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);
|
||||||
|
|
52
game/game.js
52
game/game.js
|
@ -1,4 +1,5 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
new Promise(resolve => {
|
new Promise(resolve => {
|
||||||
// 客户端自带core.js的请注意跟进
|
// 客户端自带core.js的请注意跟进
|
||||||
if ('__core-js_shared__' in window) resolve(null);
|
if ('__core-js_shared__' in window) resolve(null);
|
||||||
|
@ -11,6 +12,8 @@ new Promise(resolve => {
|
||||||
document.head.appendChild(coreJSBundle);
|
document.head.appendChild(coreJSBundle);
|
||||||
}
|
}
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
|
const nonameInitialized = localStorage.getItem('noname_inited');
|
||||||
|
const assetURL = typeof nonameInitialized != 'string' || nonameInitialized == 'nodejs' ? '' : nonameInitialized;
|
||||||
const userAgent = navigator.userAgent.toLowerCase();
|
const userAgent = navigator.userAgent.toLowerCase();
|
||||||
|
|
||||||
const exit = () => {
|
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'];
|
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 }) => {
|
if (core in supportMap && supportMap[core] > version) {
|
||||||
const coreAndVersion = get.coreInfo();
|
const tip = '检测到您的浏览器内核版本无法支持ES Module,请立即升级浏览器或手机webview内核!';
|
||||||
const core = coreAndVersion[0], version = coreAndVersion[1];
|
console.error(tip);
|
||||||
if (core == 'chrome' && !isNaN(version) && version < 77) {
|
const redirect_tip = '您使用的浏览器或无名杀客户端内核版本过低,已经无法正常运行无名杀!\n点击“确认”以前往GitHub下载最新版无名杀客户端(可能需要科学上网)。\n稍后您的无名杀将自动退出(可能的话)';
|
||||||
const tip = '检测到您的浏览器内核版本小于77,请及时升级浏览器或手机webview内核!';
|
|
||||||
console.warn(tip);
|
|
||||||
game.print(tip);
|
|
||||||
const redirect_tip = '您使用的浏览器或无名杀客户端内核版本过低,将在未来的版本被废弃!\n点击“确认”以前往GitHub下载最新版无名杀客户端(可能需要科学上网)。';
|
|
||||||
if (confirm(redirect_tip)) {
|
if (confirm(redirect_tip)) {
|
||||||
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
|
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
|
||||||
}
|
}
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
boot();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -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 { GNC as gnc } from '../gnc/index.js';
|
||||||
import { Uninstantable } from "../util/index.js";
|
import { Uninstantable } from "../util/index.js";
|
||||||
|
|
||||||
export class Basic extends Uninstantable {
|
import { Basic } from './basic.js';
|
||||||
/**
|
|
||||||
* @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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AI extends Uninstantable {
|
export class AI extends Uninstantable {
|
||||||
static basic = Basic;
|
static basic = Basic;
|
||||||
|
@ -211,3 +14,7 @@ export class AI extends Uninstantable {
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ai = AI;
|
export const ai = AI;
|
||||||
|
|
||||||
|
export {
|
||||||
|
Basic
|
||||||
|
}
|
||||||
|
|
|
@ -130,13 +130,17 @@ export class Is extends Uninstantable {
|
||||||
* @param { Card | VCard } card
|
* @param { Card | VCard } card
|
||||||
*/
|
*/
|
||||||
// @ts-ignore
|
// @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
|
* @param { Card | VCard } card
|
||||||
*/
|
*/
|
||||||
// @ts-ignore
|
// @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
|
* @param { Card | VCard } card
|
||||||
|
@ -481,7 +485,7 @@ export class Get extends Uninstantable {
|
||||||
* 根据座次数n(从0开始)获取对应的“n+1号位”翻译
|
* 根据座次数n(从0开始)获取对应的“n+1号位”翻译
|
||||||
* @param {number} seat
|
* @param {number} seat
|
||||||
*/
|
*/
|
||||||
static seatTranslation(seat) { return `${get.cnNumber(seat + 1, true)}号位` }
|
static seatTranslation(seat) { return `${get.cnNumber(seat + 1, true)}号位`; }
|
||||||
/**
|
/**
|
||||||
* @param {number} numberOfPlayers
|
* @param {number} numberOfPlayers
|
||||||
* @returns {string[]}
|
* @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) {
|
static complexYingbianConditions(card) {
|
||||||
const complexYingbianConditions = Array.from(lib.yingbian.condition.complex.keys());
|
const complexYingbianConditions = Array.from(lib.yingbian.condition.complex.keys());
|
||||||
return card ? complexYingbianConditions.filter(value => get.cardtag(card, `yingbian_${value}`)) : complexYingbianConditions;
|
return card ? complexYingbianConditions.filter(value => get.cardtag(card, `yingbian_${value}`)) : complexYingbianConditions;
|
||||||
}
|
}
|
||||||
static simpleYingbianConditions(card) {
|
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;
|
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));
|
if (info.categories) list.addArray(info.categories(skill, player));
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
static numOf(obj, item) { return obj.filter(element => element == item).length }
|
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 connectNickname() { return typeof lib.config.connect_nickname == 'string' ? (lib.config.connect_nickname.slice(0, 12)) : "无名玩家"; }
|
||||||
static zhinangs(filter) {
|
static zhinangs(filter) {
|
||||||
var list = (_status.connectMode ? lib.configOL : lib.config).zhinang_tricks;
|
var list = (_status.connectMode ? lib.configOL : lib.config).zhinang_tricks;
|
||||||
if (!list || !list.filter || !list.length) return get.inpile('trick', 'trick').randomGets(3);
|
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];
|
if (card) return list[0];
|
||||||
return list;
|
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() {
|
static cardOffset() {
|
||||||
var x = ui.arena.getBoundingClientRect();
|
var x = ui.arena.getBoundingClientRect();
|
||||||
var y = ui.window.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
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
|
@ -886,7 +890,7 @@ export class Get extends Uninstantable {
|
||||||
var key = func;
|
var key = func;
|
||||||
func = function (item) {
|
func = function (item) {
|
||||||
return item[key];
|
return item[key];
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
list.sort(function (a, b) {
|
list.sort(function (a, b) {
|
||||||
return func(b) - func(a);
|
return func(b) - func(a);
|
||||||
|
@ -913,7 +917,7 @@ export class Get extends Uninstantable {
|
||||||
var key = func;
|
var key = func;
|
||||||
func = function (item) {
|
func = function (item) {
|
||||||
return item[key];
|
return item[key];
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
list.sort(function (a, b) {
|
list.sort(function (a, b) {
|
||||||
return func(a) - func(b);
|
return func(a) - func(b);
|
||||||
|
@ -1007,8 +1011,8 @@ export class Get extends Uninstantable {
|
||||||
return Math.floor(Math.random() * num);
|
return Math.floor(Math.random() * num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static sort(arr, method, arg) { return method == "seat" ? arr.sortBySeat(arg) : void 0 }
|
static sort(arr, method, arg) { return method == "seat" ? arr.sortBySeat(arg) : void 0; }
|
||||||
static sortSeat(arr, target) { return arr.sortBySeat(target) }
|
static sortSeat(arr, target) { return arr.sortBySeat(target); }
|
||||||
static zip(callback) {
|
static zip(callback) {
|
||||||
if (!window.JSZip) {
|
if (!window.JSZip) {
|
||||||
lib.init.js(lib.assetURL + 'game', 'jszip', function () {
|
lib.init.js(lib.assetURL + 'game', 'jszip', function () {
|
||||||
|
@ -1036,7 +1040,7 @@ export class Get extends Uninstantable {
|
||||||
if (target) {
|
if (target) {
|
||||||
var str = get.translation(target);
|
var str = get.translation(target);
|
||||||
if (target == player) {
|
if (target == player) {
|
||||||
str += '(你)'
|
str += '(你)';
|
||||||
}
|
}
|
||||||
return '是否对' + str + '发动【' + get.skillTranslation(skill, player) + '】?';
|
return '是否对' + str + '发动【' + get.skillTranslation(skill, player) + '】?';
|
||||||
}
|
}
|
||||||
|
@ -1068,7 +1072,7 @@ export class Get extends Uninstantable {
|
||||||
static playerNumber() {
|
static playerNumber() {
|
||||||
var num;
|
var num;
|
||||||
if (_status.brawl && _status.brawl.playerNumber) {
|
if (_status.brawl && _status.brawl.playerNumber) {
|
||||||
num = _status.brawl.playerNumber
|
num = _status.brawl.playerNumber;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
num = get.config('player_number');
|
num = get.config('player_number');
|
||||||
|
@ -1227,13 +1231,102 @@ export class Get extends Uninstantable {
|
||||||
* @param {T} obj
|
* @param {T} obj
|
||||||
* @returns {T}
|
* @returns {T}
|
||||||
*/
|
*/
|
||||||
static copy(obj) {
|
static copy(obj, map = new WeakMap()) {
|
||||||
try {
|
try {
|
||||||
return structuredClone(obj);
|
return structuredClone(obj);
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
// obj不可序列化时
|
// obj不可序列化时,参考[这里](https://juejin.cn/post/7315612852890026021)实现深拷贝
|
||||||
return obj;
|
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) {
|
static inpilefull(type) {
|
||||||
|
@ -1280,7 +1373,7 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
static inpile2(type) { return get.inpile(type, 'trick') }
|
static inpile2(type) { return get.inpile(type, 'trick'); }
|
||||||
static typeCard(type, filter) {
|
static typeCard(type, filter) {
|
||||||
var list = [];
|
var list = [];
|
||||||
for (var i in lib.card) {
|
for (var i in lib.card) {
|
||||||
|
@ -1400,8 +1493,8 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
static mode() { return lib[_status.connectMode ? 'configOL' : 'config'].mode }
|
static mode() { return lib[_status.connectMode ? 'configOL' : 'config'].mode; }
|
||||||
static idDialog(id) { return ui.dialogs.find(dialog => dialog.videoId == id) || null }
|
static idDialog(id) { return ui.dialogs.find(dialog => dialog.videoId == id) || null; }
|
||||||
static arenaState() {
|
static arenaState() {
|
||||||
var state = {
|
var state = {
|
||||||
number: ui.arena.dataset.number,
|
number: ui.arena.dataset.number,
|
||||||
|
@ -1434,7 +1527,7 @@ export class Get extends Uninstantable {
|
||||||
disabledSkills: lib.playerOL[i].disabledSkills,
|
disabledSkills: lib.playerOL[i].disabledSkills,
|
||||||
tempSkills: lib.playerOL[i].tempSkills,
|
tempSkills: lib.playerOL[i].tempSkills,
|
||||||
storage: lib.playerOL[i].storage,
|
storage: lib.playerOL[i].storage,
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
//for(var i in lib.skill){
|
//for(var i in lib.skill){
|
||||||
// if(lib.skill[i].chooseButton&&lib.skill[i].enable){
|
// if(lib.skill[i].chooseButton&&lib.skill[i].enable){
|
||||||
|
@ -1447,7 +1540,7 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return skills;
|
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) {
|
static zhu(player, skill, group) {
|
||||||
if (typeof player == 'string') {
|
if (typeof player == 'string') {
|
||||||
skill = player;
|
skill = player;
|
||||||
|
@ -1664,9 +1757,9 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
static infoTargets(infos) { return Array.from(infos || []).map(info => game.playerMap[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 cardInfo(card) { return [card.suit, card.number, card.name, card.nature]; }
|
||||||
static cardsInfo(cards) { return Array.from(cards || []).map(get.cardInfo) }
|
static cardsInfo(cards) { return Array.from(cards || []).map(get.cardInfo); }
|
||||||
static infoCard(info) {
|
static infoCard(info) {
|
||||||
var card = ui.create.card();
|
var card = ui.create.card();
|
||||||
if (info[0]) {
|
if (info[0]) {
|
||||||
|
@ -1674,8 +1767,8 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
static infoCards(infos) { return Array.from(infos || []).map(get.infoCard) }
|
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 cardInfoOL(card) { return '_noname_card:' + JSON.stringify([card.cardid, card.suit, card.number, card.name, card.nature]); }
|
||||||
static infoCardOL(info) {
|
static infoCardOL(info) {
|
||||||
if (!lib.cardOL) return info;
|
if (!lib.cardOL) return info;
|
||||||
var card;
|
var card;
|
||||||
|
@ -1704,12 +1797,12 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return card || info;
|
return card || info;
|
||||||
}
|
}
|
||||||
static cardsInfoOL(cards) { return Array.from(cards || []).map(get.cardInfoOL) }
|
static cardsInfoOL(cards) { return Array.from(cards || []).map(get.cardInfoOL); }
|
||||||
static infoCardsOL(infos) { return Array.from(infos || []).map(get.infoCardOL) }
|
static infoCardsOL(infos) { return Array.from(infos || []).map(get.infoCardOL); }
|
||||||
static playerInfoOL(player) { return '_noname_player:' + player.playerid }
|
static playerInfoOL(player) { return '_noname_player:' + player.playerid; }
|
||||||
static infoPlayerOL(info) { return lib.playerOL ? (lib.playerOL[info.slice(15)] || info) : info }
|
static infoPlayerOL(info) { return lib.playerOL ? (lib.playerOL[info.slice(15)] || info) : info; }
|
||||||
static playersInfoOL(players) { return Array.from(players || []).map(get.playerInfoOL) }
|
static playersInfoOL(players) { return Array.from(players || []).map(get.playerInfoOL); }
|
||||||
static infoPlayersOL(infos) { return Array.from(infos || []).map(get.infoPlayerOL) }
|
static infoPlayersOL(infos) { return Array.from(infos || []).map(get.infoPlayerOL); }
|
||||||
static funcInfoOL(func) {
|
static funcInfoOL(func) {
|
||||||
if (typeof func == 'function') {
|
if (typeof func == 'function') {
|
||||||
if (func._filter_args) {
|
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);
|
else if (!lib.element.GameEvent.prototype[key] && key != 'content' && get.itemtype(entry[1]) != 'event') stringifying[key] = get.stringifiedResult(entry[1], null, false);
|
||||||
return stringifying;
|
return stringifying;
|
||||||
}, {}))}` : ''
|
}, {}))}` : '';
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @param {string} item
|
* @param {string} item
|
||||||
|
@ -1916,7 +2009,7 @@ export class Get extends Uninstantable {
|
||||||
span.innerHTML = prefix;
|
span.innerHTML = prefix;
|
||||||
return span.outerHTML;
|
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() {
|
static time() {
|
||||||
if (lib.status.dateDelaying) {
|
if (lib.status.dateDelaying) {
|
||||||
return lib.getUTC(lib.status.dateDelaying) - lib.getUTC(lib.status.date) - lib.status.dateDelayed;
|
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;
|
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) {
|
static evtDistance(e1, e2) {
|
||||||
var dx = (e1.clientX - e2.clientX) / game.documentZoom;
|
var dx = (e1.clientX - e2.clientX) / game.documentZoom;
|
||||||
var dy = (e1.clientY - e2.clientY) / game.documentZoom;
|
var dy = (e1.clientY - e2.clientY) / game.documentZoom;
|
||||||
return Math.sqrt(dx * dx + dy * dy);
|
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
|
* @overload
|
||||||
* @returns { void }
|
* @returns { void }
|
||||||
|
@ -2048,7 +2141,7 @@ export class Get extends Uninstantable {
|
||||||
if (method == 'trick' && lib.card[name].type == 'delay') return 'trick';
|
if (method == 'trick' && lib.card[name].type == 'delay') return 'trick';
|
||||||
return lib.card[name].type;
|
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) {
|
static subtype(obj, player) {
|
||||||
if (typeof obj == 'string') obj = { name: obj };
|
if (typeof obj == 'string') obj = { name: obj };
|
||||||
if (typeof obj != 'object') return;
|
if (typeof obj != 'object') return;
|
||||||
|
@ -2218,8 +2311,8 @@ export class Get extends Uninstantable {
|
||||||
if (card) return list[0];
|
if (card) return list[0];
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
static judge(card) { return card.viewAs ? lib.card[card.viewAs].judge : get.info(card).judge }
|
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 judge2(card) { return card.viewAs ? lib.card[card.viewAs].judge2 : get.info(card).judge2; }
|
||||||
static distance(from, to, method) {
|
static distance(from, to, method) {
|
||||||
if (from == to) return 0;
|
if (from == to) return 0;
|
||||||
if (!game.players.includes(from) && !game.dead.includes(from)) return Infinity;
|
if (!game.players.includes(from) && !game.dead.includes(from)) return Infinity;
|
||||||
|
@ -2347,8 +2440,8 @@ export class Get extends Uninstantable {
|
||||||
* @overload
|
* @overload
|
||||||
* @returns {GameEvent}
|
* @returns {GameEvent}
|
||||||
*/
|
*/
|
||||||
static event(key) { return key ? _status.event[key] : _status.event }
|
static event(key) { return key ? _status.event[key] : _status.event; }
|
||||||
static player() { return _status.event.player }
|
static player() { return _status.event.player; }
|
||||||
static players(sort, dead, out) {
|
static players(sort, dead, out) {
|
||||||
var players = game.players.slice(0);
|
var players = game.players.slice(0);
|
||||||
if (sort != false) {
|
if (sort != false) {
|
||||||
|
@ -2559,7 +2652,7 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
result = handleZero(result);
|
result = handleZero(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
};
|
||||||
let result = '';
|
let result = '';
|
||||||
for (let i = 0; i < numStr.length; i++) {
|
for (let i = 0; i < numStr.length; i++) {
|
||||||
const part = numStr[i];
|
const part = numStr[i];
|
||||||
|
@ -2776,7 +2869,7 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
};
|
||||||
result._filter_args = [filter, i];
|
result._filter_args = [filter, i];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -2806,18 +2899,18 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
static owner(card, method) {
|
static owner(card, method) {
|
||||||
return game.players.concat(game.dead).find(current =>
|
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) {
|
static population(identity) {
|
||||||
return identity == undefined ?
|
return identity == undefined ?
|
||||||
game.players.length + game.dead.length :
|
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) {
|
static totalPopulation(identity) {
|
||||||
return identity == undefined ?
|
return identity == undefined ?
|
||||||
game.players.length + game.dead.length :
|
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
|
* @param { Card | VCard } item
|
||||||
|
@ -2854,7 +2947,7 @@ export class Get extends Uninstantable {
|
||||||
case 'equip': return -3;
|
case 'equip': return -3;
|
||||||
default: return -4;
|
default: return -4;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
else if (sort == 'suit_sort') {
|
else if (sort == 'suit_sort') {
|
||||||
func = function (card) {
|
func = function (card) {
|
||||||
|
@ -2862,12 +2955,12 @@ export class Get extends Uninstantable {
|
||||||
if (get.suit(card) == 'diamond') return 1;
|
if (get.suit(card) == 'diamond') return 1;
|
||||||
if (get.suit(card) == 'spade') return -1;
|
if (get.suit(card) == 'spade') return -1;
|
||||||
if (get.suit(card) == 'club') return -2;
|
if (get.suit(card) == 'club') return -2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
else if (sort == 'number_sort') {
|
else if (sort == 'number_sort') {
|
||||||
func = function (card) {
|
func = function (card) {
|
||||||
return get.number(card) - 7 + 0.5;
|
return get.number(card) - 7 + 0.5;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
return func;
|
return func;
|
||||||
}
|
}
|
||||||
|
@ -2930,8 +3023,8 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
static cardPile2(name) { return get.cardPile(name, 'cardPile') }
|
static cardPile2(name) { return get.cardPile(name, 'cardPile'); }
|
||||||
static discardPile(name) { return get.cardPile(name, 'discardPile') }
|
static discardPile(name) { return get.cardPile(name, 'discardPile'); }
|
||||||
static aiStrategy() {
|
static aiStrategy() {
|
||||||
switch (get.config('ai_strategy')) {
|
switch (get.config('ai_strategy')) {
|
||||||
case 'ai_strategy_1': return 1;
|
case 'ai_strategy_1': return 1;
|
||||||
|
@ -3139,7 +3232,7 @@ export class Get extends Uninstantable {
|
||||||
uiintro.addSmall(shownHs);
|
uiintro.addSmall(shownHs);
|
||||||
if (allShown) {
|
if (allShown) {
|
||||||
var hs = node.getCards('h');
|
var hs = node.getCards('h');
|
||||||
hs.removeArray(shownHs)
|
hs.removeArray(shownHs);
|
||||||
if (hs.length) {
|
if (hs.length) {
|
||||||
uiintro.add('<div class="text center">其他手牌</div>');
|
uiintro.add('<div class="text center">其他手牌</div>');
|
||||||
uiintro.addSmall(hs);
|
uiintro.addSmall(hs);
|
||||||
|
@ -3184,7 +3277,7 @@ export class Get extends Uninstantable {
|
||||||
else {
|
else {
|
||||||
forbidstr += '(双将禁用)<br>';
|
forbidstr += '(双将禁用)<br>';
|
||||||
}
|
}
|
||||||
forbidstr += get.skillInfoTranslation(skills[i], node) + '</div></div>'
|
forbidstr += get.skillInfoTranslation(skills[i], node) + '</div></div>';
|
||||||
uiintro.add(forbidstr);
|
uiintro.add(forbidstr);
|
||||||
}
|
}
|
||||||
else if (!skills2.includes(skills[i])) {
|
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>');
|
uiintro.add('<div><div class="skill">' + translation + '</div><div>' + get.skillInfoTranslation(skills[i], node) + '</div></div>');
|
||||||
}
|
}
|
||||||
if (lib.translate[skills[i] + '_append']) {
|
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);
|
uiintro.content.appendChild(table);
|
||||||
if (!lib.config.show_favourite) {
|
if (!lib.config.show_favourite) {
|
||||||
table.style.paddingBottom = '5px'
|
table.style.paddingBottom = '5px';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!simple || get.is.phoneLayout()) {
|
if (!simple || get.is.phoneLayout()) {
|
||||||
|
@ -3415,7 +3508,7 @@ export class Get extends Uninstantable {
|
||||||
if (ui.throwEmotion) {
|
if (ui.throwEmotion) {
|
||||||
for (var i of ui.throwEmotion) i.classList.remove('exclude');
|
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 td;
|
||||||
var table = document.createElement('div');
|
var table = document.createElement('div');
|
||||||
|
@ -3463,7 +3556,7 @@ export class Get extends Uninstantable {
|
||||||
else {
|
else {
|
||||||
addFavourite.innerHTML = '添加收藏';
|
addFavourite.innerHTML = '添加收藏';
|
||||||
}
|
}
|
||||||
addFavourite.listen(ui.click.favouriteCharacter)
|
addFavourite.listen(ui.click.favouriteCharacter);
|
||||||
uiintro.add(addFavourite);
|
uiintro.add(addFavourite);
|
||||||
}
|
}
|
||||||
if (!simple || get.is.phoneLayout()) {
|
if (!simple || get.is.phoneLayout()) {
|
||||||
|
@ -3528,7 +3621,7 @@ export class Get extends Uninstantable {
|
||||||
img.onload = function () {
|
img.onload = function () {
|
||||||
num++;
|
num++;
|
||||||
loadImage(avatar2);
|
loadImage(avatar2);
|
||||||
}
|
};
|
||||||
img.onerror = function () {
|
img.onerror = function () {
|
||||||
num--;
|
num--;
|
||||||
if (num) {
|
if (num) {
|
||||||
|
@ -3540,7 +3633,7 @@ export class Get extends Uninstantable {
|
||||||
loadImage(true);
|
loadImage(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
var nameskin = (avatar2 ? node.name2 : node.name1);
|
var nameskin = (avatar2 ? node.name2 : node.name1);
|
||||||
var nameskin2 = nameskin;
|
var nameskin2 = nameskin;
|
||||||
var gzbool = false;
|
var gzbool = false;
|
||||||
|
@ -3552,7 +3645,7 @@ export class Get extends Uninstantable {
|
||||||
gzbool = true;
|
gzbool = true;
|
||||||
}
|
}
|
||||||
img.src = lib.assetURL + 'image/skin/' + nameskin + '/' + num + '.jpg';
|
img.src = lib.assetURL + 'image/skin/' + nameskin + '/' + num + '.jpg';
|
||||||
}
|
};
|
||||||
if (lib.config.change_skin) {
|
if (lib.config.change_skin) {
|
||||||
if (!node.isUnseen(0)) {
|
if (!node.isUnseen(0)) {
|
||||||
loadImage();
|
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>');
|
uiintro.add('<div><div class="skill">' + translation + '</div><div>' + get.skillInfoTranslation(skills[i]) + '</div></div>');
|
||||||
|
|
||||||
if (lib.translate[skills[i] + '_append']) {
|
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 {
|
else {
|
||||||
addFavourite.innerHTML = '添加收藏';
|
addFavourite.innerHTML = '添加收藏';
|
||||||
}
|
}
|
||||||
addFavourite.listen(ui.click.favouriteCharacter)
|
addFavourite.listen(ui.click.favouriteCharacter);
|
||||||
uiintro.add(addFavourite);
|
uiintro.add(addFavourite);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -4045,13 +4138,13 @@ export class Get extends Uninstantable {
|
||||||
img.onload = function () {
|
img.onload = function () {
|
||||||
num++;
|
num++;
|
||||||
loadImage();
|
loadImage();
|
||||||
}
|
};
|
||||||
img.onerror = function () {
|
img.onerror = function () {
|
||||||
num--;
|
num--;
|
||||||
createButtons(num);
|
createButtons(num);
|
||||||
}
|
};
|
||||||
img.src = lib.assetURL + 'image/skin/' + nameskin + '/' + num + '.jpg';
|
img.src = lib.assetURL + 'image/skin/' + nameskin + '/' + num + '.jpg';
|
||||||
}
|
};
|
||||||
if (lib.config.change_skin) {
|
if (lib.config.change_skin) {
|
||||||
loadImage();
|
loadImage();
|
||||||
}
|
}
|
||||||
|
@ -4071,7 +4164,7 @@ export class Get extends Uninstantable {
|
||||||
ui.control.hide();
|
ui.control.hide();
|
||||||
uiintro._onclose = function () {
|
uiintro._onclose = function () {
|
||||||
ui.control.show();
|
ui.control.show();
|
||||||
}
|
};
|
||||||
var confirmbutton;
|
var confirmbutton;
|
||||||
for (var i = 0; i < uiintro.buttons.length; i++) {
|
for (var i = 0; i < uiintro.buttons.length; i++) {
|
||||||
var button = uiintro.buttons[i];
|
var button = uiintro.buttons[i];
|
||||||
|
@ -4185,7 +4278,7 @@ export class Get extends Uninstantable {
|
||||||
dialog.add(list, true, true);
|
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() {
|
static types() {
|
||||||
var types = [];
|
var types = [];
|
||||||
for (var i in lib.card) {
|
for (var i in lib.card) {
|
||||||
|
@ -4332,8 +4425,8 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return get.useful_raw(card, player);
|
return get.useful_raw(card, player);
|
||||||
}
|
}
|
||||||
static unuseful(card) { return -get.useful(card) }
|
static unuseful(card) { return -get.useful(card); }
|
||||||
static unuseful2(card) { return 10 - get.useful(card) }
|
static unuseful2(card) { return 10 - get.useful(card); }
|
||||||
static unuseful3(card) {
|
static unuseful3(card) {
|
||||||
if (card.name == 'du') return 20;
|
if (card.name == 'du') return 20;
|
||||||
return 10 - get.useful(card);
|
return 10 - get.useful(card);
|
||||||
|
@ -4420,8 +4513,8 @@ export class Get extends Uninstantable {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static disvalue(card, player) { return -get.value(card, player) }
|
static disvalue(card, player) { return -get.value(card, player); }
|
||||||
static disvalue2(card, player) { return -get.value(card, player, 'raw') }
|
static disvalue2(card, player) { return -get.value(card, player, 'raw'); }
|
||||||
static skillthreaten(skill, player, target) {
|
static skillthreaten(skill, player, target) {
|
||||||
if (!lib.skill[skill]) return 1;
|
if (!lib.skill[skill]) return 1;
|
||||||
if (!lib.skill[skill].ai) return 1;
|
if (!lib.skill[skill].ai) return 1;
|
||||||
|
@ -4907,7 +5000,7 @@ export class Get extends Uninstantable {
|
||||||
default: return 0.4;
|
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;
|
export const get = Get;
|
|
@ -1,22 +1,20 @@
|
||||||
import { GeneratorFunction, Uninstantable } from "../util/index.js";
|
import { GeneratorFunction, Uninstantable } from "../util/index.js";
|
||||||
|
import { Is } from "./is.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;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// gnc: GeNCoroutine
|
// gnc: GeNCoroutine
|
||||||
export class GNC extends Uninstantable {
|
export class GNC extends Uninstantable {
|
||||||
|
/**
|
||||||
|
* @param {GeneratorFunction} fn
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
static of(fn) {
|
static of(fn) {
|
||||||
return gnc.is.generatorFunc(fn) ? function genCoroutine() {
|
return Is.generatorFunc(fn) ?
|
||||||
let gen = fn.apply(this, arguments);
|
/**
|
||||||
|
* @param {Parameters<typeof fn>} args
|
||||||
|
* @returns {Promise<ReturnType<typeof fn>>}
|
||||||
|
*/
|
||||||
|
function genCoroutine(...args) {
|
||||||
|
let gen = fn.apply(this, args);
|
||||||
gen.status = "next";
|
gen.status = "next";
|
||||||
gen.state = undefined;
|
gen.state = undefined;
|
||||||
const callback = (resolve, reject) => {
|
const callback = (resolve, reject) => {
|
||||||
|
@ -34,18 +32,18 @@ export class GNC extends Uninstantable {
|
||||||
gen.state = item;
|
gen.state = item;
|
||||||
gen.status = "next";
|
gen.status = "next";
|
||||||
callback(resolve, reject);
|
callback(resolve, reject);
|
||||||
}
|
};
|
||||||
throws = (err) => {
|
throws = (err) => {
|
||||||
gen.state = err;
|
gen.state = err;
|
||||||
gen.status = "throw";
|
gen.status = "throw";
|
||||||
callback(resolve, reject);
|
callback(resolve, reject);
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
result = result.value;
|
result = result.value;
|
||||||
Promise.resolve(result).then(nexts, throws);
|
Promise.resolve(result).then(nexts, throws);
|
||||||
}
|
};
|
||||||
return new Promise(callback);
|
return new Promise(callback);
|
||||||
} : (() => { throw new TypeError("gnc.of needs a GeneratorFunction.") })()
|
} : (() => { throw new TypeError("gnc.of needs a GeneratorFunction."); })();
|
||||||
}
|
}
|
||||||
static is = Is;
|
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 * as config from '../util/config.js';
|
||||||
import { gnc } from '../gnc/index.js';
|
import { gnc } from '../gnc/index.js';
|
||||||
|
|
||||||
|
import { importCardPack, importCharacterPack, importExtension, importMode } from './import.js';
|
||||||
|
import { onload } from './onload.js';
|
||||||
|
|
||||||
// 无名杀,启动!
|
// 无名杀,启动!
|
||||||
export async function boot() {
|
export async function boot() {
|
||||||
// 不想看,反正别动
|
// 不想看,反正别动
|
||||||
|
@ -29,11 +32,8 @@ export async function boot() {
|
||||||
|
|
||||||
// 设定游戏加载时间,超过时间未加载就提醒
|
// 设定游戏加载时间,超过时间未加载就提醒
|
||||||
const configLoadTime = localStorage.getItem(lib.configprefix + 'loadtime');
|
const configLoadTime = localStorage.getItem(lib.configprefix + 'loadtime');
|
||||||
Reflect.set(
|
// 现在不暴露到全局变量里了,直接传给onload
|
||||||
window,
|
const resetGameTimeout = setTimeout(lib.init.reset, configLoadTime ? parseInt(configLoadTime) : 10000)
|
||||||
'resetGameTimeout',
|
|
||||||
setTimeout(lib.init.reset, configLoadTime ? parseInt(configLoadTime) : 10000)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (Reflect.has(window, 'cordovaLoadTimeout')) {
|
if (Reflect.has(window, 'cordovaLoadTimeout')) {
|
||||||
clearTimeout(Reflect.get(window, 'cordovaLoadTimeout'));
|
clearTimeout(Reflect.get(window, 'cordovaLoadTimeout'));
|
||||||
|
@ -560,64 +560,7 @@ export async function boot() {
|
||||||
}
|
}
|
||||||
|
|
||||||
await waitDomLoad;
|
await waitDomLoad;
|
||||||
lib.init.onload();
|
await onload(resetGameTimeout);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function initSheet(libConfig) {
|
function initSheet(libConfig) {
|
||||||
|
@ -680,13 +623,13 @@ async function loadConfig() {
|
||||||
idbOpenDBRequest.onupgradeneeded = idbVersionChangeEvent => {
|
idbOpenDBRequest.onupgradeneeded = idbVersionChangeEvent => {
|
||||||
// @ts-expect-error MaybeHave
|
// @ts-expect-error MaybeHave
|
||||||
const idbDatabase = idbVersionChangeEvent.target.result;
|
const idbDatabase = idbVersionChangeEvent.target.result;
|
||||||
if (!idbDatabase.objectStoreNames.includes('video')) idbDatabase.createObjectStore('video', {
|
if (!idbDatabase.objectStoreNames.contains('video')) idbDatabase.createObjectStore('video', {
|
||||||
keyPath: 'time'
|
keyPath: 'time'
|
||||||
});
|
});
|
||||||
if (!idbDatabase.objectStoreNames.includes('image')) idbDatabase.createObjectStore('image');
|
if (!idbDatabase.objectStoreNames.contains('image')) idbDatabase.createObjectStore('image');
|
||||||
if (!idbDatabase.objectStoreNames.includes('audio')) idbDatabase.createObjectStore('audio');
|
if (!idbDatabase.objectStoreNames.contains('audio')) idbDatabase.createObjectStore('audio');
|
||||||
if (!idbDatabase.objectStoreNames.includes('config')) idbDatabase.createObjectStore('config');
|
if (!idbDatabase.objectStoreNames.contains('config')) idbDatabase.createObjectStore('config');
|
||||||
if (!idbDatabase.objectStoreNames.includes('data')) idbDatabase.createObjectStore('data');
|
if (!idbDatabase.objectStoreNames.contains('data')) idbDatabase.createObjectStore('data');
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
Reflect.set(lib, 'db', event.target.result);
|
Reflect.set(lib, 'db', event.target.result);
|
||||||
|
@ -750,14 +693,13 @@ async function onWindowReady() {
|
||||||
var script = document.createElement('script');
|
var script = document.createElement('script');
|
||||||
script.src = 'cordova.js';
|
script.src = 'cordova.js';
|
||||||
document.body.appendChild(script);
|
document.body.appendChild(script);
|
||||||
// @ts-ignore
|
await new Promise((resolve) => {
|
||||||
const { promise, resolve } = Promise.withResolvers();
|
|
||||||
document.addEventListener('deviceready', async () => {
|
document.addEventListener('deviceready', async () => {
|
||||||
const { cordovaReady } = await import('./cordova.js');
|
const { cordovaReady } = await import('./cordova.js');
|
||||||
await cordovaReady();
|
await cordovaReady();
|
||||||
resolve()
|
resolve(void 0)
|
||||||
});
|
});
|
||||||
await promise;
|
})
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
if (_status.packLoaded) {
|
if (_status.packLoaded) {
|
||||||
|
@ -810,6 +752,12 @@ function setServerIndex() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function setWindowListener() {
|
function setWindowListener() {
|
||||||
|
// 但愿有用
|
||||||
|
window.addEventListener("unhandledrejection", (error) => {
|
||||||
|
// 希望error.reason能是个正常的error
|
||||||
|
throw error.reason;
|
||||||
|
});
|
||||||
|
|
||||||
window.onkeydown = function (e) {
|
window.onkeydown = function (e) {
|
||||||
if (!Reflect.has(ui, 'menuContainer') || !Reflect.get(ui, 'menuContainer').classList.contains('hidden')) {
|
if (!Reflect.has(ui, 'menuContainer') || !Reflect.get(ui, 'menuContainer').classList.contains('hidden')) {
|
||||||
if (e.keyCode == 116 || ((e.ctrlKey || e.metaKey) && e.keyCode == 82)) {
|
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';
|
import { UI as ui } from '../ui/index.js';
|
||||||
|
|
||||||
export function nodeReady() {
|
export function nodeReady() {
|
||||||
|
const versions = window.process.versions;
|
||||||
|
// @ts-ignore
|
||||||
|
const electronVersion = parseFloat(versions.electron);
|
||||||
lib.node = {
|
lib.node = {
|
||||||
fs: require('fs'),
|
fs: require('fs'),
|
||||||
path: require("path"),
|
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();
|
ui.clear();
|
||||||
},
|
},
|
||||||
draw: async (event, _trigger, player) => {
|
draw: async (event, _trigger, player) => {
|
||||||
const { num } = event;
|
let { num } = event;
|
||||||
// if(lib.config.background_audio){
|
// if(lib.config.background_audio){
|
||||||
// game.playAudio('effect','draw');
|
// 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 { LibInit } from "./init/index.js";
|
||||||
import { Announce } from "./announce/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";
|
import * as Element from "./element/index.js";
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,6 +120,7 @@ export class Library extends Uninstantable {
|
||||||
this.playerOL;
|
this.playerOL;
|
||||||
throw new Error('Do not call this method');
|
throw new Error('Do not call this method');
|
||||||
}
|
}
|
||||||
|
|
||||||
//函数钩子
|
//函数钩子
|
||||||
static hooks = {
|
static hooks = {
|
||||||
// 本体势力的颜色
|
// 本体势力的颜色
|
||||||
|
@ -299,6 +302,7 @@ export class Library extends Uninstantable {
|
||||||
}
|
}
|
||||||
}],
|
}],
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* **无名杀频道推送机制**
|
* **无名杀频道推送机制**
|
||||||
*
|
*
|
||||||
|
@ -310,7 +314,6 @@ export class Library extends Uninstantable {
|
||||||
*
|
*
|
||||||
* 若需要异步/不报错发送信息,请等待`lib.actor`
|
* 若需要异步/不报错发送信息,请等待`lib.actor`
|
||||||
*
|
*
|
||||||
* @template T
|
|
||||||
* @example
|
* @example
|
||||||
* // 创建一个频道
|
* // 创建一个频道
|
||||||
* const channel = new lib.channel();
|
* const channel = new lib.channel();
|
||||||
|
@ -321,88 +324,8 @@ export class Library extends Uninstantable {
|
||||||
* // 从某个角落向channel发消息,若无消息接收则等待
|
* // 从某个角落向channel发消息,若无消息接收则等待
|
||||||
* await channel.send(item);
|
* await channel.send(item);
|
||||||
*/
|
*/
|
||||||
static channel = class {
|
static channel = Channel;
|
||||||
/**
|
|
||||||
* @template TValue
|
|
||||||
* @callback PromiseResolve
|
|
||||||
* @param {TValue} value
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
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>}
|
|
||||||
*/
|
|
||||||
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);
|
* lib.announce.unsubscribe("skinChange", method);
|
||||||
*/
|
*/
|
||||||
static announce = new Announce(new EventTarget(), new WeakMap());
|
static announce = new Announce(new EventTarget(), new WeakMap());
|
||||||
|
|
||||||
static objectURL = new Map();
|
static objectURL = new Map();
|
||||||
static hookmap = {};
|
static hookmap = {};
|
||||||
static imported = {};
|
static imported = {};
|
||||||
|
@ -9470,6 +9394,9 @@ export class Library extends Uninstantable {
|
||||||
stratagem_fury: '怒气',
|
stratagem_fury: '怒气',
|
||||||
_stratagem_add_buff: '强化'
|
_stratagem_add_buff: '强化'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static experimental = Experimental
|
||||||
|
|
||||||
static element = {
|
static element = {
|
||||||
content: Element.Content,
|
content: Element.Content,
|
||||||
contents: Element.Contents,
|
contents: Element.Contents,
|
||||||
|
|
|
@ -16,7 +16,7 @@ export class LibInit extends Uninstantable {
|
||||||
static promises = LibInitPromises
|
static promises = LibInitPromises
|
||||||
|
|
||||||
static init() {
|
static init() {
|
||||||
return;
|
throw new Error('lib.init.init is moved to noname/init')
|
||||||
}
|
}
|
||||||
|
|
||||||
static reset() {
|
static reset() {
|
||||||
|
@ -80,800 +80,9 @@ export class LibInit extends Uninstantable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//lib.onload支持传入GeneratorFunction以解决异步函数的问题 by诗笺
|
// 现在改lib.init.onload的都给我无报错被创
|
||||||
static async onload() {
|
static async onload() {
|
||||||
const libOnload = lib.onload;
|
throw new Error('lib.init.onload is moved to noname/init/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)();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static startOnline() {
|
static startOnline() {
|
||||||
|
|
|
@ -3,6 +3,10 @@ export const assetURL = typeof nonameInitialized != 'string' || nonameInitialize
|
||||||
export const GeneratorFunction = (function* () { }).constructor;
|
export const GeneratorFunction = (function* () { }).constructor;
|
||||||
export const AsyncFunction = (async function () { }).constructor;
|
export const AsyncFunction = (async function () { }).constructor;
|
||||||
export const userAgent = navigator.userAgent.toLowerCase();
|
export const userAgent = navigator.userAgent.toLowerCase();
|
||||||
|
|
||||||
|
// 我靠循环引用问题在这?
|
||||||
|
// export * as config from './config.js'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 不能被new的类
|
* 不能被new的类
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue