Exemple #1
0
    public Settlement(Faction faction, SettlementSize size, Cell cell, int population, bool isStartingArea = false)
    {
        Faction     = faction;
        Size        = size;
        Citizens    = new List <Entity>();
        _cell       = cell;
        _population = population;

        Name = SettlementPrefabStore.GenerateName();

        //todo just add 'New' or '2' or something to the name when it exists
        while (WorldData.Instance.Settlements.ContainsKey(Name))
        {
            Name = SettlementPrefabStore.GenerateName();
        }

        WorldData.Instance.Settlements.Add(Name, this);

        if (isStartingArea)
        {
            _areas = new Dictionary <Area, SettlementSection>();
            var area = _cell.Areas[1, 1];
            area.Settlement        = this;
            area.SettlementSection = new SettlementSection();
            _areas.Add(area, area.SettlementSection);
        }
        else
        {
            PickAreas();
        }
    }
Exemple #2
0
    private void PrepareSettlement()
    {
        if (SettlementSection == null || Settlement == null)
        {
            return;
        }

        var settlementPrefab = SettlementPrefabStore.GetSettlementPrefab(Settlement.Size);

        if (PresentFactions == null || PresentFactions.Count < 1 || PresentFactions.First() == null)
        {
            SettlementPrefabStore.AssignBuildingToStartingArea(settlementPrefab);
        }
        else
        {
            SettlementPrefabStore.AssignBuildingToLots(settlementPrefab);
        }

        SettlementSection.Lots = settlementPrefab.Lots;

        var settlementBluePrint = settlementPrefab.Blueprint;

        for (var currentRow = 0; currentRow < settlementBluePrint.GetLength(0); currentRow++)
        {
            for (var currentColumn = 0; currentColumn < settlementBluePrint.GetLength(1); currentColumn++)
            {
                var tileCode = settlementBluePrint[currentRow, currentColumn];

                if (tileCode == 'x')
                {
                    continue;
                }
                if (tileCode == SettlementPrefabStore.LotKey)
                {
                    continue;
                }

                var tile = GetTilePrefab(tileCode);

                AreaTiles[currentRow, currentColumn] =
                    new Tile(tile, new Vector2(currentRow, currentColumn), false, false);
            }
        }
        PlaceSettlementProps();
    }
Exemple #3
0
    private void PlaceSettlementProps()
    {
        var propChance = 99;

        var roll = Random.Range(1, 101);

        while (roll <= propChance)
        {
            var propType = SettlementPrefabStore.GetRandomPropType();

            var blueprintChance = 17;

            roll = Random.Range(1, 101);

            if (roll <= blueprintChance)
            {
                // todo not implemented
                while (propType == SettlementPrefabStore.SettlementPropType.Fence)
                {
                    propType = SettlementPrefabStore.GetRandomPropType();
                }

                var propBlueprint = SettlementPrefabStore.GetPropBlueprintByType(propType);

                var areaRow            = Random.Range(0, Height);
                var startingAreaColumn = Random.Range(0, Width);
                var currentAreaColumn  = startingAreaColumn;

                var blueprintHeight = propBlueprint.GetLength(0);
                var blueprintWidth  = propBlueprint.GetLength(1);

                var propPrefabs = new Dictionary <char, List <GameObject> >();

                for (var currentRow = 0; currentRow < blueprintHeight; currentRow++)
                {
                    for (var currentColumn = 0; currentColumn < blueprintWidth; currentColumn++)
                    {
                        if (areaRow < 0 || areaRow >= Height || currentAreaColumn < 0 || currentAreaColumn >= Width)
                        {
                            continue;
                        }

                        var currentTile = AreaTiles[areaRow, currentAreaColumn];

                        //todo should probably make a tile type enum because this is trash
                        if (currentTile.PresentWallTile != null ||
                            currentTile.GetPrefabTileTexture().name.Contains("floor") ||
                            currentTile.GetPrefabTileTexture().name.Contains("road") ||
                            currentTile.GetPrefabTileTexture().name.Contains("path") ||
                            currentTile.GetBlocksMovement())
                        {
                            continue;
                        }

                        var currentKey = propBlueprint[currentRow, currentColumn];

                        if (!propPrefabs.ContainsKey(currentKey))
                        {
                            var prefabsForCurrentKey = SettlementPrefabStore.GetPropPrefabsByKey(currentKey);

                            propPrefabs.Add(currentKey, prefabsForCurrentKey);
                        }

                        if (propPrefabs[currentKey] == null || propPrefabs[currentKey].Count < 1)
                        {
                            continue;
                        }

                        GameObject prefab = null;
                        if (currentKey != SettlementPrefabStore.TurretKey)
                        {
                            prefab = propPrefabs[currentKey][Random.Range(0, propPrefabs[currentKey].Count)];
                        }

                        if (currentKey == SettlementPrefabStore.FieldKey)
                        {
                            //todo pick field type
                            currentTile.PresentProp = new Field(FieldType.Wheat, currentKey.ToString(), prefab);
                        }
                        else if (currentKey == SettlementPrefabStore.GraveyardKey)
                        {
                            currentTile.PresentProp = new Grave(currentKey.ToString(), prefab);
                        }
                        else if (currentKey == SettlementPrefabStore.TurretKey)
                        {
                            continue;

                            var template = EntityTemplateLoader.GetEntityTemplate("turret");

                            var turret = new Entity(template, Settlement.Faction);

                            //todo need to implement
                            var turretBarrel = new Weapon(ItemTemplateLoader.GetItemTemplate("TurretBarrel"),
                                                          GlobalHelper.GetRandomEnumValue <ItemRarity>());

                            turret.EquipItem(turretBarrel, Entity.EquipmentSlot.Special);

                            currentTile.SetPresentEntity(turret);
                        }
                        else
                        {
                            currentTile.PresentProp = new Prop(currentKey.ToString(), prefab);
                        }

                        currentAreaColumn++;
                    }

                    areaRow++;
                    currentAreaColumn = startingAreaColumn;
                }
            }
            else
            {
                var prefabs = SettlementPrefabStore.GetPropPrefabByType(propType);

                if (prefabs == null)
                {
                    continue;
                }

                var areaRow    = Random.Range(0, Height);
                var areaColumn = Random.Range(0, Width);

                var currentTile = AreaTiles[areaRow, areaColumn];

                //todo should probably make a tile type enum because this is trash
                if (currentTile.PresentWallTile != null ||
                    currentTile.GetPrefabTileTexture().name.Contains("floor") ||
                    currentTile.GetPrefabTileTexture().name.Contains("road") ||
                    currentTile.GetPrefabTileTexture().name.Contains("path") ||
                    currentTile.GetBlocksMovement())
                {
                    continue;
                }

                if (propType == SettlementPrefabStore.SettlementPropType.Field)
                {
                    var index = Random.Range(0, prefabs.Count);

                    currentTile.PresentProp = new Field(FieldType.Wheat, index.ToString(), prefabs[index]);
                }
                else if (propType == SettlementPrefabStore.SettlementPropType.Security)
                {
                    continue;

                    var template = EntityTemplateLoader.GetEntityTemplate("turret");

                    var turret = new Entity(template, Settlement.Faction);

                    //todo need to implement
                    var turretBarrel = new Weapon(ItemTemplateLoader.GetItemTemplate("TurretBarrel"),
                                                  GlobalHelper.GetRandomEnumValue <ItemRarity>());

                    turret.EquipItem(turretBarrel, Entity.EquipmentSlot.Special);

                    currentTile.SetPresentEntity(turret);

                    //todo raise new entity event
                }
                else
                {
                    var index = Random.Range(0, prefabs.Count);

                    currentTile.PresentProp = new Prop(index.ToString(), prefabs[index]);
                }
            }

            propChance -= 23;

            if (propChance < 1)
            {
                propChance = 1;
            }

            roll = Random.Range(1, 101);
        }
    }