From aea7406586f4da75898ee4ddcc02c96d0e0faaff Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Wed, 23 Nov 2022 17:38:38 +0200 Subject: [PATCH] Map Planner (#1145) * Initial * Add images * Tweaks * Proper sized bg image and weapons * Stage bg picker * Outlined weapon images for planner * First version * Lint * Add alt and title to weapon --- app/components/Planner.tsx | 252 +++ app/components/layout/nav-items.json | 5 + app/hooks/useForceRefresh.tsx | 9 + app/modules/i18n/config.ts | 2 + app/modules/i18n/index.ts | 2 +- app/routes/contributions.tsx | 10 + app/routes/index.tsx | 7 + app/routes/plans.tsx | 22 + app/styles/common.css | 2 +- app/styles/plans.css | 92 + app/utils/urls.ts | 14 +- package-lock.json | 2357 +++++++++++++++++++- package.json | 4 + public/img/layout/plans.avif | Bin 0 -> 5545 bytes public/img/layout/plans.png | Bin 0 -> 36122 bytes public/img/main-weapons-outlined/0.avif | Bin 0 -> 2636 bytes public/img/main-weapons-outlined/0.png | Bin 0 -> 7749 bytes public/img/main-weapons-outlined/10.avif | Bin 0 -> 2184 bytes public/img/main-weapons-outlined/10.png | Bin 0 -> 6825 bytes public/img/main-weapons-outlined/1000.avif | Bin 0 -> 2451 bytes public/img/main-weapons-outlined/1000.png | Bin 0 -> 7824 bytes public/img/main-weapons-outlined/1010.avif | Bin 0 -> 2407 bytes public/img/main-weapons-outlined/1010.png | Bin 0 -> 6758 bytes public/img/main-weapons-outlined/1020.avif | Bin 0 -> 2522 bytes public/img/main-weapons-outlined/1020.png | Bin 0 -> 8613 bytes public/img/main-weapons-outlined/1030.avif | Bin 0 -> 2317 bytes public/img/main-weapons-outlined/1030.png | Bin 0 -> 7311 bytes public/img/main-weapons-outlined/1100.avif | Bin 0 -> 2213 bytes public/img/main-weapons-outlined/1100.png | Bin 0 -> 4643 bytes public/img/main-weapons-outlined/1110.avif | Bin 0 -> 2350 bytes public/img/main-weapons-outlined/1110.png | Bin 0 -> 5364 bytes public/img/main-weapons-outlined/20.avif | Bin 0 -> 2722 bytes public/img/main-weapons-outlined/20.png | Bin 0 -> 8018 bytes public/img/main-weapons-outlined/200.avif | Bin 0 -> 2294 bytes public/img/main-weapons-outlined/200.png | Bin 0 -> 6407 bytes public/img/main-weapons-outlined/2000.avif | Bin 0 -> 1976 bytes public/img/main-weapons-outlined/2000.png | Bin 0 -> 5412 bytes public/img/main-weapons-outlined/2010.avif | Bin 0 -> 2085 bytes public/img/main-weapons-outlined/2010.png | Bin 0 -> 4715 bytes public/img/main-weapons-outlined/2020.avif | Bin 0 -> 2647 bytes public/img/main-weapons-outlined/2020.png | Bin 0 -> 5102 bytes public/img/main-weapons-outlined/2030.avif | Bin 0 -> 2000 bytes public/img/main-weapons-outlined/2030.png | Bin 0 -> 5387 bytes public/img/main-weapons-outlined/2040.avif | Bin 0 -> 2378 bytes public/img/main-weapons-outlined/2040.png | Bin 0 -> 5806 bytes public/img/main-weapons-outlined/2050.avif | Bin 0 -> 1967 bytes public/img/main-weapons-outlined/2050.png | Bin 0 -> 4913 bytes public/img/main-weapons-outlined/2060.avif | Bin 0 -> 2845 bytes public/img/main-weapons-outlined/2060.png | Bin 0 -> 7547 bytes public/img/main-weapons-outlined/210.avif | Bin 0 -> 2821 bytes public/img/main-weapons-outlined/210.png | Bin 0 -> 8565 bytes public/img/main-weapons-outlined/220.avif | Bin 0 -> 2698 bytes public/img/main-weapons-outlined/220.png | Bin 0 -> 8008 bytes public/img/main-weapons-outlined/230.avif | Bin 0 -> 2679 bytes public/img/main-weapons-outlined/230.png | Bin 0 -> 9005 bytes public/img/main-weapons-outlined/240.avif | Bin 0 -> 2643 bytes public/img/main-weapons-outlined/240.png | Bin 0 -> 8471 bytes public/img/main-weapons-outlined/250.avif | Bin 0 -> 2561 bytes public/img/main-weapons-outlined/250.png | Bin 0 -> 7719 bytes public/img/main-weapons-outlined/30.avif | Bin 0 -> 2697 bytes public/img/main-weapons-outlined/30.png | Bin 0 -> 6670 bytes public/img/main-weapons-outlined/300.avif | Bin 0 -> 2404 bytes public/img/main-weapons-outlined/300.png | Bin 0 -> 8556 bytes public/img/main-weapons-outlined/3000.avif | Bin 0 -> 2625 bytes public/img/main-weapons-outlined/3000.png | Bin 0 -> 8462 bytes public/img/main-weapons-outlined/3010.avif | Bin 0 -> 2178 bytes public/img/main-weapons-outlined/3010.png | Bin 0 -> 5054 bytes public/img/main-weapons-outlined/3020.avif | Bin 0 -> 2309 bytes public/img/main-weapons-outlined/3020.png | Bin 0 -> 6593 bytes public/img/main-weapons-outlined/3030.avif | Bin 0 -> 2130 bytes public/img/main-weapons-outlined/3030.png | Bin 0 -> 5975 bytes public/img/main-weapons-outlined/3040.avif | Bin 0 -> 2491 bytes public/img/main-weapons-outlined/3040.png | Bin 0 -> 8093 bytes public/img/main-weapons-outlined/310.avif | Bin 0 -> 2245 bytes public/img/main-weapons-outlined/310.png | Bin 0 -> 7909 bytes public/img/main-weapons-outlined/40.avif | Bin 0 -> 2457 bytes public/img/main-weapons-outlined/40.png | Bin 0 -> 7077 bytes public/img/main-weapons-outlined/400.avif | Bin 0 -> 2992 bytes public/img/main-weapons-outlined/400.png | Bin 0 -> 7306 bytes public/img/main-weapons-outlined/4000.avif | Bin 0 -> 2623 bytes public/img/main-weapons-outlined/4000.png | Bin 0 -> 6122 bytes public/img/main-weapons-outlined/4010.avif | Bin 0 -> 2205 bytes public/img/main-weapons-outlined/4010.png | Bin 0 -> 7010 bytes public/img/main-weapons-outlined/4020.avif | Bin 0 -> 2677 bytes public/img/main-weapons-outlined/4020.png | Bin 0 -> 8557 bytes public/img/main-weapons-outlined/4030.avif | Bin 0 -> 2252 bytes public/img/main-weapons-outlined/4030.png | Bin 0 -> 6171 bytes public/img/main-weapons-outlined/4040.avif | Bin 0 -> 2128 bytes public/img/main-weapons-outlined/4040.png | Bin 0 -> 5746 bytes public/img/main-weapons-outlined/45.avif | Bin 0 -> 2451 bytes public/img/main-weapons-outlined/45.png | Bin 0 -> 7565 bytes public/img/main-weapons-outlined/50.avif | Bin 0 -> 2436 bytes public/img/main-weapons-outlined/50.png | Bin 0 -> 7220 bytes public/img/main-weapons-outlined/5000.avif | Bin 0 -> 3365 bytes public/img/main-weapons-outlined/5000.png | Bin 0 -> 10138 bytes public/img/main-weapons-outlined/5010.avif | Bin 0 -> 3003 bytes public/img/main-weapons-outlined/5010.png | Bin 0 -> 8383 bytes public/img/main-weapons-outlined/5020.avif | Bin 0 -> 2974 bytes public/img/main-weapons-outlined/5020.png | Bin 0 -> 10365 bytes public/img/main-weapons-outlined/5030.avif | Bin 0 -> 2449 bytes public/img/main-weapons-outlined/5030.png | Bin 0 -> 7917 bytes public/img/main-weapons-outlined/5040.avif | Bin 0 -> 2845 bytes public/img/main-weapons-outlined/5040.png | Bin 0 -> 9562 bytes public/img/main-weapons-outlined/60.avif | Bin 0 -> 1863 bytes public/img/main-weapons-outlined/60.png | Bin 0 -> 4951 bytes public/img/main-weapons-outlined/6000.avif | Bin 0 -> 2444 bytes public/img/main-weapons-outlined/6000.png | Bin 0 -> 7508 bytes public/img/main-weapons-outlined/6010.avif | Bin 0 -> 2535 bytes public/img/main-weapons-outlined/6010.png | Bin 0 -> 6461 bytes public/img/main-weapons-outlined/6020.avif | Bin 0 -> 1929 bytes public/img/main-weapons-outlined/6020.png | Bin 0 -> 4633 bytes public/img/main-weapons-outlined/70.avif | Bin 0 -> 2917 bytes public/img/main-weapons-outlined/70.png | Bin 0 -> 7032 bytes public/img/main-weapons-outlined/7010.avif | Bin 0 -> 2834 bytes public/img/main-weapons-outlined/7010.png | Bin 0 -> 8076 bytes public/img/main-weapons-outlined/7020.avif | Bin 0 -> 3067 bytes public/img/main-weapons-outlined/7020.png | Bin 0 -> 8508 bytes public/img/main-weapons-outlined/80.avif | Bin 0 -> 2401 bytes public/img/main-weapons-outlined/80.png | Bin 0 -> 7056 bytes public/img/main-weapons-outlined/8000.avif | Bin 0 -> 2442 bytes public/img/main-weapons-outlined/8000.png | Bin 0 -> 6860 bytes public/img/main-weapons-outlined/8010.avif | Bin 0 -> 2552 bytes public/img/main-weapons-outlined/8010.png | Bin 0 -> 7382 bytes public/img/main-weapons-outlined/90.avif | Bin 0 -> 2064 bytes public/img/main-weapons-outlined/90.png | Bin 0 -> 6198 bytes public/img/planner-maps/test.png | Bin 0 -> 106363 bytes public/img/stage-minimaps/0-CB.jpeg | Bin 0 -> 117067 bytes public/img/stage-minimaps/0-RM.jpeg | Bin 0 -> 127221 bytes public/img/stage-minimaps/0-SZ.jpeg | Bin 0 -> 119579 bytes public/img/stage-minimaps/0-TC.jpeg | Bin 0 -> 116960 bytes public/img/stage-minimaps/0-TW.jpeg | Bin 0 -> 115564 bytes public/img/stage-minimaps/1-CB.jpeg | Bin 0 -> 111192 bytes public/img/stage-minimaps/1-RM.jpeg | Bin 0 -> 106363 bytes public/img/stage-minimaps/1-SZ.jpeg | Bin 0 -> 111507 bytes public/img/stage-minimaps/1-TC.jpeg | Bin 0 -> 110171 bytes public/img/stage-minimaps/1-TW.jpeg | Bin 0 -> 96709 bytes public/img/stage-minimaps/10-CB.jpeg | Bin 0 -> 119619 bytes public/img/stage-minimaps/10-RM.jpeg | Bin 0 -> 130216 bytes public/img/stage-minimaps/10-SZ.jpeg | Bin 0 -> 119839 bytes public/img/stage-minimaps/10-TC.jpeg | Bin 0 -> 111114 bytes public/img/stage-minimaps/10-TW.jpeg | Bin 0 -> 115483 bytes public/img/stage-minimaps/11-CB.jpeg | Bin 0 -> 134058 bytes public/img/stage-minimaps/11-RM.jpeg | Bin 0 -> 137132 bytes public/img/stage-minimaps/11-SZ.jpeg | Bin 0 -> 130165 bytes public/img/stage-minimaps/11-TC.jpeg | Bin 0 -> 130976 bytes public/img/stage-minimaps/11-TW.jpeg | Bin 0 -> 129259 bytes public/img/stage-minimaps/2-CB.jpeg | Bin 0 -> 132511 bytes public/img/stage-minimaps/2-RM.jpeg | Bin 0 -> 137415 bytes public/img/stage-minimaps/2-SZ.jpeg | Bin 0 -> 128237 bytes public/img/stage-minimaps/2-TC.jpeg | Bin 0 -> 124148 bytes public/img/stage-minimaps/2-TW.jpeg | Bin 0 -> 133962 bytes public/img/stage-minimaps/3-CB.jpeg | Bin 0 -> 117739 bytes public/img/stage-minimaps/3-RM.jpeg | Bin 0 -> 135705 bytes public/img/stage-minimaps/3-SZ.jpeg | Bin 0 -> 118600 bytes public/img/stage-minimaps/3-TC.jpeg | Bin 0 -> 116303 bytes public/img/stage-minimaps/3-TW.jpeg | Bin 0 -> 115683 bytes public/img/stage-minimaps/4-CB.jpeg | Bin 0 -> 121881 bytes public/img/stage-minimaps/4-RM.jpeg | Bin 0 -> 124681 bytes public/img/stage-minimaps/4-SZ.jpeg | Bin 0 -> 122361 bytes public/img/stage-minimaps/4-TC.jpeg | Bin 0 -> 119092 bytes public/img/stage-minimaps/4-TW.jpeg | Bin 0 -> 120771 bytes public/img/stage-minimaps/5-CB.jpeg | Bin 0 -> 110912 bytes public/img/stage-minimaps/5-RM.jpeg | Bin 0 -> 100068 bytes public/img/stage-minimaps/5-SZ.jpeg | Bin 0 -> 95471 bytes public/img/stage-minimaps/5-TC.jpeg | Bin 0 -> 95477 bytes public/img/stage-minimaps/5-TW.jpeg | Bin 0 -> 95175 bytes public/img/stage-minimaps/6-CB.jpeg | Bin 0 -> 126359 bytes public/img/stage-minimaps/6-RM.jpeg | Bin 0 -> 135921 bytes public/img/stage-minimaps/6-SZ.jpeg | Bin 0 -> 128337 bytes public/img/stage-minimaps/6-TC.jpeg | Bin 0 -> 125394 bytes public/img/stage-minimaps/6-TW.jpeg | Bin 0 -> 126090 bytes public/img/stage-minimaps/7-CB.jpeg | Bin 0 -> 126794 bytes public/img/stage-minimaps/7-RM.jpeg | Bin 0 -> 112846 bytes public/img/stage-minimaps/7-SZ.jpeg | Bin 0 -> 108149 bytes public/img/stage-minimaps/7-TC.jpeg | Bin 0 -> 122793 bytes public/img/stage-minimaps/7-TW.jpeg | Bin 0 -> 105570 bytes public/img/stage-minimaps/8-CB.jpeg | Bin 0 -> 132371 bytes public/img/stage-minimaps/8-RM.jpeg | Bin 0 -> 135672 bytes public/img/stage-minimaps/8-SZ.jpeg | Bin 0 -> 133921 bytes public/img/stage-minimaps/8-TC.jpeg | Bin 0 -> 129396 bytes public/img/stage-minimaps/8-TW.jpeg | Bin 0 -> 132916 bytes public/img/stage-minimaps/9-CB.jpeg | Bin 0 -> 123143 bytes public/img/stage-minimaps/9-RM.jpeg | Bin 0 -> 128425 bytes public/img/stage-minimaps/9-SZ.jpeg | Bin 0 -> 121841 bytes public/img/stage-minimaps/9-TC.jpeg | Bin 0 -> 118159 bytes public/img/stage-minimaps/9-TW.jpeg | Bin 0 -> 122751 bytes public/locales/da/contributions.json | 1 - public/locales/de/contributions.json | 1 - public/locales/en/common.json | 6 +- public/locales/en/contributions.json | 3 +- public/locales/en/front.json | 1 + public/locales/es-ES/contributions.json | 1 - public/locales/es-US/contributions.json | 1 - public/locales/ja/contributions.json | 1 - public/locales/ko/contributions.json | 1 - public/locales/nl/contributions.json | 1 - public/locales/ru/contributions.json | 1 - public/locales/zh/contributions.json | 1 - scripts/replace-weapon-names.ts | 42 + tsconfig.json | 1 + 200 files changed, 2804 insertions(+), 36 deletions(-) create mode 100644 app/components/Planner.tsx create mode 100644 app/hooks/useForceRefresh.tsx create mode 100644 app/routes/plans.tsx create mode 100644 app/styles/plans.css create mode 100644 public/img/layout/plans.avif create mode 100644 public/img/layout/plans.png create mode 100644 public/img/main-weapons-outlined/0.avif create mode 100644 public/img/main-weapons-outlined/0.png create mode 100644 public/img/main-weapons-outlined/10.avif create mode 100644 public/img/main-weapons-outlined/10.png create mode 100644 public/img/main-weapons-outlined/1000.avif create mode 100644 public/img/main-weapons-outlined/1000.png create mode 100644 public/img/main-weapons-outlined/1010.avif create mode 100644 public/img/main-weapons-outlined/1010.png create mode 100644 public/img/main-weapons-outlined/1020.avif create mode 100644 public/img/main-weapons-outlined/1020.png create mode 100644 public/img/main-weapons-outlined/1030.avif create mode 100644 public/img/main-weapons-outlined/1030.png create mode 100644 public/img/main-weapons-outlined/1100.avif create mode 100644 public/img/main-weapons-outlined/1100.png create mode 100644 public/img/main-weapons-outlined/1110.avif create mode 100644 public/img/main-weapons-outlined/1110.png create mode 100644 public/img/main-weapons-outlined/20.avif create mode 100644 public/img/main-weapons-outlined/20.png create mode 100644 public/img/main-weapons-outlined/200.avif create mode 100644 public/img/main-weapons-outlined/200.png create mode 100644 public/img/main-weapons-outlined/2000.avif create mode 100644 public/img/main-weapons-outlined/2000.png create mode 100644 public/img/main-weapons-outlined/2010.avif create mode 100644 public/img/main-weapons-outlined/2010.png create mode 100644 public/img/main-weapons-outlined/2020.avif create mode 100644 public/img/main-weapons-outlined/2020.png create mode 100644 public/img/main-weapons-outlined/2030.avif create mode 100644 public/img/main-weapons-outlined/2030.png create mode 100644 public/img/main-weapons-outlined/2040.avif create mode 100644 public/img/main-weapons-outlined/2040.png create mode 100644 public/img/main-weapons-outlined/2050.avif create mode 100644 public/img/main-weapons-outlined/2050.png create mode 100644 public/img/main-weapons-outlined/2060.avif create mode 100644 public/img/main-weapons-outlined/2060.png create mode 100644 public/img/main-weapons-outlined/210.avif create mode 100644 public/img/main-weapons-outlined/210.png create mode 100644 public/img/main-weapons-outlined/220.avif create mode 100644 public/img/main-weapons-outlined/220.png create mode 100644 public/img/main-weapons-outlined/230.avif create mode 100644 public/img/main-weapons-outlined/230.png create mode 100644 public/img/main-weapons-outlined/240.avif create mode 100644 public/img/main-weapons-outlined/240.png create mode 100644 public/img/main-weapons-outlined/250.avif create mode 100644 public/img/main-weapons-outlined/250.png create mode 100644 public/img/main-weapons-outlined/30.avif create mode 100644 public/img/main-weapons-outlined/30.png create mode 100644 public/img/main-weapons-outlined/300.avif create mode 100644 public/img/main-weapons-outlined/300.png create mode 100644 public/img/main-weapons-outlined/3000.avif create mode 100644 public/img/main-weapons-outlined/3000.png create mode 100644 public/img/main-weapons-outlined/3010.avif create mode 100644 public/img/main-weapons-outlined/3010.png create mode 100644 public/img/main-weapons-outlined/3020.avif create mode 100644 public/img/main-weapons-outlined/3020.png create mode 100644 public/img/main-weapons-outlined/3030.avif create mode 100644 public/img/main-weapons-outlined/3030.png create mode 100644 public/img/main-weapons-outlined/3040.avif create mode 100644 public/img/main-weapons-outlined/3040.png create mode 100644 public/img/main-weapons-outlined/310.avif create mode 100644 public/img/main-weapons-outlined/310.png create mode 100644 public/img/main-weapons-outlined/40.avif create mode 100644 public/img/main-weapons-outlined/40.png create mode 100644 public/img/main-weapons-outlined/400.avif create mode 100644 public/img/main-weapons-outlined/400.png create mode 100644 public/img/main-weapons-outlined/4000.avif create mode 100644 public/img/main-weapons-outlined/4000.png create mode 100644 public/img/main-weapons-outlined/4010.avif create mode 100644 public/img/main-weapons-outlined/4010.png create mode 100644 public/img/main-weapons-outlined/4020.avif create mode 100644 public/img/main-weapons-outlined/4020.png create mode 100644 public/img/main-weapons-outlined/4030.avif create mode 100644 public/img/main-weapons-outlined/4030.png create mode 100644 public/img/main-weapons-outlined/4040.avif create mode 100644 public/img/main-weapons-outlined/4040.png create mode 100644 public/img/main-weapons-outlined/45.avif create mode 100644 public/img/main-weapons-outlined/45.png create mode 100644 public/img/main-weapons-outlined/50.avif create mode 100644 public/img/main-weapons-outlined/50.png create mode 100644 public/img/main-weapons-outlined/5000.avif create mode 100644 public/img/main-weapons-outlined/5000.png create mode 100644 public/img/main-weapons-outlined/5010.avif create mode 100644 public/img/main-weapons-outlined/5010.png create mode 100644 public/img/main-weapons-outlined/5020.avif create mode 100644 public/img/main-weapons-outlined/5020.png create mode 100644 public/img/main-weapons-outlined/5030.avif create mode 100644 public/img/main-weapons-outlined/5030.png create mode 100644 public/img/main-weapons-outlined/5040.avif create mode 100644 public/img/main-weapons-outlined/5040.png create mode 100644 public/img/main-weapons-outlined/60.avif create mode 100644 public/img/main-weapons-outlined/60.png create mode 100644 public/img/main-weapons-outlined/6000.avif create mode 100644 public/img/main-weapons-outlined/6000.png create mode 100644 public/img/main-weapons-outlined/6010.avif create mode 100644 public/img/main-weapons-outlined/6010.png create mode 100644 public/img/main-weapons-outlined/6020.avif create mode 100644 public/img/main-weapons-outlined/6020.png create mode 100644 public/img/main-weapons-outlined/70.avif create mode 100644 public/img/main-weapons-outlined/70.png create mode 100644 public/img/main-weapons-outlined/7010.avif create mode 100644 public/img/main-weapons-outlined/7010.png create mode 100644 public/img/main-weapons-outlined/7020.avif create mode 100644 public/img/main-weapons-outlined/7020.png create mode 100644 public/img/main-weapons-outlined/80.avif create mode 100644 public/img/main-weapons-outlined/80.png create mode 100644 public/img/main-weapons-outlined/8000.avif create mode 100644 public/img/main-weapons-outlined/8000.png create mode 100644 public/img/main-weapons-outlined/8010.avif create mode 100644 public/img/main-weapons-outlined/8010.png create mode 100644 public/img/main-weapons-outlined/90.avif create mode 100644 public/img/main-weapons-outlined/90.png create mode 100644 public/img/planner-maps/test.png create mode 100644 public/img/stage-minimaps/0-CB.jpeg create mode 100644 public/img/stage-minimaps/0-RM.jpeg create mode 100644 public/img/stage-minimaps/0-SZ.jpeg create mode 100644 public/img/stage-minimaps/0-TC.jpeg create mode 100644 public/img/stage-minimaps/0-TW.jpeg create mode 100644 public/img/stage-minimaps/1-CB.jpeg create mode 100644 public/img/stage-minimaps/1-RM.jpeg create mode 100644 public/img/stage-minimaps/1-SZ.jpeg create mode 100644 public/img/stage-minimaps/1-TC.jpeg create mode 100644 public/img/stage-minimaps/1-TW.jpeg create mode 100644 public/img/stage-minimaps/10-CB.jpeg create mode 100644 public/img/stage-minimaps/10-RM.jpeg create mode 100644 public/img/stage-minimaps/10-SZ.jpeg create mode 100644 public/img/stage-minimaps/10-TC.jpeg create mode 100644 public/img/stage-minimaps/10-TW.jpeg create mode 100644 public/img/stage-minimaps/11-CB.jpeg create mode 100644 public/img/stage-minimaps/11-RM.jpeg create mode 100644 public/img/stage-minimaps/11-SZ.jpeg create mode 100644 public/img/stage-minimaps/11-TC.jpeg create mode 100644 public/img/stage-minimaps/11-TW.jpeg create mode 100644 public/img/stage-minimaps/2-CB.jpeg create mode 100644 public/img/stage-minimaps/2-RM.jpeg create mode 100644 public/img/stage-minimaps/2-SZ.jpeg create mode 100644 public/img/stage-minimaps/2-TC.jpeg create mode 100644 public/img/stage-minimaps/2-TW.jpeg create mode 100644 public/img/stage-minimaps/3-CB.jpeg create mode 100644 public/img/stage-minimaps/3-RM.jpeg create mode 100644 public/img/stage-minimaps/3-SZ.jpeg create mode 100644 public/img/stage-minimaps/3-TC.jpeg create mode 100644 public/img/stage-minimaps/3-TW.jpeg create mode 100644 public/img/stage-minimaps/4-CB.jpeg create mode 100644 public/img/stage-minimaps/4-RM.jpeg create mode 100644 public/img/stage-minimaps/4-SZ.jpeg create mode 100644 public/img/stage-minimaps/4-TC.jpeg create mode 100644 public/img/stage-minimaps/4-TW.jpeg create mode 100644 public/img/stage-minimaps/5-CB.jpeg create mode 100644 public/img/stage-minimaps/5-RM.jpeg create mode 100644 public/img/stage-minimaps/5-SZ.jpeg create mode 100644 public/img/stage-minimaps/5-TC.jpeg create mode 100644 public/img/stage-minimaps/5-TW.jpeg create mode 100644 public/img/stage-minimaps/6-CB.jpeg create mode 100644 public/img/stage-minimaps/6-RM.jpeg create mode 100644 public/img/stage-minimaps/6-SZ.jpeg create mode 100644 public/img/stage-minimaps/6-TC.jpeg create mode 100644 public/img/stage-minimaps/6-TW.jpeg create mode 100644 public/img/stage-minimaps/7-CB.jpeg create mode 100644 public/img/stage-minimaps/7-RM.jpeg create mode 100644 public/img/stage-minimaps/7-SZ.jpeg create mode 100644 public/img/stage-minimaps/7-TC.jpeg create mode 100644 public/img/stage-minimaps/7-TW.jpeg create mode 100644 public/img/stage-minimaps/8-CB.jpeg create mode 100644 public/img/stage-minimaps/8-RM.jpeg create mode 100644 public/img/stage-minimaps/8-SZ.jpeg create mode 100644 public/img/stage-minimaps/8-TC.jpeg create mode 100644 public/img/stage-minimaps/8-TW.jpeg create mode 100644 public/img/stage-minimaps/9-CB.jpeg create mode 100644 public/img/stage-minimaps/9-RM.jpeg create mode 100644 public/img/stage-minimaps/9-SZ.jpeg create mode 100644 public/img/stage-minimaps/9-TC.jpeg create mode 100644 public/img/stage-minimaps/9-TW.jpeg create mode 100644 scripts/replace-weapon-names.ts diff --git a/app/components/Planner.tsx b/app/components/Planner.tsx new file mode 100644 index 000000000..98fd66585 --- /dev/null +++ b/app/components/Planner.tsx @@ -0,0 +1,252 @@ +import type { TDImageAsset } from "@tldraw/tldraw"; +import { + Tldraw, + ColorStyle, + type TldrawApp, + TDShapeType, + TDAssetType, +} from "@tldraw/tldraw"; +import clsx from "clsx"; +import * as React from "react"; +import { useForceRefreshOnMount } from "~/hooks/useForceRefresh"; +import { useTranslation } from "~/hooks/useTranslation"; +import type { MainWeaponId, ModeShort, StageId } from "~/modules/in-game-lists"; +import { stageIds } from "~/modules/in-game-lists"; +import { mainWeaponIds } from "~/modules/in-game-lists"; +import { modesShort } from "~/modules/in-game-lists/modes"; +import { + mainWeaponImageUrl, + modeImageUrl, + outlinedMainWeaponImageUrl, + stageMinimapImageUrlWithEnding, + TLDRAW_URL, +} from "~/utils/urls"; +import { Button } from "./Button"; +import { Image } from "./Image"; +import { nanoid } from "nanoid"; +import randomInt from "just-random-integer"; +import type { LanguageCode } from "~/modules/i18n"; + +export default function Planner() { + const { t } = useTranslation(["common", "weapons"]); + const { i18n } = useTranslation(); + const appRef = React.useRef(); + const app = appRef.current!; + + useForceRefreshOnMount(); + + const handleMount = React.useCallback( + (mountedApp: TldrawApp) => { + appRef.current = mountedApp; + mountedApp.setSetting( + "language", + ourLanguageToTldrawLanguage(i18n.language) + ); + mountedApp.style({ color: ColorStyle.Red }); + }, + [i18n] + ); + + const handleAddImage = React.useCallback( + ({ + src, + size, + isLocked, + point, + cb, + }: { + src: string; + size: number[]; + isLocked: boolean; + point: number[]; + cb?: () => void; + }) => { + if (!app) return; + + const asset: TDImageAsset = { + id: src, + type: TDAssetType.Image, + fileName: "img", + src, + size, + }; + + // tldraw creator: + // "So image shapes in tldraw work like this: we add an asset to the app.assets table, then we reference that asset in the shape object itself. + // This lets us have multiple copies of an image on the canvas without having all of those take up memory individually" + + app.insertContent({ + assets: [asset], + shapes: [], + }); + + app.createShapes({ + id: nanoid(), + type: TDShapeType.Image, + assetId: src, + size, + isAspectRatioLocked: true, + isLocked, + point, + }); + cb?.(); + }, + [app] + ); + + const handleAddWeapon = React.useCallback( + (weaponId: MainWeaponId) => { + handleAddImage({ + src: `${outlinedMainWeaponImageUrl(weaponId)}.png`, + size: [45, 45], + isLocked: false, + point: [randomInt(250, 1000), randomInt(250, 750)], + cb: () => app.selectTool("select"), + }); + }, + [app, handleAddImage] + ); + + const handleAddBackgroundImage = React.useCallback( + ({ stageId, modeShort }: { stageId: StageId; modeShort: ModeShort }) => { + app.resetDocument(); + handleAddImage({ + src: stageMinimapImageUrlWithEnding({ stageId, modeShort }), + size: [1600, 900], + isLocked: true, + point: [65, 20], + }); + }, + [app, handleAddImage] + ); + + return ( + <> + +
+ {mainWeaponIds.map((weaponId) => { + return ( + + ); + })} +
+
+ + {t("common:plans.poweredBy", { name: "tldraw" })} + +
+ + + ); +} + +function StageBackgroundSelector({ + onAddBackground, +}: { + onAddBackground: ({ + stageId, + modeShort, + }: { + stageId: StageId; + modeShort: ModeShort; + }) => void; +}) { + const { t } = useTranslation(["game-misc", "common"]); + const [stageId, setStageId] = React.useState(stageIds[0]); + const [selectedMode, setSelectedMode] = React.useState("SZ"); + + return ( +
+ +
+ {modesShort.map((mode) => { + const selected = mode === selectedMode; + return ( + + ); + })} +
+ +
+ ); +} + +// when adding new language check from Tldraw codebase what is the matching +// language in TRANSLATIONS constant, or default to english if none found +const ourLanguageToTldrawLanguageMap: Record = { + "es-US": "es", + "es-ES": "es", + ko: "ko-kr", + nl: "en", + zh: "zh-ch", + // map to itself + da: "da", + de: "de", + en: "en", + fr: "fr", + it: "it", + ja: "ja", + ru: "ru", +}; +function ourLanguageToTldrawLanguage(ourLanguageUserSelected: string) { + for (const [ourLanguage, tldrawLanguage] of Object.entries( + ourLanguageToTldrawLanguageMap + )) { + if (ourLanguage === ourLanguageUserSelected) { + return tldrawLanguage; + } + } + + console.error(`No tldraw language found for: ${ourLanguageUserSelected}`); + return "en"; +} diff --git a/app/components/layout/nav-items.json b/app/components/layout/nav-items.json index 6cdf24785..322463aae 100644 --- a/app/components/layout/nav-items.json +++ b/app/components/layout/nav-items.json @@ -11,6 +11,11 @@ "url": "object-damage-calculator", "prefetch": true }, + { + "name": "plans", + "url": "plans", + "prefetch": false + }, { "name": "calendar", "url": "calendar", "prefetch": false }, { "name": "maps", "url": "maps", "prefetch": false }, { "name": "badges", "url": "badges", "prefetch": false }, diff --git a/app/hooks/useForceRefresh.tsx b/app/hooks/useForceRefresh.tsx new file mode 100644 index 000000000..db558bd5b --- /dev/null +++ b/app/hooks/useForceRefresh.tsx @@ -0,0 +1,9 @@ +import * as React from "react"; + +export function useForceRefreshOnMount() { + const [, setOne] = React.useState(0); + + React.useEffect(() => { + setOne(1); + }, []); +} diff --git a/app/modules/i18n/config.ts b/app/modules/i18n/config.ts index 80d84dd38..b01e33ca1 100644 --- a/app/modules/i18n/config.ts +++ b/app/modules/i18n/config.ts @@ -51,6 +51,8 @@ export const languages = [ }, ] as const; +export type LanguageCode = typeof languages[number]["code"]; + export const config = { supportedLngs: languages.map((lang) => lang.code), fallbackLng: DEFAULT_LANGUAGE, diff --git a/app/modules/i18n/index.ts b/app/modules/i18n/index.ts index d46768a1f..1214ba1bf 100644 --- a/app/modules/i18n/index.ts +++ b/app/modules/i18n/index.ts @@ -1,4 +1,4 @@ export { i18nLoader } from "./loader"; export { i18Instance } from "./loader.server"; export { i18next, i18nCookie } from "./i18next.server"; -export { DEFAULT_LANGUAGE, languages } from "./config"; +export { DEFAULT_LANGUAGE, languages, type LanguageCode } from "./config"; diff --git a/app/routes/contributions.tsx b/app/routes/contributions.tsx index 96776ee4c..03a0b21ce 100644 --- a/app/routes/contributions.tsx +++ b/app/routes/contributions.tsx @@ -9,6 +9,7 @@ import { GITHUB_CONTRIBUTORS_URL, LEAN_TWITTER, SENDOU_TWITTER_URL, + TWIG_TWITTER, UBERU_TWITTER, } from "~/utils/urls"; import { type SendouRouteHandle } from "~/utils/remix"; @@ -24,6 +25,8 @@ export const handle: SendouRouteHandle = { i18n: "contributions", }; +const PROGRAMMERS = ["DoubleCookies", "ElementUser", "remmycat"] as const; + const TRANSLATORS: Array<{ translators: Array; language: typeof languages[number]["code"]; @@ -83,6 +86,7 @@ export default function ContributionsPage() {