Esempio n. 1
0
        private void OnHealthChanged(Entity e, HealthModule h, int delta)
        {
            GameUI.BroadcastMessage(UIMessage.Create(UIMessage.MessageType.LoseLife,
                                                     new UIMessage.Datum()
            {
                type = UIMessage.Datum.Type.Int, value = h.HitPoints.ToString()
            }));

            if (h.HitPoints <= 0)
            {
                _agent.Disable();

                GameUI.BroadcastMessage(UIMessage.Create(UIMessage.MessageType.GameOver));
            }
        }
Esempio n. 2
0
        private static IEnumerator InitializeLevel(Difficulty difficulty, int numTeams)
        {
            int   worldSize, desiredEnemies;
            float tileSize = GameConfig.TERRAIN_TILE_SIZE;

            // generate terrain data
            WorldTileConfig[,] worldSeed;
            switch (difficulty)
            {
            case Difficulty.Easy:
                worldSeed      = WorldGenSeed.SEED_MAZE1;
                worldSize      = 7;
                desiredEnemies = 3;
                break;

            case Difficulty.Normal:
                worldSeed      = WorldGenSeed.SEED_MAZE1;
                worldSize      = 9;
                desiredEnemies = 5;
                break;

            case Difficulty.Hard:
                worldSeed      = WorldGenSeed.SEED_MAZE1;
                worldSize      = 11;
                desiredEnemies = 20;
                break;

            default:
                throw new Exception($"Unhandled difficulty level: {difficulty}");
            }

            int randomSeed = UnityEngine.Random.Range(0, 9999999);
            var config     = new TerrainGenerator.WorldGenConfig(randomSeed, WorldType.Prim, worldSize, worldSize,
                                                                 new Vector2(tileSize, tileSize), worldSeed);

            _terrainGenerator = new TerrainGenerator();
            _terrainGenerator.InitWorldFromConfig(config);
            while (!_terrainGenerator.IsInitialized)
            {
                yield return(null);
            }

            _terrainGenerator.GenerateWorld();
            while (!_terrainGenerator.IsGenerated)
            {
                yield return(null);
            }

            // center the camera over the terrain
            Camera.main.transform.position = new Vector3(
                (worldSize - 1) * (tileSize * 0.5f),
                (worldSize - 1) * (tileSize * 2f),
                (worldSize - 1) * (tileSize * 0.5f)
                );

            // spawn terrain tiles
            for (int yTile = 0; yTile < worldSize; yTile++)
            {
                for (int xTile = 0; xTile < worldSize; xTile++)
                {
                    bool isRoadTile = _terrainGenerator.GetTile(xTile, yTile).IsOpen();
                    var  tileType   = GetTerrainType(_terrainGenerator, xTile, yTile);
                    var  worldPos   = GetTileWorldPosition(xTile, yTile);
                    var  terrain    = EntityFactory.CreateTerrain($"Terrain_{xTile}_{yTile}", worldPos, tileType, isRoadTile, tileSize, xTile, yTile);
                    _terrainEntities.Add(terrain);

                    if (!isRoadTile)
                    {
                        // randomly spawn obstacles
                        if (UnityEngine.Random.value > 0.75f)
                        {
                            var prop = EntityFactory.CreateDestructible($"Prop_Tree_{_propEntities.Count}", "PropTree", worldPos, GameConfig.DESTRUCTIBLE_HIT_POINTS);
                            _propEntities.Add(prop);
                        }
                    }
                }
            }

            // surround the world with invisible walls
            for (int yTile = -1; yTile <= worldSize; yTile++)
            {
                var wall1 = EntityFactory.CreateProp("Blocker", "PropInvisibleWall", GetTileWorldPosition(-1, yTile));
                _wallEntities.Add(wall1);

                var wall2 = EntityFactory.CreateProp("Blocker", "PropInvisibleWall", GetTileWorldPosition(worldSize, yTile));
                _wallEntities.Add(wall2);
            }

            for (int xTile = -1; xTile <= worldSize; xTile++)
            {
                var wall1 = EntityFactory.CreateProp("Blocker", "PropInvisibleWall", GetTileWorldPosition(xTile, -1));
                _wallEntities.Add(wall1);

                var wall2 = EntityFactory.CreateProp("Blocker", "PropInvisibleWall", GetTileWorldPosition(xTile, worldSize));
                _wallEntities.Add(wall2);
            }

            // place the player on a road
            int xPlayer = -1;
            int yPlayer = -1;

            for (int yTile = 0; yTile < worldSize; yTile++)
            {
                for (int xTile = 0; xTile < worldSize; xTile++)
                {
                    int index   = _terrainGenerator.GetLinearIndex(xTile, yTile);
                    var terrain = _terrainEntities[index].GetModule <PrefabModule <TerrainBehaviour> >(ModuleType.Prefab);
                    if (terrain.component.isOpen)
                    {
                        _playerEntity = EntityFactory.CreatePlayerTank("Player", GetTileWorldPosition(xTile, yTile), GameConfig.PLAYER_HIT_POINTS);
                        xPlayer       = xTile;
                        yPlayer       = yTile;
                        break;
                    }
                }

                if (_playerEntity != null)
                {
                    break;
                }
            }

            // iterate backwards over the terrain to place enemies preferentially far from the player
            _numEnemiesRemaining = 0;
            for (int yTile = worldSize - 1; yTile >= 0; yTile--)
            {
                for (int xTile = worldSize - 1; xTile >= 0; xTile--)
                {
                    int index   = _terrainGenerator.GetLinearIndex(xTile, yTile);
                    var terrain = _terrainEntities[index].GetModule <PrefabModule <TerrainBehaviour> >(ModuleType.Prefab);

                    if (terrain.component.isOpen &&
                        !(xTile == xPlayer && yTile == yPlayer) &&
                        _enemyEntities.Count < desiredEnemies &&
                        UnityEngine.Random.value > 0.8f)
                    {
                        var team = Team.Red;
                        if (numTeams == 2 && UnityEngine.Random.value > 0.5f)
                        {
                            team = Team.Blue;
                        }

                        var enemy = EntityFactory.CreateNpcTank($"Enemy_{_enemyEntities.Count}", GetTileWorldPosition(xTile, yTile), GameConfig.ENEMY_HIT_POINTS, team);
                        _enemyEntities.Add(enemy);

                        if (team != Team.Blue)
                        {
                            _numEnemiesRemaining++;
                        }

                        enemy.GetModule <HealthModule>(ModuleType.Health).OnHealthChanged += (e, h, delta) =>
                        {
                            if (e.GetModule <NpcAgentModule>(ModuleType.NpcAgent).Team == Team.Red && h.HitPoints <= 0)
                            {
                                _numEnemiesRemaining--;
                                if (_numEnemiesRemaining <= 0)
                                {
                                    GameUI.BroadcastMessage(UIMessage.Create(UIMessage.MessageType.LevelCleared));
                                }
                            }
                        };
                    }
                }
            }
        }