private void BroadcastMessage() { if (_message.type == UIMessage.MessageType.Undefined) { throw new ArgumentException($"UIButtonHandler has an undefined message type: {Utilities.GetPathToGameObjectInScene(gameObject)}"); } GameUI.BroadcastMessage(_message); }
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)); } }
public override void Update(float deltaTime) { for (int i = 0; i < _keysDown.Length; i++) { if (Input.GetKeyDown(_keysDown[i])) { GameUI.BroadcastMessage(KeyDownBindings[_keysDown[i]]); } } for (int i = 0; i < _keys.Length; i++) { if (Input.GetKey(_keys[i])) { GameUI.BroadcastMessage(KeyBindings[_keys[i]]); } } }
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)); } } }; } } } }