Esempio n. 1
0
        //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);
        }
Esempio n. 2
0
 public void SetMap(CombatMap map)
 {
     _map = map;
 }
Esempio n. 3
0
        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);
                    }
                }
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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++;
                    }
                }
            }
        }