From d0025b3de66ec10f95fca99874fafb23880a3f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Fri, 13 Jul 2018 16:15:01 +0200 Subject: [PATCH] WIP --- TODO.md | 2 +- data/stage2/image/battle/hud/grid-invalid.png | Bin 0 -> 2205 bytes data/stage2/image/battle/hud/grid-ok.png | Bin 0 -> 2081 bytes data/stage2/image/battle/hud/grid-power.png | Bin 0 -> 2122 bytes src/ui/battle/Targetting.ts | 39 ++++++++++++++ src/ui/common/UIBatch.ts | 50 ++++++++++++++++++ src/ui/common/UIBuilder.ts | 13 +++++ 7 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 data/stage2/image/battle/hud/grid-invalid.png create mode 100644 data/stage2/image/battle/hud/grid-ok.png create mode 100644 data/stage2/image/battle/hud/grid-power.png create mode 100644 src/ui/common/UIBatch.ts diff --git a/TODO.md b/TODO.md index 71acad7..0a28d0e 100644 --- a/TODO.md +++ b/TODO.md @@ -5,7 +5,7 @@ Phaser 3 migration ------------------ * Restore fullscreen mode (and add a fullscreen incentive before the menu) -* Fix valuebar requiring to be in root display list +* Fix valuebar requiring to be in root display list (use tile sprite ?) * Restore unit tests about boundaries (in UITools) Menu/settings/saves diff --git a/data/stage2/image/battle/hud/grid-invalid.png b/data/stage2/image/battle/hud/grid-invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..0424653adfbfe819360b7eedc2e291eb73f85e21 GIT binary patch literal 2205 zcmV;O2x9k%P)y zAsY4jZ{A!tH7!k$2x18UZ}F8YcSmC@8_i1Kve*w{q`N$!kvcD8Tp=(voF7hlB~ zgPA#Vo=U4dD2ZZ4g-%zwBN!A%vLQ#~SeKQRPSNx(nNry*a-0w21d-!>GNrPGqUl|_ z%*^!B*bGa6F`FN~B$vM-Qz{d~!5~w5{rc_kBC!7Y_1ocKkdY~s((906F@j+wZiW8jyZu6j|bH@8?FLkx6k)BMbq6Xt=0tqVZHttlgex^ z`DoQD>4?pC6abtS3&tBvZY}`eu+4VlqgAUU#$vHQRSpa|cu%jN5|fzt4#%<&9yT`q z5&%lv?r|qzzj_q_5Uj6%gJao_n8d_)-q-7=d{^iWA+UFlgSgbx-^gQPriA?dU1c2| zT>~*X5nzl)?D*!Ju23MbORiRHHL0n;1pvF(i@n1c9-coR{h6O%y?lA^(Sm}@m}DF) zD5$AkzC7$O8W#XSRsR~FIDtx|5o>E|uoFvRzH!~% z8wH+M#3m)}*bb=H)zl1G&tn4d$;kkK@7ruYqvY~JJ`{S7h(@n5d3h)uL63|FO5JWa z&1MiZUB`z)`zg8nTsKEp4U1^Hxz5-wZZ3 z-UEQ*aj5yD#hRKL06?I=zF822UkTCZT+NIbD*?cM?b^@~a#^i86isg;fWL=)zQ67a z21RFoNu5kEW;1qmcZ(sv|1ShVT%;6=O;ve$IRn2_0Pwr)Y?WH4+e*^(OI#>aR#IDg z1pq#4ZJl%iXWQBU0O$Swo<+&Yy_8b9hNLL|2Ws`DbAdpV+y+3EkYJ?b^39Sco^Ery z&yS=(CK}GUa{&PD9?yA66ssw@e4|>YGuZ)_4HC zYHQ&z7_ggVS=R4&00@bKz~toSYDo|T4@uh3v+Odr+x<@fXpN1<^M+u>G%+dq_|0Fq?HGL6nHmXhUgT-5LBJz+o^fC1tWKNRo@BmC7DP zT-?HVz1~role6G?U;Lr$?EHAWo>9cbEuxglZt~%sJDey8Tlh#MNt2RN{3cDy0f2dq zLTR86c}uO9Yg1E8_;5H$j7GO~-MYn*+gn=^YHz7ul}yrlqOce`yv z!HkT@eMpMQw3MXjB9Z4Awxi?UTie?~o?N^bo12=#(Qud%dA?Jw(X408<|F{}OO>ZMC(ynvKL(;)3051bYYjsYU;^PK|V zrew16nFd4h^O6He217DQ)8z!<3Hf}dT!84x%fouN`;nL<#76_L4L5Gw4+n#X>DXAU zM3UPM84RRz5}KL8LXI&QNP-}?(lIgG@WY3PH{Q6>3;=x{9sm6!p$Etlg@u3naN$C! z%4*G;?A>=+tyv!~TqvC=EWDuWSI>i+dvfqxhB29N8xXr&THdAA>P||fs(RdVPGDJO zva`Q!YSii~TCMKvZfU6q0;0og9x|62GL^7hC!0oB92cV7?6x5t9D(bGx&dwiii7_w@uguBGuP!R;I$BUr zv!}mneCpw@(_}(9An?7t>!Xo~Ml)kZ*^dF4-R;KSagZ2)TDcN-j|WQtN|TaOCPX4} z(caz-<$%BpQ_8=SKuLe5iyT+av+M^lmFh2yf!0vX#X|a3{fUS>Z|0ts+rtj|Blq6gztZfe)gB z5K+X$`~(E?kCNKjJ7adudgis)uD_m00000NkvXXu0mjf%{M7O literal 0 HcmV?d00001 diff --git a/data/stage2/image/battle/hud/grid-ok.png b/data/stage2/image/battle/hud/grid-ok.png new file mode 100644 index 0000000000000000000000000000000000000000..3ddda64dbb15e8da15b0885900446ae50c2fd4de GIT binary patch literal 2081 zcmV++2;TRJP)@eW z-h_r40A=I1r6=mV39sTsG(xXqlL6#QPUUZsOFkp$BWWznCJ^!QrV0%jqH@%&__Wiy zdYaaOdK4ONgb}?v5qSWU9Q_rL83hY|KoQjTo)KA2`st5Hsy6myX@0Ab zF*&;YT_2(XeKREhZ=$cu-}QlsH72kWzil*!`-gK_ME-*(mbPRc&1@JFJoQe;nXI~z zu+BQVsG;D*(u-6rmI46krmzBuFarRR^(iGh&4=6Fw|@>mU0b;nO6l|qP)dN+|0n}$#6(E;tzy|2@Y}q>^N|f#w`VRnru4eX$ z>*As83b_tME!n6ocI%Iozzgu4w`#&RO_G zf)d0ESqsbI=AabnPB*1Li9JZYy7LaGp?eAdw9jH+GM~$M3Lv&dm1uqcf83XG3Badw zxB)K29?@(mWJ)v!NP^gDG8lS&AN#LpfBsqs8S1$lj^dvML0stcc3;FXXftu+-v3<$ zpb=W9yZa)5^Bm1TXV}N(4F3)Qcn8b^OX~A1&93%@2M&jdh3lhNW-c+z;R3?s6GYg^ z7&q%kUDUVIe;F5`kXQ&LS`zYk9luRcm5*K5-G7fCrSk{-<0sM;_eEJ%&ha{aYmzk~ z4**E^HOio>%5DNgxZT(OA>KoT*-HYY^GLvMfT<&aCPZ#}Z~mSD5mHoTH(Ns)X@VeR z73yyWBfbH-B$lX%OH|A^h!J(jDO~d%@|CEX>L3V09-E@oVBUhbhn*pGwS-wCut`?5 z+bG9h@&ABoJVsMQCZXUXQm-=#Nqq8}6{*Y0us7y6<~8=Ba7F6!vLt=d8a-zSlY@5y zk__qHpcqKbP0W58uR!-dwt605n9GZx^AfW+2Sk6etjO;U-VRD6_5-edcZVQH-sfoU zaeKaX&9JS0dmgYqK4S6h1=ckz&3z{#M}F<{xI6GufZWi$45&iX7a2S&Dp7x;-ti2o zVFv(KPt7@h#uGOSHLyAKj%P$A>i0zln^B2q;~#$ls;%HIa2|+uh(5zgJ;_tt(+ov- z1~P&-lsZkDYXQn<8t@~KY3V8J3_AS}!&3OYuj&WBKma)RKnqCh0T?F$Q8+Gb^J)=q!dSyaFU0HQ+~`|{A;kkgoTXvy*1fAag-#dAIT zypvtLIy)o%DJDum+8@#@`g+VyZAF3%A`3U_B(7Vkm{%)W{s=<1m#Pgeth3ITW> zrc6ubkHeDCK1Ry`pK^zxaCQ$?>X! z_pFT$Et7Cn{6k-`w`Gwfb0aEaK4~T`2066CmH1YsC39nMu&+gE5kDHQDoBo79Xk!x zA02E6ia}GJBYQh2kZLJ_-^~E~w*j?0Hgv8ddq+?Tn*C8<1Dc_ZH)-D}V5p22mV{g0 zi1(C%F|IZ_4I2S~yEOe4gEPeXH15}LFfztRJ%Z<#f*9!-UGBVRxKARf*0}Y|ZGhO2 zq)$qAJ>1_a*J`2Z79fAB0p&=_Psw{VCJWhhTB9_W`$?D;KG4&Nt%7I7reGjc~oa+PP z|BuyTi;kpUW@uJFEeX3E4HE>SS|#3>q5TPv@yOmSXf6L>!nXef%)RqP81Lja00000 LNkvXXu0mjfOeDnH literal 0 HcmV?d00001 diff --git a/data/stage2/image/battle/hud/grid-power.png b/data/stage2/image/battle/hud/grid-power.png new file mode 100644 index 0000000000000000000000000000000000000000..60cab26922793ab6a2d8da24e3109af6a685d7c6 GIT binary patch literal 2122 zcmV-Q2(|Z#P)Bo0FLY`!|lpkE?ew502B-kRL$R1lA3+u zH+4tSgL&qjG_VmsLEj6d{vyAPRak*tpj5E~nC!01s#XIx_c0|hfl?)AFxU&Bw(45P zJN1=wBoI0ihPVWvu|M(vKn9Yasx*bh+9xaoXpVlXWnF6aiSq~p+^)>8$>uQ|4THba z()4Lr#^QR>-x@lQz|k>d;|P_PG1=B?2(1-if?@ERRI;`bDldzU85=i{HGK+To4Owp zl@~L~7OVN24mh0Eo^T0p%suJR{7vsO$reMXyregWdl#@7;Q4^tl{r~bq84%8_tCCm zw`(9l?+2_Xc->X(c5&VJk)%W|a=S98@O%J8_aR^mB7%XH$UMr-U8=9)w>wKbV)iRj z!1D)R0M7$v{q<4oEb$m>*Y&q4Gy9klnF|1GAAa_}H`P;@POYjrchs2=0CEvQxFK&2 z<~VoMx%Sejl{Icx=KOmqA=+IYwdK=CDb}&8xz^s&<-Pt30MPP`unW-E26J?IufN4L z-wnkQxB72~rr7|177ajv=q?Z0Y=4nSwivbR`i``PbzQUwLk3y|q%ExTsa*{_nLIk$ zWKCEN03xrSh0-PxDxK7e)hqsd;n;%R7-n2JwqWJ=yJTp6hVAl+8RUp|3X0X^Tq z{x=_y73G)eregRDT3rZ?9H`D0NVtdTmBhp zE7Ia+^Oyyk`x^ugl%+iJq2Xuhu$51sQ-i}Bm_hUWL20dSlU`MLTJ9-r_ZB~*8Kmcr!7c>s;) zTKgXy&gvVzpUiL~#KGaLZsD5u03jrf$&ueadw8ZPC}12QnW86CW?lk_!_AFXPXPc% zz}@e`*5IYlbM=g2@CwSzi)B;HBmf}p$}AgY)}4|Pm85nx{5UoH#5v_<3U$4}NP<#C zq2>v=U75*>HF3MHwlxU7^G6hb4v12&d)MwMxp*D`)JH}Zc>quYK~8&0E}rMQHxCe{ zLGHJ=Xd5wNLGEH_h})GJ0bsrXM!^|K%Fb&n*?M$fJ2lrv!5xE>DGuz1$BpK zrH**=hi9c)BPJC{N>n;!<}R9C>C#|`?OgZS6WZ&8fd;OxcV+-=B()0#Pl9py3INydt=|AE4iml?O78?@yt(a{2HdpZNk+r72W4#bgk|W(cnCKXB;p zR{&sD?Hi!@8K7*Y$lr3+(EOfCLP$MfrsreFjEfm5dmuV?TnwS|3jo}j-&6VXH?J8= zAp;7!y^!h`A-~bA2AU5tX>=qZ2T(#cS^l6P$0jey&gNeCfJm}HAm1I-5=&gy0W zP-A&7H@YGCX8_n;Twl(0@5fAz%%RLYzTZAHj1UC?2p!Ml$Q-WwYIYabmxqL5q0HQia4H^H@UQ2MeP?`0lVu^c9^*0`OIIC;F^~%&cEdCv1 zm20ME0D!OKUpoX3G<45pBHGq>LMjYDd8rWauJ@znkB-rbCGI7z`#%r(8g>A{ar4;$ zj23?y?1Iu3*0pJV&t4|k5=_>Fl>nfx3%`I+4$G*dl}xfFYJSh&ug^dGg zx}eWJP32nP#%aY8=M4Fza9Rvn*yDFn6ib{_3*0#U>E-K(`kD&TzNTYymz@_}_r1<_ z-)NI9DQ9&~JQeu>ejlC&UaSLN{C+%DY>7*`?vLQQ@Aaow{X_J1)BdY~(D5mRdWCD= zVk%i@z3_t+Cjgi~9(;>owgqGUaB0e1CfR0kt^IdGsF!<>JMT$A2#)M34&Xhm``Q#s z+*7p`Y4*UD!M7NJH5|3&(;rkUar3$E>o5$Xv^#g-n|>g{n;WmT*vC%XD}d)EIU)f- z)7gp{3I_O%Z2&N)&O5D2N>rlYfh0p{dvCT}8_=h$ehIKbfUg7Gm09sHM6%$4V}zL$ z*%Y&g5Ed~g><#YKZneHActB;$k_DhXHTy&(Ee!69|49GJ{M A-T(jq literal 0 HcmV?d00001 diff --git a/src/ui/battle/Targetting.ts b/src/ui/battle/Targetting.ts index d176e0d..797134e 100644 --- a/src/ui/battle/Targetting.ts +++ b/src/ui/battle/Targetting.ts @@ -27,6 +27,11 @@ module TK.SpaceTac.UI { impact_area: UIGraphics impact_indicators: UIContainer + // Grid indicators + grid_ok: UIBatch + grid_power: UIBatch + grid_invalid: UIBatch + // Diffs display diffs_move: UIGraphics @@ -57,6 +62,9 @@ module TK.SpaceTac.UI { this.fire_arrow.setOrigin(1, 0.5); this.fire_arrow.setVisible(false); this.impact_indicators = builder.container("impact-indicators", 0, 0, false); + this.grid_ok = builder.batch({ image: "battle-hud-grid-ok", x: -24, y: -20 }); + this.grid_power = builder.batch({ image: "battle-hud-grid-power", x: -24, y: -20 }); + this.grid_invalid = builder.batch({ image: "battle-hud-grid-invalid", x: -24, y: -20 }); } /** @@ -221,6 +229,35 @@ module TK.SpaceTac.UI { }); } + /** + * Update the grid indicators + */ + updateGridIndicators(): void { + this.grid_ok.clear(); + this.grid_power.clear(); + this.grid_invalid.clear(); + + if (this.ship && this.action) { + let grid = this.ship.grid; + let action = this.action; + let simulator = new MoveFireSimulator(this.ship, grid); + + range(35).forEach(x => { + range(20).forEach(y => { + let target = Target.newFromLocation(x * 50, y * 50).snap(grid); + let result = simulator.simulateAction(action, target); + if (result.status == MoveFireStatus.OK) { + this.grid_ok.add(target.x, target.y); + } else if (result.status == MoveFireStatus.NOT_ENOUGH_POWER) { + this.grid_power.add(target.x, target.y); + } else { + this.grid_invalid.add(target.x, target.y); + } + }); + }); + } + } + /** * Update visual effects to show the simulation of current action/target */ @@ -329,6 +366,8 @@ module TK.SpaceTac.UI { this.setTarget(null); } + + this.updateGridIndicators(); } /** diff --git a/src/ui/common/UIBatch.ts b/src/ui/common/UIBatch.ts new file mode 100644 index 0000000..1a6ace6 --- /dev/null +++ b/src/ui/common/UIBatch.ts @@ -0,0 +1,50 @@ +module TK.SpaceTac.UI { + export interface UIBatchOptions { + // Image key + image: string + + // Initial location + x?: number + y?: number + } + + /** + * UI component to display a batch of the same image repeated a great number of times + */ + export class UIBatch { + private internal: Phaser.GameObjects.Blitter + + constructor(view: BaseView, options: UIBatchOptions) { + let info = view.getImageInfo(options.image); + this.internal = view.add.blitter(options.x || 0, options.y || 0, info.key, info.frame); + } + + /** + * Add to a container + */ + addToContainer(container: UIContainer): void { + container.add(this.internal); + } + + /** + * Set the location of the whole batch + */ + setPosition(x: number, y: number): void { + this.internal.setPosition(x, y); + } + + /** + * Clear the batch of all items + */ + clear(): void { + this.internal.clear(); + } + + /** + * Add an item to the batch + */ + add(x: number, y: number): void { + this.internal.create(x, y); + } + } +} diff --git a/src/ui/common/UIBuilder.ts b/src/ui/common/UIBuilder.ts index d0ae2f3..c67536e 100644 --- a/src/ui/common/UIBuilder.ts +++ b/src/ui/common/UIBuilder.ts @@ -180,6 +180,19 @@ module TK.SpaceTac.UI { return result; } + /** + * Add a batch of images + */ + batch(options: UIBatchOptions): UIBatch { + let result = new UIBatch(this.view, options); + if (this.parent instanceof UIContainer) { + result.addToContainer(this.parent); + } else { + console.error("Cannot add a batch to an image parent"); + } + return result; + } + /** * Add a hoverable and/or clickable button *