diff --git a/src/client/haxe/layout/frames/level.json b/src/client/haxe/layout/frames/level.json new file mode 100644 index 0000000..4da14f3 --- /dev/null +++ b/src/client/haxe/layout/frames/level.json @@ -0,0 +1,21 @@ +{ + "pWidth": 100, "pHeight": 100, + "views": [ + { + "id":"levels", "@type":"haxework.gui.list.VListView", + "factory": "@class:ru.m.tankz.view.frames.list.LevelView", + "pWidth":100, + "pHeight":100, + "paddings":10, + "scroll":{ + "@type":"haxework.gui.list.VScrollView", + "width":10, "pHeight":100, + "skin":{"@type":"haxework.gui.list.VScrollSkin"} + }, + "skin": { + "@type": "haxework.gui.skin.ColorSkin", + "color": "0x000000", "alpha": 0.0 + } + } + ] +} \ No newline at end of file diff --git a/src/client/haxe/layout/main.json b/src/client/haxe/layout/main.json index fcbeaca..b475189 100755 --- a/src/client/haxe/layout/main.json +++ b/src/client/haxe/layout/main.json @@ -15,6 +15,10 @@ "id": "start", "@type": "ru.m.tankz.view.frames.StartFrame" }, + { + "id": "level", + "@type": "ru.m.tankz.view.frames.LevelFrame" + }, { "id": "game", "@type": "ru.m.tankz.view.frames.GameFrame" diff --git a/src/client/haxe/layout/other.json b/src/client/haxe/layout/other.json index bf66831..d798e31 100644 --- a/src/client/haxe/layout/other.json +++ b/src/client/haxe/layout/other.json @@ -1,13 +1,18 @@ { - "person": { + "level": { "width": 440, "height": 44, + "margins": 5, "views": [ { - "id": "nameLabel", + "id": "label", "@type": "haxework.gui.LabelView", - "pWidth": 100, "height": 44, "text": "Выбор персонажа", + "pWidth": 100, "pHeight": 100, "text": "", "@style": "label" } - ] + ], + "skin": { + "@type": "haxework.gui.skin.ColorSkin", + "color": "0x000000", "alpha": 0.2 + } } } \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/render/Render.hx b/src/client/haxe/ru/m/tankz/render/Render.hx index 29fc348..a585d83 100755 --- a/src/client/haxe/ru/m/tankz/render/Render.hx +++ b/src/client/haxe/ru/m/tankz/render/Render.hx @@ -1,5 +1,6 @@ package ru.m.tankz.render; +import flash.display.DisplayObjectContainer; import ru.m.tankz.core.EntityType; import flash.display.DisplayObject; import Type.ValueType; @@ -68,15 +69,21 @@ class Render extends SpriteView implements EngineListener { } } + private function clearLayer(layer:DisplayObjectContainer) { + while (layer.numChildren > 0) layer.removeChildAt(0); + } + public function reset():Void { items = new Map>(); if (background != null) { backgroundLayer.removeChild(background); background = null; } + clearLayer(entryLayer); + clearLayer(groundLayer); + clearLayer(upLayer); } - public function onSpawn(entity:EntityType):Void { switch(entity) { case EntityType.TANK(tank): diff --git a/src/client/haxe/ru/m/tankz/view/frames/LevelFrame.hx b/src/client/haxe/ru/m/tankz/view/frames/LevelFrame.hx new file mode 100644 index 0000000..a379872 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/frames/LevelFrame.hx @@ -0,0 +1,35 @@ +package ru.m.tankz.view.frames; + +import ru.m.tankz.config.ConfigBundle; +import haxework.gui.frame.IFrameSwitcher; +import ru.m.tankz.game.GameState; +import haxework.provider.Provider; +import haxework.gui.list.ListView; +import haxework.gui.ViewBuilder; +import haxework.gui.VGroupView; + + +interface LevelFrameLayout { + var levels(default, null):ListView; +} + + +@:template("layout/frames/level.json", "layout/styles.json") +class LevelFrame extends VGroupView implements ViewBuilder implements LevelFrameLayout implements ListViewListener { + public static inline var ID = "level"; + + public function init():Void { + levels.dispatcher.addListener(this); + } + + public function onShow():Void { + var state = Provider.get(GameState); + var c = ConfigBundle.get(state.type).levels; + levels.data = [for (i in 0...c) i]; + } + + public function onListItemClick(item:IListItemView):Void { + Provider.get(GameState).level = item.data; + Provider.get(IFrameSwitcher).change(GameFrame.ID); + } +} diff --git a/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx b/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx index 3bb257b..ba0ef4d 100644 --- a/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx @@ -30,6 +30,6 @@ class StartFrame extends VGroupView implements ViewBuilder { private function startGame(humans:Int):Void { Provider.set(GameState, ClassicGame.buildState(0, humans)); - Provider.get(IFrameSwitcher).change(GameFrame.ID); + Provider.get(IFrameSwitcher).change(LevelFrame.ID); } } diff --git a/src/client/haxe/ru/m/tankz/view/frames/list/GameView.hx b/src/client/haxe/ru/m/tankz/view/frames/list/GameView.hx deleted file mode 100755 index c7f5e4d..0000000 --- a/src/client/haxe/ru/m/tankz/view/frames/list/GameView.hx +++ /dev/null @@ -1,33 +0,0 @@ -package ru.m.tankz.view.frames.list; - -import ru.m.tankz.proto.Person; -import ru.m.tankz.proto.Game; -import haxework.gui.list.ListView.IListItemView; -import haxework.gui.LabelView; -import haxework.gui.skin.ColorSkin; -import haxework.gui.HGroupView; - -class GameView extends HGroupView implements IListItemView { - - public var item_index(default, default):Int; - public var data(default, set):Game; - - private var nameLabel:LabelView; - - public function new() { - super(); - pWidth = 100; - height = 50; - skin = new ColorSkin(0xffffff); - - nameLabel = new LabelView(); - addView(nameLabel); - } - - private function set_data(value:Game):Game { - this.data = value; - var persons:String = Lambda.map(this.data.persons, function(p:Person) return p.name).join(","); - nameLabel.text = "Game_" + this.data.id + "(" + persons + ")"; - return this.data; - } -} \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/view/frames/list/LevelView.hx b/src/client/haxe/ru/m/tankz/view/frames/list/LevelView.hx new file mode 100755 index 0000000..072fed4 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/frames/list/LevelView.hx @@ -0,0 +1,24 @@ +package ru.m.tankz.view.frames.list; + +import haxework.gui.ViewBuilder; +import haxework.gui.HGroupView; +import haxework.gui.LabelView; +import haxework.gui.list.ListView.IListItemView; + + +interface LevelViewLayout { + var label(default, null):LabelView; +} + +@:template("layout/other.json@level", "layout/styles.json") +class LevelView extends HGroupView implements ViewBuilder implements IListItemView implements LevelViewLayout { + + public var item_index(default, default):Int; + public var data(default, set):Int; + + private function set_data(value:Int):Int { + data = value; + label.text = 'Level ${data}'; + return data; + } +} \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/view/frames/list/PersonView.hx b/src/client/haxe/ru/m/tankz/view/frames/list/PersonView.hx deleted file mode 100755 index 4d2dbe0..0000000 --- a/src/client/haxe/ru/m/tankz/view/frames/list/PersonView.hx +++ /dev/null @@ -1,19 +0,0 @@ -package ru.m.tankz.view.frames.list; - -import haxework.gui.ViewBuilder; -import haxework.gui.list.ListView.IListItemView; -import ru.m.tankz.proto.Person; -import haxework.gui.HGroupView; - -@:template("layout/other.json@person", "layout/styles.json") -class PersonView extends HGroupView implements ViewBuilder implements IListItemView { - - public var item_index(default, default):Int; - public var data(default, set):Person; - - private function set_data(value:Person):Person { - this.data = value; - nameLabel.text = this.data.name; - return this.data; - } -} \ No newline at end of file diff --git a/src/client/resources/config/classic.yaml b/src/client/resources/classic/config.yaml similarity index 99% rename from src/client/resources/config/classic.yaml rename to src/client/resources/classic/config.yaml index 498e7bd..64254a8 100644 --- a/src/client/resources/config/classic.yaml +++ b/src/client/resources/classic/config.yaml @@ -1,3 +1,5 @@ +levels: 36 + map: cellWidth: 22 cellHeight: 22 diff --git a/src/client/resources/levels/level000.txt b/src/client/resources/classic/levels/level000.txt similarity index 100% rename from src/client/resources/levels/level000.txt rename to src/client/resources/classic/levels/level000.txt diff --git a/src/client/resources/levels/level001.txt b/src/client/resources/classic/levels/level001.txt similarity index 100% rename from src/client/resources/levels/level001.txt rename to src/client/resources/classic/levels/level001.txt diff --git a/src/client/resources/levels/level002.txt b/src/client/resources/classic/levels/level002.txt similarity index 100% rename from src/client/resources/levels/level002.txt rename to src/client/resources/classic/levels/level002.txt diff --git a/src/client/resources/levels/level003.txt b/src/client/resources/classic/levels/level003.txt similarity index 100% rename from src/client/resources/levels/level003.txt rename to src/client/resources/classic/levels/level003.txt diff --git a/src/client/resources/levels/level004.txt b/src/client/resources/classic/levels/level004.txt similarity index 100% rename from src/client/resources/levels/level004.txt rename to src/client/resources/classic/levels/level004.txt diff --git a/src/client/resources/levels/level005.txt b/src/client/resources/classic/levels/level005.txt similarity index 100% rename from src/client/resources/levels/level005.txt rename to src/client/resources/classic/levels/level005.txt diff --git a/src/client/resources/levels/level006.txt b/src/client/resources/classic/levels/level006.txt similarity index 100% rename from src/client/resources/levels/level006.txt rename to src/client/resources/classic/levels/level006.txt diff --git a/src/client/resources/levels/level007.txt b/src/client/resources/classic/levels/level007.txt similarity index 100% rename from src/client/resources/levels/level007.txt rename to src/client/resources/classic/levels/level007.txt diff --git a/src/client/resources/levels/level008.txt b/src/client/resources/classic/levels/level008.txt similarity index 100% rename from src/client/resources/levels/level008.txt rename to src/client/resources/classic/levels/level008.txt diff --git a/src/client/resources/levels/level009.txt b/src/client/resources/classic/levels/level009.txt similarity index 100% rename from src/client/resources/levels/level009.txt rename to src/client/resources/classic/levels/level009.txt diff --git a/src/client/resources/levels/level010.txt b/src/client/resources/classic/levels/level010.txt similarity index 100% rename from src/client/resources/levels/level010.txt rename to src/client/resources/classic/levels/level010.txt diff --git a/src/client/resources/levels/level011.txt b/src/client/resources/classic/levels/level011.txt similarity index 100% rename from src/client/resources/levels/level011.txt rename to src/client/resources/classic/levels/level011.txt diff --git a/src/client/resources/levels/level012.txt b/src/client/resources/classic/levels/level012.txt similarity index 100% rename from src/client/resources/levels/level012.txt rename to src/client/resources/classic/levels/level012.txt diff --git a/src/client/resources/levels/level013.txt b/src/client/resources/classic/levels/level013.txt similarity index 100% rename from src/client/resources/levels/level013.txt rename to src/client/resources/classic/levels/level013.txt diff --git a/src/client/resources/levels/level014.txt b/src/client/resources/classic/levels/level014.txt similarity index 100% rename from src/client/resources/levels/level014.txt rename to src/client/resources/classic/levels/level014.txt diff --git a/src/client/resources/levels/level015.txt b/src/client/resources/classic/levels/level015.txt similarity index 100% rename from src/client/resources/levels/level015.txt rename to src/client/resources/classic/levels/level015.txt diff --git a/src/client/resources/levels/level016.txt b/src/client/resources/classic/levels/level016.txt similarity index 100% rename from src/client/resources/levels/level016.txt rename to src/client/resources/classic/levels/level016.txt diff --git a/src/client/resources/levels/level017.txt b/src/client/resources/classic/levels/level017.txt similarity index 100% rename from src/client/resources/levels/level017.txt rename to src/client/resources/classic/levels/level017.txt diff --git a/src/client/resources/levels/level018.txt b/src/client/resources/classic/levels/level018.txt similarity index 100% rename from src/client/resources/levels/level018.txt rename to src/client/resources/classic/levels/level018.txt diff --git a/src/client/resources/levels/level019.txt b/src/client/resources/classic/levels/level019.txt similarity index 100% rename from src/client/resources/levels/level019.txt rename to src/client/resources/classic/levels/level019.txt diff --git a/src/client/resources/levels/level020.txt b/src/client/resources/classic/levels/level020.txt similarity index 100% rename from src/client/resources/levels/level020.txt rename to src/client/resources/classic/levels/level020.txt diff --git a/src/client/resources/levels/level021.txt b/src/client/resources/classic/levels/level021.txt similarity index 100% rename from src/client/resources/levels/level021.txt rename to src/client/resources/classic/levels/level021.txt diff --git a/src/client/resources/levels/level022.txt b/src/client/resources/classic/levels/level022.txt similarity index 100% rename from src/client/resources/levels/level022.txt rename to src/client/resources/classic/levels/level022.txt diff --git a/src/client/resources/levels/level023.txt b/src/client/resources/classic/levels/level023.txt similarity index 100% rename from src/client/resources/levels/level023.txt rename to src/client/resources/classic/levels/level023.txt diff --git a/src/client/resources/levels/level024.txt b/src/client/resources/classic/levels/level024.txt similarity index 100% rename from src/client/resources/levels/level024.txt rename to src/client/resources/classic/levels/level024.txt diff --git a/src/client/resources/levels/level025.txt b/src/client/resources/classic/levels/level025.txt similarity index 100% rename from src/client/resources/levels/level025.txt rename to src/client/resources/classic/levels/level025.txt diff --git a/src/client/resources/levels/level026.txt b/src/client/resources/classic/levels/level026.txt similarity index 100% rename from src/client/resources/levels/level026.txt rename to src/client/resources/classic/levels/level026.txt diff --git a/src/client/resources/levels/level027.txt b/src/client/resources/classic/levels/level027.txt similarity index 100% rename from src/client/resources/levels/level027.txt rename to src/client/resources/classic/levels/level027.txt diff --git a/src/client/resources/levels/level028.txt b/src/client/resources/classic/levels/level028.txt similarity index 100% rename from src/client/resources/levels/level028.txt rename to src/client/resources/classic/levels/level028.txt diff --git a/src/client/resources/levels/level029.txt b/src/client/resources/classic/levels/level029.txt similarity index 100% rename from src/client/resources/levels/level029.txt rename to src/client/resources/classic/levels/level029.txt diff --git a/src/client/resources/levels/level030.txt b/src/client/resources/classic/levels/level030.txt similarity index 100% rename from src/client/resources/levels/level030.txt rename to src/client/resources/classic/levels/level030.txt diff --git a/src/client/resources/levels/level031.txt b/src/client/resources/classic/levels/level031.txt similarity index 100% rename from src/client/resources/levels/level031.txt rename to src/client/resources/classic/levels/level031.txt diff --git a/src/client/resources/levels/level032.txt b/src/client/resources/classic/levels/level032.txt similarity index 100% rename from src/client/resources/levels/level032.txt rename to src/client/resources/classic/levels/level032.txt diff --git a/src/client/resources/levels/level033.txt b/src/client/resources/classic/levels/level033.txt similarity index 100% rename from src/client/resources/levels/level033.txt rename to src/client/resources/classic/levels/level033.txt diff --git a/src/client/resources/levels/level034.txt b/src/client/resources/classic/levels/level034.txt similarity index 100% rename from src/client/resources/levels/level034.txt rename to src/client/resources/classic/levels/level034.txt diff --git a/src/client/resources/levels/level035.txt b/src/client/resources/classic/levels/level035.txt similarity index 100% rename from src/client/resources/levels/level035.txt rename to src/client/resources/classic/levels/level035.txt diff --git a/src/common/haxe/ru/m/tankz/config/Config.hx b/src/common/haxe/ru/m/tankz/config/Config.hx index de6b6cd..0d5536b 100644 --- a/src/common/haxe/ru/m/tankz/config/Config.hx +++ b/src/common/haxe/ru/m/tankz/config/Config.hx @@ -54,6 +54,7 @@ typedef TeamConfig = { class Config { public var type(default, null):String; + public var levels(default, null):Int; public var map(default, null):MapConfig; public var bricks(default, null):Array; public var tanks(default, null):Array; @@ -63,8 +64,9 @@ class Config { private var tankMap:Map>; private var teamMap:Map; - public function new(type:String, map:MapConfig, bricks:Array, teams:Array, tanks:Array) { + public function new(type:String, levels:Int, map:MapConfig, bricks:Array, teams:Array, tanks:Array) { this.type = type; + this.levels = levels; this.map = map; this.bricks = bricks; this.teams = teams; diff --git a/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx b/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx index dde0f4c..0163002 100644 --- a/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx +++ b/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx @@ -8,6 +8,7 @@ import ru.m.tankz.config.Config; typedef ConfigSource = { + var levels:Int; var map: MapConfig; var bricks: Array; var teams: Array; @@ -23,7 +24,7 @@ class ConfigBundle { public static function get(type:String):Config { switch (type) { case ClassicGame.TYPE: - var source:ConfigSource = convert(Yaml.parse(Assets.getText('resources/config/${type}.yaml'), Parser.options().useObjects())); + var source:ConfigSource = convert(Yaml.parse(Assets.getText('resources/${type}/config.yaml'), Parser.options().useObjects())); var tanks:Array = []; for (group in Reflect.fields(source.tanks)) { var data:Array = Reflect.field(source.tanks, group); @@ -32,7 +33,7 @@ class ConfigBundle { tanks.push(item); } } - return new Config(type, source.map, source.bricks, source.teams, tanks); + return new Config(type, source.levels, source.map, source.bricks, source.teams, tanks); case _: return null; } diff --git a/src/common/haxe/ru/m/tankz/config/MapBundle.hx b/src/common/haxe/ru/m/tankz/config/LevelBundle.hx similarity index 62% rename from src/common/haxe/ru/m/tankz/config/MapBundle.hx rename to src/common/haxe/ru/m/tankz/config/LevelBundle.hx index 66f1f12..dd4361f 100644 --- a/src/common/haxe/ru/m/tankz/config/MapBundle.hx +++ b/src/common/haxe/ru/m/tankz/config/LevelBundle.hx @@ -5,10 +5,16 @@ import ru.m.tankz.game.Game; import ru.m.tankz.config.Config; -class MapBundle { +class LevelBundle { + + private static function formatLevel(level:Int):String { + var result = Std.string(level); + while (result.length < 3) result = '0${result}'; + return result; + } public static function get(type:GameType, config:Config, level:Int):Array { - var bricksData:String = Assets.getText('resources/levels/level00${level}.txt'); + var bricksData:String = Assets.getText('resources/${type}/levels/level${formatLevel(level)}.txt'); var bricks:Array = []; for (line in ~/\s+/g.split(bricksData)) { for (c in line.split('')) { diff --git a/src/common/haxe/ru/m/tankz/game/Game.hx b/src/common/haxe/ru/m/tankz/game/Game.hx index eec14f8..dfc3dbe 100644 --- a/src/common/haxe/ru/m/tankz/game/Game.hx +++ b/src/common/haxe/ru/m/tankz/game/Game.hx @@ -3,7 +3,7 @@ package ru.m.tankz.game; import ru.m.tankz.bot.BotControl; import ru.m.tankz.control.HumanControl; import ru.m.tankz.config.ConfigBundle; -import ru.m.tankz.config.MapBundle; +import ru.m.tankz.config.LevelBundle; import ru.m.tankz.game.Spawner; import ru.m.tankz.core.Entity; import ru.m.tankz.core.Eagle; @@ -60,7 +60,7 @@ class Game implements EngineListener { public function start(state:GameState):Void { this.state = state; - var bricks = MapBundle.get(type, config, state.level); + var bricks = LevelBundle.get(type, config, state.level); engine.map.setData(bricks); teams = new Map(); spawners = new Map();