public static EnemyBuildingUpdater Deserialize(BinaryReader s, GameState state) { int ti = s.ReadInt32(); ViewedBuilding vb = new ViewedBuilding(); vb.Team = s.ReadInt32(); vb.Type = s.ReadInt32(); vb.CellPoint = s.ReadPoint(); vb.WorldPosition = s.ReadVector3(); vb.ViewDirection = s.ReadVector2(); int uuid = s.ReadInt32(); RTSBuilding b = null; foreach(var building in state.teams[vb.Team].Buildings) { if(building.UUID == uuid) { b = building; break; } } EnemyBuildingUpdater ebu = new EnemyBuildingUpdater(state, ti, vb, b); ebu.Added = s.ReadBoolean(); ebu.isDead = s.ReadBoolean(); if(ebu.Added) { state.teams[ebu.teamIndex].ViewedEnemyBuildings.Add(vb); } return ebu; }
private void AddTask(GameState s, RTSBuilding building, int fTeam, int type) { AddTask(s, building); ViewedBuilding vb = new ViewedBuilding(); vb.Team = fTeam; vb.Type = type; vb.ViewDirection = building.ViewDirection; vb.WorldPosition = building.WorldPosition; vb.CellPoint = HashHelper.Hash(building.GridPosition, s.CGrid.numCells, s.CGrid.size); for(int i = 0; i < s.teams.Length; i++) { if(i == fTeam || s.teams[i] == null) continue; var ebu = new EnemyBuildingUpdater(s, i, vb, building); s.tbMemBuildings.AddTask(ebu); } }
public EnemyBuildingUpdater(GameState s, int tIndex, ViewedBuilding _vb, RTSBuilding b) : base(1) { state = s; teamIndex = tIndex; Added = false; isDead = false; vb = _vb; building = b; if(b != null) b.OnDestruction += OnBuildingDeath; else isDead = true; RTSBuildingData data = state.teams[vb.Team].Race.Buildings[vb.Type]; grids = new Point[data.GridSize.X * data.GridSize.Y]; Point p = vb.CellPoint; int pi = 0; for(int y = 0; y < data.GridSize.Y; y++) { for(int x = 0; x < data.GridSize.X; x++) { grids[pi++] = new Point(p.X + x, p.Y + y); } } }