private void UpdateCity(JsonCityMatrix jsonCity) { foreach (var jb in jsonCity.grid) { var pos = new Pos2D(jb.x, jb.y); if (!this._buildings.ContainsKey(pos)) { Building newB = Instantiate(this.BuildingPrefab).GetComponent <Building>(); newB.transform.parent = this.transform; newB.transform.localPosition = GetLocalPos(pos); newB.transform.localEulerAngles = Vector3.zero; newB.name = String.Format("Building {0}-{1}", pos.x, pos.y); this._buildings.Add(pos, newB); } Building b = this._buildings[pos]; b.State = GetBuildingType(jb.type); if (b.State == Building.View.Building) { if (!TopperOnly) { b.Height = jsonCity.objects.densities[jb.type]; } b.TopperPrefab = this.TopperPrefabs[jb.type]; } } }
public static CityChange GetChange(JsonCityMatrix oldCity, JsonCityMatrix newCity) { var oldDensities = oldCity.objects.densities; var newDensities = newCity.objects.densities; for (int i = 0; i < oldCity.objects.densities.Length; i++) { if (oldDensities[i] != newDensities[i]) { return(new DensityChange(i, oldDensities[i], newDensities[i])); } } var newCityBuildings = JsonCityMatrix.GetBuildingMap(newCity); foreach (var b in oldCity.grid) { var newB = newCityBuildings[new Pos2D(b.x, b.y)]; if (b.type != newB.type) { var oldDens = b.type >= 0 && b.type < oldDensities.Length ? oldDensities[b.type] : 0; var newDens = newB.type >= 0 && newB.type < newDensities.Length ? newDensities[newB.type] : 0; return(new BuildingChange(new Pos2D(b.x, b.y), b.type, newB.type, oldDens, newDens)); } } return(null); }
private void UpdateAi(JsonCityMatrix predictCity, JsonCityMatrix aiCity) { CityChange change = CityChange.GetChange(predictCity, aiCity); if (change == null || change.Equals(_lastAiChange)) { return; } this.RemoveAi(); this._lastAiChange = change; if (change is DensityChange) { var dChange = change as DensityChange; Debug.Log("AI density change detected"); foreach (var jb in predictCity.grid.Where(b => b.type == dChange.Index)) { var b = this._buildings[new Pos2D(jb.x, jb.y)]; if (!TopperOnly) { b.ShadowDelta = dChange.NewDensity - dChange.OldDensity; } this._aiBuildings.Push(b); } } else if (change is BuildingChange) { var bChange = change as BuildingChange; Debug.Log("AI building change detected"); var b = this._buildings[bChange.Pos]; var indicator = Instantiate(BuildingPrefab).GetComponent <Building>(); indicator.State = GetBuildingType(bChange.NewId); if (indicator.State == Building.View.Building) { indicator.TopperPrefab = this.TopperPrefabs[bChange.NewId]; if (!TopperOnly) { indicator.Height = bChange.NewDensity; } } indicator.transform.parent = this.BuildingChangeIndicator.transform; indicator.transform.localPosition = Vector3.zero; var arrow = Instantiate(BuildingChangeArrowPrefab).GetComponent <BuildingsArrow>(); arrow.StartBuilding = indicator; arrow.EndBuilding = b; arrow.transform.parent = this.BuildingChangeIndicator.transform; this._aiBuildings.Push(b); } else { throw new NotImplementedException("AI Change type unknown"); } }
public static Dictionary <Pos2D, JsonBuilding> GetBuildingMap(JsonCityMatrix city) { Dictionary <Pos2D, JsonBuilding> buildings = new Dictionary <Pos2D, JsonBuilding>(16 * 16); foreach (var b in city.grid) { buildings.Add(new Pos2D(b.x, b.y), b); } return(buildings); }
private void Update() { if (packet == null) { return; } var hasChanged = false; var grid = JsonCityMatrix.GetBuildingMap(packet.predict); for (int i = 0; i < 30; i++) { for (int j = 0; j < 30; j++) { var pos = new Pos2D(i, j); if (!grid.ContainsKey(pos)) { continue; } hasChanged = hasChanged || grid[pos].type != GridDecoder.currentIds[i, j]; grid[new Pos2D(i, j)].type = GridDecoder.currentIds[i, j]; } } if (hasChanged) { foreach (var o in this._observers) { o.OnNext(packet); } } if (this.UdpSubject == this._prevSubject) { return; } this._unsubscriber.Dispose(); this._unsubscriber = this.UdpSubject.Subscribe(this); this._prevSubject = this.UdpSubject; }