From fe216cba4b83974540c0f6121124c1a29dd646e4 Mon Sep 17 00:00:00 2001 From: scamiv <6170744+scamiv@users.noreply.github.com> Date: Sat, 9 May 2026 00:42:09 +0200 Subject: [PATCH] Render name layer with Pixi --- eslint.config.js | 1 + package.json | 1 + resources/fonts/namelayer_overpass.png | Bin 0 -> 40861 bytes resources/fonts/namelayer_overpass.xml | 96 ++ resources/fonts/overpass-OFL.txt | 93 ++ resources/fonts/overpass-regular.otf | Bin 0 -> 69808 bytes resources/images/namelayer-emojis.json | 1214 +++++++++++++++++ resources/images/namelayer-emojis.png | Bin 0 -> 66989 bytes resources/images/namelayer-icons.json | 274 ++++ resources/images/namelayer-icons.png | Bin 0 -> 32338 bytes scripts/build-namelayer-assets.mjs | 351 +++++ src/client/graphics/PlayerIcons.ts | 6 +- src/client/graphics/layers/NameLayer.ts | 922 +++++++------ src/client/graphics/layers/NameLayerAssets.ts | 104 ++ src/client/graphics/layers/NameLayerLayout.ts | 195 +++ tests/NameLayer.test.ts | 76 +- 16 files changed, 2929 insertions(+), 404 deletions(-) create mode 100644 resources/fonts/namelayer_overpass.png create mode 100644 resources/fonts/namelayer_overpass.xml create mode 100644 resources/fonts/overpass-OFL.txt create mode 100644 resources/fonts/overpass-regular.otf create mode 100644 resources/images/namelayer-emojis.json create mode 100644 resources/images/namelayer-emojis.png create mode 100644 resources/images/namelayer-icons.json create mode 100644 resources/images/namelayer-icons.png create mode 100644 scripts/build-namelayer-assets.mjs create mode 100644 src/client/graphics/layers/NameLayerAssets.ts create mode 100644 src/client/graphics/layers/NameLayerLayout.ts diff --git a/eslint.config.js b/eslint.config.js index 3168893d5..e75c2f38c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -26,6 +26,7 @@ export default [ allowDefaultProject: [ "__mocks__/fileMock.js", "eslint.config.js", + "scripts/build-namelayer-assets.mjs", "scripts/sync-assets.mjs", ], }, diff --git a/package.json b/package.json index e0e3cecc2..5c234e22b 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "docs:map-generator": "cd map-generator && go doc -cmd -u -all", "tunnel": "npm run build-prod && npm run start:server", "test": "vitest run && vitest run tests/server", + "build:namelayer-assets": "node scripts/build-namelayer-assets.mjs", "perf": "npx tsx tests/perf/run-all.ts", "test:coverage": "vitest run --coverage", "format": "prettier --ignore-unknown --write .", diff --git a/resources/fonts/namelayer_overpass.png b/resources/fonts/namelayer_overpass.png new file mode 100644 index 0000000000000000000000000000000000000000..fd03648754a4c4a1f8ed5bc565eabea50751accc GIT binary patch literal 40861 zcmc$`byQT*+cta#1Ox@71WA!@kseBr8dADTbdUz=1_h;K=&q6OZbn)dKn9R*rBgcR zo!|RC&-4BD{{5_3YtF=4XPjE-04-lAtSvwX|I@p9WE?&sVp>M681a^xT! zO}V(-2lx>duV0gs$jDUb^P9i482ya(i3Eq7ghU2K@L4G?(-qeee;BLH{&GpWH1@Ql zBuyaC*T-k{#yi{J!nUw%87wd{VQPAo{3p|ORBZEq@$D>)LKFW;9daVyXPq${DL-jW zv62K6-g-B&$*eYfFKGdFB_Om%09EnzS@3A)3ND)n_)i#A$;SxQ0lVkeekahDUn(k& z!_BuHZE6pGgR+OjsE@NBZL&THYGklSI|6mv66cz!HLtYn3>(tptEWej25wftQ z7dEbtT@@p3)C<_tgb;WUvn2PnFeF6%+LJyb^in##_Rp@z+;d)LCWk%PQZ2+Tuky@icnGfJSX zqU|FBmta%SyXYKs4+j0#vbs@R_y}#HXs+5PAAM$p7OcaInA2bjN@DJi;_O^P9zR#jS)^ zpe0SjjWlsHu_(z*9??EMsJ$}iJofLO()roPFTek3tTJ(@@s+vsyZ!1MwcAU(VzT0( z+muIPu_(8PN3L@*S-eyhS={syF&^Ia150;6C@iRnD5>w{f;qkX_Y_f zjbN1THw($1Hy1%zhM&h?S_R)25~MD^m-eM>$l+a^<02W8M7+S6yelhSI*ABtG2gns zMT@O?S&Wp?qY||EW|BpKJUzFM>B=tP1(Zkn|7X;%26Hr zXS9l=&E;0pkM&j*5nK^5POmFiw*kl|b|6z!WvPh<9T1Y2<16ItBe2rYF)1CQr+Eno z-eeF8u23M-U;!*PCH!VmR#BTG@u!|E6`>FG8FnFHO3|;>(YVg)u!o-S9bu>E!e&dO z&P)3&ra1P$wJk9yBtw}{{jYC=MD*$8xf$JJWUu>H}g!7Y}7uHSY*}IwsjEzlvqu`>igp=Z|XW z)gp&B`F&vm3l9&6yR}_DoGf@Ax!3whmYcr18ScvBknVMj59vyF>+CkkQ5=cd!}9zP z>aBCbj$|7%KjmfJ9z*>80w$KQES2@uX5IeVG8V~M@BgEBR~1D9OU62{n)RErW0usi z@JDl2R|Yhzp|WtMbR%1wnS$Q1`0H;k@Lwoj*TK8kZ;2#qpaMZxZcWek4I!5X$haN!K0Gjk!1CiFR zvgeXg@~DH7B8t&FG~7AhHYiPPtkGDDF}C*{cAi`>Tfc7vE5vdVsS8Xb^Uo_Ry}Ck& z{Un(7exz)qn^(syWo=}FN<;WS&)@&xKgY9l^j#80EG(>V640_vdY+2nMZNsy<+Ktb zCz+D;%s0L^yX%C^!He;R<~#2v?K69V1z7Q>rA15a{5S{7HK=jN;^wMOIFR1!l_n)3 zMa5oLLunHz{=1dr7&i)Xem~`+3!3@zQeVV_?68yBU}M5 zq9CFbF<@<<5*SsU%?>h*GPNkB=*^#Y3fx&hogw0*53JC*eA@gNSQYnrX?e zd77NP%IDj=l8Ry$Nc+Y#QyZvxQhiMK;`mJb>rAn^mf-limpQrpW_xuk4i-?h2JwhK z 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 Rs0)A%u6a+RTn+Kx{{j4cLWTeU literal 0 HcmV?d00001 diff --git a/resources/fonts/namelayer_overpass.xml b/resources/fonts/namelayer_overpass.xml new file mode 100644 index 000000000..2b316fe9d --- /dev/null +++ b/resources/fonts/namelayer_overpass.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/fonts/overpass-OFL.txt b/resources/fonts/overpass-OFL.txt new file mode 100644 index 000000000..2739ed0cf --- /dev/null +++ b/resources/fonts/overpass-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2021 The Overpass Project Authors (https://github.com/RedHatOfficial/Overpass) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/resources/fonts/overpass-regular.otf b/resources/fonts/overpass-regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..3a7c095fab33942b0597fcbd57fbfec815c9a2c5 GIT binary patch literal 69808 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 D3Nx>f literal 0 HcmV?d00001 diff --git a/resources/images/namelayer-emojis.json b/resources/images/namelayer-emojis.json new file mode 100644 index 000000000..655ac5e79 --- /dev/null +++ b/resources/images/namelayer-emojis.json @@ -0,0 +1,1214 @@ +{ + "frames": { + "😀": { + "frame": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "😊": { + "frame": { + "x": 64, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🥰": { + "frame": { + "x": 128, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "😇": { + "frame": { + "x": 192, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "😎": { + "frame": { + "x": 256, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "😞": { + "frame": { + "x": 320, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🥺": { + "frame": { + "x": 384, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "😭": { + "frame": { + "x": 448, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "😱": { + "frame": { + "x": 0, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "😡": { + "frame": { + "x": 64, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "😈": { + "frame": { + "x": 128, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🤡": { + "frame": { + "x": 192, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🥱": { + "frame": { + "x": 256, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🫡": { + "frame": { + "x": 320, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🖕": { + "frame": { + "x": 384, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "👋": { + "frame": { + "x": 448, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "👏": { + "frame": { + "x": 0, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "✋": { + "frame": { + "x": 64, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🙏": { + "frame": { + "x": 128, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "💪": { + "frame": { + "x": 192, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "👍": { + "frame": { + "x": 256, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "👎": { + "frame": { + "x": 320, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🫴": { + "frame": { + "x": 384, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🤌": { + "frame": { + "x": 448, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🤦‍♂️": { + "frame": { + "x": 0, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🤝": { + "frame": { + "x": 64, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🆘": { + "frame": { + "x": 128, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🕊️": { + "frame": { + "x": 192, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🏳️": { + "frame": { + "x": 256, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "⏳": { + "frame": { + "x": 320, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🔥": { + "frame": { + "x": 384, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "💥": { + "frame": { + "x": 448, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "💀": { + "frame": { + "x": 0, + "y": 256, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "☢️": { + "frame": { + "x": 64, + "y": 256, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "⚠️": { + "frame": { + "x": 128, + "y": 256, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "↖️": { + "frame": { + "x": 192, + "y": 256, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "⬆️": { + "frame": { + "x": 256, + "y": 256, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "↗️": { + "frame": { + "x": 320, + "y": 256, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "👑": { + "frame": { + "x": 384, + "y": 256, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🥇": { + "frame": { + "x": 448, + "y": 256, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "⬅️": { + "frame": { + "x": 0, + "y": 320, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🎯": { + "frame": { + "x": 64, + "y": 320, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "➡️": { + "frame": { + "x": 128, + "y": 320, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🥈": { + "frame": { + "x": 192, + "y": 320, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🥉": { + "frame": { + "x": 256, + "y": 320, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "↙️": { + "frame": { + "x": 320, + "y": 320, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "⬇️": { + "frame": { + "x": 384, + "y": 320, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "↘️": { + "frame": { + "x": 448, + "y": 320, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "❤️": { + "frame": { + "x": 0, + "y": 384, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "💔": { + "frame": { + "x": 64, + "y": 384, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "💰": { + "frame": { + "x": 128, + "y": 384, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "⚓": { + "frame": { + "x": 192, + "y": 384, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "⛵": { + "frame": { + "x": 256, + "y": 384, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🏡": { + "frame": { + "x": 320, + "y": 384, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🛡️": { + "frame": { + "x": 384, + "y": 384, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🏭": { + "frame": { + "x": 448, + "y": 384, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🚂": { + "frame": { + "x": 0, + "y": 448, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "❓": { + "frame": { + "x": 64, + "y": 448, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🐔": { + "frame": { + "x": 128, + "y": 448, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "🐀": { + "frame": { + "x": 192, + "y": 448, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + } + }, + "meta": { + "app": "scripts/build-namelayer-assets.mjs", + "image": "namelayer-emojis.png", + "format": "RGBA8888", + "size": { + "w": 512, + "h": 512 + }, + "scale": "1" + } +} diff --git a/resources/images/namelayer-emojis.png b/resources/images/namelayer-emojis.png new file mode 100644 index 0000000000000000000000000000000000000000..03e5276ac4b38007a8b4184f7f8aa8e0f05a0478 GIT binary patch literal 66989 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 literal 0 HcmV?d00001 diff --git a/resources/images/namelayer-icons.json b/resources/images/namelayer-icons.json new file mode 100644 index 000000000..91124e703 --- /dev/null +++ b/resources/images/namelayer-icons.json @@ -0,0 +1,274 @@ +{ + "frames": { + "AllianceIcon.svg": { + "frame": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "AllianceIconFaded.svg": { + "frame": { + "x": 64, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "AllianceRequestBlackIcon.svg": { + "frame": { + "x": 128, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "AllianceRequestWhiteIcon.svg": { + "frame": { + "x": 192, + "y": 0, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "CrownIcon.svg": { + "frame": { + "x": 0, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "DisconnectedIcon.svg": { + "frame": { + "x": 64, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "EmbargoBlackIcon.svg": { + "frame": { + "x": 128, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "EmbargoWhiteIcon.svg": { + "frame": { + "x": 192, + "y": 64, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "NukeIconRed.svg": { + "frame": { + "x": 0, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "NukeIconWhite.svg": { + "frame": { + "x": 64, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "QuestionMarkIcon.svg": { + "frame": { + "x": 128, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "TargetIcon.svg": { + "frame": { + "x": 192, + "y": 128, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + }, + "TraitorIcon.svg": { + "frame": { + "x": 0, + "y": 192, + "w": 64, + "h": 64 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 64, + "h": 64 + }, + "sourceSize": { + "w": 64, + "h": 64 + } + } + }, + "meta": { + "app": "scripts/build-namelayer-assets.mjs", + "image": "namelayer-icons.png", + "format": "RGBA8888", + "size": { + "w": 256, + "h": 256 + }, + "scale": "1" + } +} diff --git a/resources/images/namelayer-icons.png b/resources/images/namelayer-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..8d85df2d13bfe51578d78e0833c239f0e0f999dc GIT binary patch literal 32338 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 C)YA|E literal 0 HcmV?d00001 diff --git a/scripts/build-namelayer-assets.mjs b/scripts/build-namelayer-assets.mjs new file mode 100644 index 000000000..8727a8a60 --- /dev/null +++ b/scripts/build-namelayer-assets.mjs @@ -0,0 +1,351 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const root = path.resolve(__dirname, ".."); +const fontsDir = path.join(root, "resources", "fonts"); +const imagesDir = path.join(root, "resources", "images"); + +const fontPng = "namelayer_overpass.png"; +const fontXml = "namelayer_overpass.xml"; +const fontFace = "namelayer_overpass"; +const fontSourceCandidates = [ + "overpass-regular.otf", + "overpass-regular.ttf", + "overpass.otf", + "overpass.ttf", + "overpass.woff", +]; +const glyphs = Array.from( + new Set( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ üÜ.[]+-=(),':!?/@#$%&\"".split( + "", + ), + ), +); + +const iconSources = [ + "AllianceIcon.svg", + "AllianceIconFaded.svg", + "AllianceRequestBlackIcon.svg", + "AllianceRequestWhiteIcon.svg", + "CrownIcon.svg", + "DisconnectedIcon.svg", + "EmbargoBlackIcon.svg", + "EmbargoWhiteIcon.svg", + "NukeIconRed.svg", + "NukeIconWhite.svg", + "QuestionMarkIcon.svg", + "TargetIcon.svg", + "TraitorIcon.svg", +]; + +fs.mkdirSync(fontsDir, { recursive: true }); +fs.mkdirSync(imagesDir, { recursive: true }); + +const canvasApi = await loadCanvasApi(); + +await buildBitmapFont(); +await buildIconAtlas(); +await buildEmojiAtlas(); + +async function loadCanvasApi() { + try { + const api = await import("canvas"); + const fontPath = fontSourceCandidates + .map((fileName) => path.join(fontsDir, fileName)) + .find((candidate) => fs.existsSync(candidate)); + try { + if (!fontPath) { + throw new Error( + `No Overpass font source found. Tried: ${fontSourceCandidates.join( + ", ", + )}`, + ); + } + api.registerFont(fontPath, { + family: "OverpassNameLayer", + }); + } catch (error) { + console.warn( + "Could not register Overpass; using canvas fallback font", + error, + ); + } + return api; + } catch (error) { + console.warn( + "canvas native bindings are unavailable; writing deterministic fallback NameLayer assets", + error, + ); + return null; + } +} + +async function buildBitmapFont() { + if (!canvasApi) { + const fallbackXml = fs + .readFileSync(path.join(fontsDir, "round_6x6_modified.xml"), "utf8") + .replace(/face="round_6x6_modified"/g, `face="${fontFace}"`) + .replace(/file="round_6x6_modified\.png"/g, `file="${fontPng}"`); + fs.writeFileSync( + path.join(fontsDir, fontPng), + fs.readFileSync(path.join(fontsDir, "round_6x6_modified.png")), + ); + fs.writeFileSync(path.join(fontsDir, fontXml), fallbackXml); + return; + } + + const { createCanvas } = canvasApi; + const cell = 64; + const cols = 16; + const rows = Math.ceil(glyphs.length / cols); + const canvas = createCanvas(cols * cell, rows * cell); + const ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.fillStyle = "#ffffff"; + ctx.textBaseline = "alphabetic"; + ctx.textAlign = "left"; + ctx.font = '48px "OverpassNameLayer", Arial, sans-serif'; + + const chars = []; + glyphs.forEach((glyph, index) => { + const col = index % cols; + const row = Math.floor(index / cols); + const x = col * cell; + const y = row * cell; + const metrics = ctx.measureText(glyph); + const advance = glyph === " " ? 16 : Math.max(16, Math.ceil(metrics.width)); + const drawX = x + 4; + const drawY = y + 48; + if (glyph !== " ") { + ctx.fillText(glyph, drawX, drawY); + } + chars.push({ + id: glyph.codePointAt(0), + x, + y, + width: cell, + height: cell, + xadvance: advance, + xoffset: 0, + yoffset: 0, + label: glyph, + }); + }); + + const xml = ` + + + + + + + +${chars + .map( + (char) => + ` `, + ) + .join("\n")} + + +`; + + fs.writeFileSync(path.join(fontsDir, fontPng), canvas.toBuffer("image/png")); + fs.writeFileSync(path.join(fontsDir, fontXml), xml); +} + +async function buildIconAtlas() { + if (!canvasApi) { + writeFallbackAtlas("namelayer-icons", iconSources); + return; + } + + const { createCanvas, loadImage } = canvasApi; + const cell = 64; + const cols = 4; + const rows = Math.ceil(iconSources.length / cols); + const canvas = createCanvas(cols * cell, rows * cell); + const ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, canvas.width, canvas.height); + const frames = {}; + + for (let i = 0; i < iconSources.length; i++) { + const source = iconSources[i]; + const col = i % cols; + const row = Math.floor(i / cols); + const x = col * cell; + const y = row * cell; + try { + const img = await loadIconImage(path.join(imagesDir, source), loadImage); + ctx.drawImage(img, x, y, cell, cell); + } catch (error) { + console.warn( + `Could not pack ${source}; leaving empty atlas frame`, + error, + ); + } + frames[source] = { + frame: { x, y, w: cell, h: cell }, + rotated: false, + trimmed: false, + spriteSourceSize: { x: 0, y: 0, w: cell, h: cell }, + sourceSize: { w: cell, h: cell }, + }; + } + + fs.writeFileSync( + path.join(imagesDir, "namelayer-icons.png"), + canvas.toBuffer("image/png"), + ); + fs.writeFileSync( + path.join(imagesDir, "namelayer-icons.json"), + JSON.stringify( + { + frames, + meta: { + app: "scripts/build-namelayer-assets.mjs", + image: "namelayer-icons.png", + format: "RGBA8888", + size: { w: canvas.width, h: canvas.height }, + scale: "1", + }, + }, + null, + 2, + ), + ); +} + +async function loadIconImage(sourcePath, loadImage) { + if (path.extname(sourcePath).toLowerCase() !== ".svg") { + return loadImage(sourcePath); + } + + let svg = fs.readFileSync(sourcePath, "utf8"); + if (!/]*\swidth=/i.test(svg) || !/]*\sheight=/i.test(svg)) { + const [, , , width, height] = + svg.match( + /viewBox=["']\s*([-\d.]+)\s+([-\d.]+)\s+([-\d.]+)\s+([-\d.]+)\s*["']/i, + ) ?? []; + svg = svg.replace( + / { + const col = index % cols; + const row = Math.floor(index / cols); + const x = col * cell; + const y = row * cell; + ctx.fillText(emoji, x + cell / 2, y + cell / 2); + frames[emoji] = { + frame: { x, y, w: cell, h: cell }, + rotated: false, + trimmed: false, + spriteSourceSize: { x: 0, y: 0, w: cell, h: cell }, + sourceSize: { w: cell, h: cell }, + }; + }); + + fs.writeFileSync( + path.join(imagesDir, "namelayer-emojis.png"), + canvas.toBuffer("image/png"), + ); + fs.writeFileSync( + path.join(imagesDir, "namelayer-emojis.json"), + JSON.stringify( + { + frames, + meta: { + app: "scripts/build-namelayer-assets.mjs", + image: "namelayer-emojis.png", + format: "RGBA8888", + size: { w: canvas.width, h: canvas.height }, + scale: "1", + }, + }, + null, + 2, + ), + ); +} + +function readEmojiTable() { + const utilSource = fs.readFileSync( + path.join(root, "src", "core", "Util.ts"), + "utf8", + ); + const tableSource = utilSource.match( + /export const emojiTable = \[([\s\S]*?)\] as const;/, + )?.[1]; + return tableSource + ? Array.from(tableSource.matchAll(/"([^"]+)"/g), (match) => match[1]) + : []; +} + +function writeFallbackAtlas(name, keys) { + const transparentPng = Buffer.from( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAFgwJ/lD6N7wAAAABJRU5ErkJggg==", + "base64", + ); + const frames = {}; + + for (const key of keys) { + frames[key] = { + frame: { x: 0, y: 0, w: 1, h: 1 }, + rotated: false, + trimmed: false, + spriteSourceSize: { x: 0, y: 0, w: 1, h: 1 }, + sourceSize: { w: 1, h: 1 }, + }; + } + + fs.writeFileSync(path.join(imagesDir, `${name}.png`), transparentPng); + fs.writeFileSync( + path.join(imagesDir, `${name}.json`), + JSON.stringify( + { + frames, + meta: { + app: "scripts/build-namelayer-assets.mjs", + image: `${name}.png`, + format: "RGBA8888", + size: { w: 1, h: 1 }, + scale: "1", + }, + }, + null, + 2, + ), + ); +} diff --git a/src/client/graphics/PlayerIcons.ts b/src/client/graphics/PlayerIcons.ts index 935de9388..36615e0e2 100644 --- a/src/client/graphics/PlayerIcons.ts +++ b/src/client/graphics/PlayerIcons.ts @@ -341,6 +341,10 @@ export function updateAllianceProgressIconRefs( } export function computeAllianceClipPath(fraction: number): string { - const topCut = 20 + (1 - fraction) * 80 * 0.78; // min 20%, max 82.40% + const topCut = computeAllianceTopCutPercent(fraction); return `inset(${topCut.toFixed(2)}% -2px 0 -2px)`; } + +export function computeAllianceTopCutPercent(fraction: number): number { + return 20 + (1 - fraction) * 80 * 0.78; // min 20%, max 82.40% +} diff --git a/src/client/graphics/layers/NameLayer.ts b/src/client/graphics/layers/NameLayer.ts index 701e09c26..16b206299 100644 --- a/src/client/graphics/layers/NameLayer.ts +++ b/src/client/graphics/layers/NameLayer.ts @@ -1,4 +1,5 @@ -import { assetUrl } from "src/core/AssetUrls"; +import * as PIXI from "pixi.js"; +import { assetUrl } from "../../../core/AssetUrls"; import { EventBus } from "../../../core/EventBus"; import { PseudoRandom } from "../../../core/PseudoRandom"; import { Config, Theme } from "../../../core/configuration/Config"; @@ -9,8 +10,7 @@ import { AlternateViewEvent } from "../../InputHandler"; import { renderTroops } from "../../Utils"; import { ALLIANCE_ICON_ID, - AllianceProgressIconRefs, - createAllianceProgressIconRefs, + computeAllianceTopCutPercent, EMOJI_ICON_KIND, getFirstPlacePlayer, getPlayerIcons, @@ -18,58 +18,80 @@ import { PlayerIconDescriptor, PlayerIconId, TRAITOR_ICON_ID, - updateAllianceProgressIconRefs, } from "../PlayerIcons"; import { TransformHandler } from "../TransformHandler"; import { Layer } from "./Layer"; +import { NameLayerAssets } from "./NameLayerAssets"; +import { + computeNameLayerFontSize, + computeNameLayerLayout, + computeNameLayerScale, + computeNameLayerVisible, + computeTraitorFlashAlpha, + replaceUnsupportedNameGlyphs, +} from "./NameLayerLayout"; -const PLAYER_NAME = "player-name"; -const PLAYER_NAME_SPAN = "player-name-span"; -const PLAYER_TROOPS = "player-troops"; -const PLAYER_ICONS = "player-icons"; -const PLAYER_FLAG = "player-flag"; +const allianceIconFaded = assetUrl("images/AllianceIconFaded.svg"); +const questionMarkIcon = assetUrl("images/QuestionMarkIcon.svg"); + +type PixiRenderer = PIXI.Renderer | PIXI.WebGLRenderer | PIXI.WebGPURenderer; + +interface PixiIconRender { + container: PIXI.Container; + centered: boolean; + src?: string; + sprite?: PIXI.Sprite; + text?: PIXI.Text; + alliance?: { + base: PIXI.Sprite; + colored: PIXI.Sprite; + questionMark: PIXI.Sprite; + mask: PIXI.Graphics; + }; +} class RenderInfo { - public icons: Map = new Map(); - public allianceIconRefs: AllianceProgressIconRefs | null = null; + public icons: Map = new Map(); + public location: Cell | null = null; + public baseSize = 1; + public fontSize = 0; + public fontColor = ""; + public flagSrc = ""; + public flagSprite: PIXI.Sprite | null = null; + public lastDisplayName = ""; + public lastTroopsText = ""; constructor( public player: PlayerView, public lastRenderCalc: number, - public location: Cell | null, - public fontSize: number, - public fontColor: string, - public element: HTMLElement, - public nameDiv: HTMLDivElement, - public nameSpan: HTMLSpanElement, - public troopsDiv: HTMLDivElement, - public flagImg: HTMLImageElement, - public iconsDiv: HTMLDivElement, - public lastTransform: string = "", + public container: PIXI.Container, + public nameText: PIXI.BitmapText, + public troopsText: PIXI.BitmapText, ) {} } export class NameLayer implements Layer { private config: Config; private lastChecked = 0; - private renderCheckRate = 100; - private renderRefreshRate = 500; - private rand = new PseudoRandom(10); - private renders: RenderInfo[] = []; - private seenPlayers: Set = new Set(); - private container: HTMLDivElement; + private readonly renderCheckRate = 100; + private readonly renderRefreshRate = 500; + private readonly rand = new PseudoRandom(10); + private readonly renders: RenderInfo[] = []; + private readonly seenPlayers: Set = new Set(); + private readonly rootStage: PIXI.Container = new PIXI.Container(); + private readonly labelStage: PIXI.Container = new PIXI.Container(); + private readonly assets = new NameLayerAssets(); private theme: Theme; private userSettings: UserSettings = new UserSettings(); - private isVisible: boolean = true; + private isVisible = true; private firstPlace: PlayerView | null = null; private allianceDuration: number; - private alliancesDisabled: boolean = false; + private alliancesDisabled = false; private myPlayer: PlayerView | null = null; - private lastContainerTransform: string = ""; - private basePlayerTemplate: HTMLDivElement; - private iconTemplate: HTMLImageElement; - private iconCenterTemplate: HTMLImageElement; - private emojiTemplate: HTMLDivElement; + private pixicanvas: HTMLCanvasElement; + private renderer: PixiRenderer | null = null; + private rendererInitialized = false; + private rebuildPending = false; constructor( private game: GameView, @@ -81,86 +103,41 @@ export class NameLayer implements Layer { return false; } - redraw() {} // not affected by Canvas/WebGL context loss as this layer is DOM-based - - public init() { - this.container = document.createElement("div"); - this.container.style.position = "fixed"; - this.container.style.left = "50%"; - this.container.style.top = "50%"; - this.container.style.pointerEvents = "none"; - this.container.style.zIndex = "2"; - document.body.appendChild(this.container); - - // Add CSS keyframes for traitor icon flashing animation - // Append to container instead of document.head to keep styles scoped to this component - const style = document.createElement("style"); - style.textContent = ` - @keyframes traitorFlash { - 0%, 100% { - opacity: 1; - } - 50% { - opacity: 0.3; - } - } - `; - this.container.appendChild(style); - + async init() { this.myPlayer = this.game.myPlayer(); this.config = this.game.config(); this.theme = this.config.theme(); - this.alliancesDisabled = this.config.disableAlliances(); this.allianceDuration = Math.max(1, this.config.allianceDuration()); - this.basePlayerTemplate = this.createBasePlayerElement(); - - this.iconTemplate = document.createElement("img"); - - this.iconCenterTemplate = document.createElement("img"); - this.iconCenterTemplate.style.position = "absolute"; - this.iconCenterTemplate.style.top = "50%"; - this.iconCenterTemplate.style.transform = "translateY(-50%)"; - - this.emojiTemplate = document.createElement("div"); - this.emojiTemplate.style.position = "absolute"; - this.emojiTemplate.style.top = "50%"; - this.emojiTemplate.style.transform = "translateY(-50%)"; + this.rootStage.addChild(this.labelStage); + this.rootStage.position.set(0, 0); this.eventBus.on(AlternateViewEvent, (e) => this.onAlternateViewChange(e)); + window.addEventListener("resize", () => this.resizeCanvas()); + + await this.setupRenderer(); + this.resizeCanvas(); } - private onAlternateViewChange(event: AlternateViewEvent) { - this.isVisible = !event.alternateView; - // Update visibility of all name elements immediately - for (const render of this.renders) { - this.updateElementVisibility(render); - } - } - - private updateElementVisibility(render: RenderInfo, baseSize?: number) { - if (!render.player.nameLocation() || !render.player.isAlive()) { + async redraw() { + if (this.rebuildPending || this.rendererOrGLContextLost()) { return; } - - baseSize = - baseSize ?? Math.max(1, Math.floor(render.player.nameLocation().size)); - const size = this.transformHandler.scale * baseSize; - const isOnScreen = render.location - ? this.transformHandler.isOnScreen(render.location) - : false; - const maxZoomScale = 17; - - const display = - !this.isVisible || - size < 7 || - (this.transformHandler.scale > maxZoomScale && size > 100) || - !isOnScreen - ? "none" - : "flex"; - if (render.element.style.display !== display) { - render.element.style.display = display; + this.rebuildPending = true; + try { + if (this.renderer?.name === "webgpu") { + this.rendererInitialized = false; + await this.setupRenderer(); + } + this.resizeCanvas(); + for (const render of this.renders) { + render.container.destroy({ children: true }); + } + this.renders.length = 0; + this.seenPlayers.clear(); + } finally { + this.rebuildPending = false; } } @@ -168,385 +145,526 @@ export class NameLayer implements Layer { return 1000; } - public tick() { - // Precompute the first-place player for performance + tick() { this.firstPlace = getFirstPlacePlayer(this.game); for (const player of this.game.playerViews()) { - if (player.isAlive()) { - if (!this.seenPlayers.has(player)) { - this.seenPlayers.add(player); - this.renders.push(this.createPlayerElement(player)); - } + if (player.isAlive() && !this.seenPlayers.has(player)) { + this.seenPlayers.add(player); + this.renders.push(this.createPlayerRender(player)); } } } - public renderLayer() { - const screenPosOld = this.transformHandler.worldToScreenCoordinates( - new Cell(0, 0), - ); - const screenPos = new Cell( - screenPosOld.x - window.innerWidth / 2, - screenPosOld.y - window.innerHeight / 2, - ); - const newTransform = `translate(${screenPos.x}px, ${screenPos.y}px) scale(${this.transformHandler.scale})`; - if (this.lastContainerTransform !== newTransform) { - this.container.style.transform = newTransform; - this.lastContainerTransform = newTransform; + renderLayer(mainContext: CanvasRenderingContext2D) { + if (this.rendererOrGLContextLost()) { + return; } + this.myPlayer ??= this.game.myPlayer(); + this.updateTransformsAndVisibility(); + const now = Date.now(); if (now > this.lastChecked + this.renderCheckRate) { this.lastChecked = now; - - this.myPlayer ??= this.game.myPlayer(); const transitiveTargets = this.myPlayer?.transitiveTargets() ?? []; - - for (const render of this.renders) { - this.renderPlayerInfo(render, transitiveTargets); + for (const render of [...this.renders]) { + this.renderPlayerInfo(render, transitiveTargets, now); } } + + this.renderer?.render(this.rootStage); + if (this.renderer) { + mainContext.drawImage(this.renderer.canvas, 0, 0); + } } - private createBasePlayerElement(): HTMLDivElement { - const element = document.createElement("div"); - element.style.position = "absolute"; - element.style.flexDirection = "column"; - element.style.alignItems = "center"; - element.style.gap = "0px"; - // Start off invisible so it doesn't flash at 0,0 - element.style.display = "none"; - - const iconsDiv = document.createElement("div"); - iconsDiv.classList.add(PLAYER_ICONS); - iconsDiv.style.display = "flex"; - iconsDiv.style.gap = "4px"; - iconsDiv.style.justifyContent = "center"; - iconsDiv.style.alignItems = "center"; - iconsDiv.style.zIndex = "2"; - iconsDiv.style.opacity = "0.8"; - element.appendChild(iconsDiv); - - const nameDiv = document.createElement("div"); - nameDiv.classList.add(PLAYER_NAME); - nameDiv.style.whiteSpace = "nowrap"; - nameDiv.style.textOverflow = "ellipsis"; - nameDiv.style.zIndex = "3"; - nameDiv.style.display = "flex"; - nameDiv.style.justifyContent = "flex-end"; - nameDiv.style.alignItems = "center"; - - const flagImg = document.createElement("img"); - flagImg.classList.add(PLAYER_FLAG); - flagImg.style.opacity = "0.8"; - flagImg.style.zIndex = "1"; - flagImg.style.objectFit = "contain"; - flagImg.style.display = "none"; - nameDiv.appendChild(flagImg); - - const nameSpan = document.createElement("span"); - nameSpan.classList.add(PLAYER_NAME_SPAN); - nameDiv.appendChild(nameSpan); - element.appendChild(nameDiv); - - const troopsDiv = document.createElement("div"); - troopsDiv.classList.add(PLAYER_TROOPS); - troopsDiv.setAttribute("translate", "no"); - troopsDiv.style.zIndex = "3"; - troopsDiv.style.marginTop = "-5%"; - element.appendChild(troopsDiv); - - return element; - } - - private createPlayerElement(player: PlayerView): RenderInfo { - const element = this.basePlayerTemplate.cloneNode(true) as HTMLDivElement; - - // Queryselector expensive but this runs only once per player and better maintainable - const nameDiv = element.querySelector(`.${PLAYER_NAME}`) as HTMLDivElement; - const nameSpan = element.querySelector( - `.${PLAYER_NAME_SPAN}`, - ) as HTMLSpanElement; - const troopsDiv = element.querySelector( - `.${PLAYER_TROOPS}`, - ) as HTMLDivElement; - const flagImg = element.querySelector( - `.${PLAYER_FLAG}`, - ) as HTMLImageElement; - const iconsDiv = element.querySelector( - `.${PLAYER_ICONS}`, - ) as HTMLDivElement; - - const font = this.theme.font(); - nameDiv.style.fontFamily = font; - - const flag = player.cosmetics.flag; - if (flag) { - flagImg.src = assetUrl(flag); - flagImg.style.display = "block"; + private async setupRenderer() { + if (this.renderer) { + this.renderer.destroy(true); + this.labelStage.removeChildren(); } - const renderInfo = new RenderInfo( - player, - 0, - null, - 0, - "", - element, - nameDiv, - nameSpan, - troopsDiv, - flagImg, - iconsDiv, - ); + await this.assets.preload(); - this.container.appendChild(element); - return renderInfo; + this.pixicanvas = document.createElement("canvas"); + this.pixicanvas.width = window.innerWidth; + this.pixicanvas.height = window.innerHeight; + + const renderer = await PIXI.autoDetectRenderer({ + canvas: this.pixicanvas, + resolution: 1, + width: this.pixicanvas.width, + height: this.pixicanvas.height, + antialias: false, + clearBeforeRender: true, + backgroundAlpha: 0, + backgroundColor: 0x00000000, + }); + + console.info(`Using ${renderer.name} for name layer`); + this.renderer = renderer; + + if (this.renderer.name === "webgpu") { + const gpuRenderer = this.renderer as PIXI.WebGPURenderer; + gpuRenderer.gpu.device.lost.then(() => { + this.redraw(); + }); + } + + if (this.renderer.name === "webgl") { + this.renderer.runners.contextChange.add({ + contextChange: () => { + requestAnimationFrame(() => { + this.redraw(); + }); + }, + }); + } + + this.rendererInitialized = true; } - renderPlayerInfo(render: RenderInfo, transitiveTargets: PlayerView[]) { + private rendererOrGLContextLost(): boolean { + if (!this.renderer || !this.rendererInitialized) return true; + if (this.renderer.name === "webgl") { + return (this.renderer as PIXI.WebGLRenderer).context?.isLost === true; + } + return false; + } + + private resizeCanvas() { + if (this.rendererOrGLContextLost()) { + return; + } + this.pixicanvas.width = window.innerWidth; + this.pixicanvas.height = window.innerHeight; + this.renderer?.resize(window.innerWidth, window.innerHeight, 1); + } + + private onAlternateViewChange(event: AlternateViewEvent) { + this.isVisible = !event.alternateView; + this.updateTransformsAndVisibility(); + } + + private createPlayerRender(player: PlayerView): RenderInfo { + const container = new PIXI.Container(); + container.visible = false; + + const nameText = this.createBitmapText(""); + const troopsText = this.createBitmapText(""); + + container.addChild(nameText, troopsText); + this.labelStage.addChild(container); + + const render = new RenderInfo(player, 0, container, nameText, troopsText); + this.updateFlag(render); + return render; + } + + private createBitmapText(text: string): PIXI.BitmapText { + const bitmapText = new PIXI.BitmapText({ + text, + style: { + fontFamily: this.assets.fontFamily, + fontSize: 12, + fill: "#ffffff", + }, + }); + bitmapText.anchor.set(0.5); + return bitmapText; + } + + private updateTransformsAndVisibility() { + const now = performance.now(); + for (const render of this.renders) { + const nameLocation = render.player.nameLocation(); + if (!nameLocation || !render.player.isAlive()) { + render.container.visible = false; + continue; + } + + render.baseSize = Math.max(1, Math.floor(nameLocation.size)); + render.location = new Cell(nameLocation.x, nameLocation.y); + const isOnScreen = this.transformHandler.isOnScreen(render.location); + render.container.visible = computeNameLayerVisible({ + isLayerVisible: this.isVisible, + transformScale: this.transformHandler.scale, + baseSize: render.baseSize, + isOnScreen, + }); + + if (!render.container.visible) { + continue; + } + + const screenPos = this.transformHandler.worldToCanvasCoordinates( + render.location, + ); + render.container.position.set( + Math.round(screenPos.x), + Math.round(screenPos.y), + ); + render.container.scale.set(computeNameLayerScale(render.baseSize)); + this.updateTraitorAlpha(render, now); + } + } + + private renderPlayerInfo( + render: RenderInfo, + transitiveTargets: PlayerView[], + now: number, + ) { if (!render.player.nameLocation()) { return; } if (!render.player.isAlive()) { - this.renders = this.renders.filter((r) => r !== render); - render.element.remove(); + this.deleteRender(render); return; } - - // Update location and size, show or hide dependent on those - const nameLocation = render.player.nameLocation(); - const newX = nameLocation.x; - const newY = nameLocation.y; - - if ( - !render.location || - render.location.x !== newX || - render.location.y !== newY - ) { - render.location = new Cell(newX, newY); - } - - const baseSize = Math.max(1, Math.floor(nameLocation.size)); - this.updateElementVisibility(render, baseSize); - - if (render.element.style.display === "none") { + if (!render.container.visible) { return; } - - // Throttle further updates - const now = Date.now(); if (now - render.lastRenderCalc <= this.renderRefreshRate) { return; } render.lastRenderCalc = now + this.rand.nextInt(0, 100); - // Update text sizes, content and color - render.fontSize = Math.max(4, Math.floor(baseSize * 0.4)); - render.nameDiv.style.fontSize = `${render.fontSize}px`; - render.nameDiv.style.lineHeight = `${render.fontSize}px`; - render.flagImg.style.height = `${render.fontSize}px`; - render.troopsDiv.style.fontSize = `${render.fontSize}px`; + render.fontSize = computeNameLayerFontSize(render.baseSize); + this.updateText(render); + this.updateFlag(render); - render.nameSpan.textContent = render.player.displayName(); - render.troopsDiv.textContent = renderTroops(render.player.troops()); - - const fontColor = this.theme.textColor(render.player); - if (render.fontColor !== fontColor) { - render.fontColor = fontColor; - render.nameDiv.style.color = fontColor; - render.troopsDiv.style.color = fontColor; - } - - // Handle icons const iconSize = Math.min(render.fontSize * 1.5, 48); - const darkMode = this.userSettings.darkMode(); - const darkModeStr = darkMode.toString(); - - // Compute which icons should be shown for this player using shared logic const icons = getPlayerIcons({ game: this.game, player: render.player, includeAllianceIcon: true, firstPlace: this.firstPlace, - darkMode: darkMode, + darkMode: this.userSettings.darkMode(), alliancesDisabled: this.alliancesDisabled, - transitiveTargets: transitiveTargets, + transitiveTargets, }); - // Build a set of desired icon IDs - const desiredIconIds = new Set(icons.map((icon) => icon.id)); + this.updateIcons(render, icons, iconSize); + this.layoutRender(render, iconSize); + } - // Remove any icons that are no longer needed - for (const [id, element] of render.icons) { - if (!desiredIconIds.has(id)) { - if (id === ALLIANCE_ICON_ID) { - render.allianceIconRefs?.wrapper.remove(); - render.allianceIconRefs = null; - render.icons.delete(ALLIANCE_ICON_ID); - } else { - element.remove(); - render.icons.delete(id); - } + private updateText(render: RenderInfo) { + const displayName = replaceUnsupportedNameGlyphs( + render.player.displayName(), + ); + const troopsText = replaceUnsupportedNameGlyphs( + renderTroops(render.player.troops()), + ); + const fontColor = this.theme.textColor(render.player); + + if ( + render.lastDisplayName !== displayName || + render.fontColor !== fontColor || + render.nameText.style.fontSize !== render.fontSize || + render.nameText.style.fontFamily !== this.assets.fontFamily + ) { + render.nameText.text = displayName; + render.nameText.style = { + fontFamily: this.assets.fontFamily, + fontSize: render.fontSize, + fill: fontColor, + }; + render.lastDisplayName = displayName; + } + + if ( + render.lastTroopsText !== troopsText || + render.fontColor !== fontColor || + render.troopsText.style.fontSize !== render.fontSize || + render.troopsText.style.fontFamily !== this.assets.fontFamily + ) { + render.troopsText.text = troopsText; + render.troopsText.style = { + fontFamily: this.assets.fontFamily, + fontSize: render.fontSize, + fill: fontColor, + }; + render.lastTroopsText = troopsText; + } + + render.fontColor = fontColor; + } + + private updateFlag(render: RenderInfo) { + const flag = render.player.cosmetics.flag; + const src = flag ? assetUrl(flag) : ""; + if (!src) { + render.flagSprite?.destroy(); + render.flagSprite = null; + render.flagSrc = ""; + return; + } + + if (src !== render.flagSrc) { + render.flagSprite?.destroy(); + render.flagSprite = null; + render.flagSrc = src; + } + + const texture = this.assets.getTexture(src); + if (!texture) { + if (render.flagSprite) { + render.flagSprite.visible = false; + } + return; + } + + if (!render.flagSprite) { + render.flagSprite = new PIXI.Sprite(texture); + render.flagSprite.anchor.set(0.5); + render.flagSprite.alpha = 0.8; + render.container.addChild(render.flagSprite); + } else if (render.flagSprite.texture !== texture) { + render.flagSprite.texture = texture; + } + + render.flagSprite.visible = true; + } + + private updateIcons( + render: RenderInfo, + icons: PlayerIconDescriptor[], + size: number, + ) { + const desiredIds = new Set(icons.map((icon) => icon.id)); + for (const [id, iconRender] of render.icons) { + if (!desiredIds.has(id)) { + iconRender.container.destroy({ children: true }); + render.icons.delete(id); } } - // Add or update icons that should be shown for (const icon of icons) { - if (icon.kind === EMOJI_ICON_KIND && icon.text) { - this.handleEmojiIcon(render, icon, iconSize); - continue; - } else if (!(icon.kind === IMAGE_ICON_KIND && icon.src)) { - continue; + if (icon.kind === EMOJI_ICON_KIND) { + this.updateEmojiIcon(render, icon, size); + } else if (icon.id === ALLIANCE_ICON_ID) { + this.updateAllianceIcon(render, icon, size); + } else if (icon.kind === IMAGE_ICON_KIND && icon.src) { + this.updateImageIcon(render, icon, size); } - // Special handling for alliance icon with progress indicator - if (icon.id === ALLIANCE_ICON_ID) { - this.handleAllianceIcons(render, iconSize, darkModeStr); - continue; // Skip regular image handling - } - - const imgElement = this.handleOtherIcons( - render, - icon, - iconSize, - darkModeStr, - ); - - // Traitor flashing - smooth speed increase starting at 15s - if (icon.id === TRAITOR_ICON_ID) { - this.handleTraitorIconFlashing(render.player, imgElement); - } - } - - // Position element with scale - // Don't require nameLocation to be changed: Scale update otherwise sometimes only happens after seconds which looks buggy. - // Because of sometimes overlapping delays of 20 ticks for nameLocation() (largestClusterBoundingBox in PlayerExecution) - // and the 500ms renderRefreshRate in here. - const scale = Math.min(baseSize * 0.25, 3); - const transform = `translate(${newX}px, ${newY}px) translate(-50%, -50%) scale(${scale})`; - if (render.lastTransform !== transform) { - render.element.style.transform = transform; - render.lastTransform = transform; } } - private handleEmojiIcon( + private updateImageIcon( render: RenderInfo, icon: PlayerIconDescriptor, size: number, ) { - let emojiDiv = render.icons.get(icon.id) as HTMLDivElement | undefined; - - if (!emojiDiv) { - emojiDiv = this.emojiTemplate.cloneNode(true) as HTMLDivElement; - render.iconsDiv.appendChild(emojiDiv); - render.icons.set(icon.id, emojiDiv); + const src = icon.src; + if (!src) { + return; } - emojiDiv.textContent = icon.text ?? ""; - emojiDiv.style.fontSize = `${size}px`; + let iconRender = render.icons.get(icon.id); + if (!iconRender || iconRender.src !== src || !iconRender.sprite) { + iconRender?.container.destroy({ children: true }); + const container = new PIXI.Container(); + container.alpha = 0.8; + const sprite = new PIXI.Sprite(); + sprite.anchor.set(0.5); + container.addChild(sprite); + render.container.addChild(container); + iconRender = { + container, + centered: icon.center ?? false, + src, + sprite, + }; + render.icons.set(icon.id, iconRender); + } + + iconRender.centered = icon.center ?? false; + const texture = this.assets.getTexture(src); + iconRender.container.visible = texture !== null; + if (!texture) { + return; + } + + iconRender.sprite!.texture = texture; + iconRender.sprite!.width = size; + iconRender.sprite!.height = size; } - private handleAllianceIcons( + private updateEmojiIcon( render: RenderInfo, + icon: PlayerIconDescriptor, size: number, - darkMode: string, ) { + let iconRender = render.icons.get(icon.id); + if (!iconRender || !iconRender.text) { + iconRender?.container.destroy({ children: true }); + const container = new PIXI.Container(); + container.alpha = 0.8; + const text = new PIXI.Text({ + text: icon.text ?? "", + style: { + fontFamily: "sans-serif", + fontSize: size, + fill: "#ffffff", + }, + }); + text.anchor.set(0.5); + container.addChild(text); + render.container.addChild(container); + iconRender = { container, centered: icon.center ?? false, text }; + render.icons.set(icon.id, iconRender); + } + + iconRender.centered = icon.center ?? false; + iconRender.text!.text = icon.text ?? ""; + iconRender.text!.style = { + fontFamily: "sans-serif", + fontSize: size, + fill: "#ffffff", + }; + iconRender.container.visible = true; + } + + private updateAllianceIcon( + render: RenderInfo, + icon: PlayerIconDescriptor, + size: number, + ) { + let iconRender = render.icons.get(icon.id); + if (!iconRender || !iconRender.alliance) { + iconRender?.container.destroy({ children: true }); + const container = new PIXI.Container(); + container.alpha = 0.8; + const base = new PIXI.Sprite(); + const colored = new PIXI.Sprite(); + const questionMark = new PIXI.Sprite(); + const mask = new PIXI.Graphics(); + for (const sprite of [base, colored, questionMark]) { + sprite.anchor.set(0.5); + container.addChild(sprite); + } + colored.mask = mask; + container.addChild(mask); + render.container.addChild(container); + iconRender = { + container, + centered: false, + src: icon.src, + alliance: { base, colored, questionMark, mask }, + }; + render.icons.set(icon.id, iconRender); + } + + const baseTexture = this.assets.getTexture(allianceIconFaded); + const coloredTexture = icon.src ? this.assets.getTexture(icon.src) : null; + const questionTexture = this.assets.getTexture(questionMarkIcon); + iconRender.container.visible = + baseTexture !== null && coloredTexture !== null; + if (!baseTexture || !coloredTexture) { + return; + } + + const refs = iconRender.alliance!; + refs.base.texture = baseTexture; + refs.colored.texture = coloredTexture; + refs.base.width = size; + refs.base.height = size; + refs.colored.width = size; + refs.colored.height = size; + this.myPlayer ??= this.game.myPlayer(); const allianceView = this.myPlayer ?.alliances() .find((a) => a.other === render.player.id()); + const remaining = allianceView + ? Math.max(0, allianceView.expiresAt - this.game.ticks()) + : 0; + const fraction = Math.max( + 0, + Math.min(1, remaining / this.allianceDuration), + ); + const topCut = (computeAllianceTopCutPercent(fraction) / 100) * size; + refs.mask.clear(); + refs.mask + .rect(-size / 2, -size / 2 + topCut, size, Math.max(0, size - topCut)) + .fill(0xffffff); - let fraction = 0; - let hasExtensionRequest = false; - if (allianceView) { - const remaining = Math.max(0, allianceView.expiresAt - this.game.ticks()); - fraction = Math.max(0, Math.min(1, remaining / this.allianceDuration)); - hasExtensionRequest = allianceView.hasExtensionRequest; + refs.questionMark.visible = + allianceView?.hasExtensionRequest === true && questionTexture !== null; + if (questionTexture) { + refs.questionMark.texture = questionTexture; + refs.questionMark.width = size; + refs.questionMark.height = size; } - - if (!render.allianceIconRefs) { - render.allianceIconRefs = createAllianceProgressIconRefs( - size, - fraction, - hasExtensionRequest, - darkMode, - ); - - render.iconsDiv.appendChild(render.allianceIconRefs.wrapper); - render.icons.set(ALLIANCE_ICON_ID, render.allianceIconRefs.wrapper); - } else { - updateAllianceProgressIconRefs( - render.allianceIconRefs, - size, - fraction, - hasExtensionRequest, - darkMode, - ); - } - return; } - private handleOtherIcons( - render: RenderInfo, - icon: PlayerIconDescriptor, - size: number, - darkMode: string, - ): HTMLImageElement { - let imgElement = render.icons.get(icon.id) as HTMLImageElement | undefined; + private layoutRender(render: RenderInfo, iconSize: number) { + const regularIcons = Array.from(render.icons.values()).filter( + (icon) => !icon.centered && icon.container.visible, + ); + const centeredIcons = Array.from(render.icons.values()).filter( + (icon) => icon.centered && icon.container.visible, + ); + const flagTexture = render.flagSprite?.visible + ? render.flagSprite.texture + : null; + const flagAspectRatio = + flagTexture && flagTexture.height > 0 + ? flagTexture.width / flagTexture.height + : 1; - if (!imgElement) { - imgElement = icon.center - ? (this.iconCenterTemplate.cloneNode(true) as HTMLImageElement) - : (this.iconTemplate.cloneNode(true) as HTMLImageElement); + const layout = computeNameLayerLayout({ + fontSize: render.fontSize, + iconSize, + iconCount: regularIcons.length, + centeredIconCount: centeredIcons.length, + hasFlag: render.flagSprite?.visible === true, + flagAspectRatio, + nameWidth: render.nameText.width, + troopWidth: render.troopsText.width, + }); - imgElement.src = icon.src ?? ""; - imgElement.style.width = `${size}px`; - imgElement.style.height = `${size}px`; - imgElement.setAttribute("dark-mode", darkMode); - render.iconsDiv.appendChild(imgElement); - render.icons.set(icon.id, imgElement); - } else { - // Update src if it changed (e.g., nuke red/white or dark-mode icons) - if (imgElement.src !== icon.src) { - imgElement.src = icon.src ?? ""; - } + regularIcons.forEach((icon, index) => { + const pos = layout.iconPositions[index]; + icon.container.position.set(pos.x, pos.y); + }); + centeredIcons.forEach((icon, index) => { + const pos = layout.centeredIconPositions[index]; + icon.container.position.set(pos.x, pos.y); + }); - imgElement.style.width = `${size}px`; - imgElement.style.height = `${size}px`; - imgElement.setAttribute("dark-mode", darkMode); + if (render.flagSprite && layout.flag) { + render.flagSprite.position.set(layout.flag.x, layout.flag.y); + render.flagSprite.width = layout.flag.width; + render.flagSprite.height = layout.flag.height; + render.flagSprite.visible = true; + } else if (render.flagSprite) { + render.flagSprite.visible = false; } - return imgElement; + + render.nameText.position.set(layout.nameText.x, layout.nameText.y); + render.troopsText.position.set(layout.troopText.x, layout.troopText.y); } - private handleTraitorIconFlashing( - player: PlayerView, - icon: HTMLImageElement, - ) { - const remainingTicks = player.getTraitorRemainingTicks(); - // Use precise seconds (not rounded) for smoother transitions, rounded to 0.5s intervals - const remainingSeconds = Math.round((remainingTicks / 10) * 2) / 2; - - if (remainingSeconds <= 15) { - // Smooth transition: starts at 1s at 15 seconds, decreases to 0.2s at 0 seconds - // Using cubic ease-out for slower, more gradual acceleration - const clampedSeconds = Math.max(0, Math.min(15, remainingSeconds)); - const normalizedTime = clampedSeconds / 15; // 0 to 1 (1 = 15s remaining, 0 = 0s remaining) - - // Cubic ease-out: slower acceleration, smoother transition - const easedProgress = 1 - Math.pow(1 - normalizedTime, 3); - const maxDuration = 1.0; // Slow flash at 15 seconds - const minDuration = 0.2; // Fast flash at 0 seconds - const duration = - minDuration + (maxDuration - minDuration) * easedProgress; - const animationDuration = `${duration.toFixed(2)}s`; - - icon.style.animation = `traitorFlash ${animationDuration} infinite`; - icon.style.animationTimingFunction = "ease-in-out"; - } else { - // Don't flash if more than 15 seconds remaining - icon.style.animation = "none"; + private updateTraitorAlpha(render: RenderInfo, nowMs: number) { + const traitorIcon = render.icons.get(TRAITOR_ICON_ID); + if (!traitorIcon) { + return; } + traitorIcon.container.alpha = + computeTraitorFlashAlpha( + render.player.getTraitorRemainingTicks(), + nowMs, + ) * 0.8; + } + + private deleteRender(render: RenderInfo) { + const index = this.renders.indexOf(render); + if (index >= 0) { + this.renders.splice(index, 1); + } + this.seenPlayers.delete(render.player); + render.container.destroy({ children: true }); } } diff --git a/src/client/graphics/layers/NameLayerAssets.ts b/src/client/graphics/layers/NameLayerAssets.ts new file mode 100644 index 000000000..a9dbfb56b --- /dev/null +++ b/src/client/graphics/layers/NameLayerAssets.ts @@ -0,0 +1,104 @@ +import * as PIXI from "pixi.js"; +import { assetUrl } from "../../../core/AssetUrls"; + +const nameLayerFont = assetUrl("fonts/namelayer_overpass.xml"); +const fallbackFont = assetUrl("fonts/round_6x6_modified.xml"); +const iconAtlas = assetUrl("images/namelayer-icons.json"); +const emojiAtlas = assetUrl("images/namelayer-emojis.json"); + +export const NAME_LAYER_FONT_FAMILY = "namelayer_overpass"; +export const NAME_LAYER_FALLBACK_FONT_FAMILY = "round_6x6_modified"; + +export class NameLayerAssets { + public fontFamily = NAME_LAYER_FONT_FAMILY; + + private readonly textures = new Map(); + private readonly pendingTextures = new Map>(); + private readonly warnedTextureFailures = new Set(); + private preloadPromise: Promise | null = null; + + preload(): Promise { + this.preloadPromise ??= this.loadBaseAssets(); + return this.preloadPromise; + } + + getTexture(src: string): PIXI.Texture | null { + const cached = this.textures.get(src); + if (cached !== undefined) { + return cached; + } + + if (!this.pendingTextures.has(src)) { + this.pendingTextures.set( + src, + PIXI.Assets.load(src) + .then((texture: PIXI.Texture) => { + this.textures.set(src, texture); + }) + .catch((error) => { + this.textures.set(src, null); + this.warnTextureFailure(src, error); + }) + .finally(() => { + this.pendingTextures.delete(src); + }), + ); + } + + return null; + } + + preloadTextures(srcs: Iterable): void { + for (const src of srcs) { + this.getTexture(src); + } + } + + resetWarningsForTests(): void { + this.warnedTextureFailures.clear(); + } + + private async loadBaseAssets(): Promise { + await this.loadFont(); + await Promise.all([ + this.loadOptionalAtlas(iconAtlas, "static icon atlas"), + this.loadOptionalAtlas(emojiAtlas, "emoji atlas"), + ]); + } + + private async loadFont(): Promise { + try { + await PIXI.Assets.load(nameLayerFont); + this.fontFamily = NAME_LAYER_FONT_FAMILY; + return; + } catch (error) { + console.warn( + "NameLayer generated bitmap font unavailable; using fallback font", + error, + ); + } + + try { + await PIXI.Assets.load(fallbackFont); + this.fontFamily = NAME_LAYER_FALLBACK_FONT_FAMILY; + } catch (error) { + console.error("NameLayer failed to load bitmap font", error); + } + } + + private async loadOptionalAtlas(src: string, label: string): Promise { + try { + await PIXI.Assets.load(src); + } catch (error) { + console.warn(`NameLayer ${label} unavailable`, error); + } + } + + private warnTextureFailure(src: string, error: unknown): void { + if (this.warnedTextureFailures.has(src)) { + return; + } + this.warnedTextureFailures.add(src); + console.warn(`NameLayer texture omitted after load failure: ${src}`, error); + } +} diff --git a/src/client/graphics/layers/NameLayerLayout.ts b/src/client/graphics/layers/NameLayerLayout.ts new file mode 100644 index 000000000..6515ab07c --- /dev/null +++ b/src/client/graphics/layers/NameLayerLayout.ts @@ -0,0 +1,195 @@ +export const NAME_LAYER_ICON_GAP = 4; +export const NAME_LAYER_MAX_ZOOM_SCALE = 17; +export const NAME_LAYER_TROOP_MARGIN_RATIO = -0.05; + +export interface NameLayerVisibilityInput { + isLayerVisible: boolean; + transformScale: number; + baseSize: number; + isOnScreen: boolean; +} + +export interface NameLayerLayoutInput { + fontSize: number; + iconSize: number; + iconCount: number; + centeredIconCount: number; + hasFlag: boolean; + flagAspectRatio: number; + nameWidth: number; + troopWidth: number; +} + +export interface NameLayerLayout { + flag: { x: number; y: number; width: number; height: number } | null; + nameText: { x: number; y: number }; + troopText: { x: number; y: number }; + iconPositions: { x: number; y: number }[]; + centeredIconPositions: { x: number; y: number }[]; + height: number; + width: number; + rows: { iconsY: number | null; nameY: number; troopsY: number }; +} + +const SUPPORTED_TEXT_CHARS = new Set( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ üÜ.[]+-=(),':!?/@#$%&\"".split( + "", + ), +); + +const warnedUnsupportedGlyphs = new Set(); + +export function computeNameLayerVisible({ + isLayerVisible, + transformScale, + baseSize, + isOnScreen, +}: NameLayerVisibilityInput): boolean { + const size = transformScale * baseSize; + return ( + isLayerVisible && + size >= 7 && + !(transformScale > NAME_LAYER_MAX_ZOOM_SCALE && size > 100) && + isOnScreen + ); +} + +export function computeNameLayerScale(baseSize: number): number { + return Math.min(baseSize * 0.25, 3); +} + +export function computeNameLayerFontSize(baseSize: number): number { + return Math.max(4, Math.floor(baseSize * 0.4)); +} + +export function computeNameLayerLayout({ + fontSize, + iconSize, + iconCount, + centeredIconCount, + hasFlag, + flagAspectRatio, + nameWidth, + troopWidth, +}: NameLayerLayoutInput): NameLayerLayout { + const visibleIconCount = Math.max(0, iconCount); + const iconRowHeight = visibleIconCount > 0 ? iconSize : 0; + const iconRowWidth = + visibleIconCount > 0 + ? visibleIconCount * iconSize + + (visibleIconCount - 1) * NAME_LAYER_ICON_GAP + : 0; + const flagHeight = hasFlag ? fontSize : 0; + const flagWidth = hasFlag ? Math.max(0, flagHeight * flagAspectRatio) : 0; + const nameRowHeight = fontSize; + const troopMargin = fontSize * NAME_LAYER_TROOP_MARGIN_RATIO; + const troopHeight = fontSize; + const nameRowWidth = flagWidth + nameWidth; + const totalHeight = iconRowHeight + nameRowHeight + troopMargin + troopHeight; + const width = Math.max(iconRowWidth, nameRowWidth, troopWidth); + + let cursorY = -totalHeight / 2; + const iconsY = visibleIconCount > 0 ? cursorY + iconRowHeight / 2 : null; + cursorY += iconRowHeight; + const nameY = cursorY + nameRowHeight / 2; + cursorY += nameRowHeight + troopMargin; + const troopsY = cursorY + troopHeight / 2; + + const iconPositions: { x: number; y: number }[] = []; + if (visibleIconCount > 0 && iconsY !== null) { + const startX = -iconRowWidth / 2 + iconSize / 2; + for (let i = 0; i < visibleIconCount; i++) { + iconPositions.push({ + x: startX + i * (iconSize + NAME_LAYER_ICON_GAP), + y: iconsY, + }); + } + } + + const nameStartX = -nameRowWidth / 2; + const flag = hasFlag + ? { + x: nameStartX + flagWidth / 2, + y: nameY, + width: flagWidth, + height: flagHeight, + } + : null; + const nameTextX = nameStartX + flagWidth + nameWidth / 2; + const centeredIconPositions = Array.from( + { length: centeredIconCount }, + () => ({ + x: 0, + y: nameY, + }), + ); + + return { + flag, + nameText: { x: nameTextX, y: nameY }, + troopText: { x: 0, y: troopsY }, + iconPositions, + centeredIconPositions, + height: totalHeight, + width, + rows: { iconsY, nameY, troopsY }, + }; +} + +export function computeTraitorFlashDurationSeconds( + remainingTicks: number, +): number | null { + const remainingSeconds = Math.round((remainingTicks / 10) * 2) / 2; + if (remainingSeconds > 15) { + return null; + } + + const clampedSeconds = Math.max(0, Math.min(15, remainingSeconds)); + const normalizedTime = clampedSeconds / 15; + const easedProgress = 1 - Math.pow(1 - normalizedTime, 3); + return 0.2 + (1.0 - 0.2) * easedProgress; +} + +export function computeTraitorFlashAlpha( + remainingTicks: number, + nowMs: number, +): number { + const duration = computeTraitorFlashDurationSeconds(remainingTicks); + if (duration === null) { + return 1; + } + + const durationMs = Math.max(1, duration * 1000); + const phase = (nowMs % durationMs) / durationMs; + const wave = phase < 0.5 ? phase / 0.5 : (1 - phase) / 0.5; + const eased = 0.5 - Math.cos(wave * Math.PI) / 2; + return 1 - eased * 0.7; +} + +export function replaceUnsupportedNameGlyphs( + value: string, + warn: (message: string) => void = console.warn, +): string { + let changed = false; + let result = ""; + + for (const char of value) { + if (SUPPORTED_TEXT_CHARS.has(char)) { + result += char; + continue; + } + + changed = true; + result += "?"; + if (!warnedUnsupportedGlyphs.has(char)) { + warnedUnsupportedGlyphs.add(char); + warn(`NameLayer unsupported glyph replaced with ?: ${char}`); + } + } + + return changed ? result : value; +} + +export function resetNameLayerGlyphWarningsForTests(): void { + warnedUnsupportedGlyphs.clear(); +} diff --git a/tests/NameLayer.test.ts b/tests/NameLayer.test.ts index 2337e78a1..8473198e9 100644 --- a/tests/NameLayer.test.ts +++ b/tests/NameLayer.test.ts @@ -1,4 +1,14 @@ -import { computeAllianceClipPath } from "../src/client/graphics/PlayerIcons"; +import { + computeAllianceClipPath, + computeAllianceTopCutPercent, +} from "../src/client/graphics/PlayerIcons"; +import { + computeNameLayerLayout, + computeTraitorFlashAlpha, + computeTraitorFlashDurationSeconds, + replaceUnsupportedNameGlyphs, + resetNameLayerGlyphWarningsForTests, +} from "../src/client/graphics/layers/NameLayerLayout"; describe("PlayerIcons", () => { describe("computeAllianceClipPath", () => { @@ -37,5 +47,69 @@ describe("PlayerIcons", () => { expect(result).toContain("-2px"); expect(result.match(/-2px/g)).toHaveLength(2); // Should appear twice (left and right) }); + + test("shares numeric top-cut helper with Pixi masks", () => { + expect(computeAllianceTopCutPercent(1.0)).toBeCloseTo(20); + expect(computeAllianceTopCutPercent(0.5)).toBeCloseTo(51.2); + expect(computeAllianceTopCutPercent(0.0)).toBeCloseTo(82.4); + }); + }); +}); + +describe("NameLayerLayout", () => { + test("computes DOM-compatible local row positions with flag and icon gaps", () => { + const layout = computeNameLayerLayout({ + fontSize: 10, + iconSize: 15, + iconCount: 2, + centeredIconCount: 1, + hasFlag: true, + flagAspectRatio: 2, + nameWidth: 40, + troopWidth: 30, + }); + + expect(layout.iconPositions).toEqual([ + { x: -9.5, y: -9.75 }, + { x: 9.5, y: -9.75 }, + ]); + expect(layout.flag).toEqual({ x: -20, y: 2.75, width: 20, height: 10 }); + expect(layout.nameText).toEqual({ x: 10, y: 2.75 }); + expect(layout.troopText).toEqual({ x: 0, y: 12.25 }); + expect(layout.centeredIconPositions).toEqual([{ x: 0, y: 2.75 }]); + }); + + test("keeps no-flag names centered on the text width", () => { + const layout = computeNameLayerLayout({ + fontSize: 12, + iconSize: 18, + iconCount: 0, + centeredIconCount: 0, + hasFlag: false, + flagAspectRatio: 1, + nameWidth: 60, + troopWidth: 24, + }); + + expect(layout.flag).toBeNull(); + expect(layout.nameText.x).toBe(0); + expect(layout.width).toBe(60); + }); + + test("matches traitor flash duration thresholds and alpha extrema", () => { + expect(computeTraitorFlashDurationSeconds(156)).toBeNull(); + expect(computeTraitorFlashDurationSeconds(150)).toBeCloseTo(1); + expect(computeTraitorFlashDurationSeconds(0)).toBeCloseTo(0.2); + expect(computeTraitorFlashAlpha(150, 0)).toBeCloseTo(1); + expect(computeTraitorFlashAlpha(150, 500)).toBeCloseTo(0.3); + }); + + test("replaces unsupported glyphs once per glyph", () => { + resetNameLayerGlyphWarningsForTests(); + const warn = vi.fn(); + + expect(replaceUnsupportedNameGlyphs("A🙂🙂B", warn)).toBe("A??B"); + expect(replaceUnsupportedNameGlyphs("🙂", warn)).toBe("?"); + expect(warn).toHaveBeenCalledTimes(1); }); });