//********************* // create by 流云 // time: Mon Apr 20 2026 // desc: //********************* import { _decorator, Component, Node, Color, instantiate, Label, EditBox } from 'cc'; import { Auto_PopGM } from './Auto_PopGM'; import { TableNames } from '../../game/ConfigTableData'; import { WeaponComposeConfigProvider } from '../../battle/bag/WeaponComposeConfigProvider'; const { ccclass, property } = _decorator; @ccclass('UIPopGM') export class UIPopGM extends Auto_PopGM { /** 武器/技能列表项底色,按品级 quality 1~4 对应;在 PopGM 预制体上配置 */ @property({ type: [Color], displayName: '品级底色(1~4)' }) colors: Color[] = []; curentwpArr: number[] = []; curentskillArr: number[] = []; onLoad(): void { super.onLoad(); } onEnable(): void { super.onEnable(); } onDisable(): void { super.onDisable(); } onInit(): void { this.typeNum = this.prema; this.curentwpArr = [...(gg.game.playerWeaponIdArray ?? [])]; this.curentskillArr = this._extractSkillIds(gg.game.playerSkillIdArray); if (this.typeNum == 1) { this.click_btnWpSet(); } else { this.click_btnSkill(); } } typeNum: number = 0; click_btnClose(): void { this.close(); } click_btnClaer(): void { if (this.ui_wpSelect.active) { gg.game.playerWeaponIdArray = []; gg.game.playerSkillIdArray = []; this.curentwpArr = []; this.curentskillArr = []; this.updateWp(); } } click_btnSave(): void { if (this.ui_setWp.active) { for (let i = 0; i < this.ui_wpSetList.children.length; i++) { let n = this.ui_wpSetList.children[i]; if (!n.active) continue; let id = Number(n.name); let level = Number(n.getChildByName('EditBox').getComponent(EditBox).string); gg.data.project.unlockWeapon(id); gg.data.project.setWeaponLevel(id, level); } gg.data.saveToServer(); gg.ui.showToast('武器等级已保存'); } else if (this.ui_wpSelect.active) { gg.game.playerWeaponIdArray = [...this.curentwpArr]; gg.game.playerSkillIdArray = [...this.curentskillArr]; gg.ui.showToast('预设武器/技能已保存'); } } click_btnSkill(): void { this.ui_setWp.active = false; this.ui_wpSelect.active = true; this.updateWp(); } click_btnWpSet(): void { this.ui_setWp.active = true; this.ui_wpSelect.active = false; this.updateSetLevel(); } updateWp() { const allList = this._getGmWeapon1List(); this.ui_wpList.children.map(x => x.active = false); for (let i = 0; i < allList.length; i++) { let w1 = allList[i]; let n: Node = null; if (i < this.ui_wpList.children.length) { n = this.ui_wpList.children[i]; } else { n = instantiate(this.ui_wpList.children[0]); this.ui_wpList.addChild(n); } n.active = true; let bg = n.getChildByName('bg'); let lbName = n.getChildByName('lbName'); let select = n.getChildByName('select'); select.active = this.curentwpArr.includes(Number(w1.id)); lbName.getComponent(Label).string = w1.name; bg.color = this.colors[w1.quality - 1]; n.targetOff(Node.EventType.TOUCH_END); n.on(Node.EventType.TOUCH_END, this.onClickWp.bind(this, n, w1), this); } // 旧词条 Skill.weapon / quality 已删:GM「已选武器技能」列表清空 this.ui_waSelectSkillList.children.map(x => x.active = false); this.curentskillArr.length = 0; } updateSetLevel() { const allList = this._getGmWeapon1List(); this.ui_wpSetList.children.map(x => x.active = false); for (let i = 0; i < allList.length; i++) { let w1 = allList[i]; let n: Node = null; if (i < this.ui_wpSetList.children.length) { n = this.ui_wpSetList.children[i]; } else { n = instantiate(this.ui_wpSetList.children[0]); this.ui_wpSetList.addChild(n); } n.active = true; n.name = w1.id.toString(); let bg = n.getChildByName('bg'); let lbName = n.getChildByName('lbName'); let ed = n.getChildByName('EditBox').getComponent(EditBox); lbName.getComponent(Label).string = w1.name; bg.color = this.colors[w1.quality - 1]; ed.string = gg.data.project.getWeaponLevel(w1.id).toString(); } } onClickWp(n: Node, data: ITableHero) { const id = Number(data.id); if (!this.curentwpArr.includes(id)) { this.curentwpArr.push(id); } else { this.curentwpArr.splice(this.curentwpArr.indexOf(id), 1); } this.updateWp(); } onClickWpSelect(n: Node, data: ITableSkill) { const skillId = Number(data.id); if (this.curentskillArr.includes(skillId)) { this.curentskillArr.splice(this.curentskillArr.indexOf(skillId), 1); n.getChildByName('select').active = false; } else { this.curentskillArr.push(skillId); n.getChildByName('select').active = true; } } /** Weapon1 全表:有 group 配置的英雄/武器(含刀棍斧箭) */ private _getGmWeapon1List(): ITableHero[] { const provider = WeaponComposeConfigProvider.instance; provider.load(); return (gg.data.table.getTableList(TableNames.Hero) ?? []) .filter((w) => provider.getWeapon1Group(w.id).length > 0) .sort((a, b) => Number(a.id) - Number(b.id)); } /** 兼容 GM 预设:playerSkillIdArray 可能是 number[] 或带 id 的对象数组 */ private _extractSkillIds(raw: unknown): number[] { if (!Array.isArray(raw)) return []; const ids: number[] = []; for (const entry of raw) { const id = typeof entry === 'number' ? entry : Number((entry as { id?: number })?.id); if (Number.isFinite(id) && id > 0 && !ids.includes(id)) { ids.push(id); } } return ids; } }