//todo temp for prototype private CombatMap GenerateTerrain() { var terrainMap = new ArrayMap <bool>(MapWidth, MapHeight); QuickGenerators.GenerateRectangleMap(terrainMap); var map = new CombatMap(terrainMap.Width, terrainMap.Height); var biome = FindObjectOfType <TravelManager>().CurrentBiome; var tStore = FindObjectOfType <TerrainStore>(); var tileWeights = tStore.GetTileTypeWeights(biome); foreach (var position in terrainMap.Positions()) { var selection = tileWeights.First().Key; var totalWeight = tileWeights.Values.Sum(); var roll = Random.Range(0, totalWeight); foreach (var tType in tileWeights.OrderByDescending(t => t.Value)) { var weightedValue = tType.Value; if (roll >= weightedValue) { roll -= weightedValue; } else { selection = tType.Key; break; } } Tile tile; if (IsWallTile(selection)) { tile = tStore.GetWallTile(biome, selection, position, MapWidth, MapHeight); } else { tile = TerrainStore.GetFloorTile(biome, selection, position, MapWidth, MapHeight); } map.SetTerrain(tile); } return(map); }
public void SetMap(CombatMap map) { _map = map; }
public void Build(CombatMap map) { GlobalHelper.DestroyAllChildren(gameObject); GlobalHelper.DestroyAllChildren(EntityHolder.gameObject); for (var currentColumn = 0; currentColumn < map.Width; currentColumn++) { for (var currentRow = 0; currentRow < map.Height; currentRow++) { var coord = new Coord(currentColumn, currentRow); var tile = map.GetTerrain <Tile>(coord); var tileInstance = Instantiate(TerrainSlotPrefab, new Vector2(currentColumn, currentRow), Quaternion.identity); tileInstance.GetComponent <SpriteRenderer>().sprite = tile.Texture; tile.SetSpriteInstance(tileInstance); tileInstance.AddComponent <OnMouseOverTile>(); tileInstance.GetComponent <OnMouseOverTile>().Tile = tile; tileInstance.transform.SetParent(transform); tileInstance.GetComponent <TerrainSlotUi>().SetTile(tile); var entity = map.GetEntity <Entity>(coord); if (entity != null) { var entityInstance = Instantiate(entity.CombatSpritePrefab, new Vector2(currentColumn, currentRow), Quaternion.identity); entityInstance.transform.SetParent(EntityHolder); entity.SetSpriteInstance(entityInstance); if (!entity.IsPlayer()) { entityInstance.AddComponent <AiController>(); entityInstance.GetComponent <AiController>().SetSelf(entity); var spriteRenderer = entityInstance.GetComponent <SpriteRenderer>(); if (spriteRenderer == null) { spriteRenderer = entityInstance.GetComponentInChildren <SpriteRenderer>(); } spriteRenderer.flipX = true; var position = entityInstance.transform.position; position = new Vector3(position.x + 1, position.y, position.z); entityInstance.transform.position = position; var sRenderer = entityInstance.GetComponent <Renderer>(); if (sRenderer == null) { sRenderer = entityInstance.GetComponentInChildren <Renderer>(); } var palette = FindObjectOfType <Palette>(); var mat = sRenderer.material; mat.SetColor("_OutlineColor", palette.BrightRed); mat.SetFloat("_OutlineWidth", 0.0009f); mat.SetFloat("_OutlineAlpha", 1.0f); } entityInstance.AddComponent <EntityAudio>(); var entityAudio = entityInstance.GetComponent <EntityAudio>(); entityAudio.AttackSound = entity.AttackSound; entityAudio.HurtSound = entity.HurtSound; entityAudio.DeathSound = entity.DieSound; var spriteStore = FindObjectOfType <SpriteStore>(); var colorSwapper = entityInstance.GetComponentsInChildren <ColorSwapper>(); spriteStore.SetColorSwaps(colorSwapper, entity); var animationHelper = entityInstance.GetComponent <CombatAnimationHelper>(); if (animationHelper != null) { animationHelper.Parent = entity; } tileInstance.GetComponent <TerrainSlotUi>().SetEntity(entity); } } } }
public void RestoreState(object state) { if (state == null) { return; } CombatManagerDto dto = (CombatManagerDto)state; Enemies = new List <Entity>(); foreach (var enemy in dto.Enemies) { var restoredEnemy = new Entity(); restoredEnemy.RestoreState(enemy); Enemies.Add(restoredEnemy); } ActiveEntity = _travelManager.Party.GetCompanionById(dto.ActiveEntityId); Companions = new Dictionary <Entity, CompanionCombatStats>(); foreach (var id in dto.CompanionIds) { var companion = _travelManager.Party.GetCompanionById(id.Key); if (companion == null) { Debug.LogError($"Can't find companion with id {id.Key}"); continue; } Companions.Add(companion, id.Value); } TurnOrder = new Queue <Entity>(); foreach (var id in dto.TurnOrder) { Entity entity = null; foreach (var companion in Companions.Keys) { if (string.Equals(id, companion.Id, StringComparison.OrdinalIgnoreCase)) { entity = companion; break; } } if (entity == null) { foreach (var enemy in Enemies) { if (string.Equals(id, enemy.Id, StringComparison.OrdinalIgnoreCase)) { entity = enemy; break; } } } TurnOrder.Enqueue(entity); } Map = new CombatMap(MapGenerator.MapWidth, MapGenerator.MapHeight); Map.RestoreState(dto.CombatMap); _combatInput = FindObjectOfType <CombatInputController>(); _combatInput.SetMap(Map); _combatInput.ClearHighlights(); DrawMap(); var messenger = FindObjectOfType <CombatMessenger>(); messenger.RestoreState(dto.CombatMessenger); HighlightActiveEntitySprite(); _eventMediator = FindObjectOfType <EventMediator>(); _eventMediator.Broadcast(GlobalHelper.RefreshCombatUi, this, ActiveEntity); }
private void PlaceEntities(CombatMap map, List <Entity> combatants) { const int maxTries = 3; //todo can come up with different deployments based on encounter. //todo for now just place on opposite sides (int, int)playerEntityRangeX = (0, MapWidth / 2); (int, int)enemyEntityRangeX = (MapWidth / 2 + 1, MapWidth - 5); int playerIndexX = playerEntityRangeX.Item2 - 1; int playerIndexY = MapHeight / 2 + combatants.Count / 3; foreach (var combatant in combatants) { if (combatant.IsDerpus()) { continue; } if (combatant.IsPlayer()) { var placed = false; var numTries = 0; while (!placed) { combatant.Position = new Coord(playerIndexX, playerIndexY); placed = map.AddEntity(combatant); if (playerIndexY <= 0 || numTries > maxTries) { playerIndexY = MapHeight / 2 + combatants.Count / 3; playerIndexX--; } else { playerIndexY--; } numTries++; } } else { var(xMin, xMax) = enemyEntityRangeX; var placed = false; var numTries = 0; while (!placed && numTries < maxTries) { combatant.Position = new Coord(Random.Range(xMin, xMax), Random.Range(5, map.Height - 5)); placed = map.AddEntity(combatant); numTries++; } } } }