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