Merge pull request #755 from nofficalfs/Dev-pref-divide
Divide more files.
This commit is contained in:
commit
a162629269
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
const module = import('../noname.js');
|
||||
|
||||
module.then(({ ai, game, get, lib, _status, ui, boot }) => {
|
||||
const coreAndVersion = get.coreInfo();
|
||||
const core = coreAndVersion[0], version = coreAndVersion[1];
|
||||
if (core === 'chrome' && !isNaN(version) && version < 77) {
|
||||
const tip = '检测到您的浏览器内核版本小于77,请及时升级浏览器或手机webview内核!';
|
||||
console.warn(tip);
|
||||
game.print(tip);
|
||||
const redirect_tip = '您使用的浏览器或无名杀客户端内核版本过低,将在未来的版本被废弃!\n点击“确认”以前往GitHub下载最新版无名杀客户端(可能需要科学上网)。';
|
||||
if (confirm(redirect_tip)) {
|
||||
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
|
||||
}
|
||||
}
|
||||
boot().then(lib.other.ignore);
|
||||
});
|
||||
*/
|
||||
|
||||
import { game, get, lib, boot } from "../noname.js"
|
||||
|
||||
const coreAndVersion = get.coreInfo();
|
||||
const core = coreAndVersion[0], version = coreAndVersion[1];
|
||||
if (core === 'chrome' && !isNaN(version) && version < 77) {
|
||||
const tip = '检测到您的浏览器内核版本小于77,请及时升级浏览器或手机webview内核!';
|
||||
console.warn(tip);
|
||||
game.print(tip);
|
||||
const redirect_tip = '您使用的浏览器或无名杀客户端内核版本过低,将在未来的版本被废弃!\n点击“确认”以前往GitHub下载最新版无名杀客户端(可能需要科学上网)。';
|
||||
if (confirm(redirect_tip)) {
|
||||
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
|
||||
}
|
||||
}
|
||||
boot().then(lib.other.ignore);
|
||||
|
58
game/game.js
58
game/game.js
|
@ -1,4 +1,5 @@
|
|||
"use strict";
|
||||
|
||||
new Promise(resolve => {
|
||||
// 客户端自带core.js的请注意跟进
|
||||
if ('__core-js_shared__' in window) resolve(null);
|
||||
|
@ -11,6 +12,8 @@ new Promise(resolve => {
|
|||
document.head.appendChild(coreJSBundle);
|
||||
}
|
||||
}).then(() => {
|
||||
const nonameInitialized = localStorage.getItem('noname_inited');
|
||||
const assetURL = typeof nonameInitialized != 'string' || nonameInitialized == 'nodejs' ? '' : nonameInitialized;
|
||||
const userAgent = navigator.userAgent.toLowerCase();
|
||||
|
||||
const exit = () => {
|
||||
|
@ -51,20 +54,47 @@ new Promise(resolve => {
|
|||
}
|
||||
window['b' + 'ann' + 'e' + 'dE' + 'x' + 'ten' + 's' + 'i' + 'o' + 'ns'] = ['\u4fa0\u4e49', '\u5168\u6559\u7a0b'];
|
||||
|
||||
const module = import('../noname.js');
|
||||
/**
|
||||
*
|
||||
* @returns {["firefox" | "chrome" | "safari" | "other", number]}
|
||||
*/
|
||||
function coreInfo() {
|
||||
const regex = /(firefox|chrome|safari)\/([\d.]+)/;
|
||||
let result;
|
||||
if (!(result = userAgent.match(regex))) return ["other", NaN];
|
||||
if (result[1] !== "safari") return [result[1], parseInt(result[2])];
|
||||
result = userAgent.match(/version\/([\d.]+).*safari/);
|
||||
// @ts-ignore
|
||||
return ["safari", parseInt(result[1])];
|
||||
}
|
||||
const [core, version] = coreInfo();
|
||||
const supportMap = {
|
||||
"firefox": 60,
|
||||
"chrome": 61,
|
||||
// 因为coreInfo不考虑子版本,故就强行只能以11运行
|
||||
"safari": 11
|
||||
}
|
||||
|
||||
module.then(({ ai, game, get, lib, _status, ui, boot }) => {
|
||||
const coreAndVersion = get.coreInfo();
|
||||
const core = coreAndVersion[0], version = coreAndVersion[1];
|
||||
if (core == 'chrome' && !isNaN(version) && version < 77) {
|
||||
const tip = '检测到您的浏览器内核版本小于77,请及时升级浏览器或手机webview内核!';
|
||||
console.warn(tip);
|
||||
game.print(tip);
|
||||
const redirect_tip = '您使用的浏览器或无名杀客户端内核版本过低,将在未来的版本被废弃!\n点击“确认”以前往GitHub下载最新版无名杀客户端(可能需要科学上网)。';
|
||||
if (confirm(redirect_tip)) {
|
||||
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
|
||||
}
|
||||
if (core in supportMap && supportMap[core] > version) {
|
||||
const tip = '检测到您的浏览器内核版本无法支持ES Module,请立即升级浏览器或手机webview内核!';
|
||||
console.error(tip);
|
||||
const redirect_tip = '您使用的浏览器或无名杀客户端内核版本过低,已经无法正常运行无名杀!\n点击“确认”以前往GitHub下载最新版无名杀客户端(可能需要科学上网)。\n稍后您的无名杀将自动退出(可能的话)';
|
||||
if (confirm(redirect_tip)) {
|
||||
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
|
||||
}
|
||||
boot();
|
||||
});
|
||||
exit()
|
||||
}
|
||||
else {
|
||||
const script = document.createElement('script')
|
||||
script.type = "module";
|
||||
script.src = `${assetURL}game/entry.js`
|
||||
script.async = true
|
||||
script.onerror = (event) => {
|
||||
console.error(event)
|
||||
const message = `您使用的浏览器或无名杀客户端加载内容失败!\n报错内容: \n${event}\n若该BUG不为您个人原因造成的,请及时反馈给无名杀开发组!`;
|
||||
alert(message);
|
||||
exit()
|
||||
}
|
||||
document.head.appendChild(script)
|
||||
}
|
||||
});
|
||||
|
|
|
@ -0,0 +1,207 @@
|
|||
import { Get as get } from '../get/index.js';
|
||||
import { Game as game } from '../game/index.js';
|
||||
import { status as _status } from '../status/index.js';
|
||||
import { UI as ui } from '../ui/index.js';
|
||||
import { Library as lib } from '../library/index.js';
|
||||
import { GNC as gnc } from '../gnc/index.js';
|
||||
import { Uninstantable } from "../util/index.js";
|
||||
|
||||
export class Basic extends Uninstantable {
|
||||
/**
|
||||
* @param { (
|
||||
* button: Button,
|
||||
* buttons?: Button[]
|
||||
* ) => number } check
|
||||
*/
|
||||
static chooseButton(check) {
|
||||
const event = _status.event;
|
||||
let i, j, range, buttons, buttons2;
|
||||
let ok = false, forced = event.forced;
|
||||
let iwhile = 100;
|
||||
while (iwhile--) {
|
||||
range = get.select(event.selectButton);
|
||||
if (ui.selected.buttons.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (range[1] <= -1) {
|
||||
j = 0;
|
||||
for (i = 0; i < ui.selected.buttons.length; i++) {
|
||||
j += check(ui.selected.buttons[i]);
|
||||
}
|
||||
return (j > 0);
|
||||
}
|
||||
buttons = get.selectableButtons();
|
||||
if (buttons.length == 0) {
|
||||
return ok;
|
||||
}
|
||||
buttons2 = buttons.slice(0);
|
||||
let ix = 0;
|
||||
let checkix = check(buttons[0], buttons2);
|
||||
for (i = 1; i < buttons.length; i++) {
|
||||
let checkixtmp = check(buttons[i], buttons2);
|
||||
if (checkixtmp > checkix) {
|
||||
ix = i;
|
||||
checkix = checkixtmp;
|
||||
}
|
||||
}
|
||||
// buttons.sort(function(a,b){
|
||||
// return check(b,buttons2)-check(a,buttons2);
|
||||
// });
|
||||
if (check(buttons[ix]) <= 0) {
|
||||
if (!forced || ok) {
|
||||
return ok;
|
||||
}
|
||||
}
|
||||
buttons[ix].classList.add('selected');
|
||||
ui.selected.buttons.add(buttons[ix]);
|
||||
game.check();
|
||||
if (ui.selected.buttons.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (ui.selected.buttons.length == range[1]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param { (
|
||||
* card?: Card,
|
||||
* cards?: Card[]
|
||||
* ) => number } check
|
||||
* @returns { boolean | undefined }
|
||||
*/
|
||||
static chooseCard(check) {
|
||||
const event = _status.event;
|
||||
if (event.filterCard == undefined) return (check() > 0);
|
||||
let i, j, range, cards, cards2, skills, effect;
|
||||
let ok = false, forced = event.forced;
|
||||
let iwhile = 100;
|
||||
while (iwhile--) {
|
||||
range = get.select(event.selectCard);
|
||||
if (ui.selected.cards.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (range[1] <= -1) {
|
||||
if (ui.selected.cards.length == 0) return true;
|
||||
j = 0;
|
||||
for (i = 0; i < ui.selected.cards.length; i++) {
|
||||
effect = check(ui.selected.cards[i]);
|
||||
if (effect < 0) j -= Math.sqrt(-effect);
|
||||
else j += Math.sqrt(effect);
|
||||
}
|
||||
return (j > 0);
|
||||
}
|
||||
cards = get.selectableCards();
|
||||
// @ts-ignore
|
||||
if (!_status.event.player._noSkill) {
|
||||
// @ts-ignore
|
||||
cards = cards.concat(get.skills());
|
||||
}
|
||||
if (cards.length == 0) {
|
||||
return ok;
|
||||
}
|
||||
cards2 = cards.slice(0);
|
||||
// cards.sort(function(a,b){
|
||||
// return (check(b,cards2)-check(a,cards2));
|
||||
// });
|
||||
var ix = 0;
|
||||
var checkix = check(cards[0], cards2);
|
||||
for (i = 1; i < cards.length; i++) {
|
||||
var checkixtmp = check(cards[i], cards2);
|
||||
if (checkixtmp > checkix) {
|
||||
ix = i;
|
||||
checkix = checkixtmp;
|
||||
}
|
||||
}
|
||||
if (check(cards[ix]) <= 0) {
|
||||
if (!forced || ok) {
|
||||
return ok;
|
||||
}
|
||||
}
|
||||
if (typeof cards[ix] == 'string') {
|
||||
ui.click.skill(cards[ix]);
|
||||
var info = get.info(event.skill);
|
||||
if (info.filterCard) {
|
||||
check = info.check || get.unuseful2;
|
||||
return (Basic.chooseCard(check));
|
||||
}
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cards[ix].classList.add('selected');
|
||||
ui.selected.cards.add(cards[ix]);
|
||||
game.check();
|
||||
if (ui.selected.cards.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (ui.selected.cards.length == range[1]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param { (
|
||||
* target?: Player,
|
||||
* targets?: Player[]
|
||||
* ) => number } check
|
||||
*/
|
||||
static chooseTarget(check) {
|
||||
const event = _status.event;
|
||||
if (event.filterTarget == undefined) return (check() > 0);
|
||||
let i, j, range, targets, targets2, effect;
|
||||
let ok = false, forced = event.forced;
|
||||
let iwhile = 100;
|
||||
while (iwhile--) {
|
||||
range = get.select(event.selectTarget);
|
||||
if (ui.selected.targets.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (range[1] <= -1) {
|
||||
j = 0;
|
||||
for (i = 0; i < ui.selected.targets.length; i++) {
|
||||
effect = check(ui.selected.targets[i]);
|
||||
if (effect < 0) j -= Math.sqrt(-effect);
|
||||
else j += Math.sqrt(effect);
|
||||
}
|
||||
return (j > 0);
|
||||
}
|
||||
else if (range[1] == 0) {
|
||||
return check() > 0
|
||||
}
|
||||
targets = get.selectableTargets();
|
||||
if (targets.length == 0) {
|
||||
return range[0] == 0 || ok;
|
||||
}
|
||||
targets2 = targets.slice(0);
|
||||
// targets.sort(function(a,b){
|
||||
// return check(b)-check(a);
|
||||
// });
|
||||
let ix = 0;
|
||||
let checkix = check(targets[0], targets2);
|
||||
for (i = 1; i < targets.length; i++) {
|
||||
let checkixtmp = check(targets[i], targets2);
|
||||
if (checkixtmp > checkix) {
|
||||
ix = i;
|
||||
checkix = checkixtmp;
|
||||
}
|
||||
}
|
||||
if (check(targets[ix]) <= 0) {
|
||||
if (!forced || ok) {
|
||||
return ok;
|
||||
}
|
||||
}
|
||||
targets[ix].classList.add('selected');
|
||||
ui.selected.targets.add(targets[ix]);
|
||||
game.check();
|
||||
if (ui.selected.targets.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (ui.selected.targets.length == range[1]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,204 +6,7 @@ import { Library as lib } from '../library/index.js';
|
|||
import { GNC as gnc } from '../gnc/index.js';
|
||||
import { Uninstantable } from "../util/index.js";
|
||||
|
||||
export class Basic extends Uninstantable {
|
||||
/**
|
||||
* @param { (
|
||||
* button: Button,
|
||||
* buttons?: Button[]
|
||||
* ) => number } check
|
||||
*/
|
||||
static chooseButton(check) {
|
||||
const event = _status.event;
|
||||
let i, j, range, buttons, buttons2;
|
||||
let ok = false, forced = event.forced;
|
||||
let iwhile = 100;
|
||||
while (iwhile--) {
|
||||
range = get.select(event.selectButton);
|
||||
if (ui.selected.buttons.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (range[1] <= -1) {
|
||||
j = 0;
|
||||
for (i = 0; i < ui.selected.buttons.length; i++) {
|
||||
j += check(ui.selected.buttons[i]);
|
||||
}
|
||||
return (j > 0);
|
||||
}
|
||||
buttons = get.selectableButtons();
|
||||
if (buttons.length == 0) {
|
||||
return ok;
|
||||
}
|
||||
buttons2 = buttons.slice(0);
|
||||
let ix = 0;
|
||||
let checkix = check(buttons[0], buttons2);
|
||||
for (i = 1; i < buttons.length; i++) {
|
||||
let checkixtmp = check(buttons[i], buttons2);
|
||||
if (checkixtmp > checkix) {
|
||||
ix = i;
|
||||
checkix = checkixtmp;
|
||||
}
|
||||
}
|
||||
// buttons.sort(function(a,b){
|
||||
// return check(b,buttons2)-check(a,buttons2);
|
||||
// });
|
||||
if (check(buttons[ix]) <= 0) {
|
||||
if (!forced || ok) {
|
||||
return ok;
|
||||
}
|
||||
}
|
||||
buttons[ix].classList.add('selected');
|
||||
ui.selected.buttons.add(buttons[ix]);
|
||||
game.check();
|
||||
if (ui.selected.buttons.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (ui.selected.buttons.length == range[1]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param { (
|
||||
* card?: Card,
|
||||
* cards?: Card[]
|
||||
* ) => number } check
|
||||
* @returns { boolean | undefined }
|
||||
*/
|
||||
static chooseCard(check) {
|
||||
const event = _status.event;
|
||||
if (event.filterCard == undefined) return (check() > 0);
|
||||
let i, j, range, cards, cards2, skills, effect;
|
||||
let ok = false, forced = event.forced;
|
||||
let iwhile = 100;
|
||||
while (iwhile--) {
|
||||
range = get.select(event.selectCard);
|
||||
if (ui.selected.cards.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (range[1] <= -1) {
|
||||
if (ui.selected.cards.length == 0) return true;
|
||||
j = 0;
|
||||
for (i = 0; i < ui.selected.cards.length; i++) {
|
||||
effect = check(ui.selected.cards[i]);
|
||||
if (effect < 0) j -= Math.sqrt(-effect);
|
||||
else j += Math.sqrt(effect);
|
||||
}
|
||||
return (j > 0);
|
||||
}
|
||||
cards = get.selectableCards();
|
||||
if (!_status.event.player._noSkill) {
|
||||
// @ts-ignore
|
||||
cards = cards.concat(get.skills());
|
||||
}
|
||||
if (cards.length == 0) {
|
||||
return ok;
|
||||
}
|
||||
cards2 = cards.slice(0);
|
||||
// cards.sort(function(a,b){
|
||||
// return (check(b,cards2)-check(a,cards2));
|
||||
// });
|
||||
var ix = 0;
|
||||
var checkix = check(cards[0], cards2);
|
||||
for (i = 1; i < cards.length; i++) {
|
||||
var checkixtmp = check(cards[i], cards2);
|
||||
if (checkixtmp > checkix) {
|
||||
ix = i;
|
||||
checkix = checkixtmp;
|
||||
}
|
||||
}
|
||||
if (check(cards[ix]) <= 0) {
|
||||
if (!forced || ok) {
|
||||
return ok;
|
||||
}
|
||||
}
|
||||
if (typeof cards[ix] == 'string') {
|
||||
ui.click.skill(cards[ix]);
|
||||
var info = get.info(event.skill);
|
||||
if (info.filterCard) {
|
||||
check = info.check || get.unuseful2;
|
||||
return (ai.basic.chooseCard(check));
|
||||
}
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cards[ix].classList.add('selected');
|
||||
ui.selected.cards.add(cards[ix]);
|
||||
game.check();
|
||||
if (ui.selected.cards.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (ui.selected.cards.length == range[1]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param { (
|
||||
* target?: Player,
|
||||
* targets?: Player[]
|
||||
* ) => number } check
|
||||
*/
|
||||
static chooseTarget(check) {
|
||||
const event = _status.event;
|
||||
if (event.filterTarget == undefined) return (check() > 0);
|
||||
let i, j, range, targets, targets2, effect;
|
||||
let ok = false, forced = event.forced;
|
||||
let iwhile = 100;
|
||||
while (iwhile--) {
|
||||
range = get.select(event.selectTarget);
|
||||
if (ui.selected.targets.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (range[1] <= -1) {
|
||||
j = 0;
|
||||
for (i = 0; i < ui.selected.targets.length; i++) {
|
||||
effect = check(ui.selected.targets[i]);
|
||||
if (effect < 0) j -= Math.sqrt(-effect);
|
||||
else j += Math.sqrt(effect);
|
||||
}
|
||||
return (j > 0);
|
||||
}
|
||||
else if (range[1] == 0) {
|
||||
return check() > 0
|
||||
}
|
||||
targets = get.selectableTargets();
|
||||
if (targets.length == 0) {
|
||||
return range[0] == 0 || ok;
|
||||
}
|
||||
targets2 = targets.slice(0);
|
||||
// targets.sort(function(a,b){
|
||||
// return check(b)-check(a);
|
||||
// });
|
||||
let ix = 0;
|
||||
let checkix = check(targets[0], targets2);
|
||||
for (i = 1; i < targets.length; i++) {
|
||||
let checkixtmp = check(targets[i], targets2);
|
||||
if (checkixtmp > checkix) {
|
||||
ix = i;
|
||||
checkix = checkixtmp;
|
||||
}
|
||||
}
|
||||
if (check(targets[ix]) <= 0) {
|
||||
if (!forced || ok) {
|
||||
return ok;
|
||||
}
|
||||
}
|
||||
targets[ix].classList.add('selected');
|
||||
ui.selected.targets.add(targets[ix]);
|
||||
game.check();
|
||||
if (ui.selected.targets.length >= range[0]) {
|
||||
ok = true;
|
||||
}
|
||||
if (ui.selected.targets.length == range[1]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
import { Basic } from './basic.js';
|
||||
|
||||
export class AI extends Uninstantable {
|
||||
static basic = Basic;
|
||||
|
@ -211,3 +14,7 @@ export class AI extends Uninstantable {
|
|||
};
|
||||
|
||||
export const ai = AI;
|
||||
|
||||
export {
|
||||
Basic
|
||||
}
|
||||
|
|
|
@ -130,13 +130,17 @@ export class Is extends Uninstantable {
|
|||
* @param { Card | VCard } card
|
||||
*/
|
||||
// @ts-ignore
|
||||
static vituralCard(card) { return card.isCard || (!("cards" in card) || !Array.isArray(card.cards) || card.cards.length == 0) }
|
||||
static vituralCard(card) {
|
||||
return card.isCard || (!("cards" in card) || !Array.isArray(card.cards) || card.cards.length == 0);
|
||||
}
|
||||
/**
|
||||
* 是否是转化牌
|
||||
* @param { Card | VCard } card
|
||||
*/
|
||||
// @ts-ignore
|
||||
static convertedCard(card) { return !card.isCard && ("cards" in card) && Array.isArray(card.cards) && card.cards.length > 0 }
|
||||
static convertedCard(card) {
|
||||
return !card.isCard && ("cards" in card) && Array.isArray(card.cards) && card.cards.length > 0;
|
||||
}
|
||||
/**
|
||||
* 是否是实体牌
|
||||
* @param { Card | VCard } card
|
||||
|
@ -481,7 +485,7 @@ export class Get extends Uninstantable {
|
|||
* 根据座次数n(从0开始)获取对应的“n+1号位”翻译
|
||||
* @param {number} seat
|
||||
*/
|
||||
static seatTranslation(seat) { return `${get.cnNumber(seat + 1, true)}号位` }
|
||||
static seatTranslation(seat) { return `${get.cnNumber(seat + 1, true)}号位`; }
|
||||
/**
|
||||
* @param {number} numberOfPlayers
|
||||
* @returns {string[]}
|
||||
|
@ -535,13 +539,13 @@ export class Get extends Uninstantable {
|
|||
*
|
||||
* 获取(此牌的)应变条件
|
||||
*/
|
||||
static yingbianConditions(card) { return get.complexYingbianConditions(card).concat(get.simpleYingbianConditions(card)) }
|
||||
static yingbianConditions(card) { return get.complexYingbianConditions(card).concat(get.simpleYingbianConditions(card)); }
|
||||
static complexYingbianConditions(card) {
|
||||
const complexYingbianConditions = Array.from(lib.yingbian.condition.complex.keys());
|
||||
return card ? complexYingbianConditions.filter(value => get.cardtag(card, `yingbian_${value}`)) : complexYingbianConditions;
|
||||
}
|
||||
static simpleYingbianConditions(card) {
|
||||
const simpleYingbianConditions = Array.from(lib.yingbian.condition.simple.keys())
|
||||
const simpleYingbianConditions = Array.from(lib.yingbian.condition.simple.keys());
|
||||
return card ? simpleYingbianConditions.filter(value => get.cardtag(card, `yingbian_${value}`)) : simpleYingbianConditions;
|
||||
}
|
||||
/**
|
||||
|
@ -713,8 +717,8 @@ export class Get extends Uninstantable {
|
|||
if (info.categories) list.addArray(info.categories(skill, player));
|
||||
return list;
|
||||
}
|
||||
static numOf(obj, item) { return obj.filter(element => element == item).length }
|
||||
static connectNickname() { return typeof lib.config.connect_nickname == 'string' ? (lib.config.connect_nickname.slice(0, 12)) : "无名玩家" }
|
||||
static numOf(obj, item) { return obj.filter(element => element == item).length; }
|
||||
static connectNickname() { return typeof lib.config.connect_nickname == 'string' ? (lib.config.connect_nickname.slice(0, 12)) : "无名玩家"; }
|
||||
static zhinangs(filter) {
|
||||
var list = (_status.connectMode ? lib.configOL : lib.config).zhinang_tricks;
|
||||
if (!list || !list.filter || !list.length) return get.inpile('trick', 'trick').randomGets(3);
|
||||
|
@ -788,7 +792,7 @@ export class Get extends Uninstantable {
|
|||
if (card) return list[0];
|
||||
return list;
|
||||
}
|
||||
static discarded() { return _status.discarded.filter(item => item.parentNode == ui.discardPile) }
|
||||
static discarded() { return _status.discarded.filter(item => item.parentNode == ui.discardPile); }
|
||||
static cardOffset() {
|
||||
var x = ui.arena.getBoundingClientRect();
|
||||
var y = ui.window.getBoundingClientRect();
|
||||
|
@ -823,7 +827,7 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
}
|
||||
}
|
||||
static autoViewAs(card, cards) { return new lib.element.VCard(card, cards) }
|
||||
static autoViewAs(card, cards) { return new lib.element.VCard(card, cards); }
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
|
@ -886,7 +890,7 @@ export class Get extends Uninstantable {
|
|||
var key = func;
|
||||
func = function (item) {
|
||||
return item[key];
|
||||
}
|
||||
};
|
||||
}
|
||||
list.sort(function (a, b) {
|
||||
return func(b) - func(a);
|
||||
|
@ -913,7 +917,7 @@ export class Get extends Uninstantable {
|
|||
var key = func;
|
||||
func = function (item) {
|
||||
return item[key];
|
||||
}
|
||||
};
|
||||
}
|
||||
list.sort(function (a, b) {
|
||||
return func(a) - func(b);
|
||||
|
@ -1007,8 +1011,8 @@ export class Get extends Uninstantable {
|
|||
return Math.floor(Math.random() * num);
|
||||
}
|
||||
}
|
||||
static sort(arr, method, arg) { return method == "seat" ? arr.sortBySeat(arg) : void 0 }
|
||||
static sortSeat(arr, target) { return arr.sortBySeat(target) }
|
||||
static sort(arr, method, arg) { return method == "seat" ? arr.sortBySeat(arg) : void 0; }
|
||||
static sortSeat(arr, target) { return arr.sortBySeat(target); }
|
||||
static zip(callback) {
|
||||
if (!window.JSZip) {
|
||||
lib.init.js(lib.assetURL + 'game', 'jszip', function () {
|
||||
|
@ -1036,7 +1040,7 @@ export class Get extends Uninstantable {
|
|||
if (target) {
|
||||
var str = get.translation(target);
|
||||
if (target == player) {
|
||||
str += '(你)'
|
||||
str += '(你)';
|
||||
}
|
||||
return '是否对' + str + '发动【' + get.skillTranslation(skill, player) + '】?';
|
||||
}
|
||||
|
@ -1068,7 +1072,7 @@ export class Get extends Uninstantable {
|
|||
static playerNumber() {
|
||||
var num;
|
||||
if (_status.brawl && _status.brawl.playerNumber) {
|
||||
num = _status.brawl.playerNumber
|
||||
num = _status.brawl.playerNumber;
|
||||
}
|
||||
else {
|
||||
num = get.config('player_number');
|
||||
|
@ -1227,13 +1231,102 @@ export class Get extends Uninstantable {
|
|||
* @param {T} obj
|
||||
* @returns {T}
|
||||
*/
|
||||
static copy(obj) {
|
||||
static copy(obj, map = new WeakMap()) {
|
||||
try {
|
||||
return structuredClone(obj);
|
||||
}
|
||||
catch {
|
||||
// obj不可序列化时
|
||||
return obj;
|
||||
// obj不可序列化时,参考[这里](https://juejin.cn/post/7315612852890026021)实现深拷贝
|
||||
const getType = (obj) => Object.prototype.toString.call(obj);
|
||||
|
||||
const canTranverse = {
|
||||
"[object Map]": true,
|
||||
"[object Set]": true,
|
||||
"[object Object]": true,
|
||||
"[object Array]": true,
|
||||
"[object Arguments]": true,
|
||||
};
|
||||
|
||||
const functionMap = {
|
||||
"[object Function]": true,
|
||||
"[object AsyncFunction]": true,
|
||||
"[object GeneratorFunction]": true,
|
||||
};
|
||||
|
||||
const transformFunction = (fn) => {
|
||||
const str = fn.toString();
|
||||
// 箭头函数
|
||||
if (/^\s*(?:async)?\s*\(.*\)\s*=>/.test(str)) return str;
|
||||
// 带function标识的
|
||||
if (/^\s*(?:async)?\s*function/.test(str)) return str;
|
||||
const hasAsync = /^\s*(?:async)/.test(str);
|
||||
return `${hasAsync ? "async " : ""}function ${str.replace(/^\s*(?:async)/, '')}`;
|
||||
}
|
||||
|
||||
const createFunction = (fn) => {
|
||||
let cloneFn = null;
|
||||
const str = `cloneFn = ${transformFunction(fn)}`;
|
||||
try {
|
||||
eval(str);
|
||||
} catch (error) {
|
||||
console.error(fn.toString())
|
||||
console.error(str);
|
||||
throw error;
|
||||
}
|
||||
return cloneFn;
|
||||
};
|
||||
|
||||
const cloneSymbol = (s) => {
|
||||
const key = Symbol.keyFor(s);
|
||||
if (key) return Symbol.for(key);
|
||||
const desc = s.description;
|
||||
if (desc) return Symbol(desc);
|
||||
return Symbol();
|
||||
};
|
||||
|
||||
if (typeof obj !== "object" || obj === null) {
|
||||
// @ts-ignore
|
||||
return typeof obj === "symbol"
|
||||
? cloneSymbol(obj)
|
||||
: functionMap[getType(obj)]
|
||||
? createFunction(obj)
|
||||
: obj;
|
||||
}
|
||||
|
||||
const constructor = obj.constructor;
|
||||
// @ts-ignore
|
||||
if (!canTranverse[getType(obj)]) return new constructor(obj);
|
||||
if (map.has(obj)) return map.get(obj);
|
||||
// @ts-ignore
|
||||
const target = new constructor();
|
||||
map.set(obj, target);
|
||||
|
||||
if (obj instanceof Map) {
|
||||
obj.forEach((value, key) => {
|
||||
target.set(get.copy(key, map), get.copy(value, map));
|
||||
});
|
||||
return target;
|
||||
}
|
||||
|
||||
if (obj instanceof Set) {
|
||||
obj.forEach((value) => {
|
||||
target.add(get.copy(value, map));
|
||||
});
|
||||
return target;
|
||||
}
|
||||
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
target[key] = get.copy(obj[key], map);
|
||||
}
|
||||
}
|
||||
|
||||
const symbols = Object.getOwnPropertySymbols(obj);
|
||||
symbols.forEach((s) => {
|
||||
target[cloneSymbol(s)] = get.copy(obj[s], map);
|
||||
});
|
||||
|
||||
return target;
|
||||
}
|
||||
}
|
||||
static inpilefull(type) {
|
||||
|
@ -1280,7 +1373,7 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return list;
|
||||
}
|
||||
static inpile2(type) { return get.inpile(type, 'trick') }
|
||||
static inpile2(type) { return get.inpile(type, 'trick'); }
|
||||
static typeCard(type, filter) {
|
||||
var list = [];
|
||||
for (var i in lib.card) {
|
||||
|
@ -1400,8 +1493,8 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return str;
|
||||
}
|
||||
static mode() { return lib[_status.connectMode ? 'configOL' : 'config'].mode }
|
||||
static idDialog(id) { return ui.dialogs.find(dialog => dialog.videoId == id) || null }
|
||||
static mode() { return lib[_status.connectMode ? 'configOL' : 'config'].mode; }
|
||||
static idDialog(id) { return ui.dialogs.find(dialog => dialog.videoId == id) || null; }
|
||||
static arenaState() {
|
||||
var state = {
|
||||
number: ui.arena.dataset.number,
|
||||
|
@ -1434,7 +1527,7 @@ export class Get extends Uninstantable {
|
|||
disabledSkills: lib.playerOL[i].disabledSkills,
|
||||
tempSkills: lib.playerOL[i].tempSkills,
|
||||
storage: lib.playerOL[i].storage,
|
||||
}
|
||||
};
|
||||
}
|
||||
//for(var i in lib.skill){
|
||||
// if(lib.skill[i].chooseButton&&lib.skill[i].enable){
|
||||
|
@ -1447,7 +1540,7 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return skills;
|
||||
}
|
||||
static id() { return (Math.floor(1000000 + 9000000 * Math.random())).toString() + (10 + lib.status.globalId++) }
|
||||
static id() { return (Math.floor(1000000 + 9000000 * Math.random())).toString() + (10 + lib.status.globalId++); }
|
||||
static zhu(player, skill, group) {
|
||||
if (typeof player == 'string') {
|
||||
skill = player;
|
||||
|
@ -1664,9 +1757,9 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return info;
|
||||
}
|
||||
static infoTargets(infos) { return Array.from(infos || []).map(info => game.playerMap[info]) }
|
||||
static cardInfo(card) { return [card.suit, card.number, card.name, card.nature] }
|
||||
static cardsInfo(cards) { return Array.from(cards || []).map(get.cardInfo) }
|
||||
static infoTargets(infos) { return Array.from(infos || []).map(info => game.playerMap[info]); }
|
||||
static cardInfo(card) { return [card.suit, card.number, card.name, card.nature]; }
|
||||
static cardsInfo(cards) { return Array.from(cards || []).map(get.cardInfo); }
|
||||
static infoCard(info) {
|
||||
var card = ui.create.card();
|
||||
if (info[0]) {
|
||||
|
@ -1674,8 +1767,8 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return card;
|
||||
}
|
||||
static infoCards(infos) { return Array.from(infos || []).map(get.infoCard) }
|
||||
static cardInfoOL(card) { return '_noname_card:' + JSON.stringify([card.cardid, card.suit, card.number, card.name, card.nature]) }
|
||||
static infoCards(infos) { return Array.from(infos || []).map(get.infoCard); }
|
||||
static cardInfoOL(card) { return '_noname_card:' + JSON.stringify([card.cardid, card.suit, card.number, card.name, card.nature]); }
|
||||
static infoCardOL(info) {
|
||||
if (!lib.cardOL) return info;
|
||||
var card;
|
||||
|
@ -1704,12 +1797,12 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return card || info;
|
||||
}
|
||||
static cardsInfoOL(cards) { return Array.from(cards || []).map(get.cardInfoOL) }
|
||||
static infoCardsOL(infos) { return Array.from(infos || []).map(get.infoCardOL) }
|
||||
static playerInfoOL(player) { return '_noname_player:' + player.playerid }
|
||||
static infoPlayerOL(info) { return lib.playerOL ? (lib.playerOL[info.slice(15)] || info) : info }
|
||||
static playersInfoOL(players) { return Array.from(players || []).map(get.playerInfoOL) }
|
||||
static infoPlayersOL(infos) { return Array.from(infos || []).map(get.infoPlayerOL) }
|
||||
static cardsInfoOL(cards) { return Array.from(cards || []).map(get.cardInfoOL); }
|
||||
static infoCardsOL(infos) { return Array.from(infos || []).map(get.infoCardOL); }
|
||||
static playerInfoOL(player) { return '_noname_player:' + player.playerid; }
|
||||
static infoPlayerOL(info) { return lib.playerOL ? (lib.playerOL[info.slice(15)] || info) : info; }
|
||||
static playersInfoOL(players) { return Array.from(players || []).map(get.playerInfoOL); }
|
||||
static infoPlayersOL(infos) { return Array.from(infos || []).map(get.infoPlayerOL); }
|
||||
static funcInfoOL(func) {
|
||||
if (typeof func == 'function') {
|
||||
if (func._filter_args) {
|
||||
|
@ -1740,7 +1833,7 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
else if (!lib.element.GameEvent.prototype[key] && key != 'content' && get.itemtype(entry[1]) != 'event') stringifying[key] = get.stringifiedResult(entry[1], null, false);
|
||||
return stringifying;
|
||||
}, {}))}` : ''
|
||||
}, {}))}` : '';
|
||||
}
|
||||
/**
|
||||
* @param {string} item
|
||||
|
@ -1916,7 +2009,7 @@ export class Get extends Uninstantable {
|
|||
span.innerHTML = prefix;
|
||||
return span.outerHTML;
|
||||
}
|
||||
static slimName(str) { return get.verticalStr(get.slimNameHorizontal(str), true) }
|
||||
static slimName(str) { return get.verticalStr(get.slimNameHorizontal(str), true); }
|
||||
static time() {
|
||||
if (lib.status.dateDelaying) {
|
||||
return lib.getUTC(lib.status.dateDelaying) - lib.getUTC(lib.status.date) - lib.status.dateDelayed;
|
||||
|
@ -1925,13 +2018,13 @@ export class Get extends Uninstantable {
|
|||
return lib.getUTC(new Date()) - lib.getUTC(lib.status.date) - lib.status.dateDelayed;
|
||||
}
|
||||
}
|
||||
static utc() { return (new Date()).getTime() }
|
||||
static utc() { return (new Date()).getTime(); }
|
||||
static evtDistance(e1, e2) {
|
||||
var dx = (e1.clientX - e2.clientX) / game.documentZoom;
|
||||
var dy = (e1.clientY - e2.clientY) / game.documentZoom;
|
||||
return Math.sqrt(dx * dx + dy * dy);
|
||||
}
|
||||
static xyDistance(from, to) { return Math.sqrt((from[0] - to[0]) * (from[0] - to[0]) + (from[1] - to[1]) * (from[1] - to[1])) }
|
||||
static xyDistance(from, to) { return Math.sqrt((from[0] - to[0]) * (from[0] - to[0]) + (from[1] - to[1]) * (from[1] - to[1])); }
|
||||
/**
|
||||
* @overload
|
||||
* @returns { void }
|
||||
|
@ -2048,7 +2141,7 @@ export class Get extends Uninstantable {
|
|||
if (method == 'trick' && lib.card[name].type == 'delay') return 'trick';
|
||||
return lib.card[name].type;
|
||||
}
|
||||
static type2(card, player) { return get.type(card, 'trick', player) }
|
||||
static type2(card, player) { return get.type(card, 'trick', player); }
|
||||
static subtype(obj, player) {
|
||||
if (typeof obj == 'string') obj = { name: obj };
|
||||
if (typeof obj != 'object') return;
|
||||
|
@ -2218,8 +2311,8 @@ export class Get extends Uninstantable {
|
|||
if (card) return list[0];
|
||||
return list;
|
||||
}
|
||||
static judge(card) { return card.viewAs ? lib.card[card.viewAs].judge : get.info(card).judge }
|
||||
static judge2(card) { return card.viewAs ? lib.card[card.viewAs].judge2 : get.info(card).judge2 }
|
||||
static judge(card) { return card.viewAs ? lib.card[card.viewAs].judge : get.info(card).judge; }
|
||||
static judge2(card) { return card.viewAs ? lib.card[card.viewAs].judge2 : get.info(card).judge2; }
|
||||
static distance(from, to, method) {
|
||||
if (from == to) return 0;
|
||||
if (!game.players.includes(from) && !game.dead.includes(from)) return Infinity;
|
||||
|
@ -2347,8 +2440,8 @@ export class Get extends Uninstantable {
|
|||
* @overload
|
||||
* @returns {GameEvent}
|
||||
*/
|
||||
static event(key) { return key ? _status.event[key] : _status.event }
|
||||
static player() { return _status.event.player }
|
||||
static event(key) { return key ? _status.event[key] : _status.event; }
|
||||
static player() { return _status.event.player; }
|
||||
static players(sort, dead, out) {
|
||||
var players = game.players.slice(0);
|
||||
if (sort != false) {
|
||||
|
@ -2559,7 +2652,7 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
result = handleZero(result);
|
||||
return result;
|
||||
}
|
||||
};
|
||||
let result = '';
|
||||
for (let i = 0; i < numStr.length; i++) {
|
||||
const part = numStr[i];
|
||||
|
@ -2776,7 +2869,7 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
result._filter_args = [filter, i];
|
||||
return result;
|
||||
}
|
||||
|
@ -2806,18 +2899,18 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
static owner(card, method) {
|
||||
return game.players.concat(game.dead).find(current =>
|
||||
current.getCards("hejsx").includes(card) || (current.judging[0] == card && method != "judge"))
|
||||
current.getCards("hejsx").includes(card) || (current.judging[0] == card && method != "judge"));
|
||||
}
|
||||
static noSelected() { return ui.selected.buttons.length + ui.selected.cards.length + ui.selected.targets.length == 0 }
|
||||
static noSelected() { return ui.selected.buttons.length + ui.selected.cards.length + ui.selected.targets.length == 0; }
|
||||
static population(identity) {
|
||||
return identity == undefined ?
|
||||
game.players.length + game.dead.length :
|
||||
game.players.filter(current => current.identity == identity).length
|
||||
game.players.filter(current => current.identity == identity).length;
|
||||
}
|
||||
static totalPopulation(identity) {
|
||||
return identity == undefined ?
|
||||
game.players.length + game.dead.length :
|
||||
game.players.concat(game.dead).filter(current => current.identity == identity).length
|
||||
game.players.concat(game.dead).filter(current => current.identity == identity).length;
|
||||
}
|
||||
/**
|
||||
* @param { Card | VCard } item
|
||||
|
@ -2854,7 +2947,7 @@ export class Get extends Uninstantable {
|
|||
case 'equip': return -3;
|
||||
default: return -4;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
else if (sort == 'suit_sort') {
|
||||
func = function (card) {
|
||||
|
@ -2862,12 +2955,12 @@ export class Get extends Uninstantable {
|
|||
if (get.suit(card) == 'diamond') return 1;
|
||||
if (get.suit(card) == 'spade') return -1;
|
||||
if (get.suit(card) == 'club') return -2;
|
||||
}
|
||||
};
|
||||
}
|
||||
else if (sort == 'number_sort') {
|
||||
func = function (card) {
|
||||
return get.number(card) - 7 + 0.5;
|
||||
}
|
||||
};
|
||||
}
|
||||
return func;
|
||||
}
|
||||
|
@ -2930,8 +3023,8 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
static cardPile2(name) { return get.cardPile(name, 'cardPile') }
|
||||
static discardPile(name) { return get.cardPile(name, 'discardPile') }
|
||||
static cardPile2(name) { return get.cardPile(name, 'cardPile'); }
|
||||
static discardPile(name) { return get.cardPile(name, 'discardPile'); }
|
||||
static aiStrategy() {
|
||||
switch (get.config('ai_strategy')) {
|
||||
case 'ai_strategy_1': return 1;
|
||||
|
@ -3139,7 +3232,7 @@ export class Get extends Uninstantable {
|
|||
uiintro.addSmall(shownHs);
|
||||
if (allShown) {
|
||||
var hs = node.getCards('h');
|
||||
hs.removeArray(shownHs)
|
||||
hs.removeArray(shownHs);
|
||||
if (hs.length) {
|
||||
uiintro.add('<div class="text center">其他手牌</div>');
|
||||
uiintro.addSmall(hs);
|
||||
|
@ -3184,7 +3277,7 @@ export class Get extends Uninstantable {
|
|||
else {
|
||||
forbidstr += '(双将禁用)<br>';
|
||||
}
|
||||
forbidstr += get.skillInfoTranslation(skills[i], node) + '</div></div>'
|
||||
forbidstr += get.skillInfoTranslation(skills[i], node) + '</div></div>';
|
||||
uiintro.add(forbidstr);
|
||||
}
|
||||
else if (!skills2.includes(skills[i])) {
|
||||
|
@ -3263,7 +3356,7 @@ export class Get extends Uninstantable {
|
|||
uiintro.add('<div><div class="skill">' + translation + '</div><div>' + get.skillInfoTranslation(skills[i], node) + '</div></div>');
|
||||
}
|
||||
if (lib.translate[skills[i] + '_append']) {
|
||||
uiintro._place_text = uiintro.add('<div class="text">' + lib.translate[skills[i] + '_append'] + '</div>')
|
||||
uiintro._place_text = uiintro.add('<div class="text">' + lib.translate[skills[i] + '_append'] + '</div>');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3345,7 +3438,7 @@ export class Get extends Uninstantable {
|
|||
|
||||
uiintro.content.appendChild(table);
|
||||
if (!lib.config.show_favourite) {
|
||||
table.style.paddingBottom = '5px'
|
||||
table.style.paddingBottom = '5px';
|
||||
}
|
||||
}
|
||||
if (!simple || get.is.phoneLayout()) {
|
||||
|
@ -3415,7 +3508,7 @@ export class Get extends Uninstantable {
|
|||
if (ui.throwEmotion) {
|
||||
for (var i of ui.throwEmotion) i.classList.remove('exclude');
|
||||
}
|
||||
}, (emotion == 'flower' || emotion == 'egg') ? 500 : 5000)
|
||||
}, (emotion == 'flower' || emotion == 'egg') ? 500 : 5000);
|
||||
};
|
||||
var td;
|
||||
var table = document.createElement('div');
|
||||
|
@ -3463,7 +3556,7 @@ export class Get extends Uninstantable {
|
|||
else {
|
||||
addFavourite.innerHTML = '添加收藏';
|
||||
}
|
||||
addFavourite.listen(ui.click.favouriteCharacter)
|
||||
addFavourite.listen(ui.click.favouriteCharacter);
|
||||
uiintro.add(addFavourite);
|
||||
}
|
||||
if (!simple || get.is.phoneLayout()) {
|
||||
|
@ -3528,7 +3621,7 @@ export class Get extends Uninstantable {
|
|||
img.onload = function () {
|
||||
num++;
|
||||
loadImage(avatar2);
|
||||
}
|
||||
};
|
||||
img.onerror = function () {
|
||||
num--;
|
||||
if (num) {
|
||||
|
@ -3540,7 +3633,7 @@ export class Get extends Uninstantable {
|
|||
loadImage(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
var nameskin = (avatar2 ? node.name2 : node.name1);
|
||||
var nameskin2 = nameskin;
|
||||
var gzbool = false;
|
||||
|
@ -3552,7 +3645,7 @@ export class Get extends Uninstantable {
|
|||
gzbool = true;
|
||||
}
|
||||
img.src = lib.assetURL + 'image/skin/' + nameskin + '/' + num + '.jpg';
|
||||
}
|
||||
};
|
||||
if (lib.config.change_skin) {
|
||||
if (!node.isUnseen(0)) {
|
||||
loadImage();
|
||||
|
@ -3965,7 +4058,7 @@ export class Get extends Uninstantable {
|
|||
uiintro.add('<div><div class="skill">' + translation + '</div><div>' + get.skillInfoTranslation(skills[i]) + '</div></div>');
|
||||
|
||||
if (lib.translate[skills[i] + '_append']) {
|
||||
uiintro._place_text = uiintro.add('<div class="text">' + lib.translate[skills[i] + '_append'] + '</div>')
|
||||
uiintro._place_text = uiintro.add('<div class="text">' + lib.translate[skills[i] + '_append'] + '</div>');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3981,7 +4074,7 @@ export class Get extends Uninstantable {
|
|||
else {
|
||||
addFavourite.innerHTML = '添加收藏';
|
||||
}
|
||||
addFavourite.listen(ui.click.favouriteCharacter)
|
||||
addFavourite.listen(ui.click.favouriteCharacter);
|
||||
uiintro.add(addFavourite);
|
||||
}
|
||||
else {
|
||||
|
@ -4045,13 +4138,13 @@ export class Get extends Uninstantable {
|
|||
img.onload = function () {
|
||||
num++;
|
||||
loadImage();
|
||||
}
|
||||
};
|
||||
img.onerror = function () {
|
||||
num--;
|
||||
createButtons(num);
|
||||
}
|
||||
};
|
||||
img.src = lib.assetURL + 'image/skin/' + nameskin + '/' + num + '.jpg';
|
||||
}
|
||||
};
|
||||
if (lib.config.change_skin) {
|
||||
loadImage();
|
||||
}
|
||||
|
@ -4071,7 +4164,7 @@ export class Get extends Uninstantable {
|
|||
ui.control.hide();
|
||||
uiintro._onclose = function () {
|
||||
ui.control.show();
|
||||
}
|
||||
};
|
||||
var confirmbutton;
|
||||
for (var i = 0; i < uiintro.buttons.length; i++) {
|
||||
var button = uiintro.buttons[i];
|
||||
|
@ -4185,7 +4278,7 @@ export class Get extends Uninstantable {
|
|||
dialog.add(list, true, true);
|
||||
}
|
||||
}
|
||||
static groups() { return ['wei', 'shu', 'wu', 'qun', 'jin', 'western', 'key'] }
|
||||
static groups() { return ['wei', 'shu', 'wu', 'qun', 'jin', 'western', 'key']; }
|
||||
static types() {
|
||||
var types = [];
|
||||
for (var i in lib.card) {
|
||||
|
@ -4332,8 +4425,8 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return get.useful_raw(card, player);
|
||||
}
|
||||
static unuseful(card) { return -get.useful(card) }
|
||||
static unuseful2(card) { return 10 - get.useful(card) }
|
||||
static unuseful(card) { return -get.useful(card); }
|
||||
static unuseful2(card) { return 10 - get.useful(card); }
|
||||
static unuseful3(card) {
|
||||
if (card.name == 'du') return 20;
|
||||
return 10 - get.useful(card);
|
||||
|
@ -4420,8 +4513,8 @@ export class Get extends Uninstantable {
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
static disvalue(card, player) { return -get.value(card, player) }
|
||||
static disvalue2(card, player) { return -get.value(card, player, 'raw') }
|
||||
static disvalue(card, player) { return -get.value(card, player); }
|
||||
static disvalue2(card, player) { return -get.value(card, player, 'raw'); }
|
||||
static skillthreaten(skill, player, target) {
|
||||
if (!lib.skill[skill]) return 1;
|
||||
if (!lib.skill[skill].ai) return 1;
|
||||
|
@ -4907,7 +5000,7 @@ export class Get extends Uninstantable {
|
|||
default: return 0.4;
|
||||
}
|
||||
}
|
||||
static attitude2(to) { return get.attitude(_status.event.player, to) }
|
||||
static attitude2(to) { return get.attitude(_status.event.player, to); }
|
||||
}
|
||||
|
||||
export const get = Get;
|
|
@ -1,51 +1,49 @@
|
|||
import { GeneratorFunction, Uninstantable } from "../util/index.js";
|
||||
|
||||
class Is extends Uninstantable {
|
||||
static coroutine(item) {
|
||||
return typeof item == "function" && item.name == "genCoroutine";
|
||||
}
|
||||
static generatorFunc(item) {
|
||||
return item instanceof GeneratorFunction;
|
||||
}
|
||||
static generator(item) {
|
||||
return (typeof item == "object") && ("constructor" in item) && item.constructor && ("constructor" in item.constructor) && item.constructor.constructor === GeneratorFunction;
|
||||
}
|
||||
};
|
||||
import { Is } from "./is.js";
|
||||
|
||||
// gnc: GeNCoroutine
|
||||
export class GNC extends Uninstantable {
|
||||
/**
|
||||
* @param {GeneratorFunction} fn
|
||||
* @returns
|
||||
*/
|
||||
static of(fn) {
|
||||
return gnc.is.generatorFunc(fn) ? function genCoroutine() {
|
||||
let gen = fn.apply(this, arguments);
|
||||
gen.status = "next";
|
||||
gen.state = undefined;
|
||||
const callback = (resolve, reject) => {
|
||||
let result,
|
||||
nexts = resolve,
|
||||
throws = reject;
|
||||
try {
|
||||
result = gen[gen.status](gen.state);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
if (!result.done) {
|
||||
nexts = (item) => {
|
||||
gen.state = item;
|
||||
gen.status = "next";
|
||||
callback(resolve, reject);
|
||||
return Is.generatorFunc(fn) ?
|
||||
/**
|
||||
* @param {Parameters<typeof fn>} args
|
||||
* @returns {Promise<ReturnType<typeof fn>>}
|
||||
*/
|
||||
function genCoroutine(...args) {
|
||||
let gen = fn.apply(this, args);
|
||||
gen.status = "next";
|
||||
gen.state = undefined;
|
||||
const callback = (resolve, reject) => {
|
||||
let result,
|
||||
nexts = resolve,
|
||||
throws = reject;
|
||||
try {
|
||||
result = gen[gen.status](gen.state);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
throws = (err) => {
|
||||
gen.state = err;
|
||||
gen.status = "throw";
|
||||
callback(resolve, reject);
|
||||
if (!result.done) {
|
||||
nexts = (item) => {
|
||||
gen.state = item;
|
||||
gen.status = "next";
|
||||
callback(resolve, reject);
|
||||
};
|
||||
throws = (err) => {
|
||||
gen.state = err;
|
||||
gen.status = "throw";
|
||||
callback(resolve, reject);
|
||||
};
|
||||
}
|
||||
}
|
||||
result = result.value;
|
||||
Promise.resolve(result).then(nexts, throws);
|
||||
}
|
||||
return new Promise(callback);
|
||||
} : (() => { throw new TypeError("gnc.of needs a GeneratorFunction.") })()
|
||||
result = result.value;
|
||||
Promise.resolve(result).then(nexts, throws);
|
||||
};
|
||||
return new Promise(callback);
|
||||
} : (() => { throw new TypeError("gnc.of needs a GeneratorFunction."); })();
|
||||
}
|
||||
static is = Is;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
import { GeneratorFunction, Uninstantable } from "../util/index.js";
|
||||
|
||||
export class Is extends Uninstantable {
|
||||
/**
|
||||
* @param {*} item
|
||||
* @returns {boolean}
|
||||
*/
|
||||
static coroutine(item) {
|
||||
return typeof item == "function" && item.name == "genCoroutine";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {*} item
|
||||
* @returns {boolean}
|
||||
*/
|
||||
static generatorFunc(item) {
|
||||
return item instanceof GeneratorFunction;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {*} item
|
||||
* @returns {boolean}
|
||||
*/
|
||||
static generator(item) {
|
||||
return (typeof item == "object") && ("constructor" in item) && item.constructor && ("constructor" in item.constructor) && item.constructor.constructor === GeneratorFunction;
|
||||
}
|
||||
};
|
|
@ -0,0 +1,41 @@
|
|||
import { Game as game } from '../game/index.js';
|
||||
|
||||
/**
|
||||
* @param {string} name - 卡牌包名
|
||||
*/
|
||||
export const importCardPack = generateImportFunction('card', (name) => `../../card/${name}.js`)
|
||||
|
||||
/**
|
||||
* @param {string} name - 武将包名
|
||||
*/
|
||||
export const importCharacterPack = generateImportFunction('character', (name) => `../../character/${name}.js`)
|
||||
|
||||
/**
|
||||
* @param {string} name - 扩展名
|
||||
*/
|
||||
export const importExtension = generateImportFunction('extension', (name) => `../../extension/${name}/extension.js`)
|
||||
|
||||
/**
|
||||
* @param {string} name - 模式名
|
||||
*/
|
||||
export const importMode = generateImportFunction('mode', (name) => `../../mode/${name}.js`)
|
||||
|
||||
/**
|
||||
* 生成导入
|
||||
*
|
||||
* @param {string} type
|
||||
* @param {(name: string) => string} pathParser
|
||||
* @returns {(name: string) => Promise<void>}
|
||||
*/
|
||||
function generateImportFunction(type, pathParser) {
|
||||
return async function (name) {
|
||||
try {
|
||||
const modeContent = await import(pathParser(name));
|
||||
if (!modeContent.type) return;
|
||||
if (modeContent.type !== type) throw new Error(`Loaded Content doesnt conform to "${type}"`);
|
||||
await game.import(type, modeContent.default);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,6 +10,9 @@ import { userAgent } from '../util/index.js';
|
|||
import * as config from '../util/config.js';
|
||||
import { gnc } from '../gnc/index.js';
|
||||
|
||||
import { importCardPack, importCharacterPack, importExtension, importMode } from './import.js';
|
||||
import { onload } from './onload.js';
|
||||
|
||||
// 无名杀,启动!
|
||||
export async function boot() {
|
||||
// 不想看,反正别动
|
||||
|
@ -29,11 +32,8 @@ export async function boot() {
|
|||
|
||||
// 设定游戏加载时间,超过时间未加载就提醒
|
||||
const configLoadTime = localStorage.getItem(lib.configprefix + 'loadtime');
|
||||
Reflect.set(
|
||||
window,
|
||||
'resetGameTimeout',
|
||||
setTimeout(lib.init.reset, configLoadTime ? parseInt(configLoadTime) : 10000)
|
||||
);
|
||||
// 现在不暴露到全局变量里了,直接传给onload
|
||||
const resetGameTimeout = setTimeout(lib.init.reset, configLoadTime ? parseInt(configLoadTime) : 10000)
|
||||
|
||||
if (Reflect.has(window, 'cordovaLoadTimeout')) {
|
||||
clearTimeout(Reflect.get(window, 'cordovaLoadTimeout'));
|
||||
|
@ -560,64 +560,7 @@ export async function boot() {
|
|||
}
|
||||
|
||||
await waitDomLoad;
|
||||
lib.init.onload();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} name - 卡牌包名
|
||||
*/
|
||||
async function importCardPack(name) {
|
||||
try {
|
||||
const cardPackContent = await import('../../card/' + name + '.js');
|
||||
if (!cardPackContent.type) return;
|
||||
if (cardPackContent.type !== 'card') throw new Error('Loaded Content is not a CardPack');
|
||||
await game.import('card', cardPackContent.default);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} name - 武将包名
|
||||
*/
|
||||
async function importCharacterPack(name) {
|
||||
try {
|
||||
const characterPackContent = await import('../../character/' + name + '.js');
|
||||
if (!characterPackContent.type) return;
|
||||
if (characterPackContent.type !== 'character') throw new Error('Loaded Content is not a CharacterPack');
|
||||
await game.import('character', characterPackContent.default);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} name - 扩展名
|
||||
*/
|
||||
async function importExtension(name) {
|
||||
try {
|
||||
const extensionContent = await import('../../extension/' + name + '/extension.js');
|
||||
if (!extensionContent.type) return;
|
||||
if (extensionContent.type !== 'extension') throw new Error('Loaded Content is not a Noname Extension');
|
||||
await game.import('extension', extensionContent.default);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
game.removeExtension(name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} name - 模式名
|
||||
*/
|
||||
async function importMode(name) {
|
||||
try {
|
||||
const modeContent = await import('../../mode/' + name + '.js');
|
||||
if (!modeContent.type) return;
|
||||
if (modeContent.type !== 'mode') throw new Error('Loaded Content is not a Mode');
|
||||
await game.import('mode', modeContent.default);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
await onload(resetGameTimeout);
|
||||
}
|
||||
|
||||
function initSheet(libConfig) {
|
||||
|
@ -680,13 +623,13 @@ async function loadConfig() {
|
|||
idbOpenDBRequest.onupgradeneeded = idbVersionChangeEvent => {
|
||||
// @ts-expect-error MaybeHave
|
||||
const idbDatabase = idbVersionChangeEvent.target.result;
|
||||
if (!idbDatabase.objectStoreNames.includes('video')) idbDatabase.createObjectStore('video', {
|
||||
if (!idbDatabase.objectStoreNames.contains('video')) idbDatabase.createObjectStore('video', {
|
||||
keyPath: 'time'
|
||||
});
|
||||
if (!idbDatabase.objectStoreNames.includes('image')) idbDatabase.createObjectStore('image');
|
||||
if (!idbDatabase.objectStoreNames.includes('audio')) idbDatabase.createObjectStore('audio');
|
||||
if (!idbDatabase.objectStoreNames.includes('config')) idbDatabase.createObjectStore('config');
|
||||
if (!idbDatabase.objectStoreNames.includes('data')) idbDatabase.createObjectStore('data');
|
||||
if (!idbDatabase.objectStoreNames.contains('image')) idbDatabase.createObjectStore('image');
|
||||
if (!idbDatabase.objectStoreNames.contains('audio')) idbDatabase.createObjectStore('audio');
|
||||
if (!idbDatabase.objectStoreNames.contains('config')) idbDatabase.createObjectStore('config');
|
||||
if (!idbDatabase.objectStoreNames.contains('data')) idbDatabase.createObjectStore('data');
|
||||
};
|
||||
});
|
||||
Reflect.set(lib, 'db', event.target.result);
|
||||
|
@ -750,14 +693,13 @@ async function onWindowReady() {
|
|||
var script = document.createElement('script');
|
||||
script.src = 'cordova.js';
|
||||
document.body.appendChild(script);
|
||||
// @ts-ignore
|
||||
const { promise, resolve } = Promise.withResolvers();
|
||||
document.addEventListener('deviceready', async () => {
|
||||
const { cordovaReady } = await import('./cordova.js');
|
||||
await cordovaReady();
|
||||
resolve()
|
||||
});
|
||||
await promise;
|
||||
await new Promise((resolve) => {
|
||||
document.addEventListener('deviceready', async () => {
|
||||
const { cordovaReady } = await import('./cordova.js');
|
||||
await cordovaReady();
|
||||
resolve(void 0)
|
||||
});
|
||||
})
|
||||
}
|
||||
/*
|
||||
if (_status.packLoaded) {
|
||||
|
@ -810,6 +752,12 @@ function setServerIndex() {
|
|||
}
|
||||
|
||||
function setWindowListener() {
|
||||
// 但愿有用
|
||||
window.addEventListener("unhandledrejection", (error) => {
|
||||
// 希望error.reason能是个正常的error
|
||||
throw error.reason;
|
||||
});
|
||||
|
||||
window.onkeydown = function (e) {
|
||||
if (!Reflect.has(ui, 'menuContainer') || !Reflect.get(ui, 'menuContainer').classList.contains('hidden')) {
|
||||
if (e.keyCode == 116 || ((e.ctrlKey || e.metaKey) && e.keyCode == 82)) {
|
||||
|
|
|
@ -6,6 +6,9 @@ import { status as _status } from '../status/index.js';
|
|||
import { UI as ui } from '../ui/index.js';
|
||||
|
||||
export function nodeReady() {
|
||||
const versions = window.process.versions;
|
||||
// @ts-ignore
|
||||
const electronVersion = parseFloat(versions.electron);
|
||||
lib.node = {
|
||||
fs: require('fs'),
|
||||
path: require("path"),
|
||||
|
|
|
@ -0,0 +1,838 @@
|
|||
// @ts-nocheck
|
||||
import { AI as ai } from '../ai/index.js';
|
||||
import { Get as get } from '../get/index.js';
|
||||
import { Library as lib } from '../library/index.js';
|
||||
import { Game as game } from '../game/index.js';
|
||||
import { status as _status } from '../status/index.js';
|
||||
import { UI as ui } from '../ui/index.js';
|
||||
|
||||
import { userAgent } from '../util/index.js';
|
||||
import * as config from '../util/config.js';
|
||||
import { gnc } from '../gnc/index.js';
|
||||
|
||||
export async function onload(resetGameTimeout) {
|
||||
const libOnload = lib.onload;
|
||||
delete lib.onload;
|
||||
await runCustomContents(libOnload);
|
||||
|
||||
ui.updated();
|
||||
game.documentZoom = game.deviceZoom;
|
||||
if (game.documentZoom !== 1) ui.updatez();
|
||||
|
||||
await createBackground();
|
||||
|
||||
if (lib.config.touchscreen) createTouchDraggedFilter();
|
||||
|
||||
// 不拆分,太玄学了
|
||||
if (lib.config.card_style == 'custom') {
|
||||
game.getDB('image', 'card_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.card_stylesheet) {
|
||||
ui.css.card_stylesheet.remove();
|
||||
}
|
||||
ui.css.card_stylesheet = lib.init.sheet('.card:not(*:empty){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.cardback_style == 'custom') {
|
||||
game.getDB('image', 'cardback_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.cardback_stylesheet) {
|
||||
ui.css.cardback_stylesheet.remove();
|
||||
}
|
||||
ui.css.cardback_stylesheet = lib.init.sheet('.card:empty,.card.infohidden{background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
game.getDB('image', 'cardback_style2', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.cardback_stylesheet2) {
|
||||
ui.css.cardback_stylesheet2.remove();
|
||||
}
|
||||
ui.css.cardback_stylesheet2 = lib.init.sheet('.card.infohidden:not(.infoflip){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.hp_style == 'custom') {
|
||||
game.getDB('image', 'hp_style1', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.hp_stylesheet1) {
|
||||
ui.css.hp_stylesheet1.remove();
|
||||
}
|
||||
ui.css.hp_stylesheet1 = lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="high"]>div:not(.lost){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
game.getDB('image', 'hp_style2', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.hp_stylesheet2) {
|
||||
ui.css.hp_stylesheet2.remove();
|
||||
}
|
||||
ui.css.hp_stylesheet2 = lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="mid"]>div:not(.lost){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
game.getDB('image', 'hp_style3', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.hp_stylesheet3) {
|
||||
ui.css.hp_stylesheet3.remove();
|
||||
}
|
||||
ui.css.hp_stylesheet3 = lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="low"]>div:not(.lost){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
game.getDB('image', 'hp_style4', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.hp_stylesheet4) {
|
||||
ui.css.hp_stylesheet4.remove();
|
||||
}
|
||||
ui.css.hp_stylesheet4 = lib.init.sheet('.hp:not(.text):not(.actcount)>.lost{background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
|
||||
if (lib.config.player_style == 'custom') {
|
||||
ui.css.player_stylesheet = lib.init.sheet('#window .player{background-image:none;background-size:100% 100%;}');
|
||||
game.getDB('image', 'player_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.player_stylesheet) {
|
||||
ui.css.player_stylesheet.remove();
|
||||
}
|
||||
ui.css.player_stylesheet = lib.init.sheet('#window .player{background-image:url("' + fileLoadedEvent.target.result + '");background-size:100% 100%;}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.border_style == 'custom') {
|
||||
game.getDB('image', 'border_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.border_stylesheet) {
|
||||
ui.css.border_stylesheet.remove();
|
||||
}
|
||||
ui.css.border_stylesheet = lib.init.sheet();
|
||||
ui.css.border_stylesheet.sheet.insertRule('#window .player>.framebg{display:block;background-image:url("' + fileLoadedEvent.target.result + '")}', 0);
|
||||
ui.css.border_stylesheet.sheet.insertRule('.player>.count{z-index: 3 !important;border-radius: 2px !important;text-align: center !important;}', 0);
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.control_style == 'custom') {
|
||||
game.getDB('image', 'control_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.control_stylesheet) {
|
||||
ui.css.control_stylesheet.remove();
|
||||
}
|
||||
ui.css.control_stylesheet = lib.init.sheet('#window .control,.menubutton:not(.active):not(.highlight):not(.red):not(.blue),#window #system>div>div{background-image:url("' + fileLoadedEvent.target.result + '")}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.menu_style == 'custom') {
|
||||
game.getDB('image', 'menu_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.menu_stylesheet) {
|
||||
ui.css.menu_stylesheet.remove();
|
||||
}
|
||||
ui.css.menu_stylesheet = lib.init.sheet('html #window>.dialog.popped,html .menu,html .menubg{background-image:url("' + fileLoadedEvent.target.result + '");background-size:cover}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
|
||||
// 改不动,暂时不改了
|
||||
const proceed2 = async () => {
|
||||
var mode = lib.imported.mode;
|
||||
var card = lib.imported.card;
|
||||
var character = lib.imported.character;
|
||||
var play = lib.imported.play;
|
||||
delete window.game;
|
||||
var i, j, k;
|
||||
for (i in mode[lib.config.mode].element) {
|
||||
if (!lib.element[i]) lib.element[i] = [];
|
||||
for (j in mode[lib.config.mode].element[i]) {
|
||||
if (j == 'init') {
|
||||
if (!lib.element[i].inits) lib.element[i].inits = [];
|
||||
lib.element[i].inits.push(mode[lib.config.mode].element[i][j]);
|
||||
}
|
||||
else {
|
||||
lib.element[i][j] = mode[lib.config.mode].element[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i in mode[lib.config.mode].ai) {
|
||||
if (typeof mode[lib.config.mode].ai[i] == 'object') {
|
||||
if (ai[i] == undefined) ai[i] = {};
|
||||
for (j in mode[lib.config.mode].ai[i]) {
|
||||
ai[i][j] = mode[lib.config.mode].ai[i][j];
|
||||
}
|
||||
}
|
||||
else {
|
||||
ai[i] = mode[lib.config.mode].ai[i];
|
||||
}
|
||||
}
|
||||
for (i in mode[lib.config.mode].ui) {
|
||||
if (typeof mode[lib.config.mode].ui[i] == 'object') {
|
||||
if (ui[i] == undefined) ui[i] = {};
|
||||
for (j in mode[lib.config.mode].ui[i]) {
|
||||
ui[i][j] = mode[lib.config.mode].ui[i][j];
|
||||
}
|
||||
}
|
||||
else {
|
||||
ui[i] = mode[lib.config.mode].ui[i];
|
||||
}
|
||||
}
|
||||
for (i in mode[lib.config.mode].game) {
|
||||
game[i] = mode[lib.config.mode].game[i];
|
||||
}
|
||||
for (i in mode[lib.config.mode].get) {
|
||||
get[i] = mode[lib.config.mode].get[i];
|
||||
}
|
||||
lib.init.start = mode[lib.config.mode].start;
|
||||
lib.init.startBefore = mode[lib.config.mode].startBefore;
|
||||
if (game.onwash) {
|
||||
lib.onwash.push(game.onwash);
|
||||
delete game.onwash;
|
||||
}
|
||||
if (game.onover) {
|
||||
lib.onover.push(game.onover);
|
||||
delete game.onover;
|
||||
}
|
||||
lib.config.banned = lib.config[lib.config.mode + '_banned'] || [];
|
||||
lib.config.bannedcards = lib.config[lib.config.mode + '_bannedcards'] || [];
|
||||
|
||||
lib.rank = window.noname_character_rank;
|
||||
delete window.noname_character_rank;
|
||||
for (i in mode[lib.config.mode]) {
|
||||
if (i == 'element') continue;
|
||||
if (i == 'game') continue;
|
||||
if (i == 'ai') continue;
|
||||
if (i == 'ui') continue;
|
||||
if (i == 'get') continue;
|
||||
if (i == 'config') continue;
|
||||
if (i == 'onreinit') continue;
|
||||
if (i == 'start') continue;
|
||||
if (i == 'startBefore') continue;
|
||||
if (lib[i] == undefined) lib[i] = (Array.isArray(mode[lib.config.mode][i])) ? [] : {};
|
||||
for (j in mode[lib.config.mode][i]) {
|
||||
lib[i][j] = mode[lib.config.mode][i][j];
|
||||
}
|
||||
}
|
||||
if (typeof mode[lib.config.mode].init == 'function') {
|
||||
mode[lib.config.mode].init();
|
||||
}
|
||||
|
||||
var connectCharacterPack = [];
|
||||
var connectCardPack = [];
|
||||
for (i in character) {
|
||||
if (character[i].character) {
|
||||
const characterPack = lib.characterPack[i];
|
||||
if (characterPack) Object.assign(characterPack, character[i].character);
|
||||
else lib.characterPack[i] = character[i].character;
|
||||
}
|
||||
for (j in character[i]) {
|
||||
if (j == 'mode' || j == 'forbid') continue;
|
||||
if (j == 'connect') {
|
||||
connectCharacterPack.push(i);
|
||||
continue;
|
||||
}
|
||||
if (j == 'character' && !lib.config.characters.includes(i) && lib.config.mode != 'connect') {
|
||||
if (lib.config.mode == 'chess' && get.config('chess_mode') == 'leader' && get.config('chess_leader_allcharacter')) {
|
||||
for (k in character[i][j]) {
|
||||
lib.hiddenCharacters.push(k);
|
||||
}
|
||||
}
|
||||
else if (lib.config.mode != 'boss' || i != 'boss') {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (Array.isArray(lib[j]) && Array.isArray(character[i][j])) {
|
||||
lib[j].addArray(character[i][j]);
|
||||
continue;
|
||||
}
|
||||
for (k in character[i][j]) {
|
||||
if (j == 'character') {
|
||||
if (!character[i][j][k][4]) {
|
||||
character[i][j][k][4] = [];
|
||||
}
|
||||
if (character[i][j][k][4].includes('boss') ||
|
||||
character[i][j][k][4].includes('hiddenboss')) {
|
||||
lib.config.forbidai.add(k);
|
||||
}
|
||||
if (lib.config.forbidai_user && lib.config.forbidai_user.includes(k)) {
|
||||
lib.config.forbidai.add(k);
|
||||
}
|
||||
for (var l = 0; l < character[i][j][k][3].length; l++) {
|
||||
lib.skilllist.add(character[i][j][k][3][l]);
|
||||
}
|
||||
}
|
||||
if (j == 'skill' && k[0] == '_' && (lib.config.mode != 'connect' ? (!lib.config.characters.includes(i)) : (!character[i].connect))) {
|
||||
continue;
|
||||
}
|
||||
if (j == 'translate' && k == i) {
|
||||
lib[j][k + '_character_config'] = character[i][j][k];
|
||||
}
|
||||
else {
|
||||
if (lib[j][k] == undefined) {
|
||||
if (j == 'skill' && !character[i][j][k].forceLoad && lib.config.mode == 'connect' && !character[i].connect) {
|
||||
lib[j][k] = {
|
||||
nopop: character[i][j][k].nopop,
|
||||
derivation: character[i][j][k].derivation
|
||||
};
|
||||
}
|
||||
else {
|
||||
Object.defineProperty(lib[j], k, Object.getOwnPropertyDescriptor(character[i][j], k));
|
||||
}
|
||||
if (j == 'card' && lib[j][k].derivation) {
|
||||
if (!lib.cardPack.mode_derivation) {
|
||||
lib.cardPack.mode_derivation = [k];
|
||||
}
|
||||
else {
|
||||
lib.cardPack.mode_derivation.push(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (Array.isArray(lib[j][k]) && Array.isArray(character[i][j][k])) {
|
||||
lib[j][k].addArray(character[i][j][k]);
|
||||
}
|
||||
else {
|
||||
console.log(
|
||||
`dublicate ${j} in character ${i}:\n${k}:\nlib.${j}.${k}`,
|
||||
lib[j][k],
|
||||
`\ncharacter.${i}.${j}.${k}`,
|
||||
character[i][j][k]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var connect_avatar_list = [];
|
||||
for (var i in lib.character) {
|
||||
connect_avatar_list.push(i);
|
||||
}
|
||||
connect_avatar_list.sort(lib.sort.capt);
|
||||
for (var i = 0; i < connect_avatar_list.length; i++) {
|
||||
var ia = connect_avatar_list[i];
|
||||
lib.mode.connect.config.connect_avatar.item[ia] = lib.translate[ia];
|
||||
}
|
||||
if (lib.config.mode != 'connect') {
|
||||
var pilecfg = lib.config.customcardpile[get.config('cardpilename') || '当前牌堆'];
|
||||
if (pilecfg) {
|
||||
lib.config.bannedpile = get.copy(pilecfg[0] || {});
|
||||
lib.config.addedpile = get.copy(pilecfg[1] || {});
|
||||
}
|
||||
else {
|
||||
lib.config.bannedpile = {};
|
||||
lib.config.addedpile = {};
|
||||
}
|
||||
}
|
||||
else {
|
||||
lib.cardPackList = {};
|
||||
}
|
||||
for (i in card) {
|
||||
const cardPack = lib.cardPack[i] ? lib.cardPack[i] : lib.cardPack[i] = [];
|
||||
if (card[i].card) {
|
||||
for (var j in card[i].card) {
|
||||
if (!card[i].card[j].hidden && card[i].translate[j + '_info']) {
|
||||
cardPack.push(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (j in card[i]) {
|
||||
if (j == 'mode' || j == 'forbid') continue;
|
||||
if (j == 'connect') {
|
||||
connectCardPack.push(i);
|
||||
continue;
|
||||
}
|
||||
if (j == 'list') {
|
||||
if (lib.config.mode == 'connect') {
|
||||
const cardPackList = lib.cardPackList[i];
|
||||
if (cardPackList) cardPackList.addArray(card[i][j]);
|
||||
else lib.cardPackList[i] = card[i][j];
|
||||
}
|
||||
else {
|
||||
if (lib.config.cards.includes(i)) {
|
||||
var pile;
|
||||
if (typeof card[i][j] == 'function') {
|
||||
pile = card[i][j]();
|
||||
}
|
||||
else {
|
||||
pile = card[i][j];
|
||||
}
|
||||
const cardPile = lib.cardPile[i];
|
||||
if (cardPile) cardPile.addArray(pile);
|
||||
else lib.cardPile[i] = pile.slice(0);
|
||||
if (lib.config.bannedpile[i]) {
|
||||
for (var k = 0; k < lib.config.bannedpile[i].length; k++) {
|
||||
pile[lib.config.bannedpile[i][k]] = null;
|
||||
}
|
||||
}
|
||||
for (var k = 0; k < pile.length; k++) {
|
||||
if (!pile[k]) {
|
||||
pile.splice(k--, 1);
|
||||
}
|
||||
}
|
||||
if (lib.config.addedpile[i]) {
|
||||
for (var k = 0; k < lib.config.addedpile[i].length; k++) {
|
||||
pile.push(lib.config.addedpile[i][k]);
|
||||
}
|
||||
}
|
||||
lib.card.list.addArray(pile);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (k in card[i][j]) {
|
||||
if (j == 'skill' && k[0] == '_' && !card[i][j][k].forceLoad && (lib.config.mode != 'connect' ? (!lib.config.cards.includes(i)) : (!card[i].connect))) {
|
||||
continue;
|
||||
}
|
||||
if (j == 'translate' && k == i) {
|
||||
lib[j][k + '_card_config'] = card[i][j][k];
|
||||
}
|
||||
else {
|
||||
if (lib[j][k] == undefined) {
|
||||
if (j == 'skill' && !card[i][j][k].forceLoad && lib.config.mode == 'connect' && !card[i].connect) {
|
||||
lib[j][k] = {
|
||||
nopop: card[i][j][k].nopop,
|
||||
derivation: card[i][j][k].derivation
|
||||
};
|
||||
}
|
||||
else {
|
||||
Object.defineProperty(lib[j], k, Object.getOwnPropertyDescriptor(card[i][j], k));
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log(
|
||||
`dublicate ${j} in card ${i}:\n${k}:\nlib.${j}.${k}`,
|
||||
lib[j][k],
|
||||
`\ncard.${i}.${j}.${k}`,
|
||||
card[i][j][k]
|
||||
);
|
||||
}
|
||||
if (j == 'card' && lib[j][k].derivation) {
|
||||
if (!lib.cardPack.mode_derivation) {
|
||||
lib.cardPack.mode_derivation = [k];
|
||||
}
|
||||
else {
|
||||
lib.cardPack.mode_derivation.push(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (lib.cardPack.mode_derivation) {
|
||||
for (var i = 0; i < lib.cardPack.mode_derivation.length; i++) {
|
||||
if (typeof lib.card[lib.cardPack.mode_derivation[i]].derivation == 'string' && !lib.character[lib.card[lib.cardPack.mode_derivation[i]].derivation]) {
|
||||
lib.cardPack.mode_derivation.splice(i--, 1);
|
||||
}
|
||||
else if (typeof lib.card[lib.cardPack.mode_derivation[i]].derivationpack == 'string' && !lib.config.cards.includes(lib.card[lib.cardPack.mode_derivation[i]].derivationpack)) {
|
||||
lib.cardPack.mode_derivation.splice(i--, 1);
|
||||
}
|
||||
}
|
||||
if (lib.cardPack.mode_derivation.length == 0) {
|
||||
delete lib.cardPack.mode_derivation;
|
||||
}
|
||||
}
|
||||
if (lib.config.mode != 'connect') {
|
||||
for (i in play) {
|
||||
if (lib.config.hiddenPlayPack.includes(i)) continue;
|
||||
if (play[i].forbid && play[i].forbid.includes(lib.config.mode)) continue;
|
||||
if (play[i].mode && play[i].mode.includes(lib.config.mode) == false) continue;
|
||||
for (j in play[i].element) {
|
||||
if (!lib.element[j]) lib.element[j] = [];
|
||||
for (k in play[i].element[j]) {
|
||||
if (k == 'init') {
|
||||
if (!lib.element[j].inits) lib.element[j].inits = [];
|
||||
lib.element[j].inits.push(play[i].element[j][k]);
|
||||
}
|
||||
else {
|
||||
lib.element[j][k] = play[i].element[j][k];
|
||||
}
|
||||
}
|
||||
}
|
||||
for (j in play[i].ui) {
|
||||
if (typeof play[i].ui[j] == 'object') {
|
||||
if (ui[j] == undefined) ui[j] = {};
|
||||
for (k in play[i].ui[j]) {
|
||||
ui[j][k] = play[i].ui[j][k];
|
||||
}
|
||||
}
|
||||
else {
|
||||
ui[j] = play[i].ui[j];
|
||||
}
|
||||
}
|
||||
for (j in play[i].game) {
|
||||
game[j] = play[i].game[j];
|
||||
}
|
||||
for (j in play[i].get) {
|
||||
get[j] = play[i].get[j];
|
||||
}
|
||||
for (j in play[i]) {
|
||||
if (j == 'mode' || j == 'forbid' || j == 'init' || j == 'element' ||
|
||||
j == 'game' || j == 'get' || j == 'ui' || j == 'arenaReady') continue;
|
||||
for (k in play[i][j]) {
|
||||
if (j == 'translate' && k == i) {
|
||||
// lib[j][k+'_play_config']=play[i][j][k];
|
||||
}
|
||||
else {
|
||||
if (lib[j][k] != undefined) {
|
||||
console.log(
|
||||
`dublicate ${j} in play ${i}:\n${k}:\nlib.${j}.${k}`,
|
||||
lib[j][k],
|
||||
`\nplay.${i}.${j}.${k}`,
|
||||
play[i][j][k]
|
||||
);
|
||||
}
|
||||
lib[j][k] = play[i][j][k];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (typeof play[i].init == 'function') play[i].init();
|
||||
if (typeof play[i].arenaReady == 'function') lib.arenaReady.push(play[i].arenaReady);
|
||||
}
|
||||
}
|
||||
|
||||
lib.connectCharacterPack = [];
|
||||
lib.connectCardPack = [];
|
||||
for (var i = 0; i < lib.config.all.characters.length; i++) {
|
||||
var packname = lib.config.all.characters[i];
|
||||
if (connectCharacterPack.includes(packname)) {
|
||||
lib.connectCharacterPack.push(packname)
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < lib.config.all.cards.length; i++) {
|
||||
var packname = lib.config.all.cards[i];
|
||||
if (connectCardPack.includes(packname)) {
|
||||
lib.connectCardPack.push(packname)
|
||||
}
|
||||
}
|
||||
if (lib.config.mode != 'connect') {
|
||||
for (i = 0; i < lib.card.list.length; i++) {
|
||||
if (lib.card.list[i][2] == 'huosha') {
|
||||
lib.card.list[i] = lib.card.list[i].slice(0);
|
||||
lib.card.list[i][2] = 'sha';
|
||||
lib.card.list[i][3] = 'fire';
|
||||
}
|
||||
else if (lib.card.list[i][2] == 'leisha') {
|
||||
lib.card.list[i] = lib.card.list[i].slice(0);
|
||||
lib.card.list[i][2] = 'sha';
|
||||
lib.card.list[i][3] = 'thunder';
|
||||
}
|
||||
if (!lib.card[lib.card.list[i][2]]) {
|
||||
lib.card.list.splice(i, 1); i--;
|
||||
}
|
||||
else if (lib.card[lib.card.list[i][2]].mode &&
|
||||
lib.card[lib.card.list[i][2]].mode.includes(lib.config.mode) == false) {
|
||||
lib.card.list.splice(i, 1); i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lib.config.mode == 'connect') {
|
||||
_status.connectMode = true;
|
||||
}
|
||||
if (window.isNonameServer) {
|
||||
lib.cheat.i();
|
||||
}
|
||||
else if (lib.config.dev && (!_status.connectMode || lib.config.debug)) {
|
||||
lib.cheat.i();
|
||||
}
|
||||
lib.config.sort_card = get.sortCard(lib.config.sort);
|
||||
delete lib.imported.character;
|
||||
delete lib.imported.card;
|
||||
delete lib.imported.mode;
|
||||
delete lib.imported.play;
|
||||
for (var i in lib.init) {
|
||||
if (i.startsWith('setMode_')) {
|
||||
delete lib.init[i];
|
||||
}
|
||||
}
|
||||
if (!_status.connectMode) {
|
||||
for (var i = 0; i < lib.extensions.length; i++) {
|
||||
try {
|
||||
_status.extension = lib.extensions[i][0];
|
||||
_status.evaluatingExtension = lib.extensions[i][3];
|
||||
if (typeof lib.extensions[i][1] == "function")
|
||||
await (gnc.is.coroutine(lib.extensions[i][1]) ? gnc.of(lib.extensions[i][1]) : lib.extensions[i][1]).call(lib.extensions[i], lib.extensions[i][2], lib.extensions[i][4]);
|
||||
if (lib.extensions[i][4]) {
|
||||
if (lib.extensions[i][4].character) {
|
||||
for (var j in lib.extensions[i][4].character.character) {
|
||||
game.addCharacterPack(get.copy(lib.extensions[i][4].character));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (lib.extensions[i][4].card) {
|
||||
for (var j in lib.extensions[i][4].card.card) {
|
||||
game.addCardPack(get.copy(lib.extensions[i][4].card));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (lib.extensions[i][4].skill) {
|
||||
for (var j in lib.extensions[i][4].skill.skill) {
|
||||
game.addSkill(j, lib.extensions[i][4].skill.skill[j],
|
||||
lib.extensions[i][4].skill.translate[j],
|
||||
lib.extensions[i][4].skill.translate[j + '_info'],
|
||||
lib.extensions[i][4].skill.translate[j + '_append'],
|
||||
lib.extensions[i][4].skill.translate[j + '_ab']);
|
||||
}
|
||||
}
|
||||
}
|
||||
delete _status.extension;
|
||||
delete _status.evaluatingExtension;
|
||||
}
|
||||
catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
delete lib.extensions;
|
||||
|
||||
if (lib.init.startBefore) {
|
||||
lib.init.startBefore();
|
||||
delete lib.init.startBefore;
|
||||
}
|
||||
ui.create.arena();
|
||||
game.createEvent('game', false).setContent(lib.init.start);
|
||||
if (lib.mode[lib.config.mode] && lib.mode[lib.config.mode].fromextension) {
|
||||
var startstr = mode[lib.config.mode].start.toString();
|
||||
if (startstr.indexOf('onfree') == -1) {
|
||||
setTimeout(lib.init.onfree, 500);
|
||||
}
|
||||
}
|
||||
delete lib.init.start;
|
||||
if (Array.isArray(_status.onprepare) && _status.onprepare.length) {
|
||||
await Promise.allSettled(_status.onprepare);
|
||||
delete _status.onprepare;
|
||||
}
|
||||
game.loop();
|
||||
};
|
||||
const proceed = async () => {
|
||||
if (!lib.db) {
|
||||
try {
|
||||
lib.storage = JSON.parse(localStorage.getItem(lib.configprefix + lib.config.mode));
|
||||
if (typeof lib.storage !== 'object') throw ('err');
|
||||
if (lib.storage === null) throw ('err');
|
||||
} catch (err) {
|
||||
lib.storage = {};
|
||||
localStorage.setItem(lib.configprefix + lib.config.mode, "{}");
|
||||
}
|
||||
await proceed2();
|
||||
}
|
||||
else {
|
||||
await game.getDB('data', lib.config.mode, async (obj) => {
|
||||
lib.storage = obj || {};
|
||||
await proceed2();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
if (!lib.imported.mode || !lib.imported.mode[lib.config.mode]) {
|
||||
window.inSplash = true;
|
||||
clearTimeout(resetGameTimeout);
|
||||
let clickedNode = false;
|
||||
const clickNode = function () {
|
||||
if (clickedNode) return;
|
||||
this.classList.add('clicked');
|
||||
clickedNode = true;
|
||||
lib.config.mode = this.link;
|
||||
game.saveConfig('mode', this.link);
|
||||
if (this.link === 'connect') {
|
||||
localStorage.setItem(lib.configprefix + 'directstart', true);
|
||||
game.reload();
|
||||
}
|
||||
else {
|
||||
if (game.layout != 'mobile' && lib.layoutfixed.indexOf(lib.config.mode) !== -1) {
|
||||
game.layout = 'mobile';
|
||||
ui.css.layout.href = lib.assetURL + 'layout/' + game.layout + '/layout.css';
|
||||
}
|
||||
else if (game.layout == 'mobile' && lib.config.layout != 'mobile' && lib.layoutfixed.indexOf(lib.config.mode) === -1) {
|
||||
game.layout = lib.config.layout;
|
||||
if (game.layout == 'default') {
|
||||
ui.css.layout.href = '';
|
||||
}
|
||||
else {
|
||||
ui.css.layout.href = lib.assetURL + 'layout/' + game.layout + '/layout.css';
|
||||
}
|
||||
}
|
||||
splash.delete(1000);
|
||||
delete window.inSplash;
|
||||
// 这不好删/m/,顺带lib.init.reset也不好删
|
||||
window.resetGameTimeout = setTimeout(lib.init.reset, 10000);
|
||||
|
||||
this.listenTransition(function () {
|
||||
lib.init.js(lib.assetURL + 'mode', lib.config.mode, proceed);
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
var downNode = function () {
|
||||
this.classList.add('glow');
|
||||
}
|
||||
var upNode = function () {
|
||||
this.classList.remove('glow');
|
||||
}
|
||||
var splash = ui.create.div('#splash', document.body);
|
||||
if (lib.config.touchscreen) {
|
||||
splash.classList.add('touch');
|
||||
lib.setScroll(splash);
|
||||
}
|
||||
if (lib.config.player_border != 'wide') {
|
||||
splash.classList.add('slim');
|
||||
}
|
||||
splash.dataset.radius_size = lib.config.radius_size;
|
||||
for (var i = 0; i < lib.config.all.mode.length; i++) {
|
||||
var node = ui.create.div('.hidden', splash, clickNode);
|
||||
node.link = lib.config.all.mode[i];
|
||||
ui.create.div(node, '.splashtext', get.verticalStr(get.translation(lib.config.all.mode[i])));
|
||||
if (lib.config.all.stockmode.includes(lib.config.all.mode[i])) {
|
||||
// 初始启动页设置
|
||||
if (lib.config.splash_style == undefined) game.saveConfig('splash_style', 'style1');
|
||||
splash.dataset.splash_style = lib.config.splash_style;
|
||||
// 扩展可通过window.splashurl设置素材读取路径
|
||||
if (window.splashurl == undefined) window.splashurl = 'image/splash/';
|
||||
if (lib.config.splash_style == 'style1' || lib.config.splash_style == 'style2') {
|
||||
ui.create.div(node, '.avatar').setBackgroundImage('image/splash/' + lib.config.splash_style + '/' + lib.config.all.mode[i] + '.jpg');
|
||||
} else {
|
||||
ui.create.div(node, '.avatar').setBackgroundImage(splashurl + lib.config.splash_style + '/' + lib.config.all.mode[i] + '.jpg');
|
||||
}
|
||||
}
|
||||
else {
|
||||
var avatarnode = ui.create.div(node, '.avatar');
|
||||
var avatarbg = lib.mode[lib.config.all.mode[i]].splash;
|
||||
if (avatarbg.startsWith('ext:')) {
|
||||
avatarnode.setBackgroundImage(avatarbg.replace(/^ext:/, 'extension/'));
|
||||
}
|
||||
else {
|
||||
avatarnode.setBackgroundDB(avatarbg);
|
||||
}
|
||||
}
|
||||
if (!lib.config.touchscreen) {
|
||||
node.addEventListener('mousedown', downNode);
|
||||
node.addEventListener('mouseup', upNode);
|
||||
node.addEventListener('mouseleave', upNode);
|
||||
}
|
||||
setTimeout((function (node) {
|
||||
return function () {
|
||||
node.show();
|
||||
}
|
||||
}(node)), i * 100);
|
||||
}
|
||||
if (lib.config.mousewheel) {
|
||||
splash.onmousewheel = ui.click.mousewheel;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Reflect.set(window, 'resetGameTimeout', resetGameTimeout);
|
||||
proceed().then(lib.other.ignore);
|
||||
}
|
||||
localStorage.removeItem(lib.configprefix + 'directstart');
|
||||
|
||||
const libOnload2 = lib.onload2;
|
||||
delete lib.onload2;
|
||||
await runCustomContents(libOnload2)
|
||||
}
|
||||
|
||||
async function createBackground() {
|
||||
ui.background = ui.create.div('.background');
|
||||
ui.background.style.backgroundSize = "cover";
|
||||
ui.background.style.backgroundPosition = '50% 50%';
|
||||
|
||||
document.documentElement.style.backgroundImage = '';
|
||||
document.documentElement.style.backgroundSize = '';
|
||||
document.documentElement.style.backgroundPosition = '';
|
||||
document.body.insertBefore(ui.background, document.body.firstChild);
|
||||
document.body.onresize = ui.updatexr;
|
||||
|
||||
if (!lib.config.image_background) return;
|
||||
if (lib.config.image_background === 'default') return
|
||||
|
||||
let url = `url("${lib.assetURL}image/background/${lib.config.image_background}.jpg")`;
|
||||
|
||||
if (lib.config.image_background.startsWith('custom_')) {
|
||||
try {
|
||||
const fileToLoad = await game.getDB('image', lib.config.image_background);
|
||||
const fileReader = new FileReader();
|
||||
const fileLoadedEvent = await Promise((resolve) => {
|
||||
fileReader.onload = resolve;
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
})
|
||||
const data = fileLoadedEvent.target.result;
|
||||
url = `url("${data}")`;
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
url = "none";
|
||||
}
|
||||
}
|
||||
|
||||
ui.background.style.backgroundImage = url;
|
||||
if (lib.config.image_background_blur) {
|
||||
ui.background.style.filter = 'blur(8px)';
|
||||
ui.background.style.webkitFilter = 'blur(8px)';
|
||||
ui.background.style.transform = 'scale(1.05)';
|
||||
}
|
||||
}
|
||||
|
||||
function createTouchDraggedFilter() {
|
||||
document.body.addEventListener('touchstart', function (e) {
|
||||
this.startX = e.touches[0].clientX / game.documentZoom;
|
||||
this.startY = e.touches[0].clientY / game.documentZoom;
|
||||
_status.dragged = false;
|
||||
});
|
||||
document.body.addEventListener('touchmove', function (e) {
|
||||
if (_status.dragged) return;
|
||||
if (Math.abs(e.touches[0].clientX / game.documentZoom - this.startX) > 10 ||
|
||||
Math.abs(e.touches[0].clientY / game.documentZoom - this.startY) > 10) {
|
||||
_status.dragged = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @async
|
||||
* @param {(() => void | GeneratorFunction)[]} contents
|
||||
*/
|
||||
function runCustomContents(contents) {
|
||||
if (!Array.isArray(contents)) return
|
||||
|
||||
const tasks = contents
|
||||
.filter((fn) => typeof fn === "function")
|
||||
.map((fn) => gnc.is.generatorFunc(fn) ? gnc.of(fn) : fn) // 将生成器函数转换成genCoroutin
|
||||
.map((fn) => fn())
|
||||
|
||||
|
||||
return Promise
|
||||
.allSettled(tasks)
|
||||
.then((results) => {
|
||||
results.forEach((result) => {
|
||||
if (result.status === "rejected") {
|
||||
console.error(result.reason)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
|
||||
/**
|
||||
* @template T
|
||||
*/
|
||||
export class Channel {
|
||||
/**
|
||||
* @template U
|
||||
* @typedef {(value?: U | PromiseLike<U>) => void} PromiseResolve
|
||||
*/
|
||||
constructor() {
|
||||
/**
|
||||
* @type {"active" | "receiving" | "sending"}
|
||||
*/
|
||||
this.status = "active";
|
||||
|
||||
/**
|
||||
* @type {PromiseResolve<T> | [T, PromiseResolve<void>] | null}
|
||||
*/
|
||||
this._buffer = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 向该频道发送消息,在消息未被接受前将等待
|
||||
*
|
||||
* @param {T} value - 要发送的消息
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
send(value) {
|
||||
return new Promise((resolve, reject) => {
|
||||
switch (this.status) {
|
||||
case "sending":
|
||||
// TODO: handle the error.
|
||||
reject(new Error());
|
||||
break;
|
||||
case "receiving": {
|
||||
/**
|
||||
* @type {PromiseResolve<T>}
|
||||
*/
|
||||
// @ts-ignore
|
||||
const buffer = this._buffer;
|
||||
this._buffer = null;
|
||||
buffer(value);
|
||||
this.status = "active";
|
||||
resolve();
|
||||
break;
|
||||
}
|
||||
case "active":
|
||||
this.status = "sending";
|
||||
this._buffer = [value, resolve];
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 接收频道所发送的消息,若无消息发送则等待
|
||||
*
|
||||
* @returns {Promise<T>} 接收到的消息
|
||||
*/
|
||||
receive() {
|
||||
return new Promise((resolve, reject) => {
|
||||
switch (this.status) {
|
||||
case "receiving":
|
||||
// TODO: handle the error.
|
||||
reject(new Error());
|
||||
break;
|
||||
case "sending": {
|
||||
/**
|
||||
* @type {[T, PromiseResolve<void>]}
|
||||
*/
|
||||
// @ts-ignore
|
||||
const buffer = this._buffer;
|
||||
this._buffer = null;
|
||||
resolve(buffer[0]);
|
||||
this.status = "active";
|
||||
buffer[1]();
|
||||
break;
|
||||
}
|
||||
case "active":
|
||||
this.status = "receiving";
|
||||
// @ts-ignore
|
||||
this._buffer = resolve;
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -6666,7 +6666,7 @@ export const Content = {
|
|||
ui.clear();
|
||||
},
|
||||
draw: async (event, _trigger, player) => {
|
||||
const { num } = event;
|
||||
let { num } = event;
|
||||
// if(lib.config.background_audio){
|
||||
// game.playAudio('effect','draw');
|
||||
// }
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
import { Uninstantable } from "../../util/index.js";
|
||||
|
||||
export class Experimental extends Uninstantable {
|
||||
|
||||
}
|
|
@ -18,6 +18,8 @@ import { GNC as gnc } from '../gnc/index.js';
|
|||
|
||||
import { LibInit } from "./init/index.js";
|
||||
import { Announce } from "./announce/index.js";
|
||||
import { Channel } from "./channel/index.js";
|
||||
import { Experimental } from "./experimental/index.js";
|
||||
import * as Element from "./element/index.js";
|
||||
|
||||
|
||||
|
@ -118,6 +120,7 @@ export class Library extends Uninstantable {
|
|||
this.playerOL;
|
||||
throw new Error('Do not call this method');
|
||||
}
|
||||
|
||||
//函数钩子
|
||||
static hooks = {
|
||||
// 本体势力的颜色
|
||||
|
@ -299,6 +302,7 @@ export class Library extends Uninstantable {
|
|||
}
|
||||
}],
|
||||
};
|
||||
|
||||
/**
|
||||
* **无名杀频道推送机制**
|
||||
*
|
||||
|
@ -310,7 +314,6 @@ export class Library extends Uninstantable {
|
|||
*
|
||||
* 若需要异步/不报错发送信息,请等待`lib.actor`
|
||||
*
|
||||
* @template T
|
||||
* @example
|
||||
* // 创建一个频道
|
||||
* const channel = new lib.channel();
|
||||
|
@ -321,88 +324,8 @@ export class Library extends Uninstantable {
|
|||
* // 从某个角落向channel发消息,若无消息接收则等待
|
||||
* await channel.send(item);
|
||||
*/
|
||||
static channel = class {
|
||||
/**
|
||||
* @template TValue
|
||||
* @callback PromiseResolve
|
||||
* @param {TValue} value
|
||||
* @returns {void}
|
||||
*/
|
||||
constructor() {
|
||||
/**
|
||||
* @type {"active" | "receiving" | "sending"}
|
||||
*/
|
||||
this.status = "active";
|
||||
static channel = Channel;
|
||||
|
||||
/**
|
||||
* @type {PromiseResolve<T> | [T, PromiseResolve<void>] | null}
|
||||
*/
|
||||
this._buffer = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 向该频道发送消息,在消息未被接受前将等待
|
||||
*
|
||||
* @param {T} value - 要发送的消息
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
send(value) {
|
||||
return new Promise((resolve, reject) => {
|
||||
switch (this.status) {
|
||||
case "sending":
|
||||
// TODO: handle the error.
|
||||
reject(new Error());
|
||||
break;
|
||||
case "receiving": {
|
||||
/**
|
||||
* @type {PromiseResolve<T>}
|
||||
*/
|
||||
const buffer = this._buffer;
|
||||
this._buffer = null;
|
||||
buffer(value);
|
||||
this.status = "active";
|
||||
resolve();
|
||||
break;
|
||||
}
|
||||
case "active":
|
||||
this.status = "sending";
|
||||
this._buffer = [value, resolve];
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 接收频道所发送的消息,若无消息发送则等待
|
||||
*
|
||||
* @returns {Promise<T>} 接收到的消息
|
||||
*/
|
||||
receive() {
|
||||
return new Promise((resolve, reject) => {
|
||||
switch (this.status) {
|
||||
case "receiving":
|
||||
// TODO: handle the error.
|
||||
reject(new Error());
|
||||
break;
|
||||
case "sending": {
|
||||
/**
|
||||
* @type {[T, PromiseResolve<void>]}
|
||||
*/
|
||||
const buffer = this._buffer;
|
||||
this._buffer = null;
|
||||
resolve(buffer[0]);
|
||||
this.status = "active";
|
||||
buffer[1]();
|
||||
break;
|
||||
}
|
||||
case "active":
|
||||
this.status = "receiving";
|
||||
this._buffer = resolve;
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
/**
|
||||
* **无名杀消息推送库**
|
||||
*
|
||||
|
@ -429,6 +352,7 @@ export class Library extends Uninstantable {
|
|||
* lib.announce.unsubscribe("skinChange", method);
|
||||
*/
|
||||
static announce = new Announce(new EventTarget(), new WeakMap());
|
||||
|
||||
static objectURL = new Map();
|
||||
static hookmap = {};
|
||||
static imported = {};
|
||||
|
@ -9470,6 +9394,9 @@ export class Library extends Uninstantable {
|
|||
stratagem_fury: '怒气',
|
||||
_stratagem_add_buff: '强化'
|
||||
};
|
||||
|
||||
static experimental = Experimental
|
||||
|
||||
static element = {
|
||||
content: Element.Content,
|
||||
contents: Element.Contents,
|
||||
|
|
|
@ -16,7 +16,7 @@ export class LibInit extends Uninstantable {
|
|||
static promises = LibInitPromises
|
||||
|
||||
static init() {
|
||||
return;
|
||||
throw new Error('lib.init.init is moved to noname/init')
|
||||
}
|
||||
|
||||
static reset() {
|
||||
|
@ -80,800 +80,9 @@ export class LibInit extends Uninstantable {
|
|||
}
|
||||
}
|
||||
|
||||
//lib.onload支持传入GeneratorFunction以解决异步函数的问题 by诗笺
|
||||
// 现在改lib.init.onload的都给我无报错被创
|
||||
static async onload() {
|
||||
const libOnload = lib.onload;
|
||||
delete lib.onload;
|
||||
while (Array.isArray(libOnload) && libOnload.length) {
|
||||
const fun = libOnload.shift();
|
||||
if (typeof fun !== "function") continue;
|
||||
await (gnc.is.generatorFunc(fun) ? gnc.of(fun) : fun)();
|
||||
}
|
||||
ui.updated();
|
||||
game.documentZoom = game.deviceZoom;
|
||||
if (game.documentZoom != 1) {
|
||||
ui.updatez();
|
||||
}
|
||||
ui.background = ui.create.div('.background');
|
||||
ui.background.style.backgroundSize = "cover";
|
||||
ui.background.style.backgroundPosition = '50% 50%';
|
||||
if (lib.config.image_background && lib.config.image_background != 'default' && !lib.config.image_background.startsWith('custom_')) {
|
||||
ui.background.setBackgroundImage('image/background/' + lib.config.image_background + '.jpg');
|
||||
if (lib.config.image_background_blur) {
|
||||
ui.background.style.filter = 'blur(8px)';
|
||||
ui.background.style.webkitFilter = 'blur(8px)';
|
||||
ui.background.style.transform = 'scale(1.05)';
|
||||
}
|
||||
}
|
||||
document.documentElement.style.backgroundImage = '';
|
||||
document.documentElement.style.backgroundSize = '';
|
||||
document.documentElement.style.backgroundPosition = '';
|
||||
document.body.insertBefore(ui.background, document.body.firstChild);
|
||||
document.body.onresize = ui.updatexr;
|
||||
if (lib.config.touchscreen) {
|
||||
document.body.addEventListener('touchstart', function (e) {
|
||||
this.startX = e.touches[0].clientX / game.documentZoom;
|
||||
this.startY = e.touches[0].clientY / game.documentZoom;
|
||||
_status.dragged = false;
|
||||
});
|
||||
document.body.addEventListener('touchmove', function (e) {
|
||||
if (_status.dragged) return;
|
||||
if (Math.abs(e.touches[0].clientX / game.documentZoom - this.startX) > 10 ||
|
||||
Math.abs(e.touches[0].clientY / game.documentZoom - this.startY) > 10) {
|
||||
_status.dragged = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (lib.config.image_background.startsWith('custom_')) {
|
||||
ui.background.style.backgroundImage = "none";
|
||||
game.getDB('image', lib.config.image_background, function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
var data = fileLoadedEvent.target.result;
|
||||
ui.background.style.backgroundImage = 'url(' + data + ')';
|
||||
if (lib.config.image_background_blur) {
|
||||
ui.background.style.filter = 'blur(8px)';
|
||||
ui.background.style.webkitFilter = 'blur(8px)';
|
||||
ui.background.style.transform = 'scale(1.05)';
|
||||
}
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.card_style == 'custom') {
|
||||
game.getDB('image', 'card_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.card_stylesheet) {
|
||||
ui.css.card_stylesheet.remove();
|
||||
}
|
||||
ui.css.card_stylesheet = lib.init.sheet('.card:not(*:empty){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.cardback_style == 'custom') {
|
||||
game.getDB('image', 'cardback_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.cardback_stylesheet) {
|
||||
ui.css.cardback_stylesheet.remove();
|
||||
}
|
||||
ui.css.cardback_stylesheet = lib.init.sheet('.card:empty,.card.infohidden{background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
game.getDB('image', 'cardback_style2', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.cardback_stylesheet2) {
|
||||
ui.css.cardback_stylesheet2.remove();
|
||||
}
|
||||
ui.css.cardback_stylesheet2 = lib.init.sheet('.card.infohidden:not(.infoflip){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.hp_style == 'custom') {
|
||||
game.getDB('image', 'hp_style1', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.hp_stylesheet1) {
|
||||
ui.css.hp_stylesheet1.remove();
|
||||
}
|
||||
ui.css.hp_stylesheet1 = lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="high"]>div:not(.lost){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
game.getDB('image', 'hp_style2', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.hp_stylesheet2) {
|
||||
ui.css.hp_stylesheet2.remove();
|
||||
}
|
||||
ui.css.hp_stylesheet2 = lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="mid"]>div:not(.lost){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
game.getDB('image', 'hp_style3', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.hp_stylesheet3) {
|
||||
ui.css.hp_stylesheet3.remove();
|
||||
}
|
||||
ui.css.hp_stylesheet3 = lib.init.sheet('.hp:not(.text):not(.actcount)[data-condition="low"]>div:not(.lost){background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
game.getDB('image', 'hp_style4', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.hp_stylesheet4) {
|
||||
ui.css.hp_stylesheet4.remove();
|
||||
}
|
||||
ui.css.hp_stylesheet4 = lib.init.sheet('.hp:not(.text):not(.actcount)>.lost{background-image:url(' + fileLoadedEvent.target.result + ')}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.player_style == 'custom') {
|
||||
ui.css.player_stylesheet = lib.init.sheet('#window .player{background-image:none;background-size:100% 100%;}');
|
||||
game.getDB('image', 'player_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.player_stylesheet) {
|
||||
ui.css.player_stylesheet.remove();
|
||||
}
|
||||
ui.css.player_stylesheet = lib.init.sheet('#window .player{background-image:url("' + fileLoadedEvent.target.result + '");background-size:100% 100%;}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.border_style == 'custom') {
|
||||
game.getDB('image', 'border_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.border_stylesheet) {
|
||||
ui.css.border_stylesheet.remove();
|
||||
}
|
||||
ui.css.border_stylesheet = lib.init.sheet();
|
||||
ui.css.border_stylesheet.sheet.insertRule('#window .player>.framebg{display:block;background-image:url("' + fileLoadedEvent.target.result + '")}', 0);
|
||||
ui.css.border_stylesheet.sheet.insertRule('.player>.count{z-index: 3 !important;border-radius: 2px !important;text-align: center !important;}', 0);
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.control_style == 'custom') {
|
||||
game.getDB('image', 'control_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.control_stylesheet) {
|
||||
ui.css.control_stylesheet.remove();
|
||||
}
|
||||
ui.css.control_stylesheet = lib.init.sheet('#window .control,.menubutton:not(.active):not(.highlight):not(.red):not(.blue),#window #system>div>div{background-image:url("' + fileLoadedEvent.target.result + '")}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
if (lib.config.menu_style == 'custom') {
|
||||
game.getDB('image', 'menu_style', function (fileToLoad) {
|
||||
if (!fileToLoad) return;
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function (fileLoadedEvent) {
|
||||
if (ui.css.menu_stylesheet) {
|
||||
ui.css.menu_stylesheet.remove();
|
||||
}
|
||||
ui.css.menu_stylesheet = lib.init.sheet('html #window>.dialog.popped,html .menu,html .menubg{background-image:url("' + fileLoadedEvent.target.result + '");background-size:cover}');
|
||||
};
|
||||
fileReader.readAsDataURL(fileToLoad, "UTF-8");
|
||||
});
|
||||
}
|
||||
|
||||
var proceed2 = async () => {
|
||||
var mode = lib.imported.mode;
|
||||
var card = lib.imported.card;
|
||||
var character = lib.imported.character;
|
||||
var play = lib.imported.play;
|
||||
delete window.game;
|
||||
var i, j, k;
|
||||
for (i in mode[lib.config.mode].element) {
|
||||
if (!lib.element[i]) lib.element[i] = [];
|
||||
for (j in mode[lib.config.mode].element[i]) {
|
||||
if (j == 'init') {
|
||||
if (!lib.element[i].inits) lib.element[i].inits = [];
|
||||
lib.element[i].inits.push(mode[lib.config.mode].element[i][j]);
|
||||
}
|
||||
else {
|
||||
lib.element[i][j] = mode[lib.config.mode].element[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i in mode[lib.config.mode].ai) {
|
||||
if (typeof mode[lib.config.mode].ai[i] == 'object') {
|
||||
if (ai[i] == undefined) ai[i] = {};
|
||||
for (j in mode[lib.config.mode].ai[i]) {
|
||||
ai[i][j] = mode[lib.config.mode].ai[i][j];
|
||||
}
|
||||
}
|
||||
else {
|
||||
ai[i] = mode[lib.config.mode].ai[i];
|
||||
}
|
||||
}
|
||||
for (i in mode[lib.config.mode].ui) {
|
||||
if (typeof mode[lib.config.mode].ui[i] == 'object') {
|
||||
if (ui[i] == undefined) ui[i] = {};
|
||||
for (j in mode[lib.config.mode].ui[i]) {
|
||||
ui[i][j] = mode[lib.config.mode].ui[i][j];
|
||||
}
|
||||
}
|
||||
else {
|
||||
ui[i] = mode[lib.config.mode].ui[i];
|
||||
}
|
||||
}
|
||||
for (i in mode[lib.config.mode].game) {
|
||||
game[i] = mode[lib.config.mode].game[i];
|
||||
}
|
||||
for (i in mode[lib.config.mode].get) {
|
||||
get[i] = mode[lib.config.mode].get[i];
|
||||
}
|
||||
lib.init.start = mode[lib.config.mode].start;
|
||||
lib.init.startBefore = mode[lib.config.mode].startBefore;
|
||||
if (game.onwash) {
|
||||
lib.onwash.push(game.onwash);
|
||||
delete game.onwash;
|
||||
}
|
||||
if (game.onover) {
|
||||
lib.onover.push(game.onover);
|
||||
delete game.onover;
|
||||
}
|
||||
lib.config.banned = lib.config[lib.config.mode + '_banned'] || [];
|
||||
lib.config.bannedcards = lib.config[lib.config.mode + '_bannedcards'] || [];
|
||||
|
||||
lib.rank = window.noname_character_rank;
|
||||
delete window.noname_character_rank;
|
||||
for (i in mode[lib.config.mode]) {
|
||||
if (i == 'element') continue;
|
||||
if (i == 'game') continue;
|
||||
if (i == 'ai') continue;
|
||||
if (i == 'ui') continue;
|
||||
if (i == 'get') continue;
|
||||
if (i == 'config') continue;
|
||||
if (i == 'onreinit') continue;
|
||||
if (i == 'start') continue;
|
||||
if (i == 'startBefore') continue;
|
||||
if (lib[i] == undefined) lib[i] = (Array.isArray(mode[lib.config.mode][i])) ? [] : {};
|
||||
for (j in mode[lib.config.mode][i]) {
|
||||
lib[i][j] = mode[lib.config.mode][i][j];
|
||||
}
|
||||
}
|
||||
if (typeof mode[lib.config.mode].init == 'function') {
|
||||
mode[lib.config.mode].init();
|
||||
}
|
||||
|
||||
var connectCharacterPack = [];
|
||||
var connectCardPack = [];
|
||||
for (i in character) {
|
||||
if (character[i].character) {
|
||||
const characterPack = lib.characterPack[i];
|
||||
if (characterPack) Object.assign(characterPack, character[i].character);
|
||||
else lib.characterPack[i] = character[i].character;
|
||||
}
|
||||
for (j in character[i]) {
|
||||
if (j == 'mode' || j == 'forbid') continue;
|
||||
if (j == 'connect') {
|
||||
connectCharacterPack.push(i);
|
||||
continue;
|
||||
}
|
||||
if (j == 'character' && !lib.config.characters.includes(i) && lib.config.mode != 'connect') {
|
||||
if (lib.config.mode == 'chess' && get.config('chess_mode') == 'leader' && get.config('chess_leader_allcharacter')) {
|
||||
for (k in character[i][j]) {
|
||||
lib.hiddenCharacters.push(k);
|
||||
}
|
||||
}
|
||||
else if (lib.config.mode != 'boss' || i != 'boss') {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (Array.isArray(lib[j]) && Array.isArray(character[i][j])) {
|
||||
lib[j].addArray(character[i][j]);
|
||||
continue;
|
||||
}
|
||||
for (k in character[i][j]) {
|
||||
if (j == 'character') {
|
||||
if (!character[i][j][k][4]) {
|
||||
character[i][j][k][4] = [];
|
||||
}
|
||||
if (character[i][j][k][4].includes('boss') ||
|
||||
character[i][j][k][4].includes('hiddenboss')) {
|
||||
lib.config.forbidai.add(k);
|
||||
}
|
||||
if (lib.config.forbidai_user && lib.config.forbidai_user.includes(k)) {
|
||||
lib.config.forbidai.add(k);
|
||||
}
|
||||
for (var l = 0; l < character[i][j][k][3].length; l++) {
|
||||
lib.skilllist.add(character[i][j][k][3][l]);
|
||||
}
|
||||
}
|
||||
if (j == 'skill' && k[0] == '_' && (lib.config.mode != 'connect' ? (!lib.config.characters.includes(i)) : (!character[i].connect))) {
|
||||
continue;
|
||||
}
|
||||
if (j == 'translate' && k == i) {
|
||||
lib[j][k + '_character_config'] = character[i][j][k];
|
||||
}
|
||||
else {
|
||||
if (lib[j][k] == undefined) {
|
||||
if (j == 'skill' && !character[i][j][k].forceLoad && lib.config.mode == 'connect' && !character[i].connect) {
|
||||
lib[j][k] = {
|
||||
nopop: character[i][j][k].nopop,
|
||||
derivation: character[i][j][k].derivation
|
||||
};
|
||||
}
|
||||
else {
|
||||
Object.defineProperty(lib[j], k, Object.getOwnPropertyDescriptor(character[i][j], k));
|
||||
}
|
||||
if (j == 'card' && lib[j][k].derivation) {
|
||||
if (!lib.cardPack.mode_derivation) {
|
||||
lib.cardPack.mode_derivation = [k];
|
||||
}
|
||||
else {
|
||||
lib.cardPack.mode_derivation.push(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (Array.isArray(lib[j][k]) && Array.isArray(character[i][j][k])) {
|
||||
lib[j][k].addArray(character[i][j][k]);
|
||||
}
|
||||
else {
|
||||
console.log(
|
||||
`dublicate ${j} in character ${i}:\n${k}:\nlib.${j}.${k}`,
|
||||
lib[j][k],
|
||||
`\ncharacter.${i}.${j}.${k}`,
|
||||
character[i][j][k]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var connect_avatar_list = [];
|
||||
for (var i in lib.character) {
|
||||
connect_avatar_list.push(i);
|
||||
}
|
||||
connect_avatar_list.sort(lib.sort.capt);
|
||||
for (var i = 0; i < connect_avatar_list.length; i++) {
|
||||
var ia = connect_avatar_list[i];
|
||||
lib.mode.connect.config.connect_avatar.item[ia] = lib.translate[ia];
|
||||
}
|
||||
if (lib.config.mode != 'connect') {
|
||||
var pilecfg = lib.config.customcardpile[get.config('cardpilename') || '当前牌堆'];
|
||||
if (pilecfg) {
|
||||
lib.config.bannedpile = get.copy(pilecfg[0] || {});
|
||||
lib.config.addedpile = get.copy(pilecfg[1] || {});
|
||||
}
|
||||
else {
|
||||
lib.config.bannedpile = {};
|
||||
lib.config.addedpile = {};
|
||||
}
|
||||
}
|
||||
else {
|
||||
lib.cardPackList = {};
|
||||
}
|
||||
for (i in card) {
|
||||
const cardPack = lib.cardPack[i] ? lib.cardPack[i] : lib.cardPack[i] = [];
|
||||
if (card[i].card) {
|
||||
for (var j in card[i].card) {
|
||||
if (!card[i].card[j].hidden && card[i].translate[j + '_info']) {
|
||||
cardPack.push(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (j in card[i]) {
|
||||
if (j == 'mode' || j == 'forbid') continue;
|
||||
if (j == 'connect') {
|
||||
connectCardPack.push(i);
|
||||
continue;
|
||||
}
|
||||
if (j == 'list') {
|
||||
if (lib.config.mode == 'connect') {
|
||||
const cardPackList = lib.cardPackList[i];
|
||||
if (cardPackList) cardPackList.addArray(card[i][j]);
|
||||
else lib.cardPackList[i] = card[i][j];
|
||||
}
|
||||
else {
|
||||
if (lib.config.cards.includes(i)) {
|
||||
var pile;
|
||||
if (typeof card[i][j] == 'function') {
|
||||
pile = card[i][j]();
|
||||
}
|
||||
else {
|
||||
pile = card[i][j];
|
||||
}
|
||||
const cardPile = lib.cardPile[i];
|
||||
if (cardPile) cardPile.addArray(pile);
|
||||
else lib.cardPile[i] = pile.slice(0);
|
||||
if (lib.config.bannedpile[i]) {
|
||||
for (var k = 0; k < lib.config.bannedpile[i].length; k++) {
|
||||
pile[lib.config.bannedpile[i][k]] = null;
|
||||
}
|
||||
}
|
||||
for (var k = 0; k < pile.length; k++) {
|
||||
if (!pile[k]) {
|
||||
pile.splice(k--, 1);
|
||||
}
|
||||
}
|
||||
if (lib.config.addedpile[i]) {
|
||||
for (var k = 0; k < lib.config.addedpile[i].length; k++) {
|
||||
pile.push(lib.config.addedpile[i][k]);
|
||||
}
|
||||
}
|
||||
lib.card.list.addArray(pile);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (k in card[i][j]) {
|
||||
if (j == 'skill' && k[0] == '_' && !card[i][j][k].forceLoad && (lib.config.mode != 'connect' ? (!lib.config.cards.includes(i)) : (!card[i].connect))) {
|
||||
continue;
|
||||
}
|
||||
if (j == 'translate' && k == i) {
|
||||
lib[j][k + '_card_config'] = card[i][j][k];
|
||||
}
|
||||
else {
|
||||
if (lib[j][k] == undefined) {
|
||||
if (j == 'skill' && !card[i][j][k].forceLoad && lib.config.mode == 'connect' && !card[i].connect) {
|
||||
lib[j][k] = {
|
||||
nopop: card[i][j][k].nopop,
|
||||
derivation: card[i][j][k].derivation
|
||||
};
|
||||
}
|
||||
else {
|
||||
Object.defineProperty(lib[j], k, Object.getOwnPropertyDescriptor(card[i][j], k));
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log(
|
||||
`dublicate ${j} in card ${i}:\n${k}:\nlib.${j}.${k}`,
|
||||
lib[j][k],
|
||||
`\ncard.${i}.${j}.${k}`,
|
||||
card[i][j][k]
|
||||
);
|
||||
}
|
||||
if (j == 'card' && lib[j][k].derivation) {
|
||||
if (!lib.cardPack.mode_derivation) {
|
||||
lib.cardPack.mode_derivation = [k];
|
||||
}
|
||||
else {
|
||||
lib.cardPack.mode_derivation.push(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (lib.cardPack.mode_derivation) {
|
||||
for (var i = 0; i < lib.cardPack.mode_derivation.length; i++) {
|
||||
if (typeof lib.card[lib.cardPack.mode_derivation[i]].derivation == 'string' && !lib.character[lib.card[lib.cardPack.mode_derivation[i]].derivation]) {
|
||||
lib.cardPack.mode_derivation.splice(i--, 1);
|
||||
}
|
||||
else if (typeof lib.card[lib.cardPack.mode_derivation[i]].derivationpack == 'string' && !lib.config.cards.includes(lib.card[lib.cardPack.mode_derivation[i]].derivationpack)) {
|
||||
lib.cardPack.mode_derivation.splice(i--, 1);
|
||||
}
|
||||
}
|
||||
if (lib.cardPack.mode_derivation.length == 0) {
|
||||
delete lib.cardPack.mode_derivation;
|
||||
}
|
||||
}
|
||||
if (lib.config.mode != 'connect') {
|
||||
for (i in play) {
|
||||
if (lib.config.hiddenPlayPack.includes(i)) continue;
|
||||
if (play[i].forbid && play[i].forbid.includes(lib.config.mode)) continue;
|
||||
if (play[i].mode && play[i].mode.includes(lib.config.mode) == false) continue;
|
||||
for (j in play[i].element) {
|
||||
if (!lib.element[j]) lib.element[j] = [];
|
||||
for (k in play[i].element[j]) {
|
||||
if (k == 'init') {
|
||||
if (!lib.element[j].inits) lib.element[j].inits = [];
|
||||
lib.element[j].inits.push(play[i].element[j][k]);
|
||||
}
|
||||
else {
|
||||
lib.element[j][k] = play[i].element[j][k];
|
||||
}
|
||||
}
|
||||
}
|
||||
for (j in play[i].ui) {
|
||||
if (typeof play[i].ui[j] == 'object') {
|
||||
if (ui[j] == undefined) ui[j] = {};
|
||||
for (k in play[i].ui[j]) {
|
||||
ui[j][k] = play[i].ui[j][k];
|
||||
}
|
||||
}
|
||||
else {
|
||||
ui[j] = play[i].ui[j];
|
||||
}
|
||||
}
|
||||
for (j in play[i].game) {
|
||||
game[j] = play[i].game[j];
|
||||
}
|
||||
for (j in play[i].get) {
|
||||
get[j] = play[i].get[j];
|
||||
}
|
||||
for (j in play[i]) {
|
||||
if (j == 'mode' || j == 'forbid' || j == 'init' || j == 'element' ||
|
||||
j == 'game' || j == 'get' || j == 'ui' || j == 'arenaReady') continue;
|
||||
for (k in play[i][j]) {
|
||||
if (j == 'translate' && k == i) {
|
||||
// lib[j][k+'_play_config']=play[i][j][k];
|
||||
}
|
||||
else {
|
||||
if (lib[j][k] != undefined) {
|
||||
console.log(
|
||||
`dublicate ${j} in play ${i}:\n${k}:\nlib.${j}.${k}`,
|
||||
lib[j][k],
|
||||
`\nplay.${i}.${j}.${k}`,
|
||||
play[i][j][k]
|
||||
);
|
||||
}
|
||||
lib[j][k] = play[i][j][k];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (typeof play[i].init == 'function') play[i].init();
|
||||
if (typeof play[i].arenaReady == 'function') lib.arenaReady.push(play[i].arenaReady);
|
||||
}
|
||||
}
|
||||
|
||||
lib.connectCharacterPack = [];
|
||||
lib.connectCardPack = [];
|
||||
for (var i = 0; i < lib.config.all.characters.length; i++) {
|
||||
var packname = lib.config.all.characters[i];
|
||||
if (connectCharacterPack.includes(packname)) {
|
||||
lib.connectCharacterPack.push(packname)
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < lib.config.all.cards.length; i++) {
|
||||
var packname = lib.config.all.cards[i];
|
||||
if (connectCardPack.includes(packname)) {
|
||||
lib.connectCardPack.push(packname)
|
||||
}
|
||||
}
|
||||
if (lib.config.mode != 'connect') {
|
||||
for (i = 0; i < lib.card.list.length; i++) {
|
||||
if (lib.card.list[i][2] == 'huosha') {
|
||||
lib.card.list[i] = lib.card.list[i].slice(0);
|
||||
lib.card.list[i][2] = 'sha';
|
||||
lib.card.list[i][3] = 'fire';
|
||||
}
|
||||
else if (lib.card.list[i][2] == 'leisha') {
|
||||
lib.card.list[i] = lib.card.list[i].slice(0);
|
||||
lib.card.list[i][2] = 'sha';
|
||||
lib.card.list[i][3] = 'thunder';
|
||||
}
|
||||
if (!lib.card[lib.card.list[i][2]]) {
|
||||
lib.card.list.splice(i, 1); i--;
|
||||
}
|
||||
else if (lib.card[lib.card.list[i][2]].mode &&
|
||||
lib.card[lib.card.list[i][2]].mode.includes(lib.config.mode) == false) {
|
||||
lib.card.list.splice(i, 1); i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lib.config.mode == 'connect') {
|
||||
_status.connectMode = true;
|
||||
}
|
||||
if (window.isNonameServer) {
|
||||
lib.cheat.i();
|
||||
}
|
||||
else if (lib.config.dev && (!_status.connectMode || lib.config.debug)) {
|
||||
lib.cheat.i();
|
||||
}
|
||||
lib.config.sort_card = get.sortCard(lib.config.sort);
|
||||
delete lib.imported.character;
|
||||
delete lib.imported.card;
|
||||
delete lib.imported.mode;
|
||||
delete lib.imported.play;
|
||||
for (var i in lib.init) {
|
||||
if (i.startsWith('setMode_')) {
|
||||
delete lib.init[i];
|
||||
}
|
||||
}
|
||||
if (!_status.connectMode) {
|
||||
for (var i = 0; i < lib.extensions.length; i++) {
|
||||
try {
|
||||
_status.extension = lib.extensions[i][0];
|
||||
_status.evaluatingExtension = lib.extensions[i][3];
|
||||
if (typeof lib.extensions[i][1] == "function")
|
||||
await (gnc.is.coroutine(lib.extensions[i][1]) ? gnc.of(lib.extensions[i][1]) : lib.extensions[i][1]).call(lib.extensions[i], lib.extensions[i][2], lib.extensions[i][4]);
|
||||
if (lib.extensions[i][4]) {
|
||||
if (lib.extensions[i][4].character) {
|
||||
for (var j in lib.extensions[i][4].character.character) {
|
||||
game.addCharacterPack(get.copy(lib.extensions[i][4].character));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (lib.extensions[i][4].card) {
|
||||
for (var j in lib.extensions[i][4].card.card) {
|
||||
game.addCardPack(get.copy(lib.extensions[i][4].card));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (lib.extensions[i][4].skill) {
|
||||
for (var j in lib.extensions[i][4].skill.skill) {
|
||||
game.addSkill(j, lib.extensions[i][4].skill.skill[j],
|
||||
lib.extensions[i][4].skill.translate[j],
|
||||
lib.extensions[i][4].skill.translate[j + '_info'],
|
||||
lib.extensions[i][4].skill.translate[j + '_append'],
|
||||
lib.extensions[i][4].skill.translate[j + '_ab']);
|
||||
}
|
||||
}
|
||||
}
|
||||
delete _status.extension;
|
||||
delete _status.evaluatingExtension;
|
||||
}
|
||||
catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
delete lib.extensions;
|
||||
|
||||
if (lib.init.startBefore) {
|
||||
lib.init.startBefore();
|
||||
delete lib.init.startBefore;
|
||||
}
|
||||
ui.create.arena();
|
||||
game.createEvent('game', false).setContent(lib.init.start);
|
||||
if (lib.mode[lib.config.mode] && lib.mode[lib.config.mode].fromextension) {
|
||||
var startstr = mode[lib.config.mode].start.toString();
|
||||
if (startstr.indexOf('onfree') == -1) {
|
||||
setTimeout(lib.init.onfree, 500);
|
||||
}
|
||||
}
|
||||
delete lib.init.start;
|
||||
if (Array.isArray(_status.onprepare) && _status.onprepare.length) {
|
||||
await Promise.allSettled(_status.onprepare);
|
||||
delete _status.onprepare;
|
||||
}
|
||||
game.loop();
|
||||
};
|
||||
var proceed = async () => {
|
||||
if (!lib.db) {
|
||||
try {
|
||||
lib.storage = JSON.parse(localStorage.getItem(lib.configprefix + lib.config.mode));
|
||||
if (typeof lib.storage !== 'object') throw ('err');
|
||||
if (lib.storage === null) throw ('err');
|
||||
} catch (err) {
|
||||
lib.storage = {};
|
||||
localStorage.setItem(lib.configprefix + lib.config.mode, "{}");
|
||||
}
|
||||
await proceed2();
|
||||
}
|
||||
else {
|
||||
await game.getDB('data', lib.config.mode, async (obj) => {
|
||||
lib.storage = obj || {};
|
||||
await proceed2();
|
||||
});
|
||||
}
|
||||
};
|
||||
if (!lib.imported.mode || !lib.imported.mode[lib.config.mode]) {
|
||||
window.inSplash = true;
|
||||
clearTimeout(window.resetGameTimeout);
|
||||
delete window.resetGameTimeout;
|
||||
var clickedNode = false;
|
||||
var clickNode = function () {
|
||||
if (clickedNode) return;
|
||||
this.classList.add('clicked');
|
||||
clickedNode = true;
|
||||
lib.config.mode = this.link;
|
||||
game.saveConfig('mode', this.link);
|
||||
if (this.link == 'connect') {
|
||||
localStorage.setItem(lib.configprefix + 'directstart', true);
|
||||
game.reload();
|
||||
}
|
||||
else {
|
||||
if (game.layout != 'mobile' && lib.layoutfixed.indexOf(lib.config.mode) !== -1) {
|
||||
game.layout = 'mobile';
|
||||
ui.css.layout.href = lib.assetURL + 'layout/' + game.layout + '/layout.css';
|
||||
}
|
||||
else if (game.layout == 'mobile' && lib.config.layout != 'mobile' && lib.layoutfixed.indexOf(lib.config.mode) === -1) {
|
||||
game.layout = lib.config.layout;
|
||||
if (game.layout == 'default') {
|
||||
ui.css.layout.href = '';
|
||||
}
|
||||
else {
|
||||
ui.css.layout.href = lib.assetURL + 'layout/' + game.layout + '/layout.css';
|
||||
}
|
||||
}
|
||||
splash.delete(1000);
|
||||
delete window.inSplash;
|
||||
window.resetGameTimeout = setTimeout(lib.init.reset, 10000);
|
||||
|
||||
this.listenTransition(function () {
|
||||
lib.init.js(lib.assetURL + 'mode', lib.config.mode, proceed);
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
var downNode = function () {
|
||||
this.classList.add('glow');
|
||||
}
|
||||
var upNode = function () {
|
||||
this.classList.remove('glow');
|
||||
}
|
||||
var splash = ui.create.div('#splash', document.body);
|
||||
if (lib.config.touchscreen) {
|
||||
splash.classList.add('touch');
|
||||
lib.setScroll(splash);
|
||||
}
|
||||
if (lib.config.player_border != 'wide') {
|
||||
splash.classList.add('slim');
|
||||
}
|
||||
splash.dataset.radius_size = lib.config.radius_size;
|
||||
for (var i = 0; i < lib.config.all.mode.length; i++) {
|
||||
var node = ui.create.div('.hidden', splash, clickNode);
|
||||
node.link = lib.config.all.mode[i];
|
||||
ui.create.div(node, '.splashtext', get.verticalStr(get.translation(lib.config.all.mode[i])));
|
||||
if (lib.config.all.stockmode.includes(lib.config.all.mode[i])) {
|
||||
// 初始启动页设置
|
||||
if (lib.config.splash_style == undefined) game.saveConfig('splash_style', 'style1');
|
||||
splash.dataset.splash_style = lib.config.splash_style;
|
||||
// 扩展可通过window.splashurl设置素材读取路径
|
||||
if (window.splashurl == undefined) window.splashurl = 'image/splash/';
|
||||
if (lib.config.splash_style == 'style1' || lib.config.splash_style == 'style2') {
|
||||
ui.create.div(node, '.avatar').setBackgroundImage('image/splash/' + lib.config.splash_style + '/' + lib.config.all.mode[i] + '.jpg');
|
||||
} else {
|
||||
ui.create.div(node, '.avatar').setBackgroundImage(splashurl + lib.config.splash_style + '/' + lib.config.all.mode[i] + '.jpg');
|
||||
}
|
||||
}
|
||||
else {
|
||||
var avatarnode = ui.create.div(node, '.avatar');
|
||||
var avatarbg = lib.mode[lib.config.all.mode[i]].splash;
|
||||
if (avatarbg.startsWith('ext:')) {
|
||||
avatarnode.setBackgroundImage(avatarbg.replace(/^ext:/, 'extension/'));
|
||||
}
|
||||
else {
|
||||
avatarnode.setBackgroundDB(avatarbg);
|
||||
}
|
||||
}
|
||||
if (!lib.config.touchscreen) {
|
||||
node.addEventListener('mousedown', downNode);
|
||||
node.addEventListener('mouseup', upNode);
|
||||
node.addEventListener('mouseleave', upNode);
|
||||
}
|
||||
setTimeout((function (node) {
|
||||
return function () {
|
||||
node.show();
|
||||
}
|
||||
}(node)), i * 100);
|
||||
}
|
||||
if (lib.config.mousewheel) {
|
||||
splash.onmousewheel = ui.click.mousewheel;
|
||||
}
|
||||
}
|
||||
else {
|
||||
await proceed();
|
||||
}
|
||||
localStorage.removeItem(lib.configprefix + 'directstart');
|
||||
delete lib.init.init;
|
||||
const libOnload2 = lib.onload2;
|
||||
delete lib.onload2;
|
||||
while (Array.isArray(libOnload2) && libOnload2.length) {
|
||||
const fun = libOnload2.shift();
|
||||
if (typeof fun != "function") continue;
|
||||
await (gnc.is.generatorFunc(fun) ? gnc.of(fun) : fun)();
|
||||
}
|
||||
throw new Error('lib.init.onload is moved to noname/init/onload')
|
||||
}
|
||||
|
||||
static startOnline() {
|
||||
|
|
|
@ -3,6 +3,10 @@ export const assetURL = typeof nonameInitialized != 'string' || nonameInitialize
|
|||
export const GeneratorFunction = (function* () { }).constructor;
|
||||
export const AsyncFunction = (async function () { }).constructor;
|
||||
export const userAgent = navigator.userAgent.toLowerCase();
|
||||
|
||||
// 我靠循环引用问题在这?
|
||||
// export * as config from './config.js'
|
||||
|
||||
/**
|
||||
* 不能被new的类
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue