From 7ac181ed5a71bb6a15fce082895757655aa1c1c8 Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 25 Jan 2018 22:55:39 +0300 Subject: [PATCH] [common] added GameState --- src/client/haxe/ru/m/tankz/Client.hx | 6 +- .../haxe/ru/m/tankz/view/frames/GameFrame.hx | 18 +- .../haxe/ru/m/tankz/view/frames/StartFrame.hx | 11 +- src/client/resources/config/classic.yaml | 3 - src/client/resources/fonts/8-BIT WONDER.TTF | Bin 14328 -> 0 bytes src/client/resources/fonts/8-BIT WONDER.eot | Bin 14536 -> 0 bytes src/client/resources/fonts/8-BIT WONDER.svg | 161 ------------------ src/client/resources/fonts/8-BIT WONDER.woff | Bin 4892 -> 0 bytes src/common/haxe/ru/m/tankz/config/Config.hx | 6 +- .../haxe/ru/m/tankz/config/ConfigBundle.hx | 12 +- .../haxe/ru/m/tankz/config/MapBundle.hx | 22 +++ src/common/haxe/ru/m/tankz/engine/Engine.hx | 3 +- .../haxe/ru/m/tankz/game/ClassicGame.hx | 40 ++++- src/common/haxe/ru/m/tankz/game/Game.hx | 16 +- src/common/haxe/ru/m/tankz/game/GameState.hx | 24 +++ src/common/haxe/ru/m/tankz/map/LevelMap.hx | 7 +- 16 files changed, 121 insertions(+), 208 deletions(-) delete mode 100644 src/client/resources/fonts/8-BIT WONDER.TTF delete mode 100644 src/client/resources/fonts/8-BIT WONDER.eot delete mode 100644 src/client/resources/fonts/8-BIT WONDER.svg delete mode 100644 src/client/resources/fonts/8-BIT WONDER.woff create mode 100644 src/common/haxe/ru/m/tankz/config/MapBundle.hx create mode 100644 src/common/haxe/ru/m/tankz/game/GameState.hx diff --git a/src/client/haxe/ru/m/tankz/Client.hx b/src/client/haxe/ru/m/tankz/Client.hx index 79cbc5f..4257b0e 100755 --- a/src/client/haxe/ru/m/tankz/Client.hx +++ b/src/client/haxe/ru/m/tankz/Client.hx @@ -1,5 +1,7 @@ package ru.m.tankz; +import ru.m.tankz.game.ClassicGame; +import ru.m.tankz.game.Game; import flash.ui.Keyboard; import flash.events.KeyboardEvent; import flash.text.Font; @@ -10,8 +12,6 @@ import haxework.resources.IResources; import haxework.gui.VGroupView; import haxework.gui.ViewBuilder; import haxework.gui.ButtonView; -import flash.display.Sprite; -import haxework.gui.IGroupView; import ru.m.tankz.PacketBuilder; import haxework.log.JSLogger; import haxework.gui.frame.IFrameSwitcher; @@ -74,6 +74,8 @@ class Client implements IConnectionHandler { view.switcher.change(StartFrame.ID); } }); + + Provider.setFactory(Game, ClassicGame, ClassicGame.TYPE); } public function onPress(view:ButtonView):Void { diff --git a/src/client/haxe/ru/m/tankz/view/frames/GameFrame.hx b/src/client/haxe/ru/m/tankz/view/frames/GameFrame.hx index cc7084e..08fbd75 100755 --- a/src/client/haxe/ru/m/tankz/view/frames/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/frames/GameFrame.hx @@ -1,6 +1,6 @@ package ru.m.tankz.view.frames; -import ru.m.tankz.config.Config; +import ru.m.tankz.game.GameState; import ru.m.tankz.control.PlayerControl; import flash.events.Event; import haxe.Timer; @@ -9,8 +9,6 @@ import haxework.gui.ViewBuilder; import haxework.provider.Provider; import protohx.Message; import ru.m.connect.IConnection; -import ru.m.tankz.config.ConfigBundle; -import ru.m.tankz.game.ClassicGame; import ru.m.tankz.game.Game; import ru.m.tankz.proto.pack.GameUpdateResponse; @@ -29,15 +27,15 @@ class GameFrame extends VGroupView implements ViewBuilder implements IPacketHand } public function onShow():Void { - var config:Config = Provider.get(Config); - game = switch (config.type) { - case ClassicGame.TYPE: new ClassicGame(config); - case x: throw 'Unsupported game type "${x}"'; + var state:GameState = Provider.get(GameState); + game = Provider.build(Game, state.type); + if (game == null) { + throw 'Unsupported game type "${state.type}"'; } game.engine.listeners.push(render); - game.start(); - for (index in 0...game.config.getTeam('human').size) { - game.setControl({team:'human', index:index}, PlayerControl.forPlayer(index)); + game.start(state); + for (human in state.players['human'].iterator()) { + game.setControl({team:'human', index:human.index}, PlayerControl.forPlayer(human.index)); } content.addEventListener(Event.ENTER_FRAME, redraw); Provider.get(IConnection).packetHandler.addListener(this); 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 51486b9..3bb257b 100644 --- a/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx @@ -1,14 +1,14 @@ package ru.m.tankz.view.frames; -import ru.m.tankz.config.Config; +import ru.m.tankz.game.GameState; import ru.m.tankz.game.ClassicGame; -import ru.m.tankz.config.ConfigBundle; import haxework.gui.frame.IFrameSwitcher; import haxework.provider.Provider; import haxework.gui.ButtonView; import haxework.gui.ViewBuilder; import haxework.gui.VGroupView; + @:template("layout/frames/start.json", "layout/styles.json") class StartFrame extends VGroupView implements ViewBuilder { @@ -28,11 +28,8 @@ class StartFrame extends VGroupView implements ViewBuilder { } } - private function startGame(players:Int):Void { - var config = ConfigBundle.get(ClassicGame.TYPE, 0); - config.getTeam('human').size = players; - config.getTeam('bot').size = 2 + 2 * players; - Provider.set(Config, config); + private function startGame(humans:Int):Void { + Provider.set(GameState, ClassicGame.buildState(0, humans)); Provider.get(IFrameSwitcher).change(GameFrame.ID); } } diff --git a/src/client/resources/config/classic.yaml b/src/client/resources/config/classic.yaml index 622c7cf..498e7bd 100644 --- a/src/client/resources/config/classic.yaml +++ b/src/client/resources/config/classic.yaml @@ -3,7 +3,6 @@ map: cellHeight: 22 gridWidth: 26 gridHeight: 26 - bricks: [] bricks: # border @@ -37,7 +36,6 @@ bricks: teams: - id: human - size: 2 spawnInterval: 0 points: - type: eagle @@ -56,7 +54,6 @@ teams: y: 24 direction: top - id: bot - size: 6 spawnInterval: 3000 points: - type: tank diff --git a/src/client/resources/fonts/8-BIT WONDER.TTF b/src/client/resources/fonts/8-BIT WONDER.TTF deleted file mode 100644 index 6d9b3972e185bb15dfa5555eb8e3accd796b50b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14328 zcmeHO3w#{KdH?V2z3+4non+}OKTZ~4FtQ|{FmkDa*C0ExB|l;tBN1aPIDs5&%P|HF zv8j`gU{pffrco$qC~aw*^o2-TYVxY{ zC%I`#^Xu=|`Oodm&d$z!`_1>7y*U^FvOENl8Qi|De`)&rmjGrnYX>)P>nyJS@-^oG z;~}2!-g5Qe_63hVRswoX@%-`~eH(|~zU%(CvOViUU%hGH$brZciCsV{$$O66bjP8B z(YJF42N-1g`8OZ9W#5NBc;XQteVo_tyJhcPH-D=C@glE}0fqjt(!Rr=_~;b-iuIA8 zGh?G8r5CS!|5CPHAmfd(BJfxs!Sn4rzhG?Np~IV}W~O=m3O|Lt<2Q|L?;P9@teE2U zpWQcd_&{KPAj@lqd0yB*vTyWTM)zldqV#|I!1!&4c7?8eAD<`6>%V{C;OK$3J+Sx< zq$k7kUI=gaS$yxa-?<^(`(0#=cGlp@54`tA`TpbN)3?vO%qAyPy@`O-GVvbW(m1WJ ztDf{Vee72?{pd$bRRj=)g$A$-<33em8jFn+2(jXe_zY_N_mA@7INtkDSDnw+e^oo_ z$JbYldwp%H`kD1vs@ie1{$|54nwy*D^Iu48JWFC<2Glhq@k(@tb1m`~Q*$3joaF=o zUQO~?M^J?bDhdH)2nr0W=dpo}ktdKnnpZAb^Dgu!x{& z6Cw`<9$N`u2?4Yb)Gz|LkN_?sfTaX*F#%jc0LuuG&P#c0CxGPy&_Mv51kgoLDG90` z0dy0Ut5CQ6#XxU~0*g^nrB7m&~u#Et=6TmeDu!8`uC4eCU z7$$)02;j{Gu#*6;CxBf9a05ZhN&q7Sa3cZSL;xiM7$tz43E&n27$bl^1n?FDxRn6* z62LwJ*iQiC1aN==-bw%m3E(yYI79%q6Tlq=a3=vACV;yL;BEqV8vz_4fTIL(4*~oX z0URTMw-dlS2;iLra4!M8ivZqD0QV8VaRRuX0450FrwQNz0(cJrJV*fVC4dtI@G}Ih zIsv?o0Dg`D-cN{anB?&T1n>|6{5%0XOaLDwfL|bh4-vp41n`Rl@F)TN5&`@&0sIO9 zJVpS&N&vq`0KZNEA0~j05WsH`z;6=3ZxO(66Tt5fz~clkMF39_z()z-V+8QK1n_$V zoeDu8L;xoV;3)$5I01Zu06s|opCW)y6Tlx3z$pUwLjpKWfF9#BJbsn{{)hmcCg`#V z;0yu$2?6{m0sI*OJVOAVBY;0AfWIJs&lA8G2+#|Ck;lIzfM*HduL$5d0{9XEJWl{$ zCV;;tfWIMt7YN`h1n?pO{4D`|l>p8Xz)J-1H3IlL0sI{Se1ia9CV+1ez_$qC?+M@^ z2;d(H;GYQK+XV2>1n@5e@UH~$9Rm0_0{C|V_$~o_j{yFI0A3-0?-QWEoaXUA3E))% zI7a}l5x@)~DZ|fTEEPg16l0Dtdy`b8%2iU5W;*$=0r9l-6=#k!dy`b8%T-d6W;*$= z(Ya*92!|8Q31)ASifp+`O43Xx|24X(dg&|4oMiSUsi-ekNlBXN`hY9P_B}aG}Fm{jqb8h`bsgUn7v6V8p~Bul4d&juhHo?(LqPk%xPwCl8UBsm6W8J zPX22YjArR8!<=FECaGvHS4l~l>Eyr00AM~thFF$4%j`{3F~3|TC26LU{~E)H7U`>= zxt`gZq@tx6uV&_EW^a;;3(8eel4d&juPHlb^2iUPWJ8@V z;F*+OKv?;h0^=BI<6eG*crBvp^dZW)HqLl9$v8H}_%);AR#yW?usKGqjf_~E7^&tN zp|&tGUC4-ZF$#=AmoWOgfKlf~j5aT3l(~%2Wji}qZgjlL)i*DUP7HSzrm$^j50Bf2TBoexmU3})c=!tTlahXT3!6_2 zvxm3XJ@8vqb)I9Rbo&6QzG%zPn}(*2^|ee{eZwuSt%bEyr?w1Do$7089Uf+@Oqo(r zd~{E>qsXO{7Lz3ye((3I6Oh2e<_>2upqTkF)ZiHVj8K8JmN5~r#v3{+QGb_H3- zK7^$wjbmHb8Nb?ETNIC5+geHIurN8-KCo?QEh%jsUe3TPeyLR#jYcBja42L@_Ko)l z*Kq$xyVbcg0qJUU;M`uqnR`+)HX3j}AI(yIY`RPnYh-0xqYP`b7ta{&(`OiFvO}gxawdUMYpIb;T6N&F1`_dD zG!mAQfkfOyENX@$Va0LNAz-!h@ExuMDcejik#sX5shH5VvTbGe%I?Ot#_q|Z`TWsh zF@Gjs-Rnp0-Azg&)!)l#m{hQq0@$eI&Y!&_*`V z@-3xR>!Ia(Bbr1CDT<-alUT^l3VzmfcCF}%v@KoP)7_Ldyx&W8{bHl`cawd+eBZSA z)_6lP-H>K3#uvqzOPK1mdwE`n^QJz2I}2>s<#!3YNdsl%0=~>p3WbgJWCa$o{>?de9=X3 z4i8vY>iMlTuLgqQbSfAXeaqEH%&?iw#LOrkELoSVp?aN7z2}e|BB$)%{lH`LX7V%sgLHsdsEe&c0NzlS!>J@4F`HRir- z$b?ePJm;RgJDQ&s3oCOkR+c2w&q)&Ac{Dtonp?v;?NJh5pMAYGT+uFCt~6X8p`Y@4zbiH|M=#KV4_jM|1q-Z&XqlgHZkpHFP)m1cVN9hy2{Rsywltf8 zd5varex7<13Y$$0l#vkGsbrucn!R2X5@l+ttw)YdIrv^9(K+Nqw5+x#uq8Z~p(~ihMrZ?9L&7`wKH5%Y>pP1l5F6q023pRQ zFHnMBQqSR%bMa-jS)E2EV`Y^mtJX}~igZ$37#~c{91LetntD};Bbw=1x%c00Dm1xlDuUxXF{q6beF}-jwYWv$@eU`!{F4v@quC^v#NfN8+Iwt*(-5m#l}V4Q7xlaPb8U$nt^ys z#RGn0T+K4~Y}blvwE=Ea0SZO(tTJ2E`Nt>AajmwwcUWCo5=C38C6RG~inD2HCFH6O zQ|5>dyyVpuMknZ&8PyDo6rbMnhsmyloLz+NYQiM7%Eq8n8rR>iN~ z4!_*oaz!A1qf#phDVvhoOD17eBjdYi2|$=j)2(S#%k1#S5%Zji(Ql-JX~X@ zalp}&8ahJO)`{KI@m)>ss$jHCi{o0Hho8$_3y+nCXg<^038za8J6-gJu))e3;jk4^ zoKXCz!SRX_aYp9L1UK8m4%?}b3^}IH=rN2FoXL_-Oy+mq7>Fx!Etw(%7@W1P8Ltz~-VBv$gyod|C{nXnmF2{mSoG|05F zB@NY>JfTh-2OTyaCF@Fjkx^0(TJ)+y+y50F)~VHWk6umt*HW=)Fix9KR%TO-f->nj z#IGC*`K&=D{t4AsQFUv5pv@I)Ad$0{N(p~x5_It6wh6BHCAs>!qh!7Zh;VWJzY`^k zqqSFqYDs8E$@Y5CYv&g^?@Jsj&vlIAtr&VIC{~i{vM`Qq3(aQd#eWWz2Kc`5jF?fE z9Zldy$9IZ0yZtBMH!{$W1-y4`^^U{hg-ZECnc^S8rc!UR2xrYMY_>UN^&{{u42njOu%fc^T9B?ZNfB^oJZ%1W1OQB&vO4&VHj0zR3^r6Xo0dvf$BtD$goHCtiQn^?Tax zC7^oY?*X=7mZz<}da1pHuGnGvXcskMn-ZBeHDR8WuKPJ;t?S%bO@WRKysJ{T9p*m9 zImWDv>sl~Y*>UIoa3?#G-$MAzyibYSTF&I+A+Zb=_~s}ubMXZ zGQ;H`L!NnY=o7V7iv@=lw*ROeGshbaP1b zM{!8azw=haA2qxCkht0DLvu{`p-0vde7@M$xnE}Kze9t>opWSO;~mD=0}BF&0?(QA%|qt1!DR4w z@SCA4LXU>N5$*^d3qKucj_iyakDQLyNBg1=MxTilV*6vK;|t(#sd#EhYF%n)>YmiYsZXX}NWGR`l3thIl|GVw zDE;yDOPOHi0!34!p>#dT@D~(e911GSZ=&%mxIXhUm|+;L&yde+2t_HogCc=#yHAD z0n09v&cO3_nREueZI?-B;8nX!I?Ww+nRJ>*>@w*zAK^~mqT1!Y0tN0TALq{OgFF_v z&wPY?tZ(7*E`AD}vjTS`9aMX|?_`aX+F5ra_h295_g>yL&b{0PbzebUAK|af``E6) z9pHP|Vw5}Ubx#|(JAFO(qi=@Akv4NT`bMl_%^+J`&GU`i6?GNQx3m4VJl~{tLv7{v zID6c~9pWSGZx#1d)oP{3@V3=;b3g4!`FU%PUZ@(si`4dzd%Eu;cXM^9-CZ4Jo;v-^ z`V1c_c6F^NY#85jaJ5z3an1U{j;l9sTy@p@?S*SMZ|YmSb<_C1J^M%Yu3BEH z;vIG^OI5>;$hfZCot9l4JzZ>Fyu71pMTbx-Z9F6Vzx=qg<;NgDv<4OXWgDQXuYQKJ z0k)FeTzYR~tv!tXU5m>p&F9;#Xq9&<_ETFo@V_X7)ZI8-^n?|9ep|quK(ib9WsmZIZlTx)MZIV(#T0&!zhNO?QO`DXc80G)X?%wU* zuH>dE&9A>-=RdbMJ3Bk`?Kj_R=JsaR1Fv)e8Uip=(E8SJQj_AqHr=YRzf?6(zVqz8 z%k8?#_adyvmDr4(DBxNQ;%f9@6SlKKiscE6V;>G+1p8UD0v%{W7mo!T<)?_tc;11v zJQn#aC1B+|Jr+Fuv9S=B845XZJ1+Fu?YU zZ$5a-_=i4t@)00?g4gf6W&d3_f2!~CBCn4Dg}$-U_>oV1bees|dPvaB*yu><#Vg*w zifxz3cw?*xJQhgsd?(K@7#lx)WN>01N`yNPwpFN*=EwKtoDBr!n2c zV=n=`k>Jb{pvm3L;}!zwCus2qU@HOYm}uD`0c<0HHxZy=7Sp_g08O^op=$_W7XcdZ zYk3?ZfMEi-jsV_F0J{m`dIH!(05=e{tORJ{M|ixE0B$0H5&?`7z|9133jvG~pj+6- z<68*eRswVp`*|EEK$mfV#|Z*BNC0mofI|du8vz_9fZGY+4g$E70FDsAT?BA90lbX> zUCvP+j}gE<1n^S?aGU_%P5|#9fOitWy#(+s0(dt8+(!T>2;hDKm?VIoCV&SB;5`KJ zAOXCW08SFX&k(fg1n@or_&EZ2KOweZipLKSz(WM^^91lP0ep}Eet`f!L;#Nvz%LTO zqXh6v1n|oQ@GAuH7y3j}yQ&0X#tf zA0>c~5y0;f!0!=sDg=EH0h}U$rwHKV1n>z0_#^>*iU2-M0DnLLrwQN>3E&I?dW_HT z_*nw@BLaAupvxkF83Ond0{Bw`_%i}{h5$ZC0Dn#Ze?b7BCx9;ypcncgkAF!3&l132 z5x{c<@FfCxo&df~0DnyYe?tH-5WrUm;6(!XTLSnh0h}d(mk8i%1n_kN_&Wml1_8WG z0N*5lZxO)X6Tm+Zz&{eeKM}yU3E-az;9m&fUkL_b1n_SJ@b3ihT>|(X0sIHS0FMB^ zPk{b%mdF1jfL96N909yW0CR+-3_k<0R0yF^j5)^aPEwI7S4l~lnaO(%h^M8mICGrY zoundNu9A{8Gn4lkol7>1a5%x7V0I^|$d;?5B+bm^y+#*RD}5!Ilg#cU6}9CmDM>Rk zd9TsY)kP4A)G*gDyOUJZm8+yA&CKMzMt4~+eWjRF%&|bhB?FRPEyfWu9A{8Gn4lk1AxU08Dd%HEVDaF#o}_6 zl%$!Nyw?~;G)Z5z%(cw!Bo$5NDk(`bGkLEu7+K07CZ1!?F}ssgEG<__Nt&6-dyOH@ zGU=<1xsKVLq+(gQN=nkqOx|k@j0y~^67|gW%sdYq?wt#*BD+kOJ9qa7csk& zR5X{Xq$JJEXd=5#qIosxuE!#32D z>J}MAUdrh4GDeN-87*GUD6yN-;T4Pu4Mu}kG76N%bT6a6po-xnk{0?49AP!@cr#z_|?+fqG=xI|JrD}=LRi-VnkXQ8?`ZF8#D?zn?#wyKT6_07 zo}BB(+74~=n1qJW&0{0e#`dB0*{-J$ojbjLxHH?CUDcUw$sN4Dzh7&8?b)1Wj?LCu zYt`5sEfCN`!2rkQ*x`^)D&&E+^Ny|gjD4||ZH}yKsh453*5ZuTIy=KKlN~ZmkuwR5 z8mqKq(x?HSHIRtMqLHwaG$i6WVo^OD2`i54HUS&#hi`KvNZDe7j---Rnu9kYCg&)!)l#m{h zQp{WXJ`!CTF1B?(bD* z{c_F!yTQ6%zHe51YrL+Qu1hl)reG*}65eP^kZFXd+_C#K8_&$773xKyjH zHF6LR=>adVvKeJVqUn?#3X)esMp>K1mMp+4i&GYD8fu+6=~OT(`j)GW=wUsZiRn>3Sh6PRqk8QP-RByt zsTO-^^V9il+eUr9Syt4SpP+L#e|DpEvk$0%}~`(vdNrObEk$)%{q9qMX5vFw&q>v0-2uko^` z-$k3rJ@?$}K676-WI`!to^wy$9m~&(g_XG%D@&5;=OhX5TpFHEEv(_3_9zLj&A#3m zu4or6R~jylP%<@K&An58UswH}Em7)3zbiH|M=#KX4;$OGB}yfQfwmyZh#Aywd zxU8mSIYlZ~k*{Uzsm!KrLHmpS%7$82bOAXLE%WyTmW1arbOrO+2-Cp%NO&9fqpei7 zzVmnju@Me$V9L4j1xnCM>Ny;8F23wGqg~5njI8ox)tX6Lkxq&WcN&b#`is?3FmOV&fvt zsFu;IE0Rn^^*}tP;sLKQu4b8Yw*8`7(*W120EHrXR++8Y{Nq#QxYo3}cNiU}B#O3F zOCsX}6=&1ZO2}0mrYsO2xXJSuMmy-188sP3-zqF)a`>_YZZcMyK2=<3CGzG{DNd?o zX`n^I&?25F&n09e$iNqHou(Qazr3rqv98Zlue2Ml1W%q&-iXu0ubiXtRn`Icvr^;Bc}y} zMhLQIs;f+aGkM2i^q)w?Nr4wkQmt;@Xkb)=c!N;LflD3-03jM3l7ilOUAC)a`BP3JN-C^ zgGV}&=4#X%rgAPS(_ssQH|+2e4JE8jPfjDiYz3yKjjzxdjap52nX75A_?1H;k2R>oKOvtLRi~*Bw7FspByu*TQogd*)^{)asEW=LL$ zTU%5}A5XxD$KNN5b*o5_cg<((;W{h+5p5JrRC*}hnPrcEPGiDo)zpelm?m@R<0~vu zE6%ffgF~!^FiA?h%%T;d#e7zKmK9b@Q*)ZhP%#xW#NPcPM_emAg&r@)bpUCW9hV<+ zpU|lbnh%-eroBffZo}LmlwCsEAmqo=P5C__f@_TBZhJtQRJ`MjEvvk%J)wR-L9m(*H; zImdR#l}-+c{wNNq`L}mPyiv2W4~d)YK1`08eV8Mg5`4bc*1lh6>AypR#GMOsK;}$z z*)JHZ%zv)@Btl8j=0;`fQnX{wyRL17sdX>J!NkfW!v-MbPf#|ZWGd}L$ zA;LcEUP!%` zUXkui?@1p`Ka~D>`lU=TbAh6%UNd!7PUPKNGiiLo$36@2T_AZQR+7$lqUB9iNkOdC z7MVr<+hK*)ZI#0;@3A<}cPq8yR+&M(_KZ~yAfkQAD(hIIy=aw#$njqy=In=%4J@rOvi?TCgMFCa`+3&{-{mf-`wHs% z2!CxJXS)L50N=+JqkOa8>}d<%PT$P;(Fb90q(Q!oz7-o;Gr$&C@q8=ait_twk^65& z>-k=lUn_GAcU!Y=;inxbKd=Aj)qg`e|6iKyew=@ga?$mXVn@f?!j_4Bhb9VrBZqGp zxof0ww9tEKbo9=VL!+&Q8*e|%e+Nz6S{ON8IK+PyjgJ;?-nW0Wjg7VpZr(m<^bPLZ zx^eSB+f{>G*I&7LXW`nxt9v$Wzj|VP-+__+>(^AOc!yQXQq`~{GOpuxyJbgPR|i`c zFKg>q+a{Ds8`lW`FFy`#`7y{3twF_pSq7-;tB>JqfUV?hF7w?+zjqkDZ!NB&E}rjg zMWg(dVjs143*R3bpzdBx4c^B8oNVWRO?L7>CcF6Gk|F-5 - -!"#$%&'()*+,-./0123456789:;å<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` abcdefghijklmnopqrstuvwxyz|{}~ \ No newline at end of file diff --git a/src/client/resources/fonts/8-BIT WONDER.woff b/src/client/resources/fonts/8-BIT WONDER.woff deleted file mode 100644 index 5902288477f0bc4664db24fd823d3875c42282e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4892 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 diff --git a/src/common/haxe/ru/m/tankz/config/Config.hx b/src/common/haxe/ru/m/tankz/config/Config.hx index d0b1a2d..de6b6cd 100644 --- a/src/common/haxe/ru/m/tankz/config/Config.hx +++ b/src/common/haxe/ru/m/tankz/config/Config.hx @@ -14,7 +14,6 @@ typedef MapConfig = { var cellHeight:Float; var gridWidth:Int; var gridHeight:Int; - var bricks:Array; } typedef BrickConfig = { @@ -31,9 +30,12 @@ typedef BulletConfig = { } -typedef TankConfig = { +typedef TankType = { var group:String; var type:String; +} + +typedef TankConfig = { > TankType, var width:Float; var height:Float; var speed:Float; diff --git a/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx b/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx index 64827d3..dde0f4c 100644 --- a/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx +++ b/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx @@ -20,20 +20,10 @@ class ConfigBundle { return raw; } - public static function get(type:String, level:Int):Config { + 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 bricksData:String = Assets.getText('resources/levels/level00${level}.txt'); - var bricks:Array = []; - for (line in ~/\s+/g.split(bricksData)) { - for (c in line.split('')) { - if (c.length > 0) { - bricks.push(source.bricks[Std.parseInt(c) + 1]); - } - } - } - source.map.bricks = bricks; var tanks:Array = []; for (group in Reflect.fields(source.tanks)) { var data:Array = Reflect.field(source.tanks, group); diff --git a/src/common/haxe/ru/m/tankz/config/MapBundle.hx b/src/common/haxe/ru/m/tankz/config/MapBundle.hx new file mode 100644 index 0000000..66f1f12 --- /dev/null +++ b/src/common/haxe/ru/m/tankz/config/MapBundle.hx @@ -0,0 +1,22 @@ +package ru.m.tankz.config; + +import openfl.Assets; +import ru.m.tankz.game.Game; +import ru.m.tankz.config.Config; + + +class MapBundle { + + public static function get(type:GameType, config:Config, level:Int):Array { + var bricksData:String = Assets.getText('resources/levels/level00${level}.txt'); + var bricks:Array = []; + for (line in ~/\s+/g.split(bricksData)) { + for (c in line.split('')) { + if (c.length > 0) { + bricks.push(config.bricks[Std.parseInt(c) + 1]); + } + } + } + return bricks; + } +} diff --git a/src/common/haxe/ru/m/tankz/engine/Engine.hx b/src/common/haxe/ru/m/tankz/engine/Engine.hx index 1a49ac8..ea449ae 100755 --- a/src/common/haxe/ru/m/tankz/engine/Engine.hx +++ b/src/common/haxe/ru/m/tankz/engine/Engine.hx @@ -122,7 +122,8 @@ class Engine implements ControlHandler { case TankAction.MOVE(direction): tank.move(direction); case TankAction.LEVEL_UP(level): - tank.config = config.getTank('player', Std.string(Std.int(Math.min(Std.parseInt(tank.config.type) + level, 3)))); + // ToDo: + tank.config = config.getTank('human', Std.string(Std.int(Math.min(Std.parseInt(tank.config.type) + level, 3)))); case TankAction.STOP: tank.stop(); case TankAction.SHOT: diff --git a/src/common/haxe/ru/m/tankz/game/ClassicGame.hx b/src/common/haxe/ru/m/tankz/game/ClassicGame.hx index 9a13d7c..ff2cbe2 100644 --- a/src/common/haxe/ru/m/tankz/game/ClassicGame.hx +++ b/src/common/haxe/ru/m/tankz/game/ClassicGame.hx @@ -1,5 +1,6 @@ package ru.m.tankz.game; +import ru.m.tankz.game.GameState.PlayerState; import ru.m.tankz.bot.Bot; import ru.m.tankz.game.Game; import ru.m.tankz.config.Config; @@ -9,14 +10,43 @@ class ClassicGame extends Game { public static var TYPE(default, never):GameType = 'classic'; - public function new(config:Config) { - super(TYPE, config); + public static var HUMAN(default, never):TeamId = 'human'; + public static var BOT(default, never):TeamId = 'bot'; + + public function new() { + super(TYPE); } - override public function start():Void { - super.start(); - for (player in teams.get('bot').players) { + override public function start(state:GameState):Void { + super.start(state); + for (player in teams.get(BOT).players) { setControl(player.id, new Bot()); } } + + public static function buildState(level:Int, humans:Int):GameState { + var state = new GameState(); + state.type = TYPE; + state.level = level; + state.players[HUMAN] = new Map(); + state.players[BOT] = new Map(); + for (i in 0...humans) { + state.players[HUMAN][i] = { + index:i, + tank:{ + group: HUMAN, + type: '1' + }, + life:3, + }; + } + for (i in 0...humans*2+2) { + state.players[BOT][i] = { + index:i, + tank:null, + life:-1, + }; + } + return state; + } } diff --git a/src/common/haxe/ru/m/tankz/game/Game.hx b/src/common/haxe/ru/m/tankz/game/Game.hx index a7d0fb6..618609c 100644 --- a/src/common/haxe/ru/m/tankz/game/Game.hx +++ b/src/common/haxe/ru/m/tankz/game/Game.hx @@ -1,5 +1,7 @@ package ru.m.tankz.game; +import ru.m.tankz.config.ConfigBundle; +import ru.m.tankz.config.MapBundle; import ru.m.tankz.game.Spawner; import ru.m.tankz.core.Entity; import ru.m.tankz.core.Eagle; @@ -25,15 +27,16 @@ typedef PlayerId = { class Game implements EngineListener { public var type(default, null):GameType; + public var state(default, null):GameState; public var teams(default, null):Map; public var config(default, null):Config; public var engine(default, null):Engine; private var spawners:Map; - public function new(type:GameType, config:Config) { + public function new(type:GameType) { this.type = type; - this.config = config; + this.config = ConfigBundle.get(type); this.engine = new Engine(config); engine.listeners.push(this); } @@ -53,13 +56,16 @@ class Game implements EngineListener { entity.rect.direction = Direction.fromString(point.direction); } - public function start():Void { + public function start(state:GameState):Void { + this.state = state; + var bricks = MapBundle.get(type, config, state.level); + engine.map.setData(bricks); teams = new Map(); spawners = new Map(); for (teamConfig in config.teams) { var team = new Team(teamConfig); - for (index in 0...team.config.size) { - var player = new Player({team:team.id, index:index}); + for (playerState in state.players.get(team.id)) { + var player = new Player({team:team.id, index:playerState.index}); team.players.push(player); teams.set(team.id, team); } diff --git a/src/common/haxe/ru/m/tankz/game/GameState.hx b/src/common/haxe/ru/m/tankz/game/GameState.hx new file mode 100644 index 0000000..fbd018e --- /dev/null +++ b/src/common/haxe/ru/m/tankz/game/GameState.hx @@ -0,0 +1,24 @@ +package ru.m.tankz.game; + +import ru.m.tankz.game.Game; +import ru.m.tankz.config.Config; + + +typedef PlayerState = { + var index:Int; + var tank:TankType; + var life:Int; +} + + +class GameState { + public var type:GameType; + public var level:Int; + public var players:Map>; + + public function new() { + type = null; + level = -1; + players = new Map(); + } +} diff --git a/src/common/haxe/ru/m/tankz/map/LevelMap.hx b/src/common/haxe/ru/m/tankz/map/LevelMap.hx index 554353f..ec59d39 100755 --- a/src/common/haxe/ru/m/tankz/map/LevelMap.hx +++ b/src/common/haxe/ru/m/tankz/map/LevelMap.hx @@ -28,13 +28,18 @@ class LevelMap { gridWidth = config.gridWidth; gridHeight = config.gridHeight; bricksMap = new HashMap(); + bricks = []; grid = new Grid( Std.int(cellWidth / 2), Std.int(cellHeight / 2), Std.int(cellWidth * gridWidth), Std.int(cellHeight * gridHeight) ); - bricks = Lambda.array(Lambda.mapi(config.bricks, function(i:Int, brickConfig:BrickConfig):Brick { + } + + public function setData(data:Array):Void { + bricksMap = new HashMap(); + bricks = Lambda.array(Lambda.mapi(data, function(i:Int, brickConfig:BrickConfig):Brick { var cellX = Std.int(i % gridWidth); var cellY = Std.int(Math.floor(i / gridHeight)); var cells:HashMap = new HashMap();