Пример #1
0
    /// <summary>
    /// 获取未连接的连接房
    /// </summary>
    public static List <RoomGrid> GetNoLinkRoom(List <Int2> lOld, List <Int2> lNew)
    {
        List <Int2> lGold      = new List <Int2>();
        int         nRoomCount = m_GoldRoom.Count;
        int         nRoomCnt   = 0;

        for (nRoomCnt = 0; nRoomCnt < nRoomCount; nRoomCnt++)
        {
            RoomGrid rRoomGrid = m_GoldRoom[nRoomCnt];
            if (rRoomGrid != null)
            {
                lGold.Add(rRoomGrid.mPosRoomGrid);
            }
        }

        List <Int2>     lGrid   = new List <Int2>();
        List <RoomGrid> lNoLink = new List <RoomGrid>();

        lGrid = NDLink.GetNoLinkGrid(lOld, lNew, lGold, m_PutRoom, m_RealMapSize);
        foreach (Int2 Pos in lGrid)
        {
            RoomGrid R = FindRoomGrid(Pos, XYSYS.RoomGrid);
            if (R != null)
            {
                lNoLink.Add(R);
            }
        }
        return(lNoLink);
    }
Пример #2
0
    /// <summary>
    /// 获取可放置区域
    /// </summary>
    public static List <Int2> GetCanPutArea(ShipBuildType type, bool bDeckRoom)
    {
        List <Int2> l = new List <Int2>();

        if (m_PutRoom.Count == 0)         //一个都未摆设,则所有区域都可以摆设了。
        {
            List <RoomGrid> ll = GetAllRoomGrid();
            foreach (RoomGrid g in ll)
            {
                l.Add(g.mPosRoomGrid);
            }
        }
        else          //根据现有的设置摆设区域。
        {
            if (type == ShipBuildType.Soldier)
            {
                List <RoomGrid> lAll = GetAllRoomGrid();
                foreach (RoomGrid r in lAll)
                {
                    if (r.CheckPosition((int)PutPosition.Soldier))
                    {
                        l.Add(r.mPosRoomGrid);
                    }
                }
                //List<RoomGrid>listRoomGrid = RoomMap.GetPutRoomGrid();
            }
            else if (type == ShipBuildType.BuildRoom)
            {
                if (bDeckRoom)
                {
                    foreach (RoomGrid r in m_DeckRoom)
                    {
                        if (r.CheckPosition((int)PutPosition.Floor))
                        {
                            l.Add(r.mPosRoomGrid);
                        }
                    }
                }
                else
                {
                    List <Int2>     listOld            = new List <Int2>();
                    List <Int2>     listNew            = new List <Int2>();
                    List <RoomGrid> listNoLinRoomGrid  = GetNoLinkRoom(listOld, listNew);
                    List <RoomGrid> listCanPutRoomGrid = new List <RoomGrid>();;
                    int             nCount             = m_PutRoom.Count;
                    for (int nCnt = 0; nCnt < nCount; nCnt++)
                    {
                        RoomGrid roolGrid = m_PutRoom[nCnt];
                        if (!listNoLinRoomGrid.Contains(roolGrid) && roolGrid.mPosRoomGrid.Layer < 4)
                        {
                            listCanPutRoomGrid.Add(roolGrid);
                        }
                    }
                    NDLink.JoinLink(new List <Int2>(), new List <Int2>(), listCanPutRoomGrid, m_RealMapSize);
                    l.AddRange(NDLink.GetCanPutArea());
                }
            }
        }
        return(l);
    }
Пример #3
0
    /// <summary>
    /// 删除一层的楼梯
    /// </summary>
    private static void DeleteStairInLayer(int layer)
    {
        //获取一层区组
        List <int> l = new List <int>();

        l = GetColumnPutRoom(layer);
        //对一层区组进行连续性分割
        List <Int2> lArea = NDLink.GetContinuousRange(l);

        //
        foreach (Int2 P in lArea)
        {
            DeleteStairAreaStair(layer, P.Layer, P.Unit);
        }
    }
Пример #4
0
    /// <summary>
    /// 是否可以正常连通到金库
    /// </summary>
    public static bool CheckLinkToGoldRoom(List <Int2> RemoveList, List <Int2> AddList, bool IsNewCreate)
    {
        if (IsNewCreate)
        {
            if (!NDLink.SameGridList(RemoveList, AddList))
            {
                //确认是否产生无效的甲板房间
                if (CheckHaveInvalidRoomGrid(RemoveList, AddList) == true)
                {
                    return(false);
                }

                //确认能否吸收新房间的
                if (CheckCanPutRoom(RemoveList, AddList) == false)
                {
                    return(false);
                }
            }
        }
        //确认是否覆盖了甲板房间或在甲板房间上面
        if (ChencUpCoverDeckRoom(AddList) == true)
        {
            return(false);
        }
        //联通性测试
        NDLink.JoinLink(RemoveList, AddList, m_PutRoom, m_RealMapSize);

        bool            bLinkOK           = true;
        List <Int2>     listOld           = new List <Int2>();
        List <Int2>     listNew           = new List <Int2>();
        List <RoomGrid> listNoLinRoomGrid = GetNoLinkRoom(listOld, listNew);
        int             nNewPosCount      = AddList.Count;
        int             nNewPosCnt        = 0;

        for (nNewPosCnt = 0; nNewPosCnt < nNewPosCount; nNewPosCnt++)
        {
            RoomGrid R = FindRoomGrid(AddList[nNewPosCnt], XYSYS.RoomGrid);
            if (listNoLinRoomGrid.Contains(R))
            {
                bLinkOK = false;
                break;
            }
        }
        return(bLinkOK);
    }
Пример #5
0
    /// <summary>
    /// 获取改层需要创造的楼梯位置点。
    /// </summary>
    private static List <Int2> GetStairCreatePoint(int layer)
    {
        List <Int2> lTarget = new List <Int2>();
        //获取一层区组
        List <int> l = new List <int>();

        l = GetColumnPutRoom(layer);
        //对一层区组进行连续性分割
        List <Int2> lArea = NDLink.GetContinuousRange(l);

        //
        foreach (Int2 P in lArea)
        {
            Int2 StairPos = Int2.zero;
            if (CheckStairPoint(layer, P.Layer, P.Unit, ref StairPos) == true)
            {
                lTarget.Add(StairPos);
            }
        }
        return(lTarget);
    }
Пример #6
0
    /// <summary>
    /// 获取楼梯活动区域
    /// </summary>
    /// <param name="layer">格子坐标</param>
    /// <param name="unit">格子坐标</param>
    /// <returns>返回的为地图格子坐标范围Int2.Layer为区间开始 Int2.Unit区间结束</returns>
    public static Int2  GetStairActiveArea(int layer, int unit)
    {
        Int2 Area = Int2.zero;
        int  u    = unit / MapGrid.m_UnitRoomGridNum;
        //获取一层区组
        List <int> l = new List <int>();

        l = GetColumnPutRoom(layer);
        //对一层区组进行连续性分割
        List <Int2> lArea = NDLink.GetContinuousRange(l);

        foreach (Int2 Pos in lArea)
        {
            //Int2.Layer为区间开始 Int2.Unit区间结束
            if (Pos.Layer <= u && u <= Pos.Unit)
            {
                Area.Layer = Pos.Layer * MapGrid.m_UnitRoomGridNum;
                Area.Unit  = (Pos.Unit + 1) * MapGrid.m_UnitRoomGridNum;
                break;
            }
        }
        return(Area);
    }