From 1b3bcf32c1c810f3e68ef72a2d1ed04a71e50f8b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michal=20Mart=C3=ADnek?=
<96337712+Michal-Martinek@users.noreply.github.com>
Date: Thu, 23 Oct 2025 04:07:40 +0200
Subject: [PATCH 01/10] Made leaderboard entries bold for teammates (#2221)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Description:
Closes #2185.
Made leaderboard entries **bold** all your for **teamates**. Before it
was only bold for your player.
_Your player should still be bold even when is undefined._
Didn't add any tests - not sure if there is any testing for these type
of things.
### collapsed leaderboard list
### expanded leaderboard
### player not yet spawned
## Please complete the following:
- [x] I have added screenshots for all UI updates
- [x] I process any text displayed to the user through translateText()
and I've added it to the en.json file
- [ ] I have added relevant tests to the test directory
- [x] I confirm I have thoroughly tested these changes and take full
responsibility for any bugs introduced
## Please put your Discord username so you can be contacted if a bug or
regression is found:
michal7952
---
src/client/graphics/layers/Leaderboard.ts | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/client/graphics/layers/Leaderboard.ts b/src/client/graphics/layers/Leaderboard.ts
index 30e0539d5..8d6a32d6e 100644
--- a/src/client/graphics/layers/Leaderboard.ts
+++ b/src/client/graphics/layers/Leaderboard.ts
@@ -14,6 +14,7 @@ interface Entry {
gold: string;
troops: string;
isMyPlayer: boolean;
+ isOnSameTeam: boolean;
player: PlayerView;
}
@@ -115,6 +116,7 @@ export class Leaderboard extends LitElement implements Layer {
gold: renderNumber(player.gold()),
troops: renderNumber(troops),
isMyPlayer: player === myPlayer,
+ isOnSameTeam: player === myPlayer || player.isOnSameTeam(myPlayer!),
player: player,
};
});
@@ -143,6 +145,7 @@ export class Leaderboard extends LitElement implements Layer {
gold: renderNumber(myPlayer.gold()),
troops: renderNumber(myPlayerTroops),
isMyPlayer: true,
+ isOnSameTeam: true,
player: myPlayer,
});
}
@@ -225,7 +228,7 @@ export class Leaderboard extends LitElement implements Layer {
(p) => p.player.id(),
(player) => html`
u{@8)!;n_l&TH#Ntk2XNA#IAI$wVU@pAca5a~lRWic4iVET8U$b4Y z2~dimDpY&$lg_W~a6E_jixMM~rCxKKgFp~sZM#XSY=$W+G4=}N*RBV6zDgRg425Bc z4wjt6gdAFk)4M-g5g&BvDX^ElQRtJl^$#^AFjIETLh&1$r^m5{T#S1?D)O0BY-;2g zbt4`nd;3L2u0Y`RueD95NWj{RLjN=^1QhCHu(_HsH`Ad2q0h|NE?yc+B-?CoOT}5m znrQSbw&1_*!C+THyLg>Nc>1exy0vzs*GZHI{DFyK6p6EpIwTX~b_ONeXjeRcd_4PN z$G5A38nIAr%GKeZt&%Eq@cWEk%&kcE5&28klIn`_RXY s)Nyou%+0hSzF(Roh(#q?;=!oHY9pL^ZH|cG9A)JF!YM_u=S VQ_U=M8%Q zXOhc`Af)mN@~7)8dsO3`K3_7yUzLO|6jh`8r*7M9`8jHSpKJsg9i|Pm>a7qBLe~W> zzVzQ7`JCK(OP98oDbUj!kt)0;RaI+<)z9RuVbFeEd^pm?Ozo#7v?6YNrYV7mB8TRg z?C*5oM7~`gl1X2xAyTO$pNVkeS$3g%&8d~RgIWws*+L*$bbOC$tW+;&9M9ig1neB2 ze`!K->NNdQ(5k X?3)&!B=s0cW`}c(cwuH2Qv(isy%Y*Lk zVSL6x%ooO~_vmY?TK-wR2^iWaLMm97KiRBurYwtL8A20lF&$2$V83&=mDX$2GgKH= zP}cXV!q8E05PSy2muDuk09q*P^~G#v2;-kksI&Ktqidh5ABo)Wh1*KCSVb K z=8EbQmiQy2ho9`SbdULNk$4owgld67&HbL;Qxlw>>H5JlRaU}laA}{4MIPALH{a=; zrc5qpd(IpL9CT-hcehcV5`WG8Q!WD-ynHRaWORBE{9~t-cT&UM&L%X!lc6Z`id5HV z;ObPjbiQx-oEs`*hZW{+%nd~*P13`zkbqp_!_~iMe4p(XXtvfblcUhV@b62Cr7lEp zT2mJLEW<5h9F2}Qb|IsW6_kx5FvR)dOZGdK=^~VS)~$8st#i=Q|4Y&-PG4vS?@m|} zP8L$eJuNJQl!UT|VzI7f6{}W1CV7k<&>8l# YS9&_83{pS=Cv~?IV1!vw4+A}R zDT+Q0_ov#cgf2ZbDo(F^DMROwV2{!(TfA(tdFIbAt|W$2q;kD@Ec2hvrm?p3g$WsF zsQ(Ga;TkA4c9N>c #tH|U87c0_$ z5#~hKIJ>k3Cbl*{D*T0>g;qHeM%Z=#$)D%^7WkHeG3vO2x%6R@G3y_8K!|qD)eiet zPfh^ }&?_2<|Tc !yNT zhy}Viu-E)E;y~h09HvL-?3ApDQRPCkalBBW5X~0)cfL_>Tzz4nVDkk}%lR4C=oZ<{ z5lnmmx+ydMDi(EYr_EUh)SIxUGJ9^Txq$B 0}n~H9~Wf4qYvM< z0v-tN*Bsw2 Kl0| (RQ>%a9OXYEi-~ z@^`Jb{9oz3d_$)FNgaFPiR;~qljoS*Zodjo$7|WGlYP~(X#q-%@zCZcdl7GU29d=m z?0Ydl(mRop+}%hrYyUtHmUHk?Y&rbuMfFM6opsKWlkN>C^Hlo>o= <>V*kQzui2Wm;6VmnLKCF gTVqn2;~#fo>|&MFGzGX{rp{*9~T(MsUe$LYJ&ZTWJ1UJcQ7gSh^^JvK(Hz& zB0XhBZ6n9bh{On?d|ddY9Ohd;!--_+{kl9+?&LI9=DcE2P#)u)fx4c8C?7vxw_4<> zx!KZFHy))s-@|+sC_G`-%_pSeVKLp6_?qglLlN1^TRfKBlk7ovr<@kbL%CBf4D8`b zueZfy`WonTJ)zka1^h!V#^>rOXjO@c`fY#^bnY4J3x`?$SvF~7kB+5)%_A*$-8N#+oFC!K+=@qJ znYHf}hxLUzJQ%V~bLiP}uOmkZ YB;Eclxlcj(il!DL;eg#^+?Sk-KQ`eu^A7-f;6`dg_J!b;QLKWToxHbHJRF( z$sc~HQfd;&^lHha0BP_|)B6I!WZdrc1uhw>WJKQgz#MY;>fa3xS#5Jkp+Y811R{H} zKkdsx92=S8Uv|~1$jiP0?=mewe|)3byt NOJFaW@qnup7M@$`LAGkkE}0SPeDFwSjEx*+C`1q8b+Q$moJz_-Zu}Wu%)Q} zlcq+K#xgiDDSv~0+8J)x^ZH^dyInMDrtM>Z9lUGV(kkm*NBb#7;7*F?<~_Up;;iGZ zP6NcTzFs#SqpI!4b-7y}YA+T3#&W} Fr SOJm6x9rBBvVo!5ljT#h*I0(JXc$znP*-T%09ARy64gddM z0F*%RlvQw|UjHJmHVZvcDoe4Egq$An$prE<`a0790#$Wn;WVQ>7B7%TQnr|4oi6Cy z#D1x&;HA?@9=G7G_6FE_{fp3(Um>i*EXUil((GH6Oz#!5Dx*hv$>*8X?u-g&Vjn;{ zS~`e#9YA0}uBc2=&Px?8mD#(fReWsU8E;&0&B9*Z=Rcf>jAw>W>xg(YJ9nf{|9M%O zQ 14b@N z3+SI)P)UcF-x=4PxGFQt>IkzH#zr#!kg|3hIERVd1)WVk1+Ao8G~@h(r!RVz+uil+ zdUY5u6IMRKER7dn*N=31_HfoY$}YlXbDLdC+6#JI)^c1FckuTV$1IxV^gUmAMZ9>m zG 4cE5qTrDw4*o5UqEon8yZT(Bm#v!vtm7ts?jtkolbS}0QH2{<_zJ5g34930J5 zKbA0%x0be#ntxYy@vWttB%?lT)dy+H?ayAX >Wm8v#ywXm+>%sKx!awi9(^rzAf}!r?rlxyzfTuO z6CI=0sn$yu#ZdEBFYfzJ5I0+oif3~OX`F1Ke#^;Ik(Y=k_m>ak{IK0ygZL=D!8GzV z;k2eqh1%TDHGc^IwChk>tbPxVTsmmCzvl4JN8R($!39biLTF>z-XjqLmoSt!K)QT( z{sO+SdW!QzP;PsMZBP9gs%J8MPGX15??`w=OIDnEa{7|;H(m@vhsdI=HgeZs&&`kE zY-(*f!#M(pJWW%{hMG%27FoY|d%rV}wB{iBNtxH?{6i-tOt~eOrgx6XO`kraq+`F_ z;*+#sQHTpm=E=9JOAbiV(;e(W{e{|z3|1p{D=aJcR~BhG%8o4TD+pqwJFoA5#RSkQ z>aJq_R^fK{_wj{1mMQ<5tLs)&e4x@dzD6Id0G^EH5=S4gpsggsRvI|mbXy6M|EaqW zm^?}I_q=GsP!?Z>@g?H+32yD?l!K{0@%0k f}=C^a zU+%dFF1vQ#BOp%pfJeF?*t)n1IR& ze< *}`S=nY zZ+w;yl4*NXhV>R1FS%%5H^+JMY&AUchyx6^Z%0jzJ-n8HN$Hk!5|cO98X2`-An)-u z%-)r>eK^LN-n0C5 ZK(lQ1x)1)v$!PlRqxfRLtJW4^#r zSum=1LDqlf0%&@kD6;a}s|Hslat&~3H$_Sw?tQ@)%QQRa#Lp9VgHmLygfx=u&$MqL znLZ28thd3Zg!8DIeCS*e3-RGyR`QUPt84VP_ExneeP78yOmRoMK;n6&Pm6!Qp59fF z`Jp!0>N%jzrD}#PbZ8_I3*#R_{I=(Zk%=hI{0An3gzPcZpT Z8zNH<^lTk&$a$QU-^w;NEj^>}mmmQ91LI07L9jwu}5lAGx z`Ys2gX={427_n=|l? {B>XrG=j6iizXuff@Ar>7~Jg$J{KXNM_%_FxZ^&&|_M*X~Hk2 |!eGLJu*?3U#wxP#E zDvL@JOLqNXM|(Np#*H=%R)U;P^0QhHyQidZt|&%Afp_}nA9-#+^T=1d1ZTJ;3_gl& zWN*&RrJGrM!cd@WLf`R >wW(3XnH)9~Oc zq^OhfZCsRLntm MzbbvoUnf@{Pw z@L8=18f!s6ac_NKQI0NYA30+ZZiH@c2`s>MXl(|UG=-fnUaNz#Eyd0NHEOmeTR@Mc zbrZPdyY$3skd%4?RCDo{39PctX{gD8TOjKx&h1-jAaNY908&m!uK8S*_qhGk$%RM8 zgSwwR8J>RuU>10~2Tn_&bSsd&zy^ c43Pq zC&7Eh-566rbifg&TimYODwCzN0B)5F6$gO@u^UmRjj+w4hPd+Ok9W}Z$Tw*`eeI#7 zNyLVtlG@2RPUIzs*P-as%tS3UE3y4P;xtP{5}U;9&Z`YdZr9ZM!go*bIP?Arn2+ak z`L$0m2YHFU GNP%aj2m8ZL5z7Pw zo6K+g(211x9TVj35B(L6i> zG|1?H5iJpkICJO)A7}GxnCRn*Ao)ns;1MJVhc_;-k=OrqqVyN%cP#HiwfGqEUp?JU z-ySK)nkP|~`)c%O{S}@yBi+|Gp!t#JE?KQ54j*C $1iYO^uQMfj?kjzH5 zSj#WTNn;sOiV>@8RUqlIxzI-B1XH-0@W+P0NB1mWJdqc&n8ktm4k?~24TNT))e{;p z=0`#dfIavqPp6AIO=Q5Mek76!Z;3X{rt+l0^`E=Z$46bx81GWd<7Mo6$gHl%&)?WZ z{hdKzf}!2p6=J~cR;~6WqeD_Fa&4%T=Wz_5t{pCLHGR*q )zIY`qN+(SeAL%Gg$` zw#E2Hq?hToMQ?F1diy`4z2u+-%MqK%gt4P{9MeX3b=GDjwzO!c83@$)Obyr zm$WM#gK5At_!HKhp}1&l56y3C7_mMktcQC^2JgEWGqGWCV`-8(eP|5lj#Ai}$$fW? zefed%-`m7cQ20$|7$4Z-%Z4}lY59>6?HR4-O7d*_U;YcF0mtu#Vu;ed9>#1M*Hi{? z2c_@uDM~OW5}U6M)0-{yyA#tlnpUMcrocF6=LKy+oAi6JJ zeXA`EO&nGVDY7fS>ui_~;0Mf|BFE$4w<$Lsg8cu`bFgJH{5y~;9S1t`l3x3T3FR@Y zm8?Z^v1p8CYQ2=-V2f|%I*d8}VG8^$I-2LJllcc@EJKU!fxL*?W3p~3 n?vDrc0-@48x+Fc^Ooq{729QX@a#1^@UMn0FQc{avu)lEfz0UqqfjJYsS+)JI zbhfidxrikb$qKWET#1TFtP{Vki(r!ti+dCM;?)Kc3V8n@W_u5EE7BNHt-2lwCD`JC z{v4{!fvYvP PoC}(SRirp>$aK zOvt8^35({JJ+V)XqRSEs_xr;BerXkV;dldwpL#qq_qG89cB24-;xMJGzrKU&Gn*&4 znRUL{{buQLX46VsdjSz z4ttmcNdiqxf>^dHv@GtpIV+PkbIShiOsGp6XZ){CIo_|-_M~PDF kr8q< z9yzvJ;-Bi-`^IF5TRzlNBz^tEBKD;XV&j%-L47C;ClAJmV(v@o&JrOYHu0bnI=rL3 zW$9Xezhc{5XfYDuV=w?1&p-Y^5^fZyH>gjIYbH~A^5%HahtYxXtE@O7!J`jU1WHI& zpMkyY |5!qkO(x=qq|nGZ&ov?)RP2Q8 X4w|M|J3rYA@5Bttj>A#F;qhi2f$uow`o?+#!m?jDreetf&q6$J>(}Gxv=I2 z-)9nGM++~CO9SK3Dv=KwdlEXerR@bL_O&@(`_{r8u27P&gg5`G?Ya!v+8*(%(%jOr zw!rQ0x^LH>F^;#7wUOAK23zN|I!>Ioy+C&9AweL@FLK{w1Ee8?RV|3I@k;$eyms*# zMgG||P{&etb+6kgU2F(OA4Eu&(&Mo5D{Sx>#`}poblpU|YvFDpOS9Z4GX8HCac&5| zLU@rJ^;|k>6DQC2z*GH{vcPcJZM5RCaO4+hUAyubHoDN5MmIqH7`S7ByyeT#i7S!u z5eqBy<&5RW`rf!U%SWbB)r=JTs=-Cz;FyLJ ~V|SMDuo?KhF8gSDrF2a2 z6gVIPC1y0d3-Eo9DHFV0UC<~MS>c@ATcrUwJm4F@W~@4Uj`3a XU3(> z9h$JwhSQ4MldMu*SBHcJ!oxBG4GlgYwK00Qk7{MbO`lv?1-vrPRu^7V2puc(Sj42J zV>aP~ggu#OYd$Y6wHK(kXkTwVetYv*k$0YgD0nZOJ|z3UI*6R2ukn4vEYPh(7XB3= zTPlW3U^dhw7nBxc91wRJ6X3Mua?F C!TZ zAKEw<1NWD<&x`wCr4>PSpo+!Ke=&M~pZ11a1g+~Q-yb@g01b0`Q?08jPJD!o3O$xO zBIAUb>`Xf61TGGP9O3_U+%{7m9^FgimmSp!?%3|`XmwuoB8Bh3MNF@U??A2)+#pGU z9W5jt$CO*qUEM@M!D SEnWfQ`vk8wKi16D*|(ICNpz1PTrJb#z8Ivl zaY^V$d#hj#b5N&vZ_WU1tp?>5>apL;i9U=WIG_(KuYD(8RkJOi9qB5H5i}jMGl^ zeO4i*dW+%gC84P7HBCDD#=9$Zy{#X-*hBQaU13`kgSTZaE1<7Bsya!SNW&1suv{P^ zyH-PPPX^a#;E2bT21mO3{wKDMnR{KfmJnVnUKKYbmNVOavt`mZpH3()AZ6h86gRH3 z*6jJeD)?qE*bIL?$-hR>XXiy CDhtea%SX@V|&v}zJAMKnr1%~i? zB}NRFuCtc9_>7y0 JHl(HCtCgS3E;$f(8GY<487exI{Vg2z-4<>f*^EwwO@^U zZTGfQyhqdkjMv9MhR#nc+yyiKsQa*~1-YWg^MB$IClwq@*c0z^!rA<9ih-h%y_KxD zkuxxHxNXjlrD4S&Lmic JhyQsssAxib6$>Y8&-%Z)={NYf%3}sh3s%-3YA0F7w$EUHwvjwCCOK zJTC_dUqO-e2T<6%4P%1ENlJ|~b+Q8#>VI6yb_s^uuMa*QvCpt^v3=zjJ>S1)ZCZD! zd_eZ<6B%Rb_#LZ9<5^!ZZ=29U@-dwVydNV6Q6goffVgMIQqU726Ql`+?imf~Q&)ZH z1NP_B@SpMRJKvmvyRG0x$(4G+v{xggrO(x(U;lFnvG&Nm*FA}Eip}6k*aVJ~$xEHL zlgCwaszW#+oP>a%J?!P;6`=zMa@}tpw>L(V0(t9dm~>kVu=NjSrDXV}&fIuMCrx#p zer4{J$8$x;;9_?MkfRf zsGW(VD`who!zy1q#PF5T4+TaACJ3@-R~)GlJRg5(n|waf`{5bq |z5 zjIW6@f(vsVn7zX~#TGaFh#5^ KBEOZHYH5u zSFai-7SZM#?SvYZWW%+}`jdI|+uG}>Ea}$GN&d4XKVD+K@dmZU82YSsU6cG|YG#9- z{|eN(Lnuy93pJ?9AwY&Q&W_T%%+#C3sKhk=ev4ydkqx0CYhRk%xE{ QzMPY3 Ez z5SsuJCNo1btKI9U!+c!69a M_~FUW_0+odarDzkHc3$5FRl>O^ix0Cg@{JtwY*@}*y*YI!+{HZ*c&yHBS;m6 zEiuP{KT8-u){fc6f8brq%9f6XPlgtk^VCFXDVzFW_WskB=pV^=^W-(`+{9+uk7?vz zvx=PJH!j+ZW#yMzlv?Xm_4r2+gf?De(}%>7B5zSi9bF2Fj++_m`q??95W7(9)&1jJ zMqKNPn$ 2yUbOj6WQ^58QIM@?DXq}C4^!9Fnh+ZDF^{+^JlV5H zQ>}O+9b~C3-Mjm#XTGX^XYSKPD *)5<@H@1L z^YSs%s?Gi=ui9DreeW6D{swN_STr&;L@Xq9|5@#O1%nMNC#3p9yuiJx)SWr3_Tm;D z9;lRdoofgz`xUi_YZ${8QB`1qHdb$= *U_ZbcRa=l7a%d0KwL|=G-v;egY`}eL&eL6-5h^{^gX|pq zD&@S#%Tzc4*Rdy2BsSSK((M+#1K_p@+b- u0O&pLOfea P8};*p!u+k3bVsNU4(0X?bRCca<_}Ga(bp z0}PU&_p;$eRk3;npfpkqGd`B~w{2f5uGuoU>;`OUtnVzMEe5&Dd4|R%1=QBy)ZcTK zhH^59oa$TPb6F6p*#ZcB- -B^xuYVB2TGtdVKgu zUi)L)yg*~k$0mBJZ9%%0hiaEG@?`_-=v?Ln@zy {^YlF?o z**z6IH|Te+nC5@9?dywcY>Sg4b*<%0n2cP!qf3*5)fosfmfws0qU#yCJge|Fj)}d- z(bqT`s+Z7p8g|2()V`nBeH5PaY`8Fl-c38}y7F$;ea4I;43NBNpfFeL_ZGVl2>SSH zAW9naR?`A5o@CC(fEtjf${o^V0$z0^)J-9nR=zqH=thEK5|Y(nucFQJ{^o2k?z%3! z@YZVK`O}u*_Hq}aA$!YP_X~KuU>g0*l6bgTu46XcTJ><$vD^Ml@@}Qyt>*s3AcBZ0 zk@?LK!*WTNnv01UUf0REH%-$A491Fym&pPRDQ1OK2Q@jTT^aaI2{lu8$$L+U3m5*D zM*2{)$-{=>o!tZ01?ifuL{g;L>?($ZId^_l%aq=%Wj5?Ioogv3$;iZNMNI320DONa zY_(twNrDnnIam;79vN)lRZ2FuEweR%QiEuJLqp_l@V~?~O8tPu5%GLwELPQR3y;`Y z^3Aj{*!XK3<|W_bl2M^6Ptry}StYVZaPjJNs+haf`cwF6g?~#F6Y)(;Wg1BbW2Mjh zG{SC65pXG~thX*BG3pqumHnYU48*AUDX+!+3i?5!=dN{{eCV#OSF%~IaS%PFWiy)Y zP$H`8%A-%ufS=9r&Z$MO{Wel2gS%UTE08>j2KCALJp6LSZK6XFjM&8NO_#D+$fqn} zc^956t>#*8%ZX6peM%TyxQ!Yj-%yc<#)#NMmdii%+EPE}rLA|pzMBkFr_sAA&=7=k z@2@v+4VOKd*Gq^=?*R|=s7rIss0Hc_yBLcn*t|>(u7%QUOJ_3RNob%*$w_sY(4nRu zxQp$T{o7mqmTbb}4gHmzU!R~TlK>Osj*%5)RE}}lmG;(S-K-!`Jlearcn)*$Q}^9@ z#DS9(xS@7~b&S_6`#mkMcc*=OdwGEQfA0k_*=D2qcqC?wnD;pBX@5t^ci2$8zuf{& z|1Is;{FKHQ6&GHew{{mFrg}fY{z~@6%lOp|uG4Qz2JY#oa;=QXV19CK?YwjQ-NFX- zS1^^g*o!O5g7ufVMQ(Tc05(|g g^ za`8pfh9 s*DMTmwKAt#TIj}p9Ra@{qMso4~qj5 z0Oy>*u>>V8e4EpnKn9W*GYVsxMlqU^Uy?0W0-tfUn;b984mbP`*Arz6^>@Sn_X{4e z&$22o)iC!nVF~h<;9Gf -i@CHBa2u?c+CClN0Isw49)d~Jj)|k;wM}J`=WrIh-I#ubS z3Y`mz!_VBisQBFV=DAmHv*1f=ElDkaasWl|;A0xY2ZqYXsL%7Z$yqIG+7=F{wKM#I zk|wX62Gj_OY6xM_kZqdMMMoneM7+HhbM6=Xed`16*8}cU!tZ^}m5j9d^EqdR4USsL z;*E5XoOTvPT;w^;;!pKS(%ZntZSOPAN|%~+$tWp)7Sx!QF4BL@f3<$W?V!$$wRI{$ zyB<)ghMxQB9at!4$P_HjDHc*Vj42M6gvpy~iAzcrRUO0g9`e?QKLOyK*Z+(lsPKCq z{S<(|z4|7TBE@^bDvzTb)c-kXFz>I>Eb9k`j-=1!IWT85O4&5IXceGeS8P%!yrG@p zFK%Ajc>Znx0`S{c-=r+tJO~=xt4aK&s7brMwr}W2`dkCXMihc^3td>`5L^)!mRjI9 z)KmP;&Hn)4hp+vBw?F!que{I9wUT`6wIA?r(eGxim85?8TdW2xYLzCz`YN(54-6h8 z;6u$Rv_=cqiXexeppH>M oU~XVP=~I)@(Xf~+Cvq{E&M z0815Usd2>TkNSG;C(mCZs6QcCmrQlm`g^UkvXS`^T38$=EQxIu$;^J)_jP$;w1}vd znb_y#!gjCM``AehzNh~4j0BKc3ZZGt{pP0wn|Yp7qimtyKCz#FsG)Y#Gkf6n!p93% z7*NIVvA9Kp)ND|udMhk{I_$J!3?BgYMTH4XFd1cRr!_&*7K~{cAXy1EHyD)Ll7}9A z(6bKyAhI33KFiS(yEahDg#muv5?C5cnSz{vQDG3b^;hvJpfe^6;?np#vc`K4yS)N+ zSJLz)c{!NUgU5RJB^*m|rlfAn+-8*wFA9?vlr$X#y09=&vG951msyH-W3S<}7F1bU zY*F(i^_HYAp(*==j-=0dJuE>KS%sA9W9Kc#wGw$WJS9g#sQi&S&1qrq4jmjB(7|Oy zhC%ugJ`LHS?k{k6eU`bZq#?r{)z@7~sWTX#bE*lNiO@AfD&YCz1h1MeQwt0XQQ{SI zf Fzfpj69|C{Sy~_$IuZ=YAL2# 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 _00001b5ch_0Itp) z=>Px#8&FJCMF0Q*k&%%^Up{b-W25 CQ2}nmAPl2+2L1nwCj&<*3EECtwMj!NRE}{RlhQw0 zB;o?nrto~ +AdNJZe%hS(r?*W3J-dBg zr?0+x7dJI(5K$Q1RQQU{MIGeO=55RM1 j3OF!Sk*%e6EH<9eM0@@}@86pbL(de2i FBsw literal 0 HcmV?d00001 diff --git a/resources/sprites/halloween/tentacle.png b/resources/sprites/halloween/tentacle.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb590a66a64a0faa0296ed7c4d2da96b456526e GIT binary patch literal 2088 zcmV+@2-o+CP) Px+;z>k7RCt{2oxf`wM-<23hH$Ek4q=0WTqv&6D2Oz6AuuYgaiQuU`U?&O0#$1C z2dGgc5D4xsP;pfZE_{U%sF0c<;zpIC!XW_(qu|QdYzpaJ=EnPDX7|0@o!jrHI-ghH z+k12Ko%d#DcZmQ10001HoT%y(0O8YZbz*)!7!C280syE3-vPdSSM>>iuwm1A^K8B9 zQvm=p1o#dp!uM6500^Ih?R`2v>3jd3S)rwY$_;>eQ&m4M>N}vhAmIU`bX%R+#oW5B zPW L=V5UfX0H_~z>Bp|V1DXvI9w5exr^|GGcawXZZIZwI@G~vVFVgeX zWx6;$r{DknV?y)u*L&)I@i(-z$`i&YgI0V)(+v%&I83V_=i%x*05qzj19`fwPTXDD zpqH;-(eX*2uJ3L#jng#At<4@05$zuBO&qhc)}!aE%S1#IQ`ULfWSKdy@7vWUn`0T{ zO&T;LjJ)o;TJg1YlV%L+q?`3Q%q+K?c0YFcd>`KdfROM23A(LLytCG$w^#3TO_PoC z-R+0*d-kzx&IjB3M21;@{(4XMU+#0Y^QPBLt*moR(&yJnpHp<;3`JKfzM<)w`uw_S z?WWm}UGec900;?BGhri=GKX%f6Pp_dU1oV)t4OnoqYSf8GIg#zFHX @`brJEzGr@ z_A7*@YidcxH#A+e+XLGDxJv5alRzFMJPpNVdfSJK({oWhljp0;w6)svx&-y`tWR`i zneq|EL`2<{4cglD(=)O6EWCXEs?>lSqOMkaL(?U+n=?iFaUPn!Lkd0#ss#y816lvI zLs!D4wlu#uaaD#CgV8XeBZ_$+K$5{HZJ?xt3UvJM$7++!y~u3A;aUHGJ%ItE&bnIh z4NX@ozFNA|j6)tS{kRBPzC%hr391EmT5cd_RpfHhFc qQeexRSCAII-y#f(kgG_ f4$u0uwb`Q=PnR8z&Sx+hM!QFQ>ic+H zI6mo*FN4j4r|*5ps*=kL7@_ED#Wyrvrs?hGi)%l2LECqveG*g;5}p9i*f^(Q5}FlJ z-uZGhdwqA~G<8po=IdJ}ljDF9s;*XiL(^?~yA@^Dd zGg?bpT0RM?0|}1++?lm>HL9(*SMP})pP5rv*nmyb zkvd {3}KB+ZcfP5O2@Mx}=YVRwM=y2MJ86$0Gk~c%+ zCoC_`FRCPxp$*8=x?1rKO_ynUyO~Je)KJTJrjd|f=BOGPvxjH=FgW1{!P!sjt-G$4 zp=k_6JiRV;AB=CN?5{**$J#q d z_9ijSX l=X C zl2i5?gft*)=xW6`G+n0Y?M6!d*w)sXDUtR`QXDTxXxz+8BzzMMBBCgYoW7syalXge z$Jc5}OJmu|>==?iTzY(JF>h* 3B+x>>e5rpGmZiD__dFRt38 zt9f2xkR&8st@wtfOK7(VZRvh&Bk4P&=#!e`1qqIuQ4~dS9LGrsMcVtJQ7GZ*wmPEw zU`Q!rH)l#DD~p}A-o(8sB+P+d+cA*pZ1$RT+2oIP&E$-XSQOPX_Yz1}g<6;KQa}T; z<^ZR4Ide$5XtxJ6`>}@akg`uoj~BMS 2ll2Uv_(?z?b>y|~^cQkxb zdc3gprN_-#$2&mgI-XS4XRi&G(dDVPr1i$EDZ3))X=_Vs7S%StW1hZiOnfxWbM}e1 z%elJf_-Gc<_Fc<%(a!qarfKHI*8YFAn_G;1d_tq$l0L&l*HzC|(^pqBzOLt7 vX}IA?x`vSWRcPFZbV|Dz%a4*&oF0A?4Bi46b%0000m1^xr|i+d`< SMA}IJ0000 Px?g-Jv~RCt{2U0q0=R~mlO?N+E_E+iD=&xIrdgNQOD2wsT7XpvFW4WS$3nvnJ; zfrJ<~Y$Y2gq{Z$EJ3%42X(dTb+Oh- `8#R (qW@3Q@wUhwV~cdj@KP=f@dr1;&!xW5IkJD-*(ojYw^eUssH%S-cs zM~+OKoG%iY1^|3=>Lbj~&H(`0+k@g~f|vY+&d`S_dhZ?GGj}KNd&ZZIpYS?}B#%72 z6c65Kult!yy-4R%=w26bwYu2nqP^UQNgGt$RzEN6gJz
t^Ev&2h61ppiIE#2?8?mWOiUz-pT5-z&}B8$~m 0h9_p)|{u;hWVnvf@rjB4D0!_FerD{%ug9M92V|Zj7Ll;kp z=XjLGMT;UIyHSrU&|H`)sw4dT{1@@_Kwld+;#)#QoEZ7diRm;6F2N|} YEV0dQHbe`Z4!#5x#>}8KUJ%u&C2_C-3W=HJRGM z%E~kGyWd}np3X) 7L7<`8lg~^=-}|kH~`@Ap@8oB zWNHT`#YONPtiq$mQ4I98iFVi#ELp7Rz0f9^CYbn=sT}|i{pJQ@*T_k%xG0eT)42cq z{1=p#mLiczV4$x}$w#o`Tr|%lR OygbS4spIPaFjN3^h%TptH5$5x~5#Q3; z5j0yOTeM@xvS{%BQbYv+(Zw}@iOAsjGrBff<&`5V>f58oQM5D%1V8yGaq`T?PK3u( zM;c#Q90LspbbSQ#88{HGca1t;SKlN$O-|!GScT}~8WM>FDk`eP^NB ZN&X#J7}DCx=q72&9(Osp`ry#8x+vNB}?mlv&5BsHhSv2c>3mh;0Sj`AC7O z4RUlx;HhG^8jKO-TpKKee)2S$@%+%mQ@ZD!2nRIhq au|IpuawV@$%sQ$ZtpatmM0UPRae#A|aU z#YMu04j&4jq__yfBjY%JtQ*io?61Rr%-G 7fsBs& z{k149Efvuf5u5EOW&=+{DYPspE)tz2aN%$&Rx)J4QT3M)iA-nIf9xU@>VofJ6|RpC z38zY?b~1!=W#t*BW)`r#G>_`avX{}0i!tV6HPF|F{pI^~>B7p&GYpT6V`^prSH1}A z`Wgy#A-2AaBfTA#w$3^DZu0)}eJCj|5_~Hw&*1mh!tbxe@nhW>9vMeVa{%2(FQB@z z?A1n$4X5VwbL-9nOwBCl1d@1TtDErqYq1gELZIP*uGZrOJgVbjMR@WwD!BP`F!3Fu z!>qE+@+^hYFfNXeYFT{O9S$;w*!ng?p)RyE2SijCU0g#lwWH(Z!gc%Gdq}2s5NvJ0 z?Cc!mI<5?5geA7EHI;@IuJbUjy0T1{i$V(R2~M{A$q=a+c;$;Qz(lLMvP?u&d}F{@ zlUdiX%6p=}OYE-DM2D|l6ZJ7jx%WnV>s9#8b_wBf7wz=9VO$>_62^D
5mC!A%R3-3WT;KmW}TNm`gVCwJiE$GQ<+T+^kf z&>Y)J#G^u>;Q(T*n;8-Nlc!Pm{k4cLt_f$>i_WXhFpBVKCsK~Kr)Cy}Sjkxe{hdT3 zeDxZ92djj5@qSvZQSze%6tQx#
^_^UmwXR>zn6ObY|Ahw&(u`b{Yz-@M8uRxpdO z?oQr^uVybop)Q0%UD$|k39*7E6!O1;zBaLA#v5!0C;Geg&?GG{&0~3K9zC6n=;>_4 zqsLJ^dK}diENR83T8yd)ZHJqF_SNjg_0gf1;rZ$&qKj*~6`7(NT2*A@Or~C>tz7Hi z{iP_2(9_w7WNJr58eFVs9B6*{=UFvqTG2=_Xk3%2os7*5Zs=5$=FyH-%tU?=Ka&8F zlbUhTVpUh) POM{|set#`0Dyl@?d!Vlk z*G4ai4Z7LcIa5x{`9I%v;NZ@xf}3+msxx3<`MFse-125S&cOwlcC83JEwv&Z@+|^d z;h?Rw1bJtY+Tis37x8j~< 3 zw|lff-c^=&lQ~pp7zswawzf)nL(IU*-5fCF;=v1;^7b?b@lt!eI7q2l<>ZJ;?x)?; z!m6uJ#BuuEFd&^{;Ri^)Tom|OG6EMCxgAv0wX@yNZwhdsByetOAKy8X7Y8ST#kbt~ zA!M?f)8~eD+wFD_R2m%@QI$<7qKd6 ppPt;~)jhX#IxRlucgHRxkw}O%=9{lS z%gG%v-cQxF27*^tIgGAA5qNknN1brE`t#G++;9o 0<#o5!@h$FonIq9QHAUP;KRi)gp;l#4Im_@HV zC6?jE)e$HPyhcZG+$;=65eHql;-Y1AZ#9?SK%%lS <(4x~QBU=O}b8}uk9$xh~+tCkx0v&mnZ Vy%BD&>-g$a>E zS(Pw4{cJNnUVwyFq|Al!@^M!gaIQF2 M1xhcz;>3v84X2y$r&94we)oCK9rwzYH`4rK zZmvYqh+DR)eDxV@tS7(we2>$Es7|=8`jMBBPOf|@U%Zab?c~$AWnS71G<%PgNw!ks zu)}HfbFJ1^>~MMk>Tf > = { [FxType.MiniFire]: { - url: miniFire, + url: minifireGreen, frameWidth: 7, frameCount: 6, frameDuration: 100, @@ -37,28 +43,28 @@ const ANIMATED_SPRITE_CONFIG: Partial > = { originY: 11, }, [FxType.MiniSmoke]: { - url: miniSmoke, - frameWidth: 11, - frameCount: 4, - frameDuration: 120, + url: ghost, + frameWidth: 10, + frameCount: 5, + frameDuration: 100, looping: true, - originX: 2, + originX: 4, originY: 10, }, [FxType.MiniBigSmoke]: { - url: miniBigSmoke, - frameWidth: 24, - frameCount: 5, + url: bats, + frameWidth: 21, + frameCount: 6, frameDuration: 120, looping: true, originX: 9, originY: 14, }, [FxType.MiniSmokeAndFire]: { - url: miniSmokeAndFire, + url: miniSmokeAndFireGreen, frameWidth: 24, frameCount: 5, - frameDuration: 120, + frameDuration: 90, looping: true, originX: 9, originY: 14, @@ -90,15 +96,6 @@ const ANIMATED_SPRITE_CONFIG: Partial > = { originX: 9, originY: 9, }, - [FxType.BuildingExplosion]: { - url: buildingExplosion, - frameWidth: 17, - frameCount: 10, - frameDuration: 70, - looping: false, - originX: 8, - originY: 8, - }, [FxType.SinkingShip]: { url: sinkingShip, frameWidth: 16, @@ -108,14 +105,23 @@ const ANIMATED_SPRITE_CONFIG: Partial > = { originX: 7, originY: 7, }, - [FxType.Nuke]: { - url: nuke, - frameWidth: 60, - frameCount: 9, + [FxType.BuildingExplosion]: { + url: buildingExplosion, + frameWidth: 17, + frameCount: 10, frameDuration: 70, looping: false, - originX: 30, - originY: 30, + originX: 8, + originY: 8, + }, + [FxType.Nuke]: { + url: skullNuke, + frameWidth: 42, + frameCount: 19, + frameDuration: 50, + looping: false, + originX: 20, + originY: 21, }, [FxType.SAMExplosion]: { url: SAMExplosion, @@ -127,16 +133,51 @@ const ANIMATED_SPRITE_CONFIG: Partial > = { originY: 19, }, [FxType.Conquest]: { - url: conquestSword, - frameWidth: 21, - frameCount: 10, + url: skull, + frameWidth: 14, + frameCount: 14, frameDuration: 90, looping: false, - originX: 10, - originY: 16, + originX: 7, + originY: 23, + }, + [FxType.Tentacle]: { + url: tentacle, + frameWidth: 22, + frameCount: 26, + frameDuration: 90, + looping: false, + originX: 13, + originY: 28, + }, + [FxType.Shark]: { + url: shark, + frameWidth: 25, + frameCount: 14, + frameDuration: 90, + looping: false, + originX: 13, + originY: 8, + }, + [FxType.Bubble]: { + url: bubble, + frameWidth: 22, + frameCount: 13, + frameDuration: 80, + looping: false, + originX: 13, + originY: 8, + }, + [FxType.Tornado]: { + url: tornado, + frameWidth: 30, + frameCount: 10, + frameDuration: 80, + looping: true, + originX: 11, + originY: 22, }, }; - export class AnimatedSpriteLoader { private animatedSpriteImageMap: Map = new Map(); // Do not color the same sprite twice diff --git a/src/client/graphics/SpriteLoader.ts b/src/client/graphics/SpriteLoader.ts index 29d5b7791..fdc3a3c14 100644 --- a/src/client/graphics/SpriteLoader.ts +++ b/src/client/graphics/SpriteLoader.ts @@ -1,6 +1,6 @@ import { Colord } from "colord"; -import atomBombSprite from "../../../resources/sprites/atombomb.png"; -import hydrogenBombSprite from "../../../resources/sprites/hydrogenbomb.png"; +import miniPumpkin from "../../../resources/sprites/halloween/miniPumpkin.png"; +import pumpkin from "../../../resources/sprites/halloween/pumpkin.png"; import mirvSprite from "../../../resources/sprites/mirv2.png"; import samMissileSprite from "../../../resources/sprites/samMissile.png"; import tradeShipSprite from "../../../resources/sprites/tradeship.png"; @@ -26,8 +26,8 @@ const SPRITE_CONFIG: Partial > = { [UnitType.TransportShip]: transportShipSprite, [UnitType.Warship]: warshipSprite, [UnitType.SAMMissile]: samMissileSprite, - [UnitType.AtomBomb]: atomBombSprite, - [UnitType.HydrogenBomb]: hydrogenBombSprite, + [UnitType.AtomBomb]: miniPumpkin, + [UnitType.HydrogenBomb]: pumpkin, [UnitType.TradeShip]: tradeShipSprite, [UnitType.MIRV]: mirvSprite, [TrainTypeSprite.Engine]: trainEngineSprite, diff --git a/src/client/graphics/fx/ConquestFx.ts b/src/client/graphics/fx/ConquestFx.ts index 7fa8d0690..2c3f50413 100644 --- a/src/client/graphics/fx/ConquestFx.ts +++ b/src/client/graphics/fx/ConquestFx.ts @@ -26,7 +26,6 @@ export function conquestFxFactory( x, y, FxType.Conquest, - 2500, ); const fadeAnimation = new FadeFx(swordAnimation, 0.1, 0.6); conquestFx.push(fadeAnimation); diff --git a/src/client/graphics/fx/Fx.ts b/src/client/graphics/fx/Fx.ts index d4b206614..fa843de81 100644 --- a/src/client/graphics/fx/Fx.ts +++ b/src/client/graphics/fx/Fx.ts @@ -16,4 +16,8 @@ export enum FxType { UnderConstruction = "UnderConstruction", Dust = "Dust", Conquest = "Conquest", + Tentacle = "Tentacle", + Shark = "Shark", + Bubble = "Bubble", + Tornado = "Tornado", } diff --git a/src/client/graphics/fx/SpriteFx.ts b/src/client/graphics/fx/SpriteFx.ts index 2926121a8..ebe8d410c 100644 --- a/src/client/graphics/fx/SpriteFx.ts +++ b/src/client/graphics/fx/SpriteFx.ts @@ -19,6 +19,35 @@ function fadeInOut( return 1 - f * f; } } +/** + * Move a sprite around + */ +export class MoveSpriteFx implements Fx { + private originX: number; + private originY: number; + constructor( + private fxToMove: SpriteFx, + private toX: number, + private toY: number, + private fadeIn: number = 0.1, + private fadeOut: number = 0.9, + ) { + this.originX = fxToMove.x; + this.originY = fxToMove.y; + } + + renderTick(duration: number, ctx: CanvasRenderingContext2D): boolean { + const t = this.fxToMove.getElapsedTime() / this.fxToMove.getDuration(); + this.fxToMove.x = Math.floor(this.originX * (1 - t) + this.toX * t); + this.fxToMove.y = Math.floor(this.originY * (1 - t) + this.toY * t); + ctx.save(); + ctx.globalAlpha = fadeInOut(t, this.fadeIn, this.fadeOut); + const result = this.fxToMove.renderTick(duration, ctx); + ctx.restore(); + return result; + } +} + /** * Fade in/out another FX */ @@ -49,8 +78,8 @@ export class SpriteFx implements Fx { protected waitToTheEnd = false; constructor( animatedSpriteLoader: AnimatedSpriteLoader, - protected x: number, - protected y: number, + public x: number, + public y: number, fxType: FxType, duration?: number, owner?: PlayerView, diff --git a/src/client/graphics/layers/FxLayer.ts b/src/client/graphics/layers/FxLayer.ts index e5ddf3831..94a9c1040 100644 --- a/src/client/graphics/layers/FxLayer.ts +++ b/src/client/graphics/layers/FxLayer.ts @@ -13,7 +13,7 @@ import { AnimatedSpriteLoader } from "../AnimatedSpriteLoader"; import { conquestFxFactory } from "../fx/ConquestFx"; import { Fx, FxType } from "../fx/Fx"; import { nukeFxFactory, ShockwaveFx } from "../fx/NukeFx"; -import { SpriteFx } from "../fx/SpriteFx"; +import { FadeFx, MoveSpriteFx, SpriteFx } from "../fx/SpriteFx"; import { TargetFx } from "../fx/TargetFx"; import { TextFx } from "../fx/TextFx"; import { UnitExplosionFx } from "../fx/UnitExplosionFx"; @@ -21,6 +21,8 @@ import { Layer } from "./Layer"; export class FxLayer implements Layer { private canvas: HTMLCanvasElement; private context: CanvasRenderingContext2D; + private lastRandomEvent: number = 0; + private randomEventRate: number = 8; private lastRefresh: number = 0; private refreshRate: number = 10; @@ -40,6 +42,14 @@ export class FxLayer implements Layer { } tick() { + if (!this.game.config().userSettings()?.fxLayer()) { + return; + } + this.lastRandomEvent += 1; + if (this.lastRandomEvent > this.randomEventRate) { + this.lastRandomEvent = 0; + this.randomEvent(); + } this.manageBoatTargetFx(); this.game .updatesSinceLastTick() @@ -116,6 +126,72 @@ export class FxLayer implements Layer { this.allFx.push(textFx); } + randomEvent() { + const randX = Math.floor(Math.random() * this.game.width()); + const randY = Math.floor(Math.random() * this.game.height()); + const ref = this.game.ref(randX, randY); + if (this.game.isOcean(ref) && !this.game.isShoreline(ref)) { + const animation = Math.floor(Math.random() * 4); + if (animation === 0) { + const fx = new SpriteFx( + this.animatedSpriteLoader, + randX, + randY, + FxType.Shark, + ); + this.allFx.push(fx); + } else if (animation === 1) { + const fx = new SpriteFx( + this.animatedSpriteLoader, + randX, + randY, + FxType.Bubble, + ); + this.allFx.push(fx); + } else if (animation === 2) { + const fx = new MoveSpriteFx( + new SpriteFx( + this.animatedSpriteLoader, + randX, + randY, + FxType.Tornado, + 6000, + ), + randX - 40, + randY, + 0.1, + 0.8, + ); + this.allFx.push(fx); + } else if (animation === 3) { + const fx = new FadeFx( + new SpriteFx( + this.animatedSpriteLoader, + randX, + randY, + FxType.Tentacle, + ), + 0.1, + 0.8, + ); + this.allFx.push(fx); + } + } else { + const ghost = new FadeFx( + new SpriteFx( + this.animatedSpriteLoader, + randX, + randY, + FxType.MiniSmoke, + 4000, + ), + 0.1, + 0.8, + ); + this.allFx.push(ghost); + } + } + onUnitEvent(unit: UnitView) { switch (unit.type()) { case UnitType.TransportShip: { diff --git a/src/core/Util.ts b/src/core/Util.ts index c5cbe044e..41bac4163 100644 --- a/src/core/Util.ts +++ b/src/core/Util.ts @@ -289,17 +289,17 @@ export function createRandomName( } export const emojiTable = [ - ["😀", "😊", "🥰", "😇", "😎"], + ["😀", "😊", "😇", "😎", "😈"], ["😞", "🥺", "😭", "😱", "😡"], - ["😈", "🤡", "🖕", "🥱", "🤦♂️"], - ["👋", "👏", "🤌", "💪", "🫡"], + ["⏳", "🥱", "🤦♂️", "🖕", "🤡"], + ["👋", "👏", "👻", "💪", "🎃"], ["👍", "👎", "❓", "🐔", "🐀"], - ["🤝", "🆘", "🕊️", "🏳️", "⏳"], + ["🆘", "🤝", "🕊️", "🏳️", "🛡️"], ["🔥", "💥", "💀", "☢️", "⚠️"], ["↖️", "⬆️", "↗️", "👑", "🥇"], ["⬅️", "🎯", "➡️", "🥈", "🥉"], ["↙️", "⬇️", "↘️", "❤️", "💔"], - ["💰", "⚓", "⛵", "🏡", "🛡️"], + ["💰", "🏭", "🚂", "⚓", "⛵"], ] as const; // 2d to 1d array export const flattenedEmojiTable = emojiTable.flat(); diff --git a/src/core/configuration/PastelTheme.ts b/src/core/configuration/PastelTheme.ts index d40509e1c..5664c41bb 100644 --- a/src/core/configuration/PastelTheme.ts +++ b/src/core/configuration/PastelTheme.ts @@ -18,7 +18,7 @@ export class PastelTheme implements Theme { private nationColorAllocator = new ColorAllocator(nationColors, nationColors); private background = colord({ r: 60, g: 60, b: 60 }); - private shore = colord({ r: 204, g: 203, b: 158 }); + private shore = colord({ r: 223, g: 187, b: 132 }); private falloutColors = [ colord({ r: 120, g: 255, b: 71 }), // Original color colord({ r: 130, g: 255, b: 85 }), // Slightly lighter @@ -26,8 +26,8 @@ export class PastelTheme implements Theme { colord({ r: 125, g: 255, b: 75 }), // Warmer tint colord({ r: 115, g: 250, b: 68 }), // Cooler tint ]; - private water = colord({ r: 70, g: 132, b: 180 }); - private shorelineWater = colord({ r: 100, g: 143, b: 255 }); + private water = colord({ r: 80, g: 76, b: 179 }); + private shorelineWater = colord({ r: 100, g: 110, b: 255 }); private _selfColor = colord({ r: 0, g: 255, b: 0 }); private _allyColor = colord({ r: 255, g: 255, b: 0 }); @@ -97,15 +97,15 @@ export class PastelTheme implements Theme { } case TerrainType.Plains: return colord({ - r: 190, - g: 220 - 2 * mag, - b: 138, + r: 216, + g: 205 - 2 * mag, + b: 127, }); case TerrainType.Highland: return colord({ - r: 200 + 2 * mag, - g: 183 + 2 * mag, - b: 138 + 2 * mag, + r: 223 + 2 * mag, + g: 187 + 2 * mag, + b: 132 + 2 * mag, }); case TerrainType.Mountain: return colord({ diff --git a/src/core/execution/utils/BotBehavior.ts b/src/core/execution/utils/BotBehavior.ts index 868d55f74..2b914db6a 100644 --- a/src/core/execution/utils/BotBehavior.ts +++ b/src/core/execution/utils/BotBehavior.ts @@ -20,7 +20,7 @@ const EMOJI_ASSIST_ACCEPT = (["👍", "⛵", "🤝", "🎯"] as const).map(emoji const EMOJI_RELATION_TOO_LOW = (["🥱", "🤦♂️"] as const).map(emojiId); const EMOJI_TARGET_ME = (["🥺", "💀"] as const).map(emojiId); const EMOJI_TARGET_ALLY = (["🕊️", "👎"] as const).map(emojiId); -export const EMOJI_HECKLE = (["🤡", "😡"] as const).map(emojiId); +export const EMOJI_HECKLE = (["👻", "🎃"] as const).map(emojiId); export class BotBehavior { private enemy: Player | null = null; From 6b696685b594baf640523589eb4cf0ae0b134c12 Mon Sep 17 00:00:00 2001 From: Duwibi <86431918+Duwibi@users.noreply.github.com> Date: Sat, 25 Oct 2025 01:38:28 +0300 Subject: [PATCH 05/10] Add Achiran (#2280) ## Description: Describe the PR. Adds the Halloween Special Map - Achiran. It has 4 nations and will be playable in game for a period of around 2 weeks during the Halloween event. ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: DISCORD_USERNAME Nikola123 --- map-generator/assets/maps/achiran/image.png | Bin 0 -> 1004887 bytes map-generator/assets/maps/achiran/info.json | 29 +++++++++++++ map-generator/main.go | 1 + resources/lang/en.json | 3 +- resources/maps/achiran/manifest.json | 44 ++++++++++++++++++++ resources/maps/achiran/map.bin | 1 + resources/maps/achiran/map16x.bin | 1 + resources/maps/achiran/map4x.bin | 1 + resources/maps/achiran/thumbnail.webp | Bin 0 -> 9948 bytes src/client/components/Maps.ts | 1 + src/core/configuration/DefaultConfig.ts | 1 + src/core/game/Game.ts | 2 + src/server/MapPlaylist.ts | 1 + 13 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 map-generator/assets/maps/achiran/image.png create mode 100644 map-generator/assets/maps/achiran/info.json create mode 100644 resources/maps/achiran/manifest.json create mode 100644 resources/maps/achiran/map.bin create mode 100644 resources/maps/achiran/map16x.bin create mode 100644 resources/maps/achiran/map4x.bin create mode 100644 resources/maps/achiran/thumbnail.webp diff --git a/map-generator/assets/maps/achiran/image.png b/map-generator/assets/maps/achiran/image.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ab0aea82ba3c326247c68d4263b40c80815e10 GIT binary patch literal 1004887 zcmeFZ|3B0F|34n(sWX)vROjSNr4A0!SKl_HB9&O^gyUPNq nPJL0v|dNACCg?S8vmuh-l4 z_PBk<)oCN>SJ0X@Yc`%d;o!bzjcVtbHUD|O{y)HXUM(g43jC!6cXv9vri7-$2R^I| zIpT6;&6+a2+ESnj@cE~x6W;JOYkrPZd?~Rm=_A*ySt&f}aO5n~f3jA}y!Z`Ol$l{8 zJxuIB{_x_)r2F?x5r~KNyZOHS>D{gaam Wo>?QUu|S2pya$fqW<*6WcmEBtizM<=-%{%9=SkXvoihB!?^IV`>EA` zoKya O 3CM&{Wq3>_=?N?2Kz(3w?{ zeKE-D6}c)Ih8fZ1?a6DKpE9h;jW;fQ_4=RBQL~7ILI&aVT1E{UJ8v jXooF#s#63o?xSY5!oC;GLSBK2JH&y)dHyO=#a-np<01r8E zGpTNOKIa28U1Xjb&UF16U;B9WKNtUzf2bK@1C{gsBH46J qdai*=5`IbcIQcFy-dIPnn*tIs7RfEJ}YI7PYJMyKGv8si)TzY2AXbkf~eZk z=dKur$4JLQC>Pn~JUJguk~N6yB;f?s61QAs{-&zkLEHIWb+URwl&rPN{S*pY{?GHd zI&-uhILmYEVv-}1;Z1NA(cJ Rq0AD95+{@O4bgu~YSE3giw$|;#E>8rI>XxS> zVeI8;1X)s_=$ta^-s;$J%6@h3KUKB4_s!V2xbs-Zy4d7M+vetQW-}rWPDDmXHW?FT z39%Ju-a d@ENv zoJ!N6lM)vBd?}AaN|<{Y&_SJPP-CbkE_~#-1;}T0Bv%7u{TNJ>c7@pXd*Nft_5TuX z7uqrm7{}C$Z}a%ZP!QJuG>(2^l21;85_uv9NiG&w(XkPWt)6uUBAN094ju-BN=L=* z2kGrB9vv#1Y=_frEti3S&(_0=yR4yc4_3x9*=Lm$kr?>TNbDcKM%;x!r<>pmorjYP z?QzKIEz=PzMBx{i4t`dE;epGO rrpaT$aTOsw aIS>Fxh?mkEWP- z7-^v~8}Y~_szwE@TseAfGS9PGxq8Gpu&r!;R95tOSG_0*G26Jy9+y=T-Uh!-i>; zDXQvn%2xlZl-PCi%*c9d|GTR_u|w~#^BZq#!uteR!QR17!138!`seXIo$QScLN5#- zj+_xgVCuk1wOR-Bv09x6b(Iu|$D$Pn%Acj)tF5$2^u2Ey*2MT!0Xz RQKKpm5Sne$NAzNB@`QX|5AH>3K6Lx)~6 ~dDByf_kjl~ui*YPU2j9(@FJr9(vRR4iC<)akMva%L!YqPT*l zY{RSy*5|WU xncs4P{~FHd=&AWyzS6qJ6u)>9HscG6#tQxUtjs$b88{F3i$A$IRVP$VGwq=B_$d?&H4z&&I(#abDvr&VgLh568fBk Xn|%*+KteLV&3nGR0%=I(YjrYYOI=R-wo_P|jMhid9bW3Gm(Q8z zbME0jCyX@S4rLU%Fb? wuQCqqM)e|Lr3Ns=nWzHv}>LOakv^%Gv2)Cer3AeC8 zbSzMx-|g+u=r|(u*-X`_!NP2mt8Y{VRk9yxwKA^ybq!9jwLAN6=tdL5d+S%01teD8 z@{f!tZ400cJ&>oEV*+iWhTg}{ee;CrOFugm G5I3xVRm&*M zd~;9cR8-((XIHzj>{Ek{Hy%^|w@VP#7jt1tr^h~h$0&!0WO#A}#m8wqk1$f5j|6e@ zkvMXdz?&{gUgp@zIi~65hh>Tlk?M}8jfZh?X}HTY8C`hXaPsR54~C27;GyN7mBj$^ z%aZCV^A>DMICFzfb>v|6wJmfQ5n|1AeyX1ES^zaK^d0|~<9P&N3m0|hLZ@jm-YCt4 zxb}wSFb7P_bbz}l0%ecTcgA6*yQ1#!kCLR9xFqyG;k4e+jQKVZC{MX^xnL!sdcOZ^ z2p--D6qLShY%@-mG5j%=M?EP5ZW2x4TAJp6s_OMW=}YNvVZ$X!CCw<%_<9yHckNM| zh6;hR#Fp>O?-res)Qm{C)-N=9?`!7hd>{lj# EF|MkDJd;_4pwMV?S=RY-e%9 zm^dWP69`d3UwH`So|x*KJ2fP{Qa{`3qTT6iymj9{Yu2~qy#xBlp-DuBA*Y6Z`zB9X zD`C|v)Wvok!$M%z=y!?Ja8eFXWlM7tcv1jL<$8}FU*KZ@C&OP~R@7==3!e)1wI09n z^SCp(3hQRz*T|xQyMSZabi)p1yEtATl6`y829&Zx_3GHLo9?Ho_Idq-!If^|V@pD; zZlG>N<+6BbLugV>N{!$cOgLcmsV%s5mtAsrExlegC;*br4a VlrK`$FC8Dy0B z)o>9+gDg%;LdW5rcEORA)Wn5UZ+kWnm%f`&_YFzU?V?8-sl~FwOx79Tg2Y_^7ihZ| zvtoVJ+UM_y&`ovagy40tY;1{riDeb>dxTOw5y+Q$kMu{Zj#}qik5nn! I`?uPx_Eo1yb%-iKDqSH|j3CyFc+5B^UyZrpCsz6&gUxU~VY%XUl;NFJ_< zv!gBiH*FEG6!Ea;-{K){T-}a34~fEmE~(XT JKkxU=LrEWL*>6*hMZh5%$2nGHRO_#-v@~87wh9Qt`8t7vt6=*sN`#2Hl ?iLp_!qcFmuydXFrBX2^XE4wqzkW8w5~xMI_ra@2X`G zSdTB02uKk%QxpXbC>cThdt&%CtUva$f=(2*nKAcG^ zrl{t*#r@j!VH|imi#1m=VFFZ5v-7Lb^;QEgLXUvc1w$i?Ws&lZ!;Jbx&kz#(-NZ}~ z5`eUxz>i!{1AyU|GE6NZhkT+$0^HmxY|RL&ZmsQpb2`VCR-3f9M`=G{-@0h1Hm&b( z-C wQ5yl`e;16IWCC`Tp$8K(m!O}M7N?tKBVcnDi+!!xU2 zDnbM3%FO=1HWE}Z7)P%@I%m>S;+J}9SVy=Hf22tZm)R(Wy8*b?J;Cw^5k#<`ZYKJV z87Gl>3){?9=ER5eRYVWO+nm d>vU+BkM8_SXMGCVeHaoowy=FYg~ zU@T+udV+Yo3sr+io;6Pp-Vu?T0kGav6p5YiVHDt@Hj%3M@W;n~!343jJqHfdN;|Z_ zIvbZBUY!nmOjI`!2(?>QCg~;MNF`af58jpRnk&4lW2*^#@Aq4oz?n2r!kdd!^?gNp z^l)a6W@jelBE2%5qi66?mUot02q3A&2L?`;v?@^uYt|T*qXUCOXc}LH4o+UpKDs_A z%SA;F<<|g2$@H-SK?I$nC(M_Nsv q7alny}To~%^>s&(SY zVf>tEE46Qzp1G4_mR68^*paip*mfbNA>zN0&A_kNv`%0TTtmBP^n^$_$mJR2l^SM* zWTCdPtB89C93x}b#W( ?`1`KAm*oD7TMhNe> zhW$d4wuf+wnbPN`vxoGlgT_omfv3HBA(gT^W%#SbO^xV|@yrueN+$c@VStWN?zlDO zu^U8@cu#})Vc+}}$L;U!f7)K3H~GNLNI#%$SaP~RQU$Nwk 9`W$AMoDf?Wcps` zK;!pD`Hx6?ljawh3xHtK7RFA%uo`UH!O-bV2hzC{w|NCo(*q>sY8DT~g_=GIMCRY* zoy6PYcv1!a?2|3Uvt_KwK-@Tf92Z3cGy0|#Koy>a+Vz(KQBze&ph6{8^lP$t0G6&M z$7A0v(TN7-_6H*B>q6*V`~~4*C4(bLR+&*agmnX@L2bl>`Obi7a{jK-tLITApC1zO zocRyyA()>fuodw)Q63 1AM#S;L2=fJtT3&7>`&4D(I!IrBB-<3G7F8;Y>;&Q|H+L;%{Kn&TlH9 z!V(u5<;^w%*Om9GlykuG`>y$~;|DP*gV1H6e!w#Lr)Jr_uFpUnmPfnE=qd<_mm3G| z$lBpwQ(L+V)L_#9W|pt?k&4IoH8dwd 7Vp!4Ml z;blv!ove@Us&2P5gQ;(rSW?In0192cjQ;+D>{@T9YbCE(iEB2^C)vz> rP+R4q&2N@uH`WG8f2pkz&QMk8s010k8*|L`39>=w0 zV 5~D{R?i|q;)+Zp z>*_1YEoRw?vgz&2I!!r%pov>LNhoeMKLl9&((U`W%L#Pb03s1N(hMgkvgLmtTie)s zB}$>KL6kv+Nt9vYBKhjBSyru+CndsggD| Fh_4@gIAQWs5tUJGdl4|n0Q`!hJ^S@=iS+v4ZVTP< zkR~{gD$uX+aEfStVTkcFO+cFfjq`shU7%rAN=423iI^?T8m;wn#gQ%~*#Pg7(y}w4 zlq}Ii&3f@+xSNL6K{iW3>Lz|%nKiF)HFU* ej$f( yY}Q#)|kI zkx Lfc@mS#lpGuRbHB;3`ZA4&r80%OJl$Ps;*``Jf zxhL7m3&-8YFLYS*VgyRoD+Ukk6g %G#Yb b`%bD zdv {an`WM6hxKH z=c3q^%F*e)pf(IQKFH~VciEp>o86OW`&6Xj%XXPb31)P$n+`0;#iXc1kP%8OScs^M z)=mghRmpNTdjaqkV*?~0ed9%jB2!UF-H1Ve!5d o#~Kt&27Yef1=Cfre_EgC6M{ zP2DHIslRl7v5%f$5l^y{O_rBi(K05vZTm;81y)X%c~~BGMF)Qk3aG96v<4d%A6b+* zW)hHHH 5<>IxHRy_TMRea_zV zvTKF|yh*G@_jrF!2O#i;$k2fPyiTlHcN<)be(z@QBcF|Uy#;=;KR^lHY22cmX#!5q zPh=s{8@cI(PUDOflaZitXC`H0ELT)3S }a?GX=zQQFwnM6!MK&A3Wq@@d6dahRjni9p^zJB-?xJc2K;JZZr zZHYD>lQgYbj^lK-8ofI8QkT6OxOV!2)@_ESkJk3%*R4e->2@g^6`d~E`(llQ?gUZd z?%qAxa@je3_EX#ISBbaqK~&zmmc6Niab8NFXNx5ZQAyG_wK4#DyVkEozABeKknfFr zu_oXYD)@R*!qUQRRKjU`ltU;Byoq{jAiU4%xSOqtP)K~DT)nH>r-DathR_TKM4RA{ zHjNrUj#APQh|CkEZ6eAfX=RDW+uIKi8zo&Ue6vj`5lGD5NLAd)(o{5PJh%oR9ww_9 zOk`NxWF_1tZgN4~oJghW)(oI{FZdk&0L_i= ?`8(eE9NxrM*+uHoSDdISC( zx${|CNhLv9Wc1qvzc>vFl4a}(CUT!x;OF!lF%$QNnPJKeCrCF?AU+q|eRa2p+l&4~ zfls@7-|}Z-SC-Y=l`C&lVYmlL*>)OlszRdbKgZu@@q=`@e!PAH6Px6$lv{~@310b` z6g4ZG46y^(%Lv6i8a2WlsyL0$8g2UVlVzy*IGpgTQ >1gH@or#Oi8Es zvjK@vQaQqX0xx_#JG(lC4 *lBp@R##iBQ7<& zGtBpc+SBzwdyLQGqmOU!{CeU#m~n3xHEtY5L#QmhV)w>5$K7j?UdCe&QMR5v1Du^k z rL&xH;8`#tbevgM%hUpND@r;-A<%M!h#zOx_i5F}4IdvHlO zp0)C#B2V%aP+Z)gW`0^hASR#Tw&9R;orGpxM7s_YvmhRrrn<`0MWgpZz&=$5w3TlG zQ&~V~?B%)sB7mP*ui~#LPB}u*1& h5S*L&-hk6?f4TSKM^W80=QE+8&E zW&eU{+0#?P>;bkF9VnTO=k0C7_E_&YVQ?v)9fcbO?-DO0h`VHvCXx6*^eFxBU%