feat: add copy constructor.
This commit is contained in:
parent
e24b14b676
commit
f5aba85f22
|
@ -15,6 +15,11 @@ export class Button extends HTMLDivElement {
|
|||
*/
|
||||
// @ts-ignore
|
||||
constructor(item, type, position, noClick, button) {
|
||||
if (item instanceof Button) {
|
||||
const other = item;
|
||||
// @ts-ignore
|
||||
[item, type, position, noClick, button] = other._args;
|
||||
}
|
||||
if (typeof type == 'function') button = type(item, type, position, noClick, button);
|
||||
else if (ui.create.buttonPresets[type]) button = ui.create.buttonPresets[type](item, type, position, noClick, button);
|
||||
if (button) {
|
||||
|
@ -25,6 +30,8 @@ export class Button extends HTMLDivElement {
|
|||
const intro = button.querySelector('.intro');
|
||||
if (intro) intro.remove();
|
||||
}
|
||||
// @ts-ignore
|
||||
button._args = [item, type, position, noClick, button];
|
||||
return button;
|
||||
} else {
|
||||
console.error([item, type, position, noClick, button]);
|
||||
|
@ -40,4 +47,4 @@ export class Button extends HTMLDivElement {
|
|||
get updateTransform() {
|
||||
return lib.element.Card.prototype.updateTransform;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,11 @@ export class Card extends HTMLDivElement {
|
|||
*/
|
||||
// @ts-ignore
|
||||
constructor(position, info, noclick) {
|
||||
if (position instanceof Card) {
|
||||
const other = position;
|
||||
// @ts-ignore
|
||||
[position, info, noclick] = other._args;
|
||||
}
|
||||
/**
|
||||
* @type {this}
|
||||
*/
|
||||
|
@ -20,6 +25,8 @@ export class Card extends HTMLDivElement {
|
|||
const card = ui.create.div('.card', position);
|
||||
Object.setPrototypeOf(card, Card.prototype);
|
||||
card.build(info, noclick);
|
||||
// @ts-ignore
|
||||
card._args = [position, info, noclick];
|
||||
return card;
|
||||
}
|
||||
build(info, noclick) {
|
||||
|
@ -784,4 +791,4 @@ export class Card extends HTMLDivElement {
|
|||
isInPile() {
|
||||
return ['c', 'd'].includes(get.position(this));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,9 +8,10 @@ import { GNC as gnc } from '../../gnc/index.js';
|
|||
|
||||
export class Client {
|
||||
/**
|
||||
* @param {import('../index.js').NodeWS | InstanceType<typeof import('ws').WebSocket>} ws
|
||||
* @param {import('../index.js').NodeWS | InstanceType<typeof import('ws').WebSocket> | Client} ws
|
||||
*/
|
||||
constructor(ws) {
|
||||
if (ws instanceof Client) throw new Error('Client cannot copy.')
|
||||
this.ws = ws;
|
||||
/**
|
||||
* @type { string }
|
||||
|
@ -72,4 +73,4 @@ export class Client {
|
|||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,9 +8,15 @@ import { GNC as gnc } from '../../gnc/index.js';
|
|||
|
||||
export class Control extends HTMLDivElement {
|
||||
// @ts-ignore
|
||||
constructor() {
|
||||
constructor(...args) {
|
||||
if (args[0] instanceof Control) {
|
||||
const other = args[0];
|
||||
// @ts-ignore
|
||||
args = other._args;
|
||||
}
|
||||
|
||||
const nc = !ui.control.querySelector('div:not(.removing):not(.stayleft)');
|
||||
const controls = Array.isArray(arguments[0]) ? arguments[0] : Array.from(arguments);
|
||||
const controls = Array.isArray(args[0]) ? args[0] : args;
|
||||
/**
|
||||
* @type {this}
|
||||
*/
|
||||
|
@ -54,6 +60,8 @@ export class Control extends HTMLDivElement {
|
|||
}
|
||||
|
||||
ui.updatec();
|
||||
// @ts-ignore
|
||||
control._args = args;
|
||||
return control;
|
||||
}
|
||||
open() {
|
||||
|
@ -129,4 +137,4 @@ export class Control extends HTMLDivElement {
|
|||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,13 @@ import { UI as ui } from '../../ui/index.js';
|
|||
|
||||
export class Dialog extends HTMLDivElement {
|
||||
// @ts-ignore
|
||||
constructor() {
|
||||
constructor(...args) {
|
||||
if (args[0] instanceof Dialog) {
|
||||
const other = args[0];
|
||||
// @ts-ignore
|
||||
args = other._args;
|
||||
}
|
||||
|
||||
let hidden = false;
|
||||
let noTouchScroll = false;
|
||||
let forceButton = false;
|
||||
|
@ -21,7 +27,7 @@ export class Dialog extends HTMLDivElement {
|
|||
dialog.bar1 = ui.create.div('.bar.top', dialog);
|
||||
dialog.bar2 = ui.create.div('.bar.bottom', dialog);
|
||||
dialog.buttons = [];
|
||||
Array.from(arguments).forEach(argument => {
|
||||
Array.from(args).forEach(argument => {
|
||||
if (typeof argument == 'boolean') dialog.static = argument;
|
||||
else if (argument == 'hidden') hidden = true;
|
||||
else if (argument == 'notouchscroll') noTouchScroll = true;
|
||||
|
@ -42,6 +48,8 @@ export class Dialog extends HTMLDivElement {
|
|||
dialog.forcebutton = true;
|
||||
dialog.classList.add('forcebutton');
|
||||
}
|
||||
// @ts-ignore
|
||||
dialog._args = args;
|
||||
return dialog;
|
||||
}
|
||||
add(item, noclick, zoom) {
|
||||
|
@ -175,4 +183,4 @@ export class Dialog extends HTMLDivElement {
|
|||
this.querySelector('.caption').innerHTML = str;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,15 +10,21 @@ export class GameEvent {
|
|||
/** @type { GameEventPromise } */
|
||||
#promise;
|
||||
/**
|
||||
* @param {string} [name]
|
||||
* @param {string | GameEvent} [name]
|
||||
* @param {false} [trigger]
|
||||
*/
|
||||
constructor(name, trigger) {
|
||||
if (name instanceof GameEvent) {
|
||||
const other = name;
|
||||
[name, trigger] = other.__args;
|
||||
}
|
||||
|
||||
if (typeof name == 'string') {
|
||||
this.name = name;
|
||||
const gameEvent = get.event();
|
||||
if (gameEvent) {
|
||||
const type = `onNext${name[0].toUpperCase()}${name.slice(1)}`;
|
||||
// @ts-ignore
|
||||
if (gameEvent.hasHandler(type)) this.pushHandler(...gameEvent.getHandler(type));
|
||||
}
|
||||
game.globalEventHandlers.addHandlerToEvent(this);
|
||||
|
@ -50,6 +56,7 @@ export class GameEvent {
|
|||
**/
|
||||
this.resolve = null;
|
||||
if (trigger !== false && !game.online) this._triggered = 0;
|
||||
this.__args = [name, trigger];
|
||||
}
|
||||
static initialGameEvent() {
|
||||
return new GameEvent().finish().toPromise();
|
||||
|
@ -852,4 +859,4 @@ export class GameEvent {
|
|||
this.excludeButton;
|
||||
throw new Error('Do not call this method');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,9 +37,15 @@ export class GameEventPromise extends Promise {
|
|||
}
|
||||
#event;
|
||||
/**
|
||||
* @param { GameEvent } event
|
||||
* @param { GameEvent | GameEventPromise } arg
|
||||
*/
|
||||
constructor(event) {
|
||||
constructor(arg) {
|
||||
if (arg instanceof GameEventPromise)
|
||||
throw new Error("GameEventPromise cannot copy.")
|
||||
/**
|
||||
* @type {GameEvent}
|
||||
*/
|
||||
const event = arg;
|
||||
super(resolve => {
|
||||
// 设置为异步事件
|
||||
event.async = true;
|
||||
|
@ -157,4 +163,4 @@ export class GameEventPromise extends Promise {
|
|||
game.promises.prompt('debugger调试').then(inputCallback);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,10 +8,10 @@ import { GNC as gnc } from '../../gnc/index.js';
|
|||
|
||||
export class NodeWS {
|
||||
/**
|
||||
* @param {string} id
|
||||
* @param {string | NodeWS} id
|
||||
*/
|
||||
constructor(id) {
|
||||
this.wsid = id;
|
||||
this.wsid = (id instanceof NodeWS) ? id.wsid : id;
|
||||
}
|
||||
send(message) {
|
||||
game.send('server', 'send', this.wsid, message);
|
||||
|
@ -22,4 +22,4 @@ export class NodeWS {
|
|||
close() {
|
||||
game.send('server', 'close', this.wsid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,11 @@ export class Player extends HTMLDivElement {
|
|||
*/
|
||||
// @ts-ignore
|
||||
constructor(position, noclick) {
|
||||
if (position instanceof Player) {
|
||||
const other = position;
|
||||
[position, noclick] = other._args;
|
||||
}
|
||||
|
||||
/**
|
||||
* @type {this}
|
||||
*/
|
||||
|
@ -19,6 +24,8 @@ export class Player extends HTMLDivElement {
|
|||
const player = ui.create.div('.player', position);
|
||||
Object.setPrototypeOf(player, Player.prototype);
|
||||
player.build(noclick);
|
||||
// @ts-ignore
|
||||
player._args = [position, noclick];
|
||||
return player;
|
||||
}
|
||||
/**
|
||||
|
|
|
@ -13,6 +13,11 @@ export class VCard {
|
|||
* @param { string } [nature]
|
||||
*/
|
||||
constructor(suitOrCard, numberOrCards, name, nature) {
|
||||
if (suitOrCard instanceof VCard) {
|
||||
const other = suitOrCard;
|
||||
[suitOrCard, numberOrCards, name, nature] = other._args;
|
||||
}
|
||||
|
||||
if (Array.isArray(suitOrCard)) {
|
||||
/**
|
||||
* @type {string}
|
||||
|
@ -91,6 +96,8 @@ export class VCard {
|
|||
if (typeof nature == 'string') this.nature = nature;
|
||||
if (!this.storage) this.storage = {};
|
||||
if (!this.cards) this.cards = [];
|
||||
|
||||
this._args = [suitOrCard, numberOrCards, name, nature];
|
||||
}
|
||||
sameSuitAs(card) {
|
||||
return get.suit(this) == get.suit(card);
|
||||
|
@ -119,4 +126,4 @@ export class VCard {
|
|||
if (nature == 'linked') return natures.some(n => lib.linked.includes(n));
|
||||
return get.is.sameNature(natures, nature);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue