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