From d6707226744776f7c38b714a8ebb1aace88bd22d Mon Sep 17 00:00:00 2001 From: shmyga Date: Mon, 7 Oct 2019 17:29:20 +0300 Subject: [PATCH] [common] weapon delay param --- WORK.md | 4 --- src/client/haxe/ru/m/tankz/AppTheme.hx | 10 ++++-- .../haxe/ru/m/tankz/control/HumanControl.hx | 3 +- src/client/haxe/ru/m/tankz/render/Render.hx | 6 ++-- .../m/tankz/render/item/BulletRenderItem.hx | 12 ++++++-- src/client/resources/image/bullet/mine.png | Bin 1206 -> 8557 bytes src/common/haxe/ru/m/geom/Rectangle.hx | 3 +- src/common/haxe/ru/m/tankz/config/Config.hx | 1 + src/common/haxe/ru/m/tankz/core/Bullet.hx | 2 ++ src/common/haxe/ru/m/tankz/core/Tank.hx | 1 - src/common/haxe/ru/m/tankz/core/Weapon.hx | 17 +++++++--- src/common/haxe/ru/m/tankz/engine/Engine.hx | 1 + src/common/haxe/ru/m/tankz/game/EventUtil.hx | 2 +- src/common/haxe/ru/m/tankz/game/GameEvent.hx | 3 +- src/common/haxe/ru/m/tankz/game/GameRunner.hx | 29 ++++++++++-------- src/common/resources/config/classic.yaml | 8 +++++ src/common/resources/config/death.yaml | 3 ++ src/common/resources/config/dota.yaml | 2 ++ 18 files changed, 74 insertions(+), 33 deletions(-) diff --git a/WORK.md b/WORK.md index ba7461a..1bd9d7f 100644 --- a/WORK.md +++ b/WORK.md @@ -11,12 +11,8 @@ * A star * game config validate * additional weapon - * mine * display count * bonus ammo * screen gamepad (button enabled, count label) * ui: * game frame layouts -* fix: - * ice brick fix - * shot delay diff --git a/src/client/haxe/ru/m/tankz/AppTheme.hx b/src/client/haxe/ru/m/tankz/AppTheme.hx index f24d65f..ce3a6bc 100644 --- a/src/client/haxe/ru/m/tankz/AppTheme.hx +++ b/src/client/haxe/ru/m/tankz/AppTheme.hx @@ -122,16 +122,22 @@ class AppTheme extends Theme { var red:Color = 0xff0000; register(new Style("result.winner", [ "skin.border.color" => green, + "skin.border.alpha" => 0.5, + "skin.border.thickness" => 5, + "skin.round" => 10, ], ["light"])); register(new Style("result.loser", [ "skin.border.color" => red, + "skin.border.alpha" => 0.5, + "skin.border.thickness" => 5, + "skin.round" => 10, ], ["light"])); register(new Style("player.winner", [ - "skin.background.alpha" => 0.1, + "skin.background.alpha" => 0.2, "skin.background.color" => green, ])); register(new Style("player.loser", [ - "skin.background.alpha" => 0.1, + "skin.background.alpha" => 0.2, "skin.background.color" => red, ])); diff --git a/src/client/haxe/ru/m/tankz/control/HumanControl.hx b/src/client/haxe/ru/m/tankz/control/HumanControl.hx index ca99dbd..0746fbe 100644 --- a/src/client/haxe/ru/m/tankz/control/HumanControl.hx +++ b/src/client/haxe/ru/m/tankz/control/HumanControl.hx @@ -81,7 +81,8 @@ class HumanControl extends Control { case TankAction.SHOT(weapon): if (on) { if (!shotTimers.exists(weapon)) { - var timer = new Timer(300); + // ToDo: weapon.config.delay + var timer = new Timer(350); timer.run = shooter(weapon); timer.run(); shotTimers.set(weapon, timer); diff --git a/src/client/haxe/ru/m/tankz/render/Render.hx b/src/client/haxe/ru/m/tankz/render/Render.hx index 730104f..61b1ad6 100755 --- a/src/client/haxe/ru/m/tankz/render/Render.hx +++ b/src/client/haxe/ru/m/tankz/render/Render.hx @@ -150,8 +150,10 @@ class Render extends SpriteView implements IRender { entryLayer.addChild(item.view); item.update(); playAnimate(item.rect.center, AnimateBundle.tankSpawn()); - case SPAWN(BULLET(id, rect, playerId, skin)): - var item = new BulletRenderItem(rect, skin); + case SPAWN(BULLET(id, rect, playerId, skin, color)): + var item = new BulletRenderItem(rect); + item.color = color; + item.skin = skin; items.set(id, item); entryLayer.addChild(item.view); item.update(); diff --git a/src/client/haxe/ru/m/tankz/render/item/BulletRenderItem.hx b/src/client/haxe/ru/m/tankz/render/item/BulletRenderItem.hx index d637575..ebd6048 100644 --- a/src/client/haxe/ru/m/tankz/render/item/BulletRenderItem.hx +++ b/src/client/haxe/ru/m/tankz/render/item/BulletRenderItem.hx @@ -1,20 +1,26 @@ package ru.m.tankz.render.item; +import haxework.color.Color; +import haxework.view.utils.BitmapUtil; import ru.m.geom.Rectangle; class BulletRenderItem extends BitmapRenderItem { + public var color(default, default):Null; public var skin(default, set):String; - public function new(rect:Rectangle, skin:String) { + public function new(rect:Rectangle) { super(rect); - this.skin = skin; move(rect.position); } private function set_skin(value:String):String { if (skin != value) { skin = value; - image = RenderUtil.bulletImage(skin); + var image = RenderUtil.bulletImage(skin); + if (color != null) { + image = BitmapUtil.colorize(image, color); + } + this.image = image; } return skin; } diff --git a/src/client/resources/image/bullet/mine.png b/src/client/resources/image/bullet/mine.png index 2de8cc46ef6ba6c5f3fa145588190f6004ec04d6..97d99e93a525a4ed0961bbf2908a549782c25a7d 100644 GIT binary patch literal 8557 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 Hu0mjf4`4j@ diff --git a/src/common/haxe/ru/m/geom/Rectangle.hx b/src/common/haxe/ru/m/geom/Rectangle.hx index 468a7e6..66fe0f8 100644 --- a/src/common/haxe/ru/m/geom/Rectangle.hx +++ b/src/common/haxe/ru/m/geom/Rectangle.hx @@ -113,7 +113,8 @@ abstract Rectangle(Array) { } public function intersection2(line:Line):Bool { - return contain(line.point1) || contain(line.point2); + // ToDo: line to rect? + return contain(line.point1) || contain(line.point2) || contain(line.center); } public function lean(rect:Rectangle):Void { diff --git a/src/common/haxe/ru/m/tankz/config/Config.hx b/src/common/haxe/ru/m/tankz/config/Config.hx index cfbc6d5..e697fcd 100644 --- a/src/common/haxe/ru/m/tankz/config/Config.hx +++ b/src/common/haxe/ru/m/tankz/config/Config.hx @@ -55,6 +55,7 @@ typedef WeaponConfig = { var bullet:BulletConfig; var count:Int; var queue:Int; + var delay:Int; } typedef TankConfig = { diff --git a/src/common/haxe/ru/m/tankz/core/Bullet.hx b/src/common/haxe/ru/m/tankz/core/Bullet.hx index 2485c86..626202a 100644 --- a/src/common/haxe/ru/m/tankz/core/Bullet.hx +++ b/src/common/haxe/ru/m/tankz/core/Bullet.hx @@ -1,5 +1,6 @@ package ru.m.tankz.core; +import haxework.color.Color; import ru.m.geom.Direction; import ru.m.geom.Rectangle; import ru.m.tankz.config.Config; @@ -11,6 +12,7 @@ class Bullet extends MobileEntity { public var tank(default, default):Tank; public var weapon(default, default):Weapon; public var config(default, null):BulletConfig; + public var color(default, default):Color; public function new(id:Int, rect:Rectangle, playerId:PlayerId, config:BulletConfig) { super(id, rect, config.speed, Direction.RIGHT); diff --git a/src/common/haxe/ru/m/tankz/core/Tank.hx b/src/common/haxe/ru/m/tankz/core/Tank.hx index 6e70cf1..67ab59b 100755 --- a/src/common/haxe/ru/m/tankz/core/Tank.hx +++ b/src/common/haxe/ru/m/tankz/core/Tank.hx @@ -4,7 +4,6 @@ import haxework.color.Color; import ru.m.geom.Direction; import ru.m.geom.Rectangle; import ru.m.tankz.config.Config; -import ru.m.tankz.game.GameEvent; import ru.m.tankz.Type; class Tank extends MobileEntity { diff --git a/src/common/haxe/ru/m/tankz/core/Weapon.hx b/src/common/haxe/ru/m/tankz/core/Weapon.hx index 5f9b204..da753b2 100644 --- a/src/common/haxe/ru/m/tankz/core/Weapon.hx +++ b/src/common/haxe/ru/m/tankz/core/Weapon.hx @@ -1,5 +1,6 @@ package ru.m.tankz.core; +import ru.m.tankz.engine.ITicker; import ru.m.tankz.config.Config; class Weapon { @@ -9,21 +10,29 @@ class Weapon { public var queue(default, default):Int; public var available(get, null):Bool; + private var lastShotTime:Int; + public function new(config:WeaponConfig) { this.config = config; this.count = this.config.count; this.queue = 0; + this.lastShotTime = 0; } private function get_available():Bool { return (count < 0 || count > 0) && (config.queue < 0 || queue < config.queue); } - public function use():Void { - queue++; - if (count > 0) { - count--; + public function use(ticker:ITicker):Bool { + if (available && ticker.time > lastShotTime + config.delay) { + lastShotTime = ticker.time; + queue++; + if (count > 0) { + count--; + } + return true; } + return false; } public function release():Void { diff --git a/src/common/haxe/ru/m/tankz/engine/Engine.hx b/src/common/haxe/ru/m/tankz/engine/Engine.hx index 464adf8..b03c594 100755 --- a/src/common/haxe/ru/m/tankz/engine/Engine.hx +++ b/src/common/haxe/ru/m/tankz/engine/Engine.hx @@ -56,6 +56,7 @@ import ru.m.tankz.map.LevelMap; public function move(entityId:Int, direction:Direction):Void { if (entities.exists(entityId)) { + ticker.cancel('slide.tank.${entityId}'); cast(entities.get(entityId), MobileEntity).move(direction); } } diff --git a/src/common/haxe/ru/m/tankz/game/EventUtil.hx b/src/common/haxe/ru/m/tankz/game/EventUtil.hx index e1e8587..6dbea7b 100644 --- a/src/common/haxe/ru/m/tankz/game/EventUtil.hx +++ b/src/common/haxe/ru/m/tankz/game/EventUtil.hx @@ -50,7 +50,7 @@ class EventUtil { } public static function buildBulletSpawn(bullet:Bullet):GameEvent { - return SPAWN(BULLET(bullet.id, bullet.rect.clone(), bullet.playerId, bullet.config.skin)); + return SPAWN(BULLET(bullet.id, bullet.rect.clone(), bullet.playerId, bullet.config.skin, bullet.color)); } public static function buildMove(entity:Entity):GameEvent { diff --git a/src/common/haxe/ru/m/tankz/game/GameEvent.hx b/src/common/haxe/ru/m/tankz/game/GameEvent.hx index f7b6dea..b9ac393 100644 --- a/src/common/haxe/ru/m/tankz/game/GameEvent.hx +++ b/src/common/haxe/ru/m/tankz/game/GameEvent.hx @@ -1,5 +1,6 @@ package ru.m.tankz.game; +import haxework.color.Color; import ru.m.geom.Position; import ru.m.geom.Rectangle; import ru.m.tankz.config.Config; @@ -29,7 +30,7 @@ enum SpawnEvent { BRICK(bricks:Array); EAGLE(id:Int, rect:Rectangle, teamId:TeamId); TANK(id:Int, rect:Rectangle, playerId:PlayerId, info:TankInfo); - BULLET(id:Int, rect:Rectangle, playerId:PlayerId, skin:String); + BULLET(id:Int, rect:Rectangle, playerId:PlayerId, skin:String, color:Color); BONUS(id:Int, rect:Rectangle, type:BonusType); } diff --git a/src/common/haxe/ru/m/tankz/game/GameRunner.hx b/src/common/haxe/ru/m/tankz/game/GameRunner.hx index bda1a54..8344f5e 100644 --- a/src/common/haxe/ru/m/tankz/game/GameRunner.hx +++ b/src/common/haxe/ru/m/tankz/game/GameRunner.hx @@ -283,16 +283,22 @@ class GameRunner extends Game implements EngineListener { case ACTION(tankId, SHOT(index)): var tank:Tank = cast engine.entities.get(tankId); var player = getPlayer(tank.playerId); - var weapon:Weapon = tank.weapons.length > index - 1 ? tank.weapons[index] : null; - if (weapon != null && !tank.freezing && weapon.available) { - var rect = tank.rect; - var point = rect.center.add(new Point(rect.width / 4 * rect.direction.x, rect.height / 4 * rect.direction.y)); - var bullet = builder.buildBullet(point, rect.direction, player.id, weapon.config.bullet); - bullet.tank = tank; - bullet.weapon = weapon; - bullet.move(bullet.rect.direction); - engine.spawn(bullet); - gameEventSignal.emit(EventUtil.buildBulletSpawn(bullet)); + if (!tank.freezing) { + var weapon:Weapon = tank.weapons.length > index - 1 ? tank.weapons[index] : null; + if (weapon != null && weapon.use(ticker)) { + var rect = tank.rect; + var point = rect.center.add(new Point(rect.width / 4 * rect.direction.x, rect.height / 4 * rect.direction.y)); + var bullet = builder.buildBullet(point, rect.direction, player.id, weapon.config.bullet); + // ToDo: mine color + if (bullet.config.skin == "mine") { + bullet.color = config.getColor(player.id); + } + bullet.tank = tank; + bullet.weapon = weapon; + bullet.move(bullet.rect.direction); + engine.spawn(bullet); + gameEventSignal.emit(EventUtil.buildBulletSpawn(bullet)); + } } case ACTION(tankId, MOVE(direction)): engine.move(tankId, direction); @@ -305,9 +311,6 @@ class GameRunner extends Game implements EngineListener { var player = getPlayer(playerId); player.tankId = id; player.state.tank = info; - case SPAWN(BULLET(id, _, _, _)): - var bullet:Bullet = engine.getEntity(id); - bullet.weapon.use(); case CHANGE(BRICK(id, type)): engine.map.bricksById[id].config = config.getBrick(type); case CHANGE(TANK(id, type, hits, bonus, boat)): diff --git a/src/common/resources/config/classic.yaml b/src/common/resources/config/classic.yaml index 521962e..d2d1be9 100644 --- a/src/common/resources/config/classic.yaml +++ b/src/common/resources/config/classic.yaml @@ -71,6 +71,7 @@ tanks: - bullet: {<<: *bullet, speed: 8.0} queue: 1 count: -1 + delay: 300 - type: human1 upgrade: human2 @@ -83,6 +84,7 @@ tanks: - bullet: {<<: *bullet, speed: 8.5} queue: 1 count: -1 + delay: 300 - type: human2 upgrade: human3 @@ -94,6 +96,7 @@ tanks: - bullet: {<<: *bullet, speed: 9.0} queue: 2 count: -1 + delay: 300 - type: human3 downgrade: human2 @@ -105,6 +108,7 @@ tanks: - bullet: {<<: *bullet, speed: 9.0, piercing: 3, skin: piercing} queue: 2 count: -1 + delay: 300 - type: bot0 width: 38 @@ -116,6 +120,7 @@ tanks: - bullet: {<<: *bullet, speed: 7.0} queue: 1 count: -1 + delay: 300 - type: bot1 width: 40 @@ -127,6 +132,7 @@ tanks: - bullet: {<<: *bullet, speed: 7.0} queue: 1 count: -1 + delay: 300 - type: bot2 width: 38 @@ -138,6 +144,7 @@ tanks: - bullet: {<<: *bullet, speed: 9.0} queue: 1 count: -1 + delay: 300 - type: bot3 width: 40 @@ -150,6 +157,7 @@ tanks: - bullet: {<<: *bullet, speed: 8.0} queue: 1 count: -1 + delay: 300 bonuses: - {score: 500, factory: freeze.team, type: clock, duration: 10} diff --git a/src/common/resources/config/death.yaml b/src/common/resources/config/death.yaml index 1f9559a..f0e2a5f 100644 --- a/src/common/resources/config/death.yaml +++ b/src/common/resources/config/death.yaml @@ -81,11 +81,14 @@ tanks: - bullet: {width: 12, height: 12, speed: 12.0, piercing: 1, layer: 2, skin: normal} queue: 2 count: -1 + delay: 300 - bullet: {width: 16, height: 16, speed: 4.0, piercing: 4, layer: 4, skin: rocket} queue: 1 count: 3 + delay: 300 - bullet: {width: 20, height: 20, speed: 0.0, piercing: 1, layer: 0, skin: mine} queue: -1 count: 3 + delay: 300 bonuses: [] diff --git a/src/common/resources/config/dota.yaml b/src/common/resources/config/dota.yaml index 8c117cc..79dd83a 100644 --- a/src/common/resources/config/dota.yaml +++ b/src/common/resources/config/dota.yaml @@ -97,6 +97,7 @@ tanks: - bullet: {<<: *bullet, speed: 12.0} queue: 1 count: -1 + delay: 300 - type: fast width: 40 @@ -108,6 +109,7 @@ tanks: - bullet: {<<: *bullet, speed: 8.0} queue: 1 count: -1 + delay: 300 bonuses: - {score: 100, factory: freeze.team, type: clock, duration: 10}