XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

feat(webui): world state config (#2318)

Re #2312. Will need some follow-up considerations for circuit game modes. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2318 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

d79e7c02
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

12 个文件 +446 -69
Added src/controllers/custom/configController.ts +42 -0
@@ -0,0 +1,42 @@
1 import { RequestHandler } from "express";
2 import { config } from "@/src/services/configService";
3 import { getAccountForRequest, isAdministrator } from "@/src/services/loginService";
4 import { saveConfig } from "@/src/services/configWatcherService";
5
6 export const getConfigController: RequestHandler = async (req, res) => {
7 const account = await getAccountForRequest(req);
8 if (isAdministrator(account)) {
9 const responseData: Record<string, boolean | string | number | null> = {};
10 for (const id of req.body as string[]) {
11 const [obj, idx] = configIdToIndexable(id);
12 responseData[id] = obj[idx] ?? null;
13 }
14 res.json(responseData);
15 } else {
16 res.status(401).end();
17 }
18 };
19
20 export const setConfigController: RequestHandler = async (req, res) => {
21 const account = await getAccountForRequest(req);
22 if (isAdministrator(account)) {
23 for (const [id, value] of Object.entries(req.body as Record<string, boolean | string | number>)) {
24 const [obj, idx] = configIdToIndexable(id);
25 obj[idx] = value;
26 }
27 await saveConfig();
28 res.end();
29 } else {
30 res.status(401).end();
31 }
32 };
33
34 const configIdToIndexable = (id: string): [Record<string, boolean | string | number | undefined>, string] => {
35 let obj = config as unknown as Record<string, never>;
36 const arr = id.split(".");
37 while (arr.length > 1) {
38 obj = obj[arr[0]];
39 arr.splice(0, 1);
40 }
41 return [obj, arr[0]];
42 };
Deleted src/controllers/custom/getConfigDataController.ts +0 -14
@@ -1,14 +0,0 @@
1 import { RequestHandler } from "express";
2 import { config } from "@/src/services/configService";
3 import { getAccountForRequest, isAdministrator } from "@/src/services/loginService";
4
5 const getConfigDataController: RequestHandler = async (req, res) => {
6 const account = await getAccountForRequest(req);
7 if (isAdministrator(account)) {
8 res.json(config);
9 } else {
10 res.status(401).end();
11 }
12 };
13
14 export { getConfigDataController };
Deleted src/controllers/custom/updateConfigDataController.ts +0 -21
@@ -1,21 +0,0 @@
1 import { RequestHandler } from "express";
2 import { saveConfig } from "@/src/services/configWatcherService";
3 import { getAccountForRequest, isAdministrator } from "@/src/services/loginService";
4 import { config, IConfig } from "@/src/services/configService";
5
6 export const updateConfigDataController: RequestHandler = async (req, res) => {
7 const account = await getAccountForRequest(req);
8 if (isAdministrator(account)) {
9 const data = req.body as IUpdateConfigDataRequest;
10 config[data.key] = data.value;
11 await saveConfig();
12 res.end();
13 } else {
14 res.status(401).end();
15 }
16 };
17
18 interface IUpdateConfigDataRequest {
19 key: keyof IConfig;
20 value: never;
21 }
Modified src/routes/custom.ts +3 -4
@@ -25,8 +25,7 @@ import { manageQuestsController } from "@/src/controllers/custom/manageQuestsCon
25 25 import { setEvolutionProgressController } from "@/src/controllers/custom/setEvolutionProgressController";
26 26 import { setBoosterController } from "@/src/controllers/custom/setBoosterController";
27 27
28 import { getConfigDataController } from "@/src/controllers/custom/getConfigDataController";
29 import { updateConfigDataController } from "@/src/controllers/custom/updateConfigDataController";
28 import { getConfigController, setConfigController } from "@/src/controllers/custom/configController";
30 29
31 30 const customRouter = express.Router();
32 31
@@ -55,7 +54,7 @@ customRouter.post("/manageQuests", manageQuestsController);
55 54 customRouter.post("/setEvolutionProgress", setEvolutionProgressController);
56 55 customRouter.post("/setBooster", setBoosterController);
57 56
58 customRouter.get("/config", getConfigDataController);
59 customRouter.post("/config", updateConfigDataController);
57 customRouter.post("/getConfig", getConfigController);
58 customRouter.post("/setConfig", setConfigController);
60 59
61 60 export { customRouter };
Modified static/webui/index.html +89 -2
@@ -568,10 +568,10 @@
568 568 <div class="card mb-3">
569 569 <h5 class="card-header" data-loc="cheats_server"></h5>
570 570 <div class="card-body">
571 <div id="server-settings-no-perms" class="d-none">
571 <div class="d-none config-admin-hide">
572 572 <p class="card-text" data-loc="cheats_administratorRequirement"></p>
573 573 </div>
574 <div id="server-settings" class="d-none">
574 <div class="d-none config-admin-show config-form">
575 575 <div class="form-check">
576 576 <input class="form-check-input" type="checkbox" id="skipTutorial" />
577 577 <label class="form-check-label" for="skipTutorial" data-loc="cheats_skipTutorial"></label>
@@ -807,6 +807,93 @@
807 807 </form>
808 808 </div>
809 809 </div>
810 <div class="card mb-3 d-none config-admin-show config-form">
811 <h5 class="card-header" data-loc="worldState"></h5>
812 <div class="card-body">
813 <div class="form-check">
814 <input class="form-check-input" type="checkbox" id="worldState.creditBoost" />
815 <label class="form-check-label" for="worldState.creditBoost" data-loc="worldState_creditBoost"></label>
816 </div>
817 <div class="form-check">
818 <input class="form-check-input" type="checkbox" id="worldState.affinityBoost" />
819 <label class="form-check-label" for="worldState.affinityBoost" data-loc="worldState_affinityBoost"></label>
820 </div>
821 <div class="form-check">
822 <input class="form-check-input" type="checkbox" id="worldState.resourceBoost" />
823 <label class="form-check-label" for="worldState.resourceBoost" data-loc="worldState_resourceBoost"></label>
824 </div>
825 <div class="form-check">
826 <input class="form-check-input" type="checkbox" id="worldState.starDays" />
827 <label class="form-check-label" for="worldState.starDays" data-loc="worldState_starDays"></label>
828 </div>
829 <div class="form-group mt-2">
830 <label class="form-label" for="changeSyndicate" data-loc="worldState_galleonOfGhouls"></label>
831 <select class="form-control" id="worldState.galleonOfGhouls">
832 <option value="0" data-loc="disabled"></option>
833 <option value="1" data-loc="worldState_we1"></option>
834 <option value="2" data-loc="worldState_we2"></option>
835 <option value="3" data-loc="worldState_we3"></option>
836 </select>
837 </div>
838 <div class="form-group mt-2">
839 <label class="form-label" for="changeSyndicate" data-loc="worldState_eidolonOverride"></label>
840 <select class="form-control" id="worldState.eidolonOverride">
841 <option value="" data-loc="disabled"></option>
842 <option value="day" data-loc="worldState_day"></option>
843 <option value="night" data-loc="worldState_night"></option>
844 </select>
845 </div>
846 <div class="form-group mt-2">
847 <label class="form-label" for="changeSyndicate" data-loc="worldState_vallisOverride"></label>
848 <select class="form-control" id="worldState.vallisOverride">
849 <option value="" data-loc="disabled"></option>
850 <option value="warm" data-loc="worldState_warm"></option>
851 <option value="cold" data-loc="worldState_cold"></option>
852 </select>
853 </div>
854 <div class="form-group mt-2">
855 <label class="form-label" for="changeSyndicate" data-loc="worldState_duviriOverride"></label>
856 <select class="form-control" id="worldState.duviriOverride">
857 <option value="" data-loc="disabled"></option>
858 <option value="joy" data-loc="worldState_joy"></option>
859 <option value="anger" data-loc="worldState_anger"></option>
860 <option value="envy" data-loc="worldState_envy"></option>
861 <option value="sorrow" data-loc="worldState_sorrow"></option>
862 <option value="fear" data-loc="worldState_fear"></option>
863 </select>
864 </div>
865 <div class="form-group mt-2">
866 <label class="form-label" for="changeSyndicate" data-loc="worldState_nightwaveOverride"></label>
867 <select class="form-control" id="worldState.nightwaveOverride">
868 <option value="" data-loc="disabled"></option>
869 <option value="RadioLegionIntermission13Syndicate" data-loc="worldState_RadioLegionIntermission13Syndicate"></option>
870 <option value="RadioLegionIntermission12Syndicate" data-loc="worldState_RadioLegionIntermission12Syndicate"></option>
871 <option value="RadioLegionIntermission11Syndicate" data-loc="worldState_RadioLegionIntermission11Syndicate"></option>
872 <option value="RadioLegionIntermission10Syndicate" data-loc="worldState_RadioLegionIntermission10Syndicate"></option>
873 <option value="RadioLegionIntermission9Syndicate" data-loc="worldState_RadioLegionIntermission9Syndicate"></option>
874 <option value="RadioLegionIntermission8Syndicate" data-loc="worldState_RadioLegionIntermission8Syndicate"></option>
875 <option value="RadioLegionIntermission7Syndicate" data-loc="worldState_RadioLegionIntermission7Syndicate"></option>
876 <option value="RadioLegionIntermission6Syndicate" data-loc="worldState_RadioLegionIntermission6Syndicate"></option>
877 <option value="RadioLegionIntermission5Syndicate" data-loc="worldState_RadioLegionIntermission5Syndicate"></option>
878 <option value="RadioLegionIntermission4Syndicate" data-loc="worldState_RadioLegionIntermission4Syndicate"></option>
879 <option value="RadioLegionIntermission3Syndicate" data-loc="worldState_RadioLegionIntermission3Syndicate"></option>
880 <option value="RadioLegion3Syndicate" data-loc="worldState_RadioLegion3Syndicate"></option>
881 <option value="RadioLegionIntermission2Syndicate" data-loc="worldState_RadioLegionIntermission2Syndicate"></option>
882 <option value="RadioLegion2Syndicate" data-loc="worldState_RadioLegion2Syndicate"></option>
883 <option value="RadioLegionIntermissionSyndicate" data-loc="worldState_RadioLegionIntermissionSyndicate"></option>
884 <option value="RadioLegionSyndicate" data-loc="worldState_RadioLegionSyndicate"></option>
885 </select>
886 </div>
887 <div class="form-group mt-2">
888 <label class="form-label" for="changeSyndicate" data-loc="worldState_fissures"></label>
889 <select class="form-control" id="worldState.allTheFissures">
890 <option value="" data-loc="normal"></option>
891 <option value="normal" data-loc="worldState_allAtOnceNormal"></option>
892 <option value="hard" data-loc="worldState_allAtOnceSteelPath"></option>
893 </select>
894 </div>
895 </div>
896 </div>
810 897 </div>
811 898 </div>
812 899 </div>
Modified static/webui/script.js +42 -28
@@ -1847,16 +1847,28 @@ function doAcquireMod() {
1847 1847 }
1848 1848 }
1849 1849
1850 const uiConfigs = [...$("#server-settings input[id]")].map(x => x.id);
1850 const uiConfigs = [...$(".config-form input[id], .config-form select[id]")].map(x => x.id);
1851 1851
1852 1852 for (const id of uiConfigs) {
1853 1853 const elm = document.getElementById(id);
1854 if (elm.type == "checkbox") {
1854 if (elm.tagName == "SELECT") {
1855 1855 elm.onchange = function () {
1856 let value = this.value;
1857 if (!isNaN(parseInt(value))) {
1858 value = parseInt(value);
1859 }
1856 1860 $.post({
1857 url: "/custom/config?" + window.authz,
1861 url: "/custom/setConfig?" + window.authz,
1858 1862 contentType: "application/json",
1859 data: JSON.stringify({ key: id, value: this.checked })
1863 data: JSON.stringify({ [id]: value })
1864 });
1865 };
1866 } else if (elm.type == "checkbox") {
1867 elm.onchange = function () {
1868 $.post({
1869 url: "/custom/setConfig?" + window.authz,
1870 contentType: "application/json",
1871 data: JSON.stringify({ [id]: this.checked })
1860 1872 }).then(() => {
1861 1873 if (["infiniteCredits", "infinitePlatinum", "infiniteEndo", "infiniteRegalAya"].indexOf(id) != -1) {
1862 1874 updateInventory();
@@ -1869,9 +1881,9 @@ for (const id of uiConfigs) {
1869 1881 function doSaveConfig(id) {
1870 1882 const elm = document.getElementById(id);
1871 1883 $.post({
1872 url: "/custom/config?" + window.authz,
1884 url: "/custom/setConfig?" + window.authz,
1873 1885 contentType: "application/json",
1874 data: JSON.stringify({ key: id, value: parseInt(elm.value) })
1886 data: JSON.stringify({ [id]: parseInt(elm.value) })
1875 1887 });
1876 1888 }
1877 1889
@@ -1882,26 +1894,29 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
1882 1894 interval = setInterval(() => {
1883 1895 if (window.authz) {
1884 1896 clearInterval(interval);
1885 fetch("/custom/config?" + window.authz).then(async res => {
1886 if (res.status == 200) {
1897 $.post({
1898 url: "/custom/getConfig?" + window.authz,
1899 contentType: "application/json",
1900 data: JSON.stringify(uiConfigs)
1901 })
1902 .done(json => {
1887 1903 //window.is_admin = true;
1888 $("#server-settings-no-perms").addClass("d-none");
1889 $("#server-settings").removeClass("d-none");
1890 res.json().then(json =>
1891 Object.entries(json).forEach(entry => {
1892 const [key, value] = entry;
1893 var x = document.getElementById(`${key}`);
1894 if (x != null) {
1895 if (x.type == "checkbox") {
1896 x.checked = value;
1897 } else if (x.type == "number") {
1898 x.setAttribute("value", `${value}`);
1899 }
1904 $(".config-admin-hide").addClass("d-none");
1905 $(".config-admin-show").removeClass("d-none");
1906 Object.entries(json).forEach(entry => {
1907 const [key, value] = entry;
1908 var x = document.getElementById(`${key}`);
1909 if (x != null) {
1910 if (x.type == "checkbox") {
1911 x.checked = value;
1912 } else if (x.type == "number") {
1913 x.setAttribute("value", `${value}`);
1900 1914 }
1901 })
1902 );
1903 } else {
1904 if ((await res.text()) == "Log-in expired") {
1915 }
1916 });
1917 })
1918 .fail(res => {
1919 if (res.responseText == "Log-in expired") {
1905 1920 revalidateAuthz().then(() => {
1906 1921 if (single.getCurrentPath() == "/webui/cheats") {
1907 1922 single.loadRoute("/webui/cheats");
@@ -1909,11 +1924,10 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
1909 1924 });
1910 1925 } else {
1911 1926 //window.is_admin = false;
1912 $("#server-settings-no-perms").removeClass("d-none");
1913 $("#server-settings").addClass("d-none");
1927 $(".config-admin-hide").removeClass("d-none");
1928 $(".config-admin-show").addClass("d-none");
1914 1929 }
1915 }
1916 });
1930 });
1917 1931 }
1918 1932 }, 10);
1919 1933 });
Modified static/webui/translations/de.js +45 -0
@@ -186,6 +186,51 @@ dict = {
186 186 cheats_changeSupportedSyndicate: `Unterstütztes Syndikat`,
187 187 cheats_changeButton: `Ändern`,
188 188 cheats_none: `Keines`,
189
190 worldState: `[UNTRANSLATED] World State`,
191 worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
192 worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
193 worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
194 worldState_starDays: `[UNTRANSLATED] Star Days`,
195 worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
196 disabled: `[UNTRANSLATED] Disabled`,
197 worldState_we1: `[UNTRANSLATED] Weekend 1`,
198 worldState_we2: `[UNTRANSLATED] Weekend 2`,
199 worldState_we3: `[UNTRANSLATED] Weekend 3`,
200 worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
201 worldState_day: `[UNTRANSLATED] Day`,
202 worldState_night: `[UNTRANSLATED] Night`,
203 worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
204 worldState_warm: `[UNTRANSLATED] Warm`,
205 worldState_cold: `[UNTRANSLATED] Cold`,
206 worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
207 worldState_joy: `[UNTRANSLATED] Joy`,
208 worldState_anger: `[UNTRANSLATED] Anger`,
209 worldState_envy: `[UNTRANSLATED] Envy`,
210 worldState_sorrow: `[UNTRANSLATED] Sorrow`,
211 worldState_fear: `[UNTRANSLATED] Fear`,
212 worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
213 worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
214 worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
215 worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
216 worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
217 worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
218 worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
219 worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
220 worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
221 worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
222 worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
223 worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
224 worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
225 worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
226 worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
227 worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
228 worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
229 worldState_fissures: `[UNTRANSLATED] Fissures`,
230 normal: `[UNTRANSLATED] Normal`,
231 worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
232 worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
233
189 234 import_importNote: `Du kannst hier eine vollständige oder teilweise Inventarantwort (Client-Darstellung) einfügen. Alle Felder, die vom Importer unterstützt werden, <b>werden in deinem Account überschrieben</b>.`,
190 235 import_submit: `Absenden`,
191 236 import_samples: `[UNTRANSLATED] Samples:`,
Modified static/webui/translations/en.js +45 -0
@@ -185,6 +185,51 @@ dict = {
185 185 cheats_changeSupportedSyndicate: `Supported syndicate`,
186 186 cheats_changeButton: `Change`,
187 187 cheats_none: `None`,
188
189 worldState: `World State`,
190 worldState_creditBoost: `Credit Boost`,
191 worldState_affinityBoost: `Affinity Boost`,
192 worldState_resourceBoost: `Resource Boost`,
193 worldState_starDays: `Star Days`,
194 worldState_galleonOfGhouls: `Galleon of Ghouls`,
195 disabled: `Disabled`,
196 worldState_we1: `Weekend 1`,
197 worldState_we2: `Weekend 2`,
198 worldState_we3: `Weekend 3`,
199 worldState_eidolonOverride: `Eidolon Override`,
200 worldState_day: `Day`,
201 worldState_night: `Night`,
202 worldState_vallisOverride: `Orb Vallis Override`,
203 worldState_warm: `Warm`,
204 worldState_cold: `Cold`,
205 worldState_duviriOverride: `Duviri Override`,
206 worldState_joy: `Joy`,
207 worldState_anger: `Anger`,
208 worldState_envy: `Envy`,
209 worldState_sorrow: `Sorrow`,
210 worldState_fear: `Fear`,
211 worldState_nightwaveOverride: `Nightwave Override`,
212 worldState_RadioLegionIntermission13Syndicate: `Nora's Mix Vol. 9`,
213 worldState_RadioLegionIntermission12Syndicate: `Nora's Mix Vol. 8`,
214 worldState_RadioLegionIntermission11Syndicate: `Nora's Mix Vol. 7`,
215 worldState_RadioLegionIntermission10Syndicate: `Nora's Mix Vol. 6`,
216 worldState_RadioLegionIntermission9Syndicate: `Nora's Mix Vol. 5`,
217 worldState_RadioLegionIntermission8Syndicate: `Nora's Mix Vol. 4`,
218 worldState_RadioLegionIntermission7Syndicate: `Nora's Mix Vol. 3`,
219 worldState_RadioLegionIntermission6Syndicate: `Nora's Mix Vol. 2`,
220 worldState_RadioLegionIntermission5Syndicate: `Nora's Mix Vol. 1`,
221 worldState_RadioLegionIntermission4Syndicate: `Nora's Choice`,
222 worldState_RadioLegionIntermission3Syndicate: `Intermission III`,
223 worldState_RadioLegion3Syndicate: `Glassmaker`,
224 worldState_RadioLegionIntermission2Syndicate: `Intermission II`,
225 worldState_RadioLegion2Syndicate: `The Emissary`,
226 worldState_RadioLegionIntermissionSyndicate: `Intermission I`,
227 worldState_RadioLegionSyndicate: `The Wolf of Saturn Six`,
228 worldState_fissures: `Fissures`,
229 normal: `Normal`,
230 worldState_allAtOnceNormal: `All At Once, Normal`,
231 worldState_allAtOnceSteelPath: `All At Once, Steel Path`,
232
188 233 import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer <b>will be overwritten</b> in your account.`,
189 234 import_submit: `Submit`,
190 235 import_samples: `Samples:`,
Modified static/webui/translations/es.js +45 -0
@@ -186,6 +186,51 @@ dict = {
186 186 cheats_changeSupportedSyndicate: `Sindicatos disponibles`,
187 187 cheats_changeButton: `Cambiar`,
188 188 cheats_none: `Ninguno`,
189
190 worldState: `[UNTRANSLATED] World State`,
191 worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
192 worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
193 worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
194 worldState_starDays: `[UNTRANSLATED] Star Days`,
195 worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
196 disabled: `[UNTRANSLATED] Disabled`,
197 worldState_we1: `[UNTRANSLATED] Weekend 1`,
198 worldState_we2: `[UNTRANSLATED] Weekend 2`,
199 worldState_we3: `[UNTRANSLATED] Weekend 3`,
200 worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
201 worldState_day: `[UNTRANSLATED] Day`,
202 worldState_night: `[UNTRANSLATED] Night`,
203 worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
204 worldState_warm: `[UNTRANSLATED] Warm`,
205 worldState_cold: `[UNTRANSLATED] Cold`,
206 worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
207 worldState_joy: `[UNTRANSLATED] Joy`,
208 worldState_anger: `[UNTRANSLATED] Anger`,
209 worldState_envy: `[UNTRANSLATED] Envy`,
210 worldState_sorrow: `[UNTRANSLATED] Sorrow`,
211 worldState_fear: `[UNTRANSLATED] Fear`,
212 worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
213 worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
214 worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
215 worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
216 worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
217 worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
218 worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
219 worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
220 worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
221 worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
222 worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
223 worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
224 worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
225 worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
226 worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
227 worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
228 worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
229 worldState_fissures: `[UNTRANSLATED] Fissures`,
230 normal: `[UNTRANSLATED] Normal`,
231 worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
232 worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
233
189 234 import_importNote: `Puedes proporcionar una respuesta de inventario completa o parcial (representación del cliente) aquí. Todos los campos compatibles con el importador <b>serán sobrescritos</b> en tu cuenta.`,
190 235 import_submit: `Enviar`,
191 236 import_samples: `Muestras:`,
Modified static/webui/translations/fr.js +45 -0
@@ -186,6 +186,51 @@ dict = {
186 186 cheats_changeSupportedSyndicate: `Allégeance`,
187 187 cheats_changeButton: `Changer`,
188 188 cheats_none: `Aucun`,
189
190 worldState: `[UNTRANSLATED] World State`,
191 worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
192 worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
193 worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
194 worldState_starDays: `[UNTRANSLATED] Star Days`,
195 worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
196 disabled: `[UNTRANSLATED] Disabled`,
197 worldState_we1: `[UNTRANSLATED] Weekend 1`,
198 worldState_we2: `[UNTRANSLATED] Weekend 2`,
199 worldState_we3: `[UNTRANSLATED] Weekend 3`,
200 worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
201 worldState_day: `[UNTRANSLATED] Day`,
202 worldState_night: `[UNTRANSLATED] Night`,
203 worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
204 worldState_warm: `[UNTRANSLATED] Warm`,
205 worldState_cold: `[UNTRANSLATED] Cold`,
206 worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
207 worldState_joy: `[UNTRANSLATED] Joy`,
208 worldState_anger: `[UNTRANSLATED] Anger`,
209 worldState_envy: `[UNTRANSLATED] Envy`,
210 worldState_sorrow: `[UNTRANSLATED] Sorrow`,
211 worldState_fear: `[UNTRANSLATED] Fear`,
212 worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
213 worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
214 worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
215 worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
216 worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
217 worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
218 worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
219 worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
220 worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
221 worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
222 worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
223 worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
224 worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
225 worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
226 worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
227 worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
228 worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
229 worldState_fissures: `[UNTRANSLATED] Fissures`,
230 normal: `[UNTRANSLATED] Normal`,
231 worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
232 worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
233
189 234 import_importNote: `Import manuel. Toutes les modifcations supportées par l'inventaire <b>écraseront celles présentes dans la base de données</b>.`,
190 235 import_submit: `Soumettre`,
191 236 import_samples: `Echantillons :`,
Modified static/webui/translations/ru.js +45 -0
@@ -186,6 +186,51 @@ dict = {
186 186 cheats_changeSupportedSyndicate: `Поддерживаемый синдикат`,
187 187 cheats_changeButton: `Изменить`,
188 188 cheats_none: `Отсутствует`,
189
190 worldState: `[UNTRANSLATED] World State`,
191 worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
192 worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
193 worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
194 worldState_starDays: `[UNTRANSLATED] Star Days`,
195 worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
196 disabled: `[UNTRANSLATED] Disabled`,
197 worldState_we1: `[UNTRANSLATED] Weekend 1`,
198 worldState_we2: `[UNTRANSLATED] Weekend 2`,
199 worldState_we3: `[UNTRANSLATED] Weekend 3`,
200 worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
201 worldState_day: `[UNTRANSLATED] Day`,
202 worldState_night: `[UNTRANSLATED] Night`,
203 worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
204 worldState_warm: `[UNTRANSLATED] Warm`,
205 worldState_cold: `[UNTRANSLATED] Cold`,
206 worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
207 worldState_joy: `[UNTRANSLATED] Joy`,
208 worldState_anger: `[UNTRANSLATED] Anger`,
209 worldState_envy: `[UNTRANSLATED] Envy`,
210 worldState_sorrow: `[UNTRANSLATED] Sorrow`,
211 worldState_fear: `[UNTRANSLATED] Fear`,
212 worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
213 worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
214 worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
215 worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
216 worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
217 worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
218 worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
219 worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
220 worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
221 worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
222 worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
223 worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
224 worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
225 worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
226 worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
227 worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
228 worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
229 worldState_fissures: `[UNTRANSLATED] Fissures`,
230 normal: `[UNTRANSLATED] Normal`,
231 worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
232 worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
233
189 234 import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
190 235 import_submit: `Отправить`,
191 236 import_samples: `[UNTRANSLATED] Samples:`,
Modified static/webui/translations/zh.js +45 -0
@@ -186,6 +186,51 @@ dict = {
186 186 cheats_changeSupportedSyndicate: `支持的集团`,
187 187 cheats_changeButton: `更改`,
188 188 cheats_none: `无`,
189
190 worldState: `[UNTRANSLATED] World State`,
191 worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
192 worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
193 worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
194 worldState_starDays: `[UNTRANSLATED] Star Days`,
195 worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
196 disabled: `[UNTRANSLATED] Disabled`,
197 worldState_we1: `[UNTRANSLATED] Weekend 1`,
198 worldState_we2: `[UNTRANSLATED] Weekend 2`,
199 worldState_we3: `[UNTRANSLATED] Weekend 3`,
200 worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
201 worldState_day: `[UNTRANSLATED] Day`,
202 worldState_night: `[UNTRANSLATED] Night`,
203 worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
204 worldState_warm: `[UNTRANSLATED] Warm`,
205 worldState_cold: `[UNTRANSLATED] Cold`,
206 worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
207 worldState_joy: `[UNTRANSLATED] Joy`,
208 worldState_anger: `[UNTRANSLATED] Anger`,
209 worldState_envy: `[UNTRANSLATED] Envy`,
210 worldState_sorrow: `[UNTRANSLATED] Sorrow`,
211 worldState_fear: `[UNTRANSLATED] Fear`,
212 worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
213 worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
214 worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
215 worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
216 worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
217 worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
218 worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
219 worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
220 worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
221 worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
222 worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
223 worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
224 worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
225 worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
226 worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
227 worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
228 worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
229 worldState_fissures: `[UNTRANSLATED] Fissures`,
230 normal: `[UNTRANSLATED] Normal`,
231 worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
232 worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
233
189 234 import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示)。支持的所有字段<b>将被覆盖</b>到您的账户中。`,
190 235 import_submit: `提交`,
191 236 import_samples: `示例:`,