From e9de677ceb1d2cd7fc073f1cdd04fdf02cbcd573 Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 25 Apr 2019 17:21:03 +0300 Subject: [PATCH] [common] update GameEvent --- src/client/haxe/ru/m/tankz/render/Render.hx | 2 +- .../haxe/ru/m/tankz/sound/SoundManager.hx | 5 +- src/common/haxe/ru/m/tankz/bot/BotControl.hx | 2 +- src/common/haxe/ru/m/tankz/bot/BotHelper.hx | 8 +-- .../haxe/ru/m/tankz/bot/HardBotControl.hx | 4 +- src/common/haxe/ru/m/tankz/control/Control.hx | 13 ++--- src/common/haxe/ru/m/tankz/engine/Engine.hx | 32 ++---------- src/common/haxe/ru/m/tankz/game/Game.hx | 52 +++++++++++++------ src/common/haxe/ru/m/tankz/game/GameEvent.hx | 44 ++++++++++++---- src/common/haxe/ru/m/tankz/game/IGame.hx | 9 ++++ 10 files changed, 96 insertions(+), 75 deletions(-) create mode 100644 src/common/haxe/ru/m/tankz/game/IGame.hx diff --git a/src/client/haxe/ru/m/tankz/render/Render.hx b/src/client/haxe/ru/m/tankz/render/Render.hx index ae67812..e5e0bac 100755 --- a/src/client/haxe/ru/m/tankz/render/Render.hx +++ b/src/client/haxe/ru/m/tankz/render/Render.hx @@ -136,7 +136,7 @@ class Render extends SpriteView implements EngineListener { } } - public function onDestroy(entity:EntityType, ?playerId:PlayerId):Void { + public function onDestroy(entity:EntityType):Void { switch entity { case TANK(tank): if (items.exists(tank.key)) { diff --git a/src/client/haxe/ru/m/tankz/sound/SoundManager.hx b/src/client/haxe/ru/m/tankz/sound/SoundManager.hx index 225ac5b..c2d0744 100644 --- a/src/client/haxe/ru/m/tankz/sound/SoundManager.hx +++ b/src/client/haxe/ru/m/tankz/sound/SoundManager.hx @@ -87,7 +87,8 @@ class SoundManager implements GameListener { } public function onGameEvent(event:GameEvent):Void { - switch event { + // ToDo: + /*switch event { case SPAWN_BULLET(player): // ToDo: if (Std.is(player.control, HumanControl)) { @@ -113,6 +114,6 @@ class SoundManager implements GameListener { play('bonus_get'); } case _: - } + }*/ } } diff --git a/src/common/haxe/ru/m/tankz/bot/BotControl.hx b/src/common/haxe/ru/m/tankz/bot/BotControl.hx index dfc9152..294c0dc 100644 --- a/src/common/haxe/ru/m/tankz/bot/BotControl.hx +++ b/src/common/haxe/ru/m/tankz/bot/BotControl.hx @@ -12,7 +12,7 @@ class BotControl extends Control { private var tank(get, null):Tank; private inline function get_tank():Tank { - return handler == null ? null : cast handler.entities[tankId]; + return handler == null ? null : cast handler.engine.entities[tankId]; } override public function stop():Void { diff --git a/src/common/haxe/ru/m/tankz/bot/BotHelper.hx b/src/common/haxe/ru/m/tankz/bot/BotHelper.hx index 63d1b43..9c77cdf 100644 --- a/src/common/haxe/ru/m/tankz/bot/BotHelper.hx +++ b/src/common/haxe/ru/m/tankz/bot/BotHelper.hx @@ -1,16 +1,16 @@ package ru.m.tankz.bot; import ru.m.geom.Direction; +import ru.m.tankz.core.Eagle; import ru.m.tankz.core.Entity; import ru.m.tankz.core.EntityType; -import ru.m.tankz.core.Eagle; -import ru.m.tankz.control.Control; +import ru.m.tankz.game.IGame; import ru.m.tankz.Type; class BotHelper { - public static function findEagle(team:TeamId, handler:ControlHandler):Null { - for (entity in handler.entities) { + public static function findEagle(team:TeamId, handler:IGame):Null { + for (entity in handler.engine.entities) { switch (EntityTypeResolver.of(entity)) { case EntityType.EAGLE(eagle): if (eagle.team != team) { diff --git a/src/common/haxe/ru/m/tankz/bot/HardBotControl.hx b/src/common/haxe/ru/m/tankz/bot/HardBotControl.hx index 28fc66b..e0e90a6 100644 --- a/src/common/haxe/ru/m/tankz/bot/HardBotControl.hx +++ b/src/common/haxe/ru/m/tankz/bot/HardBotControl.hx @@ -1,7 +1,7 @@ package ru.m.tankz.bot; -import ru.m.tankz.core.Eagle; import haxe.Timer; +import ru.m.tankz.core.Eagle; import ru.m.tankz.core.EntityType; import ru.m.tankz.core.Tank; @@ -56,7 +56,7 @@ class HardBotControl extends BotControl { } var enemy:Tank = null; var distance:Float = Math.POSITIVE_INFINITY; - for (entity in handler.entities.iterator()) { + for (entity in handler.engine.entities.iterator()) { switch EntityTypeResolver.of(entity) { case TANK(t): if (t.playerId.team != tank.playerId.team) { diff --git a/src/common/haxe/ru/m/tankz/control/Control.hx b/src/common/haxe/ru/m/tankz/control/Control.hx index 1165da8..3034fd9 100644 --- a/src/common/haxe/ru/m/tankz/control/Control.hx +++ b/src/common/haxe/ru/m/tankz/control/Control.hx @@ -1,9 +1,8 @@ package ru.m.tankz.control; import ru.m.geom.Direction; -import ru.m.tankz.core.Entity; import ru.m.tankz.core.EntityType; -import ru.m.tankz.map.LevelMap; +import ru.m.tankz.game.IGame; import ru.m.tankz.Type; enum TankAction { @@ -16,13 +15,13 @@ class Control { public var type:String; public var playerId(default, null):PlayerId; public var tankId(default, default):Int; - private var handler:ControlHandler; + private var handler:IGame; public function new(playerId:PlayerId) { this.playerId = playerId; } - public function bind(handler:ControlHandler):Void { + public function bind(handler:IGame):Void { this.handler = handler; } @@ -43,9 +42,3 @@ class Control { handler = null; } } - -interface ControlHandler { - public var map(default, null):LevelMap; - public var entities(default, null):Map; - public function action(tankId:Int, action:TankAction):Void; -} diff --git a/src/common/haxe/ru/m/tankz/engine/Engine.hx b/src/common/haxe/ru/m/tankz/engine/Engine.hx index b691a6e..dfa3334 100755 --- a/src/common/haxe/ru/m/tankz/engine/Engine.hx +++ b/src/common/haxe/ru/m/tankz/engine/Engine.hx @@ -3,7 +3,6 @@ package ru.m.tankz.engine; import ru.m.geom.Line; import ru.m.geom.Point; import ru.m.tankz.config.Config; -import ru.m.tankz.control.Control; import ru.m.tankz.core.Bullet; import ru.m.tankz.core.Entity; import ru.m.tankz.core.EntityType; @@ -11,15 +10,14 @@ import ru.m.tankz.core.MobileEntity; import ru.m.tankz.core.Tank; import ru.m.tankz.map.Grid; import ru.m.tankz.map.LevelMap; -import ru.m.tankz.Type; interface EngineListener { public function onSpawn(entity:EntityType):Void; public function onCollision(entity:EntityType, with:EntityType):Void; - public function onDestroy(entity:EntityType, ?playerId:PlayerId):Void; + public function onDestroy(entity:EntityType):Void; } -@:yield @:dispatcher(EngineListener) class Engine implements ControlHandler { +@:yield @:dispatcher(EngineListener) class Engine { public var config(default, default):Config; public var map(default, null):LevelMap; @@ -41,36 +39,14 @@ interface EngineListener { spawnSignal.emit(type); } - public function destroy(entity:Entity, ?playerId:PlayerId):Void { + public function destroy(entity:Entity):Void { if (entities.exists(entity.id)) { var type = EntityTypeResolver.of(entity); - switch (type) { - case BULLET(bullet): - var tank:Tank = cast entities.get(bullet.tankId); - if (tank != null) tank.onDestroyBullet(); - case _: - } - destroySignal.emit(type, playerId); + destroySignal.emit(type); entities.remove(entity.id); } } - public function action(tankId:Int, action:TankAction):Void { - if (!entities.exists(tankId)) return; - var tank:Tank = cast entities.get(tankId); - switch (action) { - case MOVE(direction): - tank.move(direction); - case STOP: - tank.stop(); - case SHOT: - var bullet = tank.shot(); - if (bullet != null) { - spawn(bullet); - } - } - } - public function update():Void { var newTime:Float = Date.now().getTime(); var d:Float = newTime - time; diff --git a/src/common/haxe/ru/m/tankz/game/Game.hx b/src/common/haxe/ru/m/tankz/game/Game.hx index 88372dc..a5f1777 100644 --- a/src/common/haxe/ru/m/tankz/game/Game.hx +++ b/src/common/haxe/ru/m/tankz/game/Game.hx @@ -25,7 +25,7 @@ interface GameListener { public function onGameEvent(event:GameEvent):Void; } -@:dispatcher(GameListener) class Game implements EngineListener { +@:dispatcher(GameListener) class Game implements IGame implements EngineListener { private static var TAG(default, never):String = "Game"; @@ -49,6 +49,22 @@ interface GameListener { engine.connect(this); } + public function action(tankId:Int, action:TankAction):Void { + if (!engine.entities.exists(tankId)) return; + var tank:Tank = cast engine.entities.get(tankId); + switch (action) { + case MOVE(direction): + tank.move(direction); + case STOP: + tank.stop(); + case SHOT: + var bullet = tank.shot(); + if (bullet != null) { + engine.spawn(bullet); + } + } + } + public function getTeam(teamId:TeamId):Team { return teams[teamId]; } @@ -98,7 +114,7 @@ interface GameListener { L.d(TAG, 'control(${player.id} - ${control})'); if (control != null) { player.control = control; - player.control.bind(engine); + player.control.bind(this); } } team.spawner.runner = spawn; @@ -175,7 +191,7 @@ interface GameListener { getPlayer(tank.playerId).control.start(); case BULLET(bullet): getPlayer(bullet.playerId).state.shots++; - gameEventSignal.emit(GameEvent.SPAWN_BULLET(getPlayer(bullet.playerId))); + gameEventSignal.emit(GameEvent.SPAWN(BULLET(bullet))); case _: } } @@ -197,11 +213,11 @@ interface GameListener { engine.destroy(other_bullet); case [BULLET(bullet), CELL(cell)]: engine.destroy(bullet); - gameEventSignal.emit(GameEvent.HIT_CELL(getPlayer(bullet.playerId), cell)); + gameEventSignal.emit(GameEvent.HIT(CELL(cell, bullet.tank, bullet))); case [TANK(tank), BONUS(bonus)]: applyBonus(tank, bonus); - engine.destroy(bonus, tank.playerId); - gameEventSignal.emit(GameEvent.TAKE_BONUS(getPlayer(tank.playerId), bonus.config)); + engine.destroy(bonus); + gameEventSignal.emit(GameEvent.DESTROY(BONUS(bonus, tank, bonus.config.score))); case [BULLET(bullet), TANK(tank)]/* | [TANK(tank), BULLET(bullet)]*/: if (bullet.tankId == tank.id || (!engine.config.game.friendlyFire && tank.playerId.team == bullet.playerId.team)) { // Nothing @@ -213,13 +229,13 @@ interface GameListener { tank.bonus = false; spawnBonus(); } - gameEventSignal.emit(GameEvent.HIT_TANK(getPlayer(bullet.playerId), getPlayer(tank.playerId))); + gameEventSignal.emit(GameEvent.HIT(TANK(tank, bullet.tank, bullet))); } else if (tank.config.downgrade != null) { tank.config = engine.config.getTank(tank.config.downgrade); - gameEventSignal.emit(GameEvent.HIT_TANK(getPlayer(bullet.playerId), getPlayer(tank.playerId))); + gameEventSignal.emit(GameEvent.HIT(TANK(tank, bullet.tank, bullet))); } else { - engine.destroy(tank, bullet.tank.playerId); - gameEventSignal.emit(GameEvent.DESTROY_TANK(getPlayer(bullet.playerId), getPlayer(tank.playerId))); + engine.destroy(tank); + gameEventSignal.emit(GameEvent.DESTROY(TANK(tank, bullet.tank, bullet, tank.config.score))); } } engine.destroy(bullet); @@ -233,14 +249,17 @@ interface GameListener { } checkComplete(); gameChangeSignal.emit(state); - gameEventSignal.emit(GameEvent.DESTROY_EAGLE(getPlayer(bullet.tank.playerId), eagle.team)); + gameEventSignal.emit(GameEvent.DESTROY(EAGLE(eagle, bullet.tank, bullet, eagle.config.score))); } case _: } } - public function onDestroy(entity:EntityType, ?playerId:PlayerId):Void { + public function onDestroy(entity:EntityType):Void { switch (entity) { + case BULLET(bullet): + var tank:Tank = bullet.tank; + if (tank != null) tank.onDestroyBullet(); case TANK(tank): var team = getTeam(tank.playerId.team); var player = getPlayer(tank.playerId); @@ -257,10 +276,11 @@ interface GameListener { if (tank.bonus) { spawnBonus(); } - if (playerId != null) { + // ToDo: + /*if (playerId != null) { getPlayer(playerId).state.frags++; getPlayer(playerId).state.score += tank.config.score * (tank.playerId.team == playerId.team ? 0 : 1); - } + }*/ gameChangeSignal.emit(state); case _: } @@ -272,7 +292,7 @@ interface GameListener { } public function onAction(tankId:Int, action:TankAction):Void { - engine.action(tankId, action); + this.action(tankId, action); } public function next():Option { @@ -300,7 +320,7 @@ interface GameListener { bonus.rect.x = Math.round(Math.random() * engine.map.width / engine.map.cellWidth) * engine.map.cellWidth; bonus.rect.y = Math.round(Math.random() * engine.map.height/ engine.map.cellHeight) * engine.map.cellHeight; engine.spawn(bonus); - gameEventSignal.emit(GameEvent.SPAWN_BONUS(bonus.config)); + gameEventSignal.emit(GameEvent.SPAWN(BONUS(bonus))); } inline private function alienTank(team:TeamId):Tank->Bool { diff --git a/src/common/haxe/ru/m/tankz/game/GameEvent.hx b/src/common/haxe/ru/m/tankz/game/GameEvent.hx index cfad2d4..1949da1 100644 --- a/src/common/haxe/ru/m/tankz/game/GameEvent.hx +++ b/src/common/haxe/ru/m/tankz/game/GameEvent.hx @@ -1,17 +1,39 @@ package ru.m.tankz.game; +import ru.m.tankz.core.Bonus; +import ru.m.tankz.core.Eagle; +import ru.m.tankz.core.Tank; +import ru.m.tankz.core.Bullet; import ru.m.tankz.map.Grid; -import ru.m.tankz.config.Config; -import ru.m.tankz.Type; + +enum SpawnEvent { + EAGLE(eagle:Eagle); + TANK(tank:Tank); + BULLET(bullet:Bullet); + BONUS(bonus:Bonus); +} + +enum HitEvent { + TANK(tank:Tank, who:Tank, wherewith:Bullet); + CELL(cell:GridCell, who:Tank, wherewith:Bullet); +} + +enum DestroyEvent { + EAGLE(eagle:Eagle, who:Tank, wherewith:Bullet, score:Int); + TANK(tank:Tank, who:Tank, wherewith:Bullet, score:Int); + CELL(cell:GridCell, who:Tank, wherewith:Bullet); + BONUS(bonus:Bonus, who:Tank, score:Int); +} + +enum ChangeEvent { + SCORE(player:Player, value:Int); + PLAYER_LIFE(player:Player, value:Int); + TEAM_LIFE(team:Team, value:Int); +} enum GameEvent { - SPAWN_BULLET(player:Player); - HIT_TANK(player:Player, target:Player); - DESTROY_TANK(player:Player, target:Player); - DESTROY_EAGLE(player:Player, eagleTeamId:TeamId); - HIT_CELL(player:Player, cell:GridCell); - DESTROY_CELL(player:Player, cell:GridCell); - SPAWN_BONUS(bonus:BonusConfig); - TAKE_BONUS(player:Player, bonus:BonusConfig); - ADD_SCORE(player:Player, score:Int); + SPAWN(event:SpawnEvent); + HIT(event:HitEvent); + DESTROY(event:DestroyEvent); + CHANGE(event:ChangeEvent); } diff --git a/src/common/haxe/ru/m/tankz/game/IGame.hx b/src/common/haxe/ru/m/tankz/game/IGame.hx new file mode 100644 index 0000000..d07469f --- /dev/null +++ b/src/common/haxe/ru/m/tankz/game/IGame.hx @@ -0,0 +1,9 @@ +package ru.m.tankz.game; + +import ru.m.tankz.engine.Engine; +import ru.m.tankz.control.Control.TankAction; + +interface IGame { + public var engine(default, null):Engine; + public function action(tankId:Int, action:TankAction):Void; +}