From c8d924d86315106ab3e2db2666f4be82b23a7165 Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Mon, 5 Feb 2024 23:17:29 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9C=AC=E4=BD=93?= =?UTF-8?q?=E4=B8=AD=E7=9A=84window.resolveLocalFileSystemURL=E8=B0=83?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/game/index.js | 12 ++++++------ noname/ui/index.js | 14 +++++++------- noname/util/index.js | 2 ++ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/noname/game/index.js b/noname/game/index.js index 7fefb3262..a48005ab8 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -16,7 +16,7 @@ import { Library as lib } from '../library/index.js'; import { status as _status } from '../status/index.js'; import { UI as ui } from '../ui/index.js'; import { GNC as gnc } from '../gnc/index.js'; -import { userAgent, Uninstantable, GeneratorFunction, AsyncFunction, delay } from "../util/index.js"; +import { userAgent, Uninstantable, GeneratorFunction, AsyncFunction, delay, nonameInitialized } from "../util/index.js"; import { DynamicStyle } from "./dynamic-style/index.js"; import { GamePromises } from "./promises.js"; @@ -1901,7 +1901,7 @@ export class Game extends Uninstantable { */ static createDir(directory, successCallback, errorCallback) { const paths = directory.split('/').reverse(); - if (window.resolveLocalFileSystemURL) return new Promise((resolve, reject) => window.resolveLocalFileSystemURL(lib.assetURL, resolve, reject)).then(directoryEntry => { + if (window.resolveLocalFileSystemURL) return new Promise((resolve, reject) => window.resolveLocalFileSystemURL(nonameInitialized, resolve, reject)).then(directoryEntry => { const redo = entry => new Promise((resolve, reject) => entry.getDirectory(paths.pop(), { create: true }, resolve, reject)).then(resolvedDirectoryEntry => { @@ -2028,7 +2028,7 @@ export class Game extends Uninstantable { } game.ensureDirectory(`extension/${extensionName}`).then(writeFile).catch(UHP); } - else new Promise((resolve, reject) => window.resolveLocalFileSystemURL(lib.assetURL, resolve, reject)).then(directoryEntry => new Promise((resolve, reject) => directoryEntry.getDirectory(`extension/${extensionName}`, { + else new Promise((resolve, reject) => window.resolveLocalFileSystemURL(nonameInitialized, resolve, reject)).then(directoryEntry => new Promise((resolve, reject) => directoryEntry.getDirectory(`extension/${extensionName}`, { create: true }, resolve, reject))).then(directoryEntry => { //扩展文件夹 @@ -4677,9 +4677,9 @@ export class Game extends Uninstantable { deleteFolderRecursive(`${__dirname}/extension/${extensionName}`); } catch (error) { - console.log(error); + console.error(error); } - else new Promise((resolve, reject) => window.resolveLocalFileSystemURL(`${lib.assetURL}extension/${extensionName}`, resolve, reject)).then(directoryEntry => directoryEntry.removeRecursively()); + else new Promise((resolve, reject) => window.resolveLocalFileSystemURL(`${nonameInitialized}extension/${extensionName}`, resolve, reject)).then(directoryEntry => directoryEntry.removeRecursively()); } static addRecentCharacter() { let list = get.config('recentCharacter') || []; @@ -8122,7 +8122,7 @@ export class Game extends Uninstantable { /** * @param { string } key * @param { * } [value] - * @param { string } [local] + * @param { string | boolean } [local] * @param { Function } [callback] */ static saveConfig(key, value, local, callback) { diff --git a/noname/ui/index.js b/noname/ui/index.js index 2960b84ac..a3638acfa 100644 --- a/noname/ui/index.js +++ b/noname/ui/index.js @@ -1,4 +1,4 @@ -import { Uninstantable } from "../util/index.js"; +import { Uninstantable, nonameInitialized } from "../util/index.js"; import { Library as lib } from '../library/index.js'; import { Game as game } from "../game/index.js"; import { Get as get } from "../get/index.js"; @@ -2111,7 +2111,7 @@ class Create extends Uninstantable { if (directoryList.length) { var dir = directoryList.shift(); var filelist = directories[dir]; - window.resolveLocalFileSystemURL(lib.assetURL + dir, function (entry) { + window.resolveLocalFileSystemURL(nonameInitialized + dir, function (entry) { var writeFile = function () { if (filelist.length) { var filename = filelist.shift(); @@ -2202,7 +2202,7 @@ class Create extends Uninstantable { unlink(); } else { - window.resolveLocalFileSystemURL(lib.assetURL + page.currentpath, function (entry) { + window.resolveLocalFileSystemURL(nonameInitialized + page.currentpath, function (entry) { var unlink = function () { if (selected.length) { entry.getFile(selected.shift().filename, { create: false }, function (fileEntry) { @@ -2257,7 +2257,7 @@ class Create extends Uninstantable { } } else { - window.resolveLocalFileSystemURL(lib.assetURL + this.path, function (entry) { + window.resolveLocalFileSystemURL(nonameInitialized + this.path, function (entry) { entry.removeRecursively(function () { enterDirectory(page, page.currentpath); }); @@ -2369,7 +2369,7 @@ class Create extends Uninstantable { lib.node.fs.mkdir(__dirname + '/' + path + '/' + str, refresh); } else { - window.resolveLocalFileSystemURL(lib.assetURL + path, function (entry) { + window.resolveLocalFileSystemURL(nonameInitialized + path, function (entry) { entry.getDirectory(str, { create: true }, refresh); }); } @@ -4327,7 +4327,7 @@ class Create extends Uninstantable { var url = lib.assetURL + 'extension/' + name + '/' + file; createButton(i, url); if (lib.device == 'ios' || lib.device == 'android') { - window.resolveLocalFileSystemURL(lib.assetURL + 'extension/' + name, function (entry) { + window.resolveLocalFileSystemURL(nonameInitialized + 'extension/' + name, function (entry) { entry.getFile(file, {}, function (fileEntry) { fileEntry.file(function (fileToLoad) { var fileReader = new FileReader(); @@ -4863,7 +4863,7 @@ class Create extends Uninstantable { var url = lib.assetURL + 'extension/' + name + '/' + file; createButton(i, url, fullskin); if (lib.device == 'ios' || lib.device == 'android') { - window.resolveLocalFileSystemURL(lib.assetURL + 'extension/' + name, function (entry) { + window.resolveLocalFileSystemURL(nonameInitialized + 'extension/' + name, function (entry) { entry.getFile(file, {}, function (fileEntry) { fileEntry.file(function (fileToLoad) { var fileReader = new FileReader(); diff --git a/noname/util/index.js b/noname/util/index.js index a1ac7857f..11face5a7 100644 --- a/noname/util/index.js +++ b/noname/util/index.js @@ -1,3 +1,5 @@ +/** @type { string } */ +// @ts-ignore export const nonameInitialized = localStorage.getItem('noname_inited'); export const assetURL = location.protocol.startsWith('http') || typeof nonameInitialized != 'string' || nonameInitialized == 'nodejs' ? '' : nonameInitialized; export const GeneratorFunction = (function* () {}).constructor; From 9b7ce5bc1ca75e4871d30041ce8a66735e9c8a91 Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Mon, 5 Feb 2024 23:27:16 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9C=AC=E4=BD=93?= =?UTF-8?q?=E4=B8=AD=E7=9A=84lib.element.xxx=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E5=8E=9F=E5=9E=8B=E6=8C=87=E5=90=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/library/element/button.js | 2 +- noname/library/element/card.js | 2 +- noname/library/element/contents.js | 3 +++ noname/library/element/control.js | 2 +- noname/library/element/dialog.js | 2 +- noname/library/element/player.js | 2 +- 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/noname/library/element/button.js b/noname/library/element/button.js index 7bce289e9..4fcf2a866 100644 --- a/noname/library/element/button.js +++ b/noname/library/element/button.js @@ -23,7 +23,7 @@ export class Button extends HTMLDivElement { 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) { - Object.setPrototypeOf(button, Button.prototype); + Object.setPrototypeOf(button, (lib.element.Button || Button).prototype); if (!noClick) button.addEventListener(lib.config.touchscreen ? 'touchend' : 'click', ui.click.button); else { button.classList.add('noclick'); diff --git a/noname/library/element/card.js b/noname/library/element/card.js index 78d8a554c..02d8bb61e 100644 --- a/noname/library/element/card.js +++ b/noname/library/element/card.js @@ -21,7 +21,7 @@ export class Card extends HTMLDivElement { */ // @ts-ignore const card = ui.create.div('.card', position); - Object.setPrototypeOf(card, Card.prototype); + Object.setPrototypeOf(card, (lib.element.Card || Card).prototype); // @ts-ignore card._args = [position]; return card; diff --git a/noname/library/element/contents.js b/noname/library/element/contents.js index d322eab06..c46269f49 100644 --- a/noname/library/element/contents.js +++ b/noname/library/element/contents.js @@ -6,6 +6,9 @@ import { status as _status } from '../../status/index.js'; import { UI as ui } from '../../ui/index.js'; import { GNC as gnc } from '../../gnc/index.js'; +/** + * @type { SMap<((event: GameEventPromise, trigger: GameEventPromise, player: Player) => Promise)[]> } + */ export const Contents = { phase: [ async (event) => { diff --git a/noname/library/element/control.js b/noname/library/element/control.js index 20e6be099..0b9545620 100644 --- a/noname/library/element/control.js +++ b/noname/library/element/control.js @@ -22,7 +22,7 @@ export class Control extends HTMLDivElement { */ // @ts-ignore const control = ui.create.div('.control'); - Object.setPrototypeOf(control, Control.prototype); + Object.setPrototypeOf(control, (lib.element.Control || Control).prototype); ui.control.insertBefore(control, _status.createControl || ui.confirm); controls.forEach(argument => { if (argument == 'nozoom') return; diff --git a/noname/library/element/dialog.js b/noname/library/element/dialog.js index 5db38f405..5d8bcc999 100644 --- a/noname/library/element/dialog.js +++ b/noname/library/element/dialog.js @@ -38,7 +38,7 @@ export class Dialog extends HTMLDivElement { /** @type { this } */ // @ts-ignore const dialog = ui.create.div('.dialog'); - Object.setPrototypeOf(dialog, Dialog.prototype); + Object.setPrototypeOf(dialog, (lib.element.Dialog || Dialog).prototype); dialog.contentContainer = ui.create.div('.content-container', dialog); dialog.content = ui.create.div('.content', dialog.contentContainer); dialog.bar1 = ui.create.div('.bar.top', dialog); diff --git a/noname/library/element/player.js b/noname/library/element/player.js index 3c84f0a98..7db756764 100644 --- a/noname/library/element/player.js +++ b/noname/library/element/player.js @@ -23,7 +23,7 @@ export class Player extends HTMLDivElement { */ // @ts-ignore const player = ui.create.div('.player', position); - Object.setPrototypeOf(player, Player.prototype); + Object.setPrototypeOf(player, (lib.element.Player || Player).prototype); // @ts-ignore player._args = [position]; return player; From 2d60f27e2b079ab8c13b54cab55807a8af5e85ca Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Mon, 5 Feb 2024 23:51:02 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E4=B8=BArunContent=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E5=A4=84=E4=BF=9D=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/game/index.js | 24 ++- noname/game/promises.js | 2 +- noname/library/element/gameEvent.js | 207 +++++++++++---------- noname/library/element/gameEventPromise.js | 1 + 4 files changed, 126 insertions(+), 108 deletions(-) diff --git a/noname/game/index.js b/noname/game/index.js index a48005ab8..46bb51611 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -5429,11 +5429,14 @@ export class Game extends Uninstantable { * 但是需要事件结果的除外 */ static executingAsyncEventMap = new Map(); + /** + * @type { GameEventPromise[] } + */ + static belongAsyncEventList = []; /** * @param { GameEventPromise } [belongAsyncEvent] */ static async loop(belongAsyncEvent) { - if (!game.belongAsyncEventList) game.belongAsyncEventList = []; if (belongAsyncEvent) { game.belongAsyncEventList.push(belongAsyncEvent); } else if (game.belongAsyncEventList.length) { @@ -5639,10 +5642,21 @@ export class Game extends Uninstantable { run(event).then(() => { // 其实这个if几乎一定执行了 if (game.executingAsyncEventMap.has(event.toEvent())) { - game.executingAsyncEventMap.set(_status.event.toEvent(), game.executingAsyncEventMap.get(_status.event.toEvent()).then(() => { - event.finish(); - resolve(); - })); + if (!game.executingAsyncEventMap.get(_status.event.toEvent())) { + console.warn(`game.executingAsyncEventMap中包括了event,但不包括_status.event!`); + console.log('event :>> ', event.toEvent()); + console.log('_status.event :>> ', _status.event.toEvent()); + // debugger; + game.executingAsyncEventMap.set(event.toEvent(), game.executingAsyncEventMap.get(event.toEvent()).then(() => { + event.finish(); + resolve(); + })); + } else { + game.executingAsyncEventMap.set(_status.event.toEvent(), game.executingAsyncEventMap.get(_status.event.toEvent()).then(() => { + event.finish(); + resolve(); + })); + } } else { event.finish(); resolve(); diff --git a/noname/game/promises.js b/noname/game/promises.js index c5f6d6988..4563fd8d3 100644 --- a/noname/game/promises.js +++ b/noname/game/promises.js @@ -13,7 +13,7 @@ export class GamePromises extends Uninstantable { * (alertOption: 'alert', title: string): Promise; * }} * - * @param { string } title 设置prompt标题与input内容 + * @param { string } [title] 设置prompt标题与input内容 * @param { boolean } [forced] 为true的话将没有"取消按钮" * @param { string } alertOption 设置prompt是否模拟alert * @example diff --git a/noname/library/element/gameEvent.js b/noname/library/element/gameEvent.js index 5817376c4..b46b7d9ea 100644 --- a/noname/library/element/gameEvent.js +++ b/noname/library/element/gameEvent.js @@ -65,6 +65,111 @@ export class GameEvent { static initialGameEvent() { return new GameEvent().finish().toPromise(); } + /** + * @type { Player } + */ + // @ts-ignore + source; + /** + * @type { Player } + */ + // @ts-ignore + player; + /** + * @type { Player } + */ + // @ts-ignore + target; + /** + * @type { Player[] } + */ + // @ts-ignore + targets; + /** + * @type { Card } + */ + // @ts-ignore + card; + /** + * @type { Card[] } + */ + // @ts-ignore + cards; + /** + * @type { string } + */ + skill; + /** + * @type { boolean } + */ + forced; + /** + * @type { number } + */ + num; + /** + * @type { GameEvent } + */ + // @ts-ignore + _trigger; + /** + * @type { Result } + */ + _result; + /** + * @type { number } + */ + // @ts-ignore + baseDamage; + /** + * @type { Player } + */ + // @ts-ignore + customSource; + /** + * @type { number } + */ + // @ts-ignore + extraDamage; + /** + * @type { string } + */ + // @ts-ignore + nature; + /** + * @type { boolean } + */ + // @ts-ignore + notrigger; + /** + * @type { number } + */ + // @ts-ignore + original_num; + /** + * @type { boolean } + */ + // @ts-ignore + unreal; + /** + * @type { Button[] } + */ + // @ts-ignore + excludeButton; + /** + * @type { Result } + */ + // @ts-ignore + result; + /** + * @type { GameEventPromise | void | null } + */ + // @ts-ignore + parent; + /** + * @type { string } + */ + name; /** * @param {keyof this} key * @param {number} [value] @@ -761,106 +866,4 @@ export class GameEvent { } return this.#promise; } - /** - * @returns {never} - */ - typeAnnotation() { - /** - * @type { Player } - */ - // @ts-ignore - this.source; - /** - * @type { Player } - */ - // @ts-ignore - this.player; - /** - * @type { Player } - */ - // @ts-ignore - this.target; - /** - * @type { Player[] } - */ - // @ts-ignore - this.targets; - /** - * @type { Card } - */ - // @ts-ignore - this.card; - /** - * @type { Card[] } - */ - // @ts-ignore - this.cards; - /** - * @type { string } - */ - this.skill; - /** - * @type { boolean } - */ - this.forced; - /** - * @type { number } - */ - this.num; - /** - * @type { GameEvent } - */ - // @ts-ignore - this._trigger; - /** - * @type { Record } - */ - this._result; - /** - * @type { number } - */ - // @ts-ignore - this.baseDamage; - /** - * @type { Player } - */ - // @ts-ignore - this.customSource; - /** - * @type { number } - */ - // @ts-ignore - this.extraDamage; - /** - * @type { string } - */ - // @ts-ignore - this.nature; - /** - * @type { boolean } - */ - // @ts-ignore - this.notrigger; - /** - * @type { number } - */ - // @ts-ignore - this.original_num; - /** - * @type { boolean } - */ - // @ts-ignore - this.unreal; - /** - * @type { Button[] } - */ - // @ts-ignore - this.excludeButton; - /** - * @type { Result } - */ - // @ts-ignore - this.result; - throw new Error('Do not call this method'); - } } diff --git a/noname/library/element/gameEventPromise.js b/noname/library/element/gameEventPromise.js index c3488f966..7aeecc31d 100644 --- a/noname/library/element/gameEventPromise.js +++ b/noname/library/element/gameEventPromise.js @@ -70,6 +70,7 @@ export class GameEventPromise extends Promise { if (lib.phaseName.includes(event.name)) event.player.getHistory('skipped').add(event.name); _status.event.next.remove(eventPromise); event.finish(); + // @ts-ignore resolve(); return eventPromise; } From cb34cd1e465d1ca972ddf67de28581ee7e6cf778 Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Mon, 5 Feb 2024 23:53:07 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=B8=BArunContent=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E5=A4=84=E4=BF=9D=E5=BA=95-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noname/game/index.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/noname/game/index.js b/noname/game/index.js index 46bb51611..2a05f9e68 100644 --- a/noname/game/index.js +++ b/noname/game/index.js @@ -5695,10 +5695,21 @@ export class Game extends Uninstantable { event.content(event, trigger, player).then(() => { // 其实这个if几乎一定执行了 if (game.executingAsyncEventMap.has(event.toEvent())) { - game.executingAsyncEventMap.set(_status.event.toEvent(), game.executingAsyncEventMap.get(_status.event.toEvent()).then(() => { - event.finish(); - resolve(); - })); + if (!game.executingAsyncEventMap.get(_status.event.toEvent())) { + console.warn(`game.executingAsyncEventMap中包括了event,但不包括_status.event!`); + console.log('event :>> ', event.toEvent()); + console.log('_status.event :>> ', _status.event.toEvent()); + // debugger; + game.executingAsyncEventMap.set(event.toEvent(), game.executingAsyncEventMap.get(event.toEvent()).then(() => { + event.finish(); + resolve(); + })); + } else { + game.executingAsyncEventMap.set(_status.event.toEvent(), game.executingAsyncEventMap.get(_status.event.toEvent()).then(() => { + event.finish(); + resolve(); + })); + } } else { event.finish(); resolve(); From d47bd0e0ea5063a425af55c692a45b2ec87e5ea7 Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Tue, 6 Feb 2024 00:26:11 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/clan.js | 3 ++- character/collab.js | 3 ++- character/ddd.js | 6 +++--- character/diy.js | 1 + character/extra.js | 2 +- character/gujian.js | 1 + character/gwent.js | 1 + character/hearth.js | 1 + character/huicui.js | 3 ++- node_modules/noname-typings/Card.d.ts | 2 +- node_modules/noname-typings/Skill.d.ts | 6 +++--- noname/get/index.js | 13 ++++++++----- 12 files changed, 26 insertions(+), 16 deletions(-) diff --git a/character/clan.js b/character/clan.js index ed77b47f9..e486df68b 100644 --- a/character/clan.js +++ b/character/clan.js @@ -33,6 +33,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clan_zhong:['clan_zhongyan','clan_zhonghui','clan_zhongyu'], }, }, + /** @type { importCharacterConfig['skill'] } */ skill:{ //族吴乔 clanqiajue:{ @@ -42,7 +43,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player.countCards('he',card=>{ if(_status.connectMode&&get.position(card)=='h') return true; return get.color(card,player)=='black'&&lib.filter.cardDiscardable(card,player); - }); + })>0; }, direct:true, async content(event,trigger,player){ diff --git a/character/collab.js b/character/collab.js index e6bc0a222..b1bc7f330 100644 --- a/character/collab.js +++ b/character/collab.js @@ -44,6 +44,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ collab_remake:['dc_caocao','dc_liubei','dc_sunquan','nezha','dc_sunce','dc_zhaoyun'], }, }, + /** @type { importCharacterConfig['skill'] } */ skill:{ //新InitFilter测试高达一号 //打赢复活赛的牢达[哭] @@ -52,7 +53,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:['chooseToUse','chooseToRespond'], prompt:'将♦牌当做火【杀】,♥牌当做【桃】,♣牌当做【闪】,♠牌当做【无懈可击】使用或打出', viewAs(cards,player){ - var name=false; + var name; var nature=null; switch(get.suit(cards[0],player)){ case 'club':name='shan';break; diff --git a/character/ddd.js b/character/ddd.js index a09538823..367321da4 100644 --- a/character/ddd.js +++ b/character/ddd.js @@ -4572,7 +4572,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ const skills=player.getStockSkills(true,true).filter(skill=>{ return !player.hasSkill(skill,null,false,false); }); - return skills.length; + return skills.length>0; }, filter_old(event,player){ var evt=event.getParent(); @@ -4677,7 +4677,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{global:'phaseUseBegin'}, filter(event,player){ - return player.countCards('h')&&event.player!=player; + return player.countCards('h')>0&&event.player!=player; }, direct:true, content(){ @@ -4791,7 +4791,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'useCardAfter'}, filter(event,player){ - return event.cards.filterInD('od').length&&get.color(event.card)=='red'; + return event.cards.filterInD('od').length>0&&get.color(event.card)=='red'; }, content(){ 'step 0' diff --git a/character/diy.js b/character/diy.js index dfca91915..5d5bf8bd1 100755 --- a/character/diy.js +++ b/character/diy.js @@ -547,6 +547,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_chihaya:['key_sakuya'], key_lucia:['key_shizuru'], }, + /** @type { importCharacterConfig['skill'] } */ skill:{ //伊吹风子 fuuko_xingdiao:{ diff --git a/character/extra.js b/character/extra.js index 71e4f2936..0bb6f8f75 100755 --- a/character/extra.js +++ b/character/extra.js @@ -90,7 +90,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return mode=='identity'&&_status.mode!='purple'; }, }, - /** @type { SMap } */ + /** @type { importCharacterConfig['skill'] } */ skill:{ //神鲁肃 dingzhou:{ diff --git a/character/gujian.js b/character/gujian.js index 2cc5f1207..e066e6d8a 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -213,6 +213,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, + /** @type { importCharacterConfig['skill'] } */ skill:{ qingshu:{ ai:{ diff --git a/character/gwent.js b/character/gwent.js index 6fa8fe5d9..fc98e2ac5 100644 --- a/character/gwent.js +++ b/character/gwent.js @@ -81,6 +81,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gw_luoqi:'是个爱国者…还是个货真价实的王八蛋。', gw_yioufeisi:'国王还是乞丐,两者有何区别,人类少一个算一个', }, + /** @type { importCharacterConfig['skill'] } */ skill:{ sqlongyin:{ trigger:{player:'phaseBeginStart'}, diff --git a/character/hearth.js b/character/hearth.js index 68ad2a36d..1a73ca43d 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -218,6 +218,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hs_jaina:['hs_antonidas'], hs_malfurion:['hs_malorne'], }, + /** @type { importCharacterConfig['skill'] } */ skill:{ hshuanyu:{ trigger:{player:'damageEnd'}, diff --git a/character/huicui.js b/character/huicui.js index 5034fee81..33bc35991 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -115,6 +115,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_zhengyin:['yue_caiwenji','yue_zhoufei','yue_caiyong','yue_xiaoqiao','yue_daqiao'], } }, + /** @type { importCharacterConfig['skill'] } */ skill:{ dcshengxi:{ inherit:'reshengxi', @@ -201,7 +202,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return card.hasGaintag('dcqiqin_tag')&&lib.skill.dczixi.zixiList.some(name=>{ return game.hasPlayer(target=>target.canAddJudge(get.autoViewAs({name:'dczixi_'+name},[card]))); }); - }); + })>0; }, zixiList:['lebu','bingliang','shandian'], direct:true, diff --git a/node_modules/noname-typings/Card.d.ts b/node_modules/noname-typings/Card.d.ts index 2fe33d972..d5c34474c 100644 --- a/node_modules/noname-typings/Card.d.ts +++ b/node_modules/noname-typings/Card.d.ts @@ -2,7 +2,7 @@ declare type CardBaseUIData = { name?: string; suit?: string; number?: number; - nature?: string; + nature?: string | null; //用于某些方法,用于过滤卡牌的额外结构 type?: string | string[]; diff --git a/node_modules/noname-typings/Skill.d.ts b/node_modules/noname-typings/Skill.d.ts index c0d1b5aef..ba57fcbce 100644 --- a/node_modules/noname-typings/Skill.d.ts +++ b/node_modules/noname-typings/Skill.d.ts @@ -863,7 +863,7 @@ declare interface Skill { * * 【v1.9.102】扩展:可以使用函数式viewAs,目前核心支持使用地方:backup,ok; */ - viewAs?: string | CardBaseUIData | ((cards: Card[], player: Player) => string | VCard | CardBaseUIData); + viewAs?: string | CardBaseUIData | ((cards: Card[], player: Player) => string | VCard | CardBaseUIData | null); /** * 视为技按钮出现条件(即发动条件) * @param player @@ -923,7 +923,7 @@ declare interface Skill { * * 取值false(因为undefined != false结果为true,故默认不填和true效果一致) */ - discard?: boolean; + discard?: boolean | ContentFuncByAll | OldContentFuncByAll; /** * 是否失去牌(是否调用player.lose) * @@ -1590,7 +1590,7 @@ declare interface SkillAI { * ai发动技能的优先度 【也用于卡牌的优先度】 * 要具体比什么先发发动,可以使用函数返回结果 */ - order?: number | TwoParmFun; + order?: number | ((item: SkillOrCard, player: Player) => number | void); /** * 发动技能是身份暴露度(0~1,相当于概率) * 取值范围为0~1,用于帮助AI判断身份,AI中未写expose其他AI将会无法判断其身份 diff --git a/noname/get/index.js b/noname/get/index.js index 9604218ab..26cb68b1a 100644 --- a/noname/get/index.js +++ b/noname/get/index.js @@ -2041,15 +2041,15 @@ export class Get extends Uninstantable { return card; } /** - * @template T + * @overload + * @returns {GameEvent} + */ + /** + * @template { keyof GameEvent } T * @overload * @param {T} key * @returns {GameEvent[T]} */ - /** - * @overload - * @returns {GameEvent} - */ static event(key) { return key ? _status.event[key] : _status.event; } static player() { return _status.event.player; } static players(sort, dead, out) { @@ -4205,6 +4205,9 @@ export class Get extends Uninstantable { let cache = CacheContext.requireCacheContext(); return cache.get.order(item); } + /** + * @returns { number } + */ static order(item) { let cache = CacheContext.requireCacheContext(); var info = get.info(item); From 91adde1a12edceb1067928df2ac6ca1e8b05de6c Mon Sep 17 00:00:00 2001 From: nonameShijian <2954700422@qq.com> Date: Tue, 6 Feb 2024 00:42:44 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node_modules/noname-typings/package.json | 2 +- node_modules/noname-typings/windowEx.d.ts | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/node_modules/noname-typings/package.json b/node_modules/noname-typings/package.json index db42e298b..b9ddb6642 100644 --- a/node_modules/noname-typings/package.json +++ b/node_modules/noname-typings/package.json @@ -1,6 +1,6 @@ { "name": "noname-typings", - "version": "2024.01.16", + "version": "2024.02.06", "description": "Noname typings, mainly for showing type hints when creating extensions of the Sanguosha-like game Noname.", "repository": { "type": "git", diff --git a/node_modules/noname-typings/windowEx.d.ts b/node_modules/noname-typings/windowEx.d.ts index aebf594b6..f0040283b 100644 --- a/node_modules/noname-typings/windowEx.d.ts +++ b/node_modules/noname-typings/windowEx.d.ts @@ -13,9 +13,7 @@ declare interface Window { } /** 游戏配置 */ - config: { - forbidai: string[], - } + config: SMap, /** 游戏源列表(预加载资源列表,待验证) */ noname_source_list?: string[],