Esempio n. 1
0
    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];
            }
        }
    }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
    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");
        }
    }
Esempio n. 4
0
    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);
    }
Esempio n. 5
0
    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;
    }