diff --git a/.vscode/launch.json b/.vscode/launch.json
index 401e4c7..b359b11 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -4,6 +4,12 @@
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
+ {
+ "name": "Launch Editor Browser",
+ "request": "launch",
+ "type": "editor-browser",
+ "url": "http://localhost:5173",
+ },
{
"type": "node",
"request": "launch",
diff --git a/index.html b/index.html
index d54a744..68e5618 100644
--- a/index.html
+++ b/index.html
@@ -15,21 +15,13 @@
-
Life Restart
-
+
diff --git a/public/channel.js b/public/channel.js
new file mode 100644
index 0000000..df3fef8
--- /dev/null
+++ b/public/channel.js
@@ -0,0 +1 @@
+globalThis.$channel = {}
diff --git a/src/app.js b/src/app.js
index e1a0881..8b81791 100644
--- a/src/app.js
+++ b/src/app.js
@@ -1,179 +1,176 @@
-import './ui/laya.patch.js';
-import './ui/runtime.js';
+import './ui/laya.patch.js'
+import './ui/runtime.js'
import './ui/pluginFunction.js'
import './ui/promisesLaya.js'
-import './ui/layaUI.max.all.js';
-import UIManager from './ui/uiManager.js';
-import * as utils from './functions/util.js';
+import './ui/layaUI.max.all.js'
+import UIManager from './ui/uiManager.js'
+import * as utils from './functions/util.js'
-globalThis.UIManager =
- globalThis.UI =
- UIManager;
+globalThis.UIManager = globalThis.UI = UIManager
-globalThis.$_ = utils;
+globalThis.$_ = utils
globalThis.goto = async tag => {
- let url;
+ let url
switch (tag) {
- case 'github': url = 'https://github.com/VickScarlet/lifeRestart'; break;
- case 'discord': url = 'https://discord.gg/U3qrf49NMQ'; break;
- case 'sponsor_afd': url = 'https://afdian.com/a/LifeRestart'; break;
- case 'sponsor_ddf': url = 'https://dun.mianbaoduo.com/@vickscarlet'; break;
+ case 'github': url = 'https://github.com/VickScarlet/lifeRestart'; break
+ case 'discord': url = 'https://discord.gg/U3qrf49NMQ'; break
+ case 'sponsor_afd': url = 'https://afdian.com/a/LifeRestart'; break
+ case 'sponsor_ddf': url = 'https://dun.mianbaoduo.com/@vickscarlet'; break
}
try {
if (Laya.Browser.onIOS) {
- window.location.href = url;
+ window.location.href = url
} else {
- window.open(url, '_blank');
+ window.open(url, '_blank')
}
} catch (error) {
- console.error(error);
+ console.error(error)
}
}
class App {
+ name = 'lifeRestart'
+ version = '2.1.0'
constructor() {
- this.name = 'lifeRestart';
- this.version = '2.0.0';
- console.log(`${this.name} ${this.version}`);
+ console.log(`${this.name} ${this.version}`)
}
- #language;
+ #language
static languages = {
'zh-cn': 'zh-cn',
'en-us': 'en-us',
- };
+ }
#initLaya() {
/**
- *...特殊的字符,如泰文,必须重新实现这个类
- */
+ *...特殊的字符,如泰文,必须重新实现这个类
+ */
//class laya.webgl.text.CharSegment
class CharSegment {
- constructor() {
- this._sourceStr = null;
- }
+ _sourceStr = null
+ constructor() {}
textToSpit(str) {
- this._sourceStr = str;
- var texLen = str.length;
- var idx = -1;
- this._words = [];
+ this._sourceStr = str
+ const texLen = str.length
+ let idx = -1
+ this._words = []
while (++idx < texLen) {
- var character = str.charAt(idx);
- var code = str.charCodeAt(idx);
- if (code >= 0xD800 && code <= 0xDBFF) {
- this._words.push(character + str.charAt(++idx));
+ const character = str.charAt(idx)
+ const code = str.codePointAt(idx)
+ if (code >= 0xd800 && code <= 0xdbff) {
+ this._words.push(character + str.charAt(++idx))
} else {
- this._words.push(character);
+ this._words.push(character)
}
}
}
getChar(i) {
- return this._words;
+ return this._words
}
getCharCode(i) {
- return this._words[i].codePointAt(0);
+ return this._words[i].codePointAt(0)
}
length() {
- return this._words.length;
+ return this._words.length
}
}
- Laya.class(CharSegment, 'laya.webgl.text.CharSegment');
- Laya.imps(CharSegment.prototype, { "laya.webgl.text.ICharSegment": true })
-
+ Laya.class(CharSegment, 'laya.webgl.text.CharSegment')
+ Laya.imps(CharSegment.prototype, { 'laya.webgl.text.ICharSegment': true })
// Laya.init(1125, 2436, Laya.WebGL);
- Laya.Config.isAntialias = true;
- Laya.init(...this.#fitScreen, Laya.WebGL);
+ Laya.Config.isAntialias = true
+ Laya.init(...this.#fitScreen, Laya.WebGL)
- Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
- Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
+ Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE
+ Laya.stage.alignH = Laya.Stage.ALIGN_CENTER
- Laya.stage.scaleMode = "showall";
- Laya.stage.bgColor = "#000000";
- window.onresize = () => Laya.stage.size(...this.#fitScreen);
+ Laya.stage.scaleMode = 'showall'
+ Laya.stage.bgColor = '#000000'
+ window.onresize = () => Laya.stage.size(...this.#fitScreen)
}
get #fitScreen() {
- const designWidth = 1125;
- const designHeight = 2436;
- const maxWidth = designHeight * 3 / 4;
- const maxHeight = designWidth * 24 / 9;
- const designRatio = designWidth / designHeight;
+ const designWidth = 1125
+ const designHeight = 2436
+ const maxWidth = (designHeight * 3) / 4
+ const maxHeight = (designWidth * 24) / 9
+ const designRatio = designWidth / designHeight
- const screenWidth = window.innerWidth;
- const screenHeight = window.innerHeight;
- const screenRatio = screenWidth / screenHeight;
+ const screenWidth = window.innerWidth
+ const screenHeight = window.innerHeight
+ const screenRatio = screenWidth / screenHeight
if (screenRatio > designRatio) {
return [
- Math.min(screenWidth * designHeight / screenHeight, maxWidth),
- designHeight
+ Math.min((screenWidth * designHeight) / screenHeight, maxWidth),
+ designHeight,
]
} else {
return [
designWidth,
- Math.min(screenHeight * designWidth / screenWidth, maxHeight)
+ Math.min((screenHeight * designWidth) / screenWidth, maxHeight),
]
}
}
async setLanguage(language) {
- return this.#setLanguage(language);
+ return this.#setLanguage(language)
}
async #setLanguage(language) {
switch (language) {
case App.languages['en-us']:
case App.languages['zh-cn']:
- this.#language = language;
- break;
+ this.#language = language
+ break
default:
- this.#language = App.languages['zh-cn'];
- break;
+ this.#language = App.languages['zh-cn']
+ break
}
globalThis.$lang =
- Laya.Text.langPacks =
- (await import(`./i18n/${this.#language}.js`)).default;
+ Laya.Text.langPacks =
+ (await import(`./i18n/${this.#language}.js`)).default
}
resigterEvent() {
$$on('achievement', achievement => {
- $ui.popup(UI.popups.ACHIEVEMENT, { achievement });
+ $ui.popup(UI.popups.ACHIEVEMENT, { achievement })
})
$$on('message', ([message, ...args]) => {
if (Array.isArray(message)) {
- message = message.map(([m, ...a]) => $_.format($lang[m], ...a)).join('\n');
+ message = message.map(([m, ...a]) => $_.format($lang[m], ...a)).join('\n')
} else {
- message = $_.format(
- $lang[message], ...args
- );
+ message = $_.format($lang[message], ...args)
}
- $ui.popup(UI.popups.MESSAGE, { message });
+ $ui.popup(UI.popups.MESSAGE, { message })
})
}
- async start({
- language = App.languages['zh-cn'],
- theme = 'default',
- }) {
- this.resigterEvent();
- this.#initLaya();
- globalThis.$ui = UIManager.getInstance();
+ async start(
+ { language = App.languages['zh-cn'], theme = 'default' },
+ features = [],
+ ) {
+ this.resigterEvent()
+ this.#initLaya()
+ globalThis.$ui = UIManager.getInstance()
if (theme == 'default') {
- theme = localStorage.getItem('theme') || 'default';
+ theme = localStorage.getItem('theme') || 'default'
}
- $ui.theme = theme;
- await this.#setLanguage(language);
- await $ui.setLoading(UI.pages.LOADING);
- await $ui.switchView(UI.pages.LOADING);
+ $ui.theme = theme
+ await this.#setLanguage(language)
+ await $ui.setLoading(UI.pages.LOADING)
+ await $ui.switchView(UI.pages.LOADING)
await core.initial(
dataSet => Laya.promises.loader.load(`data/${this.#language}/${dataSet}.json`, null, Laya.Loader.JSON),
dataSet => Laya.promises.loader.load(`data/${dataSet}.json`, null, Laya.Loader.JSON),
- );
- await $ui.switchView(UI.pages.MAIN);
-
+ )
+ await $ui.switchView(UI.pages.MAIN)
+ for (const { feature, options } of features) {
+ const f = await import(`./features/${feature}.js`)
+ await f.default(options)
+ }
}
}
-export default App;
+export default App
diff --git a/src/functions/condition.js b/src/functions/condition.js
index 41b131d..d8b1e1b 100644
--- a/src/functions/condition.js
+++ b/src/functions/condition.js
@@ -1,127 +1,124 @@
function parseCondition(condition) {
-
- const conditions = [];
- const length = condition.length;
- const stack = [];
- stack.unshift(conditions);
- let cursor = 0;
+ const conditions = []
+ const length = condition.length
+ const stack = []
+ stack.unshift(conditions)
+ let cursor = 0
const catchString = i => {
- const str = condition.substring(cursor, i).trim();
- cursor = i;
- if(str) stack[0].push(str);
- };
+ const str = condition.substring(cursor, i).trim()
+ cursor = i
+ if (str) stack[0].push(str)
+ }
- for(let i=0; i<\!\?=]/);
+ const prop = condition.substring(0, i)
+ const symbol = condition.substring(i, (i += condition[i + 1] == '=' ? 2 : 1))
+ const d = condition.substring(i, length)
- const prop = condition.substring(0,i);
- const symbol = condition.substring(i, i+=(condition[i+1]=='='?2:1));
- const d = condition.substring(i, length);
+ const propData = property.get(prop)
+ const conditionData = d[0] == '[' ? JSON.parse(d) : Number(d)
- const propData = property.get(prop);
- const conditionData = d[0]=='['? JSON.parse(d): Number(d);
-
- switch(symbol) {
- case '>': return propData > conditionData;
- case '<': return propData < conditionData;
- case '>=': return propData >= conditionData;
- case '<=': return propData <= conditionData;
+ switch (symbol) {
+ case '>': return propData > conditionData
+ case '<': return propData < conditionData
+ case '>=': return propData >= conditionData
+ case '<=': return propData <= conditionData
case '=':
- if(Array.isArray(propData))
- return propData.includes(conditionData);
- return propData == conditionData;
+ if (Array.isArray(propData)) return propData.includes(conditionData)
+ return propData == conditionData
case '!=':
- if(Array.isArray(propData))
- return !propData.includes(conditionData);
- return propData != conditionData;
+ if (Array.isArray(propData))
+ return !propData.includes(conditionData)
+ return propData != conditionData
case '?':
- if(Array.isArray(propData)) {
- for(const p of propData)
- if(conditionData.includes(p)) return true;
- return false;
+ if (Array.isArray(propData)) {
+ for (const p of propData)
+ if (conditionData.includes(p)) return true
+ return false
}
- return conditionData.includes(propData);
+ return conditionData.includes(propData)
case '!':
- if(Array.isArray(propData)) {
- for(const p of propData)
- if(conditionData.includes(p)) return false;
- return true;
+ if (Array.isArray(propData)) {
+ for (const p of propData)
+ if (conditionData.includes(p)) return false
+ return true
}
- return !conditionData.includes(propData);
+ return !conditionData.includes(propData)
- default: return false;
+ default: return false
}
}
export function extractMaxTriggers(condition) {
// Assuming only age related talents can be triggered multiple times.
- const RE_AGE_CONDITION = /AGE\?\[([0-9\,]+)\]/;
- const match_object = RE_AGE_CONDITION.exec(condition);
+ const RE_AGE_CONDITION = /AGE\?\[([0-9,]+)\]/
+ const match_object = RE_AGE_CONDITION.exec(condition)
if (match_object == null) {
// Not age related, single trigger.
- return 1;
+ return 1
}
- const age_list = match_object[1].split(",");
- return age_list.length;
-}
\ No newline at end of file
+ const age_list = match_object[1].split(',')
+ return age_list.length
+}
diff --git a/src/i18n/en-us.js b/src/i18n/en-us.js
index cf10a27..a1e8ab8 100644
--- a/src/i18n/en-us.js
+++ b/src/i18n/en-us.js
@@ -1,4 +1,4 @@
-export default ({
+export default {
UI_Next: 'Next',
UI_Back: 'Back',
UI_Skip: 'Skip',
@@ -26,7 +26,7 @@ export default ({
UI_Property_Spirit: 'SPR',
UI_Title_Remake: 'Remake Simulate',
- UI_Title_Subsequent: 'The rubbish life doesn\'t want to stay for a second',
+ UI_Title_Subsequent: "The rubbish life doesn't want to stay for a second",
UI_Remake: '↻Remake Now',
UI_Thanks: 'Thx',
UI_Achievement: 'Achv',
@@ -146,11 +146,11 @@ export default ({
UI_UniqueWaTaShiContent: '\nUnique character card different from other 60 million player\nAll property, All talent, All random\nAll has only one chance',
UI_GenerateNow: 'Generate Now',
-
M_NoRank: 'There is no rank',
M_PleaseSelectOne: 'Please Select One',
M_UnGenerate: 'Unique Character no generate',
- M_DisableExtendTalent: 'Celebrity mode can\'t extends talent',
+ M_DisableExtendTalent: "Celebrity mode can't extends talent",
+ M_SponsorThanks: 'Thanks for your support',
F_RemakeTimes: 'Remake {0} Times',
F_AchievementCount: 'Achievement {0}',
@@ -160,5 +160,5 @@ export default ({
F_TalentSelectNotComplect: 'Please select {0} talent',
F_PropertyPointLeft: 'You have left {0} property point',
F_TalentReplace: 'Talent replace [{source.name}] -> [{target.name}]',
- F_PropertyStr: 'CHR{CHR} INT{INT} STR{STR} MNY{MNY}'
-});
\ No newline at end of file
+ F_PropertyStr: 'CHR{CHR} INT{INT} STR{STR} MNY{MNY}',
+}
diff --git a/src/i18n/zh-cn.js b/src/i18n/zh-cn.js
index c37a4c4..d2cd2ad 100644
--- a/src/i18n/zh-cn.js
+++ b/src/i18n/zh-cn.js
@@ -1,4 +1,4 @@
-export default ({
+export default {
UI_Next: '下一步',
UI_Back: '返回',
UI_Skip: '跳过',
@@ -152,6 +152,7 @@ export default ({
M_PleaseSelectOne: '请选择一个名人',
M_UnGenerate: '独一无二的我还没有生成',
M_DisableExtendTalent: '名人模式不能继承天赋',
+ M_SponsorThanks: '感谢支持',
F_RemakeTimes: '已重开{0}次',
F_AchievementCount: '成就达成{0}个',
@@ -161,5 +162,5 @@ export default ({
F_TalentSelectNotComplect: '要选满{0}个天赋',
F_PropertyPointLeft: '你还有 {0} 属性点没有分配完',
F_TalentReplace: '天赋替换【{source.name}】->【{target.name}】',
- F_PropertyStr: '颜值{CHR} 智力{INT} 体质{STR} 家境{MNY}'
-});
\ No newline at end of file
+ F_PropertyStr: '颜值{CHR} 智力{INT} 体质{STR} 家境{MNY}',
+}
diff --git a/src/index.js b/src/index.js
index a99125e..9a22adc 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,74 +1,65 @@
-import App from './app.js';
-import Life from './modules/life.js';
+import App from './app.js'
+import Life from './modules/life.js'
-globalThis.$$eventMap = new Map();
+if (!globalThis.$channel) globalThis.$channel = {}
+globalThis.$$eventMap = new Map()
globalThis.$$event = (tag, data) => {
- const listener = $$eventMap.get(tag);
- if(listener) listener.forEach(fn=>fn(data));
+ const listener = $$eventMap.get(tag)
+ if (listener) listener.forEach(fn => fn(data))
}
globalThis.$$on = (tag, fn) => {
- let listener = $$eventMap.get(tag);
- if(!listener) {
- listener = new Set();
- $$eventMap.set(tag, listener);
+ let listener = $$eventMap.get(tag)
+ if (!listener) {
+ listener = new Set()
+ $$eventMap.set(tag, listener)
}
- listener.add(fn);
+ listener.add(fn)
}
globalThis.$$off = (tag, fn) => {
- const listener = $$eventMap.get(tag);
- if(listener) listener.delete(fn);
+ const listener = $$eventMap.get(tag)
+ if (listener) listener.delete(fn)
}
globalThis.$$copy = async text => {
- const result = await navigator.permissions.query({ name: "clipboard-write" })
- if (result.state == "granted" || result.state == "prompt") {
+ const result = await navigator.permissions.query({ name: 'clipboard-write' })
+ if (result.state == 'granted' || result.state == 'prompt') {
navigator.clipboard.writeText(text)
- return true;
+ return true
}
- const input = document.createElement('input');
- input.setAttribute('style', 'opacity: 0;');
- document.body.appendChild(input);
- input.value = text;
- input.select();
- const r = document.execCommand("copy");
- document.body.removeChild(input);
- return r;
+ return false
}
-globalThis.$$read = async ()=>{
- const result = await navigator.permissions.query({ name: "clipboard-read" })
- if (result.state == "granted" || result.state == "prompt") {
- return await navigator.clipboard.readText();
+globalThis.$$read = async () => {
+ const result = await navigator.permissions.query({ name: 'clipboard-read' })
+ if (result.state == 'granted' || result.state == 'prompt') {
+ return await navigator.clipboard.readText()
}
- const input = document.createElement('input');
- input.setAttribute('style', 'opacity: 0;');
- document.body.appendChild(input);
- input.focus();
- const r = document.execCommand("paste");
- const text = input.value;
- document.body.removeChild(input);
- return r?text:r;
-};
+ return null
+}
-const core = new Life();
-const game = new App();
-globalThis.core = core;
-globalThis.game = game;
+const core = new Life()
+const game = new App()
+globalThis.core = core
+globalThis.game = game
-const query = {};
-location.search.substr(1).split('&').forEach(item => {
- const parts = item.split('=');
- query[parts[0]] = parts[1];
-});
+const query = {}
+location.search
+ .substring(1)
+ .split('&')
+ .forEach(item => {
+ const parts = item.split('=')
+ query[parts[0]] = parts[1]
+ })
core.config({
defaultPropertyPoints: 20, // default number of points for a property
talentSelectLimit: 3, // max number of talents that can be selected
propertyAllocateLimit: [0, 10], // scoop of properties that can be allocated,
defaultPropertys: { SPR: 5 }, // default properties
- talentConfig: { // config for talent
+ talentConfig: {
+ // config for talent
talentPullCount: 10, // number of talents to pull from the talent pool
- talentRate: { 1:100, 2:10, 3:1, total: 1000 }, // rate of talent pull
+ talentRate: { 1: 100, 2: 10, 3: 1, total: 1000 }, // rate of talent pull
additions: {
TMS: [
[ 10, { 2: 1 }],
@@ -83,78 +74,78 @@ core.config({
[ 50, { 2: 3 }],
[ 70, { 2: 4 }],
[100, { 2: 5 }],
- ]
+ ],
},
},
propertyConfig: { // config for property
judge: {
// type: [min, grade, judge]
RTLT: [
- [ 0, 0],
- [ 0.3, 1],
- [ 0.6, 2],
- [ 0.9, 3],
+ [0, 0],
+ [0.3, 1],
+ [0.6, 2],
+ [0.9, 3],
],
REVT: [
- [ 0, 0],
- [ 0.2, 1],
- [ 0.4, 2],
- [ 0.6, 3],
+ [0, 0],
+ [0.2, 1],
+ [0.4, 2],
+ [0.6, 3],
],
TMS: [
- [ 0, 0, 'UI_Remake_Times_Judge_Level_0'],
- [ 10, 1, 'UI_Remake_Times_Judge_Level_1'],
- [ 30, 1, 'UI_Remake_Times_Judge_Level_2'],
- [ 50, 2, 'UI_Remake_Times_Judge_Level_3'],
- [ 70, 2, 'UI_Remake_Times_Judge_Level_4'],
- [ 100, 3, 'UI_Remake_Times_Judge_Level_5'],
+ [ 0, 0, 'UI_Remake_Times_Judge_Level_0'],
+ [ 10, 1, 'UI_Remake_Times_Judge_Level_1'],
+ [ 30, 1, 'UI_Remake_Times_Judge_Level_2'],
+ [ 50, 2, 'UI_Remake_Times_Judge_Level_3'],
+ [ 70, 2, 'UI_Remake_Times_Judge_Level_4'],
+ [100, 3, 'UI_Remake_Times_Judge_Level_5'],
],
CACHV: [
- [ 0, 0, 'UI_Achievement_Count_Judge_Level_0'],
- [ 10, 1, 'UI_Achievement_Count_Judge_Level_1'],
- [ 30, 1, 'UI_Achievement_Count_Judge_Level_2'],
- [ 50, 2, 'UI_Achievement_Count_Judge_Level_3'],
- [ 70, 2, 'UI_Achievement_Count_Judge_Level_4'],
- [ 100, 3, 'UI_Achievement_Count_Judge_Level_5'],
+ [ 0, 0, 'UI_Achievement_Count_Judge_Level_0'],
+ [ 10, 1, 'UI_Achievement_Count_Judge_Level_1'],
+ [ 30, 1, 'UI_Achievement_Count_Judge_Level_2'],
+ [ 50, 2, 'UI_Achievement_Count_Judge_Level_3'],
+ [ 70, 2, 'UI_Achievement_Count_Judge_Level_4'],
+ [100, 3, 'UI_Achievement_Count_Judge_Level_5'],
],
HCHR: [
- [ 0, 0, 'UI_Judge_Level_0'],
- [ 1, 0, 'UI_Judge_Level_1'],
- [ 2, 0, 'UI_Judge_Level_2'],
- [ 4, 0, 'UI_Judge_Level_3'],
- [ 7, 1, 'UI_Judge_Level_4'],
- [ 9, 2, 'UI_Judge_Level_5'],
- [ 11, 3, 'UI_Judge_Level_6'],
+ [ 0, 0, 'UI_Judge_Level_0'],
+ [ 1, 0, 'UI_Judge_Level_1'],
+ [ 2, 0, 'UI_Judge_Level_2'],
+ [ 4, 0, 'UI_Judge_Level_3'],
+ [ 7, 1, 'UI_Judge_Level_4'],
+ [ 9, 2, 'UI_Judge_Level_5'],
+ [11, 3, 'UI_Judge_Level_6'],
],
HMNY: [
- [ 0, 0, 'UI_Judge_Level_0'],
- [ 1, 0, 'UI_Judge_Level_1'],
- [ 2, 0, 'UI_Judge_Level_2'],
- [ 4, 0, 'UI_Judge_Level_3'],
- [ 7, 1, 'UI_Judge_Level_4'],
- [ 9, 2, 'UI_Judge_Level_5'],
- [ 11, 3, 'UI_Judge_Level_6'],
+ [ 0, 0, 'UI_Judge_Level_0'],
+ [ 1, 0, 'UI_Judge_Level_1'],
+ [ 2, 0, 'UI_Judge_Level_2'],
+ [ 4, 0, 'UI_Judge_Level_3'],
+ [ 7, 1, 'UI_Judge_Level_4'],
+ [ 9, 2, 'UI_Judge_Level_5'],
+ [11, 3, 'UI_Judge_Level_6'],
],
HSPR: [
- [ 0, 0, 'UI_Spirit_Judge_Level_0'],
- [ 1, 0, 'UI_Spirit_Judge_Level_1'],
- [ 2, 0, 'UI_Spirit_Judge_Level_2'],
- [ 4, 0, 'UI_Spirit_Judge_Level_3'],
- [ 7, 1, 'UI_Spirit_Judge_Level_4'],
- [ 9, 2, 'UI_Spirit_Judge_Level_5'],
- [ 11, 3, 'UI_Spirit_Judge_Level_6'],
+ [ 0, 0, 'UI_Spirit_Judge_Level_0'],
+ [ 1, 0, 'UI_Spirit_Judge_Level_1'],
+ [ 2, 0, 'UI_Spirit_Judge_Level_2'],
+ [ 4, 0, 'UI_Spirit_Judge_Level_3'],
+ [ 7, 1, 'UI_Spirit_Judge_Level_4'],
+ [ 9, 2, 'UI_Spirit_Judge_Level_5'],
+ [11, 3, 'UI_Spirit_Judge_Level_6'],
],
HINT: [
- [ 0, 0, 'UI_Judge_Level_0'],
- [ 1, 0, 'UI_Judge_Level_1'],
- [ 2, 0, 'UI_Judge_Level_2'],
- [ 4, 0, 'UI_Judge_Level_3'],
- [ 7, 1, 'UI_Judge_Level_4'],
- [ 9, 2, 'UI_Judge_Level_5'],
- [ 11, 3, 'UI_Judge_Level_6'],
- [ 21, 3, 'UI_Intelligence_Judge_Level_7'],
- [ 131, 3, 'UI_Intelligence_Judge_Level_8'],
- [ 501, 3, 'UI_Intelligence_Judge_Level_9'],
+ [ 0, 0, 'UI_Judge_Level_0'],
+ [ 1, 0, 'UI_Judge_Level_1'],
+ [ 2, 0, 'UI_Judge_Level_2'],
+ [ 4, 0, 'UI_Judge_Level_3'],
+ [ 7, 1, 'UI_Judge_Level_4'],
+ [ 9, 2, 'UI_Judge_Level_5'],
+ [ 11, 3, 'UI_Judge_Level_6'],
+ [ 21, 3, 'UI_Intelligence_Judge_Level_7'],
+ [131, 3, 'UI_Intelligence_Judge_Level_8'],
+ [501, 3, 'UI_Intelligence_Judge_Level_9'],
],
HSTR: [
[ 0, 0, 'UI_Judge_Level_0'],
@@ -171,28 +162,28 @@ core.config({
[2001, 3, 'UI_Strength_Judge_Level_11'],
],
HAGE: [
- [ 0, 0, 'UI_AGE_Judge_Level_0'],
- [ 1, 0, 'UI_AGE_Judge_Level_1'],
- [ 10, 0, 'UI_AGE_Judge_Level_2'],
- [ 18, 0, 'UI_AGE_Judge_Level_3'],
- [ 40, 0, 'UI_AGE_Judge_Level_4'],
- [ 60, 1, 'UI_AGE_Judge_Level_5'],
- [ 70, 1, 'UI_AGE_Judge_Level_6'],
- [ 80, 2, 'UI_AGE_Judge_Level_7'],
- [ 90, 2, 'UI_AGE_Judge_Level_8'],
- [ 95, 3, 'UI_AGE_Judge_Level_9'],
- [ 100, 3, 'UI_AGE_Judge_Level_10'],
- [ 500, 3, 'UI_AGE_Judge_Level_11'],
+ [ 0, 0, 'UI_AGE_Judge_Level_0'],
+ [ 1, 0, 'UI_AGE_Judge_Level_1'],
+ [ 10, 0, 'UI_AGE_Judge_Level_2'],
+ [ 18, 0, 'UI_AGE_Judge_Level_3'],
+ [ 40, 0, 'UI_AGE_Judge_Level_4'],
+ [ 60, 1, 'UI_AGE_Judge_Level_5'],
+ [ 70, 1, 'UI_AGE_Judge_Level_6'],
+ [ 80, 2, 'UI_AGE_Judge_Level_7'],
+ [ 90, 2, 'UI_AGE_Judge_Level_8'],
+ [ 95, 3, 'UI_AGE_Judge_Level_9'],
+ [100, 3, 'UI_AGE_Judge_Level_10'],
+ [500, 3, 'UI_AGE_Judge_Level_11'],
],
SUM: [
- [ 0, 0, 'UI_Judge_Level_0'],
- [ 41, 0, 'UI_Judge_Level_1'],
- [ 50, 0, 'UI_Judge_Level_2'],
- [ 60, 0, 'UI_Judge_Level_3'],
- [ 80, 1, 'UI_Judge_Level_4'],
- [ 100, 2, 'UI_Judge_Level_5'],
- [ 110, 3, 'UI_Judge_Level_6'],
- [ 120, 3, 'UI_Judge_Level_7'],
+ [ 0, 0, 'UI_Judge_Level_0'],
+ [ 41, 0, 'UI_Judge_Level_1'],
+ [ 50, 0, 'UI_Judge_Level_2'],
+ [ 60, 0, 'UI_Judge_Level_3'],
+ [ 80, 1, 'UI_Judge_Level_4'],
+ [100, 2, 'UI_Judge_Level_5'],
+ [110, 3, 'UI_Judge_Level_6'],
+ [120, 3, 'UI_Judge_Level_7'],
],
},
},
@@ -213,12 +204,12 @@ core.config({
[10, 1],
],
talentWeight: [
- [ 1, 1],
- [ 2, 2],
- [ 3, 3],
- [ 4, 2],
- [ 5, 1],
+ [1, 1],
+ [2, 2],
+ [3, 3],
+ [4, 2],
+ [5, 1],
],
},
-});
-game.start(query);
+})
+game.start(query, globalThis.$channel.features ?? [])
diff --git a/src/ui/laya.patch.js b/src/ui/laya.patch.js
index ebdb92d..82f1552 100644
--- a/src/ui/laya.patch.js
+++ b/src/ui/laya.patch.js
@@ -1,8 +1,8 @@
// 滚动条太灵敏
const SCROLL_START_DISTANCE = 30;
Laya.ScrollBar.prototype.loop=function(){
- var mouseY=Laya.stage.mouseY;
- var mouseX=Laya.stage.mouseX;
+ let mouseY=Laya.stage.mouseY;
+ let mouseX=Laya.stage.mouseX;
this._lastOffset=this.isVertical ? (mouseY-this._lastPoint.y):(mouseX-this._lastPoint.x);
if (this._clickOnly){
if (Math.abs(this._lastOffset *(this.isVertical ? Laya.stage._canvasTransform.getScaleY():Laya.stage._canvasTransform.getScaleX()))> SCROLL_START_DISTANCE){
diff --git a/src/ui/pluginFunction.js b/src/ui/pluginFunction.js
index 5504cfb..4ebdc5a 100644
--- a/src/ui/pluginFunction.js
+++ b/src/ui/pluginFunction.js
@@ -12,7 +12,7 @@ plugin.extractComponents = function(uiView, componentNames) {
uiView.child.splice(i, 1);
continue;
}
- deepSearch(child, componentNames, components);
+ deepSearch(child, componentNames);
}
};
deepSearch(uiView, componentNames);
diff --git a/src/ui/runtime.js b/src/ui/runtime.js
index dd1a68d..b26b146 100644
--- a/src/ui/runtime.js
+++ b/src/ui/runtime.js
@@ -3,16 +3,12 @@ Laya.runtime = {};
runtime.ColorFilterItem =
class ColorFilterItem extends Laya.Image {
- constructor() {
- super();
- }
-
#hexToRgba = (hex) => {
const rgba = [];
hex = hex.replace('#', '');
- hex = hex.match(new RegExp('(.{2})(.{2})(.{2})(.{2})', 'i'));
+ hex = hex.match(/(.{2})(.{2})(.{2})(.{2})/i);
hex.forEach((item, index) => {
- rgba[index] = parseInt(item, 16);
+ rgba[index] = Number.parseInt(item, 16);
});
rgba.shift();
return rgba;
@@ -47,26 +43,9 @@ class ColorFilterItem extends Laya.Image {
}
}
}
-runtime.UIBase =
-class UIBase extends Laya.View {
- constructor() {
- super();
- }
-}
-
-runtime.ViewBase =
-class ViewBase extends runtime.UIBase {
- constructor() {
- super();
- }
-}
-
-runtime.DialogBase =
-class DialogBase extends runtime.UIBase {
- constructor() {
- super();
- }
-}
+runtime.UIBase = class UIBase extends Laya.View {}
+runtime.ViewBase = class ViewBase extends runtime.UIBase {}
+runtime.DialogBase = class DialogBase extends runtime.UIBase {}
runtime.ScaleButton =
class ScaleButton extends Laya.Button {
@@ -156,12 +135,12 @@ class RGBAItem {
}
#hex(v) {
- v = parseInt(v).toString(16);
+ v = Number.parseInt(v).toString(16);
return v.length == 1 ? '0' + v : v;
}
#dec(v) {
- return parseInt(v, 16);
+ return Number.parseInt(v, 16);
}
get hex() {
@@ -303,7 +282,7 @@ class ColorfulBox extends Laya.Box {
const tween = (colorItem, target, last) => {
Laya.Tween.clearAll(colorItem);
const distance = colorItem.distance(target, last);
- if(!isFinite(distance)) {
+ if(!Number.isFinite(distance)) {
colorItem.hex = target;
return;
}
@@ -544,10 +523,6 @@ class BlankBox extends Laya.Box {
runtime.ColorAgentLabel =
class ColorAgentLabel extends Laya.Label {
- constructor(...args) {
- super(...args);
- }
-
get #brothers() {
const brothers = [];
if(!this.parent) return brothers;
diff --git a/src/ui/themes/cyber/main.js b/src/ui/themes/cyber/main.js
index 8026bde..d326bd5 100644
--- a/src/ui/themes/cyber/main.js
+++ b/src/ui/themes/cyber/main.js
@@ -1,38 +1,43 @@
export default class CyberMain extends ui.view.CyberTheme.CyberMainUI {
constructor() {
- super();
- this.btnRemake.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.MODE));
- this.btnAchievement.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.ACHIEVEMENT));
- this.btnThanks.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.THANKS));
- this.btnGithub.on(Laya.Event.CLICK, this, goto, ['github']);
- this.btnDiscord.on(Laya.Event.CLICK, this, goto, ['discord']);
- this.btnThemes.on(Laya.Event.CLICK, this, ()=>$ui.showDialog(UI.pages.THEMES));
- this.btnSaveLoad.on(Laya.Event.CLICK, this, ()=>$ui.showDialog(UI.pages.SAVELOAD));
+ super()
+ this.btnRemake.on(Laya.Event.CLICK, this, () => $ui.switchView(UI.pages.MODE))
+ this.btnAchievement.on(Laya.Event.CLICK, this, () => $ui.switchView(UI.pages.ACHIEVEMENT))
+ this.btnThanks.on(Laya.Event.CLICK, this, () => $ui.switchView(UI.pages.THANKS))
+ this.btnGithub.on(Laya.Event.CLICK, this, goto, ['github'])
+ this.btnDiscord.on(Laya.Event.CLICK, this, goto, ['discord'])
+ this.btnThemes.on(Laya.Event.CLICK, this, () => $ui.showDialog(UI.pages.THEMES))
+ this.btnSaveLoad.on(Laya.Event.CLICK, this, () => $ui.showDialog(UI.pages.SAVELOAD))
this.on(Laya.Event.RESIZE, this, () => {
const scale = Math.max(
this.width / this.imgBg.width,
- this.height / this.imgBg.height
- );
- this.imgBg.scale(scale, scale);
- });
+ this.height / this.imgBg.height,
+ )
+ this.imgBg.scale(scale, scale)
+ })
}
static load() {
return [
- "fonts/方正像素12.ttf",
- "images/atlas/images/accessories.atlas",
- "images/atlas/images/border.atlas",
- "images/atlas/images/button.atlas",
- "images/atlas/images/icons.atlas",
- "images/atlas/images/progress.atlas",
- "images/atlas/images/slider.atlas",
+ 'fonts/方正像素12.ttf',
+ 'images/atlas/images/accessories.atlas',
+ 'images/atlas/images/border.atlas',
+ 'images/atlas/images/button.atlas',
+ 'images/atlas/images/icons.atlas',
+ 'images/atlas/images/progress.atlas',
+ 'images/atlas/images/slider.atlas',
]
}
init() {
- this.banner.visible =
- this.btnDiscord.visible =
- this.btnAchievement.visible =
- this.btnThanks.visible = !!core.times;
+ const leastOnce = !!core.times
+ this.banner.visible = leastOnce
+ this.btnAchievement.visible = leastOnce
+ this.btnThanks.visible = leastOnce
+
+ const disabled = globalThis.$channel?.disabled || {}
+ this.btnDiscord.visible = leastOnce && !disabled.discord
+ this.btnGithub.visible = !disabled.github
+ this.btnSaveLoad.visible = !disabled.saveload
}
-}
\ No newline at end of file
+}
diff --git a/src/ui/themes/default/main.js b/src/ui/themes/default/main.js
index c86eb32..1549d5c 100644
--- a/src/ui/themes/default/main.js
+++ b/src/ui/themes/default/main.js
@@ -1,28 +1,32 @@
export default class Main extends ui.view.DefaultTheme.MainUI {
constructor() {
- super();
- this.btnRemake.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.MODE));
- this.btnAchievement.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.ACHIEVEMENT));
- this.btnThanks.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.THANKS));
- this.btnGithub.on(Laya.Event.CLICK, this, goto, ['github']);
- this.btnDiscord.on(Laya.Event.CLICK, this, goto, ['discord']);
- this.btnThemes.on(Laya.Event.CLICK, this, ()=>$ui.showDialog(UI.pages.THEMES));
- this.btnSaveLoad.on(Laya.Event.CLICK, this, ()=>$ui.showDialog(UI.pages.SAVELOAD));
+ super()
+ this.btnRemake.on(Laya.Event.CLICK, this, () => $ui.switchView(UI.pages.MODE))
+ this.btnAchievement.on(Laya.Event.CLICK, this, () => $ui.switchView(UI.pages.ACHIEVEMENT))
+ this.btnThanks.on(Laya.Event.CLICK, this, () => $ui.switchView(UI.pages.THANKS))
+ this.btnGithub.on(Laya.Event.CLICK, this, goto, ['github'])
+ this.btnDiscord.on(Laya.Event.CLICK, this, goto, ['discord'])
+ this.btnThemes.on(Laya.Event.CLICK, this, () => $ui.showDialog(UI.pages.THEMES))
+ this.btnSaveLoad.on(Laya.Event.CLICK, this, () => $ui.showDialog(UI.pages.SAVELOAD))
}
static load() {
- return [
- "images/atlas/images/icons.atlas",
- ]
+ return ['images/atlas/images/icons.atlas']
}
init() {
- this.banner.visible =
- this.btnDiscord.visible =
- this.btnAchievement.visible =
- this.btnThanks.visible = !!core.times;
- const text = this.labSubTitle.text;
- this.labSubTitle.text = ' ';
- this.labSubTitle.text = text;
+ const text = this.labSubTitle.text
+ this.labSubTitle.text = ' '
+ this.labSubTitle.text = text
+
+ const leastOnce = !!core.times
+ this.banner.visible = leastOnce
+ this.btnAchievement.visible = leastOnce
+ this.btnThanks.visible = leastOnce
+
+ const disabled = globalThis.$channel?.disabled || {}
+ this.btnDiscord.visible = leastOnce && !disabled.discord
+ this.btnGithub.visible = !disabled.github
+ this.btnSaveLoad.visible = !disabled.saveload
}
-}
\ No newline at end of file
+}
diff --git a/src/ui/themes/default/thanks.js b/src/ui/themes/default/thanks.js
index 81dca13..307ee09 100644
--- a/src/ui/themes/default/thanks.js
+++ b/src/ui/themes/default/thanks.js
@@ -5,8 +5,13 @@ export default class Thanks extends ui.view.DefaultTheme.ThanksUI {
this.listSupports.renderHandler = Laya.Handler.create(this, this.renderSupport, null, false);
this.panelTopSupports.vScrollBar.elasticDistance = 150;
this.listSupports.scrollBar.elasticDistance = 150;
- this.btnAFD.on(Laya.Event.CLICK, this, goto, ['sponsor_afd']);
- this.btnDDF.on(Laya.Event.CLICK, this, goto, ['sponsor_ddf']);
+ if (globalThis.$channel?.disabled?.sponsor) {
+ this.btnAFD.on(Laya.Event.CLICK, this, $$event, ['message', ['M_SponsorThanks']]);
+ } else {
+ this.btnAFD.on(Laya.Event.CLICK, this, goto, ['sponsor_afd']);
+ // this.btnDDF.on(Laya.Event.CLICK, this, goto, ['sponsor_ddf']);
+ }
+ this.btnDDF.on(Laya.Event.CLICK, this, $$event, ['message', ['M_SponsorThanks']]);
}
static #createComponent = Laya.plugin.extractComponents(Thanks.uiView, ['boxTopSupport']);
diff --git a/src/ui/themes/saveload.js b/src/ui/themes/saveload.js
index 87f7879..cf4ca7e 100644
--- a/src/ui/themes/saveload.js
+++ b/src/ui/themes/saveload.js
@@ -1,78 +1,77 @@
export default class SaveLoad extends ui.view.SaveLoadUI {
constructor() {
- super();
- this.btnClose.on(Laya.Event.CLICK, this, async ()=>{
- await this.close();
- $ui.switchView(UI.pages.MAIN);
- });
- this.btnRead.on(Laya.Event.CLICK, this, async ()=>{
- const result = await $$copy(this.input.text = this.data);
- $$event('message', [result? 'UI_CopySuccess': 'UI_CopyFailed']);
- });
- this.btnWrite.on(Laya.Event.CLICK, this, async ()=>{
- const text = await $$read();
- if(text == false) {
+ super()
+ this.btnClose.on(Laya.Event.CLICK, this, async () => {
+ await this.close()
+ $ui.switchView(UI.pages.MAIN)
+ })
+ this.btnRead.on(Laya.Event.CLICK, this, async () => {
+ this.input.text = this.data
+ const result = await $$copy(this.data)
+ $$event('message', [result ? 'UI_CopySuccess' : 'UI_CopyFailed'])
+ })
+ this.btnWrite.on(Laya.Event.CLICK, this, async () => {
+ const text = await $$read()
+ if (text == null) {
this.data = [
this.input.text,
'UI_PasteFailedDecodeSuccess',
- 'UI_PasteFailedDecodeFailed'
- ];
+ 'UI_PasteFailedDecodeFailed',
+ ]
} else {
- this.input.text = text;
+ this.input.text = text
this.data = [
text,
'UI_PasteSuccessDecodeSuccess',
- 'UI_PasteSuccessDecodeFailed'
- ];
+ 'UI_PasteSuccessDecodeFailed',
+ ]
}
- });
-
- this.btnSave.on(Laya.Event.CLICK, this, ()=>{
- let blob = new Blob([this.data], { type: 'application/json' });
- const slice = blob.slice || blob.webkitSlice || blob.mozSlice;
- blob = slice.call(blob, 0, blob.size, 'application/octet-stream');
- const a = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
- a.href = URL.createObjectURL(blob);
- a.download = `Remake_save_${new Date().toISOString().replace(':','.')}.json`;
-
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- URL.revokeObjectURL(a.href);
- });
- this.btnLoad.on(Laya.Event.CLICK, this, ()=>{
- const file = document.createElement('input');
- file.setAttribute('type', 'file');
- file.setAttribute('name', 'file');
- file.setAttribute('accept', 'application/json');
- file.setAttribute('style', 'display: none;');
- document.body.appendChild(file);
- file.click();
- file.onchange = (e)=>{
- const file = e.target.files[0];
- if(!file) return;
- const reader = new FileReader();
- reader.onload = () => this.data = [reader.result];
- reader.readAsText(file);
- document.body.removeChild(file);
- };
- });
- this.input.on(Laya.Event.MOUSE_DOWN, this, ()=>{
- this.input.setSelection(0, this.input.text.length);
})
- this.btnBackup.on(Laya.Event.CLICK, this, ()=>{
- const board = document.createElement("div");
- document.body.appendChild(board);
+ this.btnSave.on(Laya.Event.CLICK, this, () => {
+ let blob = new Blob([this.data], { type: 'application/json' })
+ const slice = blob.slice || blob.webkitSlice || blob.mozSlice
+ blob = slice.call(blob, 0, blob.size, 'application/octet-stream')
+ const a = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
+ a.href = URL.createObjectURL(blob)
+ a.download = `Remake_save_${new Date().toISOString().replace(':', '.')}.json`
+
+ document.body.appendChild(a)
+ a.click()
+ a.remove()
+ URL.revokeObjectURL(a.href)
+ })
+ this.btnLoad.on(Laya.Event.CLICK, this, () => {
+ const file = document.createElement('input')
+ file.setAttribute('type', 'file')
+ file.setAttribute('name', 'file')
+ file.setAttribute('accept', 'application/json')
+ file.setAttribute('style', 'display: none;')
+ document.body.appendChild(file)
+ file.click()
+ file.onchange = async e => {
+ const f = e.target.files[0]
+ if (!f) return
+ this.data = [await f.text()]
+ file.remove()
+ }
+ })
+ this.input.on(Laya.Event.MOUSE_DOWN, this, () => {
+ this.input.setSelection(0, this.input.text.length)
+ })
+
+ this.btnBackup.on(Laya.Event.CLICK, this, () => {
+ const board = document.createElement('div')
+ document.body.appendChild(board)
board.style = `
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
- opacity: 0.95`;
+ opacity: 0.95`
- const bg = document.createElement("div");
+ const bg = document.createElement('div')
bg.style = `
position: absolute;
top: 0;
@@ -80,18 +79,14 @@ export default class SaveLoad extends ui.view.SaveLoadUI {
right: 0;
bottom: 0;
background: #fff;
- opacity: 0.95`;
- document.body.appendChild(board);
- board.appendChild(bg);
- const textarea = document.createElement("textarea");
+ opacity: 0.95`
+ document.body.appendChild(board)
+ board.appendChild(bg)
+ const textarea = document.createElement('textarea')
textarea.style = `position: absolute; width: ${window.innerWidth}px; height: ${window.innerHeight}px;`
- textarea.value = JSON.stringify(
- JSON.parse(this.data),
- null,
- 4
- );
- board.appendChild(textarea);
- const close = document.createElement("div");
+ textarea.value = JSON.stringify(JSON.parse(this.data), null, 4)
+ board.appendChild(textarea)
+ const close = document.createElement('div')
close.style = `
position: absolute;
top: 0;
@@ -103,12 +98,12 @@ export default class SaveLoad extends ui.view.SaveLoadUI {
padding: 0;
line-height: 100px;
color: white;
- opacity: 0.7`;
- close.innerHTML = '×';
- board.appendChild(close);
- close.onclick = ()=>board.remove();
+ opacity: 0.7`
+ close.innerHTML = '×'
+ board.appendChild(close)
+ close.onclick = () => board.remove()
- const load = document.createElement("div");
+ const load = document.createElement('div')
load.style = `
position: absolute;
bottom: 0;
@@ -120,43 +115,41 @@ export default class SaveLoad extends ui.view.SaveLoadUI {
padding: 0;
line-height: 50px;
color: white;
- opacity: 0.7`;
- load.innerHTML = 'LOAD
读取';
- board.appendChild(load);
- load.onclick = ()=>this.data = [textarea.value, '成功/success', '失败/failed', true];
- });
+ opacity: 0.7`
+ load.innerHTML = 'LOAD
读取'
+ board.appendChild(load)
+ load.onclick = () => (this.data = [textarea.value, '成功/success', '失败/failed', true])
+ })
}
static load() {
- return ["images/atlas/images/radio.atlas"];
+ return ['images/atlas/images/radio.atlas']
}
init() {
- this.input.text = this.data;
+ this.input.text = this.data
}
get data() {
- const data = {};
- Object
- .keys(localStorage)
- .filter(v=>v.substr(0,4)!='goog')
- .forEach(key=>data[key] = localStorage[key]);
- return JSON.stringify(data);
+ const data = {}
+ Object.keys(localStorage)
+ .filter(v => !v.startsWith('goog'))
+ .forEach(key => (data[key] = localStorage[key]))
+ return JSON.stringify(data)
}
set data([v, success = 'UI_LoadSuccess', failed = 'UI_LoadFailed', altMsg]) {
try {
- const data = JSON.parse(v);
- for(const key in data)
- localStorage.setItem(key, data[key]);
- if(altMsg) alert(success);
- else $$event('message', [success]);
- $ui.theme = $ui.theme;
- this.btnClose.event(Laya.Event.CLICK);
+ const data = JSON.parse(v)
+ for (const key in data) localStorage.setItem(key, data[key])
+ if (altMsg) alert(success)
+ else $$event('message', [success])
+ $ui.theme = $ui.theme ?? null
+ this.btnClose.event(Laya.Event.CLICK)
} catch (e) {
- console.error(e);
- if(altMsg) alert(`${failed}\n${e}`);
- else $$event('message', [failed]);
+ console.error(e)
+ if (altMsg) alert(`${failed}\n${e}`)
+ else $$event('message', [failed])
}
}
-}
\ No newline at end of file
+}
diff --git a/src/ui/uiManager.js b/src/ui/uiManager.js
index 80894cb..47455bb 100644
--- a/src/ui/uiManager.js
+++ b/src/ui/uiManager.js
@@ -34,7 +34,7 @@ export default class UIManager {
this.#dialogMask.graphics.drawRect(0, 0, 5000, 5000, '#000000')
this.#dialogMask.alpha = 0.4
this.#dialogMask.on(Laya.Event.CLICK, this, () => {
- this.#dialogStack[this.#dialogStack.length - 1]?.close?.()
+ this.#dialogStack.at(-1)?.close?.()
})
}
@@ -86,7 +86,7 @@ export default class UIManager {
args,
actions?.load,
viewName,
- 'pages'
+ 'pages',
)
view.top = view.bottom = view.left = view.right = 0
@@ -115,7 +115,7 @@ export default class UIManager {
if (this.#loading) {
timeout = setTimeout(
() => this.#stage.addChild(this.#loading),
- 3000
+ 3000,
)
}
const onProgress = this.#loading?.onProgress
@@ -128,7 +128,7 @@ export default class UIManager {
? this.scanResource(ViewClass.uiView)
: []
if (preload) {
- preload = [].concat(preload).concat(scanedResourceList)
+ preload = preload.concat(scanedResourceList)
} else {
preload = scanedResourceList
}
@@ -162,19 +162,19 @@ export default class UIManager {
async loadRes(resourceList, preload, onProgress) {
const cnt = (resourceList?.length || 0) + (preload?.length || 0)
- if (resourceList && resourceList.length) {
+ if (resourceList?.length) {
const s = resourceList.length / cnt
await Laya.promises.loader.load(
resourceList,
- Laya.Handler.create(null, prg => onProgress?.(prg * s))
+ Laya.Handler.create(null, prg => onProgress?.(prg * s)),
)
}
- if (preload && preload.length) {
+ if (preload?.length) {
const s = 1 - preload.length / cnt
const l = preload.length / cnt
await Laya.promises.loader.load(
preload,
- Laya.Handler.create(null, prg => onProgress?.(prg * l + s))
+ Laya.Handler.create(null, prg => onProgress?.(prg * l + s)),
)
}
}
@@ -202,7 +202,7 @@ export default class UIManager {
args,
actions?.load,
dialogName,
- 'pages'
+ 'pages',
)
const index = this.#dialogStack.indexOf(dialog)
@@ -223,7 +223,7 @@ export default class UIManager {
dialog,
{ scaleX: 1, scaleY: 1 },
300,
- Laya.Ease.backOut
+ Laya.Ease.backOut,
)
})
await open(dialog)
@@ -237,7 +237,7 @@ export default class UIManager {
dialog,
{ scaleX: 0, scaleY: 0 },
300,
- Laya.Ease.strongIn
+ Laya.Ease.strongIn,
)
}
const index = this.#dialogStack.indexOf(dialog)
@@ -255,7 +255,7 @@ export default class UIManager {
const popup = await this.getView(className, args, null, type, 'popups')
this.#popupLayer.addChild(popup)
await popup.popup(args, this.#popupLayer)
- this.#popupLayer.removeChild(popup)
+ popup.removeSelf()
}
clearAllDialog() {
@@ -266,7 +266,7 @@ export default class UIManager {
#config(view, key, type) {
const config = this.#configs?.[type]?.[key]
if (!config) return
- if (view.config && view.config(config)) return
+ if (view.config?.(config)) return
const applyConfig = (target, config) => {
if (!target) return
if (typeof config == 'string') {
@@ -278,7 +278,7 @@ export default class UIManager {
if (config.names)
for (const name in config.names)
this.#deepGetChildsByName(view, name).forEach(child =>
- applyConfig(child, config.names[name])
+ applyConfig(child, config.names[name]),
)
if (config.vars)
@@ -288,7 +288,7 @@ export default class UIManager {
#deepGetChildsByName(parent, name) {
const list = []
- if (!parent || !parent._childs) return list
+ if (!parent?._childs) return list
for (const child of parent._childs) {
if (child.name == name) list.push(child)
@@ -311,7 +311,7 @@ export default class UIManager {
}
#subSkin(skin, type) {
- if (!skin || !skin.replace(/\s/g, '')) return []
+ if (!skin?.replace(/\s/g, '')) return []
switch (type) {
case 'ProgressBar':
return [skin, ...this.#progressBarSkin(skin)]
@@ -340,21 +340,14 @@ export default class UIManager {
scanResource(uiView) {
if (!uiView) return []
- const resourceList = []
-
- resourceList.push(...this.#subSkin(uiView.props?.skin, uiView.type))
- resourceList.push(
- ...this.#subSkin(uiView.props?.hScrollBarSkin, 'ScrollBar')
- )
- resourceList.push(
- ...this.#subSkin(uiView.props?.vScrollBarSkin, 'ScrollBar')
- )
-
- uiView.child?.forEach(child => {
- resourceList.push(...this.scanResource(child))
- })
-
- return resourceList
+ return [
+ this.#subSkin(uiView.props?.skin, uiView.type),
+ this.#subSkin(uiView.props?.hScrollBarSkin, 'ScrollBar'),
+ this.#subSkin(uiView.props?.vScrollBarSkin, 'ScrollBar'),
+ uiView.child?.flatMap(child => this.scanResource(child)),
+ ]
+ .flat()
+ .filter(item => !!item)
}
get currentView() {
@@ -362,7 +355,7 @@ export default class UIManager {
}
get currentDialog() {
- return this.#dialogStack[this.#dialogStack.length - 1]
+ return this.#dialogStack.at(-1)
}
get theme() {