Files
lifeRestart/src/app.js
T
2026-08-16 20:06:16 +08:00

177 lines
5.4 KiB
JavaScript

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'
globalThis.UIManager = globalThis.UI = UIManager
globalThis.$_ = utils
globalThis.goto = async tag => {
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
}
try {
if (Laya.Browser.onIOS) {
window.location.href = url
} else {
window.open(url, '_blank')
}
} catch (error) {
console.error(error)
}
}
class App {
name = 'lifeRestart'
version = '2.1.0'
constructor() {
console.log(`${this.name} ${this.version}`)
}
#language
static languages = {
'zh-cn': 'zh-cn',
'en-us': 'en-us',
}
#initLaya() {
/**
*...特殊的字符,如泰文,必须重新实现这个类
*/
//class laya.webgl.text.CharSegment
class CharSegment {
_sourceStr = null
constructor() {}
textToSpit(str) {
this._sourceStr = str
const texLen = str.length
let idx = -1
this._words = []
while (++idx < texLen) {
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)
}
}
}
getChar(i) {
return this._words
}
getCharCode(i) {
return this._words[i].codePointAt(0)
}
length() {
return this._words.length
}
}
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.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)
}
get #fitScreen() {
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
if (screenRatio > designRatio) {
return [
Math.min((screenWidth * designHeight) / screenHeight, maxWidth),
designHeight,
]
} else {
return [
designWidth,
Math.min((screenHeight * designWidth) / screenWidth, maxHeight),
]
}
}
async 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
default:
this.#language = App.languages['zh-cn']
break
}
globalThis.$lang =
Laya.Text.langPacks =
(await import(`./i18n/${this.#language}.js`)).default
}
resigterEvent() {
$$on('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')
} else {
message = $_.format($lang[message], ...args)
}
$ui.popup(UI.popups.MESSAGE, { message })
})
}
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'
}
$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)
for (const { feature, options } of features) {
const f = await import(`./features/${feature}.js`)
await f.default(options)
}
}
}
export default App