/// <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); }
/// <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); }
/// <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); } }
/// <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); }
/// <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); }
/// <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); }