From 21aab1f7fdaed1aa2e1bb45a666e0fdede301936 Mon Sep 17 00:00:00 2001 From: humingxing <930621236@qq.com> Date: Sat, 10 Oct 2026 10:50:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=98=E6=96=97=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battleGame/prefab/BattleGame.prefab | 2 +- .../battleGame/prefab/营地血条.prefab | 150 ++++++++++++++++- assets/bundles/first/config/Battlebuff.json | 6 +- assets/bundles/first/config/Const.json | 6 + assets/bundles/icons/img/仙桃.png | Bin 37113 -> 0 bytes assets/bundles/icons/img/金币.png | Bin 0 -> 7811 bytes .../img/{仙桃.png.meta => 金币.png.meta} | 74 ++++----- assets/mx/components/list/List.ts | 3 +- assets/mx/module/merge/core/MergeSession.ts | 2 +- assets/res/spine/保护派派.atlas | 55 +++++++ assets/res/spine/保护派派.atlas.meta | 12 ++ assets/res/spine/保护派派.json | 1 + assets/res/spine/保护派派.json.meta | 13 ++ assets/res/spine/保护派派.png | Bin 0 -> 6279 bytes assets/res/spine/保护派派.png.meta | 134 ++++++++++++++++ assets/res/spine/{likeRole => }/数字.meta | 0 .../spine/{likeRole => }/数字/数字1.atlas | 0 .../{likeRole => }/数字/数字1.atlas.meta | 0 .../spine/{likeRole => }/数字/数字1.json | 0 .../{likeRole => }/数字/数字1.json.meta | 0 .../spine/{likeRole => }/数字/数字1.png | Bin .../{likeRole => }/数字/数字1.png.meta | 0 .../{likeRole => }/数字/数字1024.atlas | 0 .../数字/数字1024.atlas.meta | 0 .../{likeRole => }/数字/数字1024.json | 0 .../数字/数字1024.json.meta | 0 .../{likeRole => }/数字/数字1024.png | Bin .../{likeRole => }/数字/数字1024.png.meta | 0 .../{likeRole => }/数字/数字128.atlas | 0 .../数字/数字128.atlas.meta | 0 .../{likeRole => }/数字/数字128.json | 0 .../{likeRole => }/数字/数字128.json.meta | 0 .../spine/{likeRole => }/数字/数字128.png | Bin .../{likeRole => }/数字/数字128.png.meta | 0 .../{likeRole => }/数字/数字16.atlas | 0 .../{likeRole => }/数字/数字16.atlas.meta | 0 .../spine/{likeRole => }/数字/数字16.json | 0 .../{likeRole => }/数字/数字16.json.meta | 0 .../spine/{likeRole => }/数字/数字16.png | Bin .../{likeRole => }/数字/数字16.png.meta | 0 .../spine/{likeRole => }/数字/数字2.atlas | 0 .../{likeRole => }/数字/数字2.atlas.meta | 0 .../spine/{likeRole => }/数字/数字2.json | 0 .../{likeRole => }/数字/数字2.json.meta | 0 .../spine/{likeRole => }/数字/数字2.png | Bin .../{likeRole => }/数字/数字2.png.meta | 0 .../{likeRole => }/数字/数字2048.atlas | 0 .../数字/数字2048.atlas.meta | 0 .../{likeRole => }/数字/数字2048.json | 0 .../数字/数字2048.json.meta | 0 .../{likeRole => }/数字/数字2048.png | Bin .../{likeRole => }/数字/数字2048.png.meta | 0 .../{likeRole => }/数字/数字256.atlas | 0 .../数字/数字256.atlas.meta | 0 .../{likeRole => }/数字/数字256.json | 0 .../{likeRole => }/数字/数字256.json.meta | 0 .../spine/{likeRole => }/数字/数字256.png | Bin .../{likeRole => }/数字/数字256.png.meta | 0 .../{likeRole => }/数字/数字32.atlas | 0 .../{likeRole => }/数字/数字32.atlas.meta | 0 .../spine/{likeRole => }/数字/数字32.json | 0 .../{likeRole => }/数字/数字32.json.meta | 0 .../spine/{likeRole => }/数字/数字32.png | Bin .../{likeRole => }/数字/数字32.png.meta | 0 .../spine/{likeRole => }/数字/数字4.atlas | 0 .../{likeRole => }/数字/数字4.atlas.meta | 0 .../spine/{likeRole => }/数字/数字4.json | 0 .../{likeRole => }/数字/数字4.json.meta | 0 .../spine/{likeRole => }/数字/数字4.png | Bin .../{likeRole => }/数字/数字4.png.meta | 0 .../{likeRole => }/数字/数字4096.atlas | 0 .../数字/数字4096.atlas.meta | 0 .../{likeRole => }/数字/数字4096.json | 0 .../数字/数字4096.json.meta | 0 .../{likeRole => }/数字/数字4096.png | Bin .../{likeRole => }/数字/数字4096.png.meta | 0 .../{likeRole => }/数字/数字512.atlas | 0 .../数字/数字512.atlas.meta | 0 .../{likeRole => }/数字/数字512.json | 0 .../{likeRole => }/数字/数字512.json.meta | 0 .../spine/{likeRole => }/数字/数字512.png | Bin .../{likeRole => }/数字/数字512.png.meta | 0 .../{likeRole => }/数字/数字64.atlas | 0 .../{likeRole => }/数字/数字64.atlas.meta | 0 .../spine/{likeRole => }/数字/数字64.json | 0 .../{likeRole => }/数字/数字64.json.meta | 0 .../spine/{likeRole => }/数字/数字64.png | Bin .../{likeRole => }/数字/数字64.png.meta | 0 .../spine/{likeRole => }/数字/数字8.atlas | 0 .../{likeRole => }/数字/数字8.atlas.meta | 0 .../spine/{likeRole => }/数字/数字8.json | 0 .../{likeRole => }/数字/数字8.json.meta | 0 .../spine/{likeRole => }/数字/数字8.png | Bin .../{likeRole => }/数字/数字8.png.meta | 0 .../{likeRole => }/数字/数字8192.atlas | 0 .../数字/数字8192.atlas.meta | 0 .../{likeRole => }/数字/数字8192.json | 0 .../数字/数字8192.json.meta | 0 .../{likeRole => }/数字/数字8192.png | Bin .../{likeRole => }/数字/数字8192.png.meta | 0 .../battle/ai/runtime/AiActiveSkillHost.ts | 3 +- assets/script/battle/bag/AutoMergePlanner.ts | 3 + assets/script/battle/bag/BagPrepConfig.ts | 17 ++ assets/script/battle/bond/InBattleBondHost.ts | 129 ++------------- .../script/battle/combat/MonsterSkillHost.ts | 6 +- .../script/battle/combat/TowerQueryService.ts | 4 +- .../battle/config/ChapterLevelBuilder.ts | 6 +- .../config/TableBattleConfigProvider.ts | 2 +- .../script/battle/debug/BagRefreshDebugLog.ts | 4 +- .../battle/debug/GlobalSkillDebugLog.ts | 2 +- .../battle/mechanism/MechanismResCollector.ts | 6 +- .../battle/mechanism/MechanismServices.ts | 2 +- .../presentation/ExtraStrikePresenter.ts | 3 - .../presentation/RingProjectilesPresenter.ts | 3 +- assets/script/battle/runtime/BattleRuntime.ts | 33 ++++ .../battle/skill/SkillPresentationEnv.ts | 48 ++---- assets/script/battle/skill/WangMuConfig.ts | 39 +---- .../battle/view/AreaUnlockGuidePresenter.ts | 92 ++++++----- .../battle/view/BoardPlaceFlightExecutor.ts | 4 +- .../script/battle/view/CampHpBarPresenter.ts | 151 ++++++++++++++++-- .../script/battle/view/CocosBagBoardView.ts | 57 ++++++- .../battle/view/GridUpgradeSpineEffect.ts | 4 +- assets/script/com/itemPic.ts | 2 +- assets/script/game/ConfigProjectData.ts | 18 +-- assets/script/game/ConfigRes.ts | 4 +- assets/script/game/GameData.ts | 3 +- assets/script/game/GameDataEnums.ts | 2 + .../BattleGame/BattlePeachCoinFlyPresenter.ts | 6 +- assets/script/ui/BattleGame/CoinFly.ts | 2 +- assets/script/ui/BattleGame/UIBattleGame.ts | 107 ++++++++++++- .../ui/BattleWeaponDesc/UIBattleWeaponDesc.ts | 6 +- assets/script/ui/GetReward/RewardGrid.ts | 7 +- assets/script/ui/GetReward/UIGetReward.ts | 6 +- .../UIPopDailyShopLottery.ts | 2 +- assets/script/ui/PopGM/UIPopGM.ts | 35 +--- settings/v2/packages/information.json | 4 +- 配置表/excelList/常量表.xlsx | Bin 11637 -> 11722 bytes 137 files changed, 896 insertions(+), 384 deletions(-) delete mode 100644 assets/bundles/icons/img/仙桃.png create mode 100644 assets/bundles/icons/img/金币.png rename assets/bundles/icons/img/{仙桃.png.meta => 金币.png.meta} (75%) create mode 100644 assets/res/spine/保护派派.atlas create mode 100644 assets/res/spine/保护派派.atlas.meta create mode 100644 assets/res/spine/保护派派.json create mode 100644 assets/res/spine/保护派派.json.meta create mode 100644 assets/res/spine/保护派派.png create mode 100644 assets/res/spine/保护派派.png.meta rename assets/res/spine/{likeRole => }/数字.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字1.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字1.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字1.json (100%) rename assets/res/spine/{likeRole => }/数字/数字1.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字1.png (100%) rename assets/res/spine/{likeRole => }/数字/数字1.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字1024.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字1024.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字1024.json (100%) rename assets/res/spine/{likeRole => }/数字/数字1024.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字1024.png (100%) rename assets/res/spine/{likeRole => }/数字/数字1024.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字128.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字128.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字128.json (100%) rename assets/res/spine/{likeRole => }/数字/数字128.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字128.png (100%) rename assets/res/spine/{likeRole => }/数字/数字128.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字16.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字16.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字16.json (100%) rename assets/res/spine/{likeRole => }/数字/数字16.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字16.png (100%) rename assets/res/spine/{likeRole => }/数字/数字16.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字2.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字2.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字2.json (100%) rename assets/res/spine/{likeRole => }/数字/数字2.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字2.png (100%) rename assets/res/spine/{likeRole => }/数字/数字2.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字2048.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字2048.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字2048.json (100%) rename assets/res/spine/{likeRole => }/数字/数字2048.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字2048.png (100%) rename assets/res/spine/{likeRole => }/数字/数字2048.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字256.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字256.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字256.json (100%) rename assets/res/spine/{likeRole => }/数字/数字256.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字256.png (100%) rename assets/res/spine/{likeRole => }/数字/数字256.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字32.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字32.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字32.json (100%) rename assets/res/spine/{likeRole => }/数字/数字32.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字32.png (100%) rename assets/res/spine/{likeRole => }/数字/数字32.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字4.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字4.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字4.json (100%) rename assets/res/spine/{likeRole => }/数字/数字4.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字4.png (100%) rename assets/res/spine/{likeRole => }/数字/数字4.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字4096.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字4096.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字4096.json (100%) rename assets/res/spine/{likeRole => }/数字/数字4096.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字4096.png (100%) rename assets/res/spine/{likeRole => }/数字/数字4096.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字512.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字512.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字512.json (100%) rename assets/res/spine/{likeRole => }/数字/数字512.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字512.png (100%) rename assets/res/spine/{likeRole => }/数字/数字512.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字64.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字64.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字64.json (100%) rename assets/res/spine/{likeRole => }/数字/数字64.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字64.png (100%) rename assets/res/spine/{likeRole => }/数字/数字64.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字8.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字8.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字8.json (100%) rename assets/res/spine/{likeRole => }/数字/数字8.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字8.png (100%) rename assets/res/spine/{likeRole => }/数字/数字8.png.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字8192.atlas (100%) rename assets/res/spine/{likeRole => }/数字/数字8192.atlas.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字8192.json (100%) rename assets/res/spine/{likeRole => }/数字/数字8192.json.meta (100%) rename assets/res/spine/{likeRole => }/数字/数字8192.png (100%) rename assets/res/spine/{likeRole => }/数字/数字8192.png.meta (100%) diff --git a/assets/bundles/battleGame/prefab/BattleGame.prefab b/assets/bundles/battleGame/prefab/BattleGame.prefab index cf0450d..6364c8f 100644 --- a/assets/bundles/battleGame/prefab/BattleGame.prefab +++ b/assets/bundles/battleGame/prefab/BattleGame.prefab @@ -9972,7 +9972,7 @@ }, "clickEvents": [], "_interactable": true, - "_transition": 3, + "_transition": 0, "_normalColor": { "__type__": "cc.Color", "r": 255, diff --git a/assets/bundles/battleGame/prefab/营地血条.prefab b/assets/bundles/battleGame/prefab/营地血条.prefab index 5a100ee..74f49d5 100644 --- a/assets/bundles/battleGame/prefab/营地血条.prefab +++ b/assets/bundles/battleGame/prefab/营地血条.prefab @@ -20,19 +20,22 @@ "_children": [ { "__id__": 2 + }, + { + "__id__": 14 } ], "_active": true, "_components": [ { - "__id__": 14 + "__id__": 20 }, { - "__id__": 16 + "__id__": 22 } ], "_prefab": { - "__id__": 18 + "__id__": 24 }, "_lpos": { "__type__": "cc.Vec3", @@ -332,6 +335,142 @@ "targetOverrides": null, "nestedPrefabInstanceRoots": null }, + { + "__type__": "cc.Node", + "_name": "保护派派", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 15 + }, + { + "__id__": 17 + } + ], + "_prefab": { + "__id__": 19 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": -43.859, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 14 + }, + "_enabled": true, + "__prefab": { + "__id__": 16 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 45.7599983215332, + "height": 52.790000915527344 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.4755244979683985, + "y": 0.3559386359093728 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "f5/i6nMStGQb2+BCobRDcY" + }, + { + "__type__": "sp.Skeleton", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 14 + }, + "_enabled": true, + "__prefab": { + "__id__": 18 + }, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_skeletonData": { + "__uuid__": "7349a7a2-5944-4811-993a-0febfe291be3", + "__expectedType__": "sp.SkeletonData" + }, + "defaultSkin": "default", + "defaultAnimation": "待机", + "_premultipliedAlpha": false, + "_timeScale": 1, + "_preCacheMode": 0, + "_cacheMode": 0, + "_sockets": [], + "_useTint": false, + "_debugMesh": false, + "_debugBones": false, + "_debugSlots": false, + "_enableBatch": false, + "loop": true, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "cfLPcS9oxASqTT67HsdQl9" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "8egfQqvRhCGLfXhalDzSH8", + "instance": null, + "targetOverrides": null, + "nestedPrefabInstanceRoots": null + }, { "__type__": "cc.UITransform", "_name": "", @@ -342,7 +481,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 15 + "__id__": 21 }, "_contentSize": { "__type__": "cc.Size", @@ -370,7 +509,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 17 + "__id__": 23 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -414,6 +553,7 @@ "__id__": 0 }, "fileId": "e1uX9LxBJNRqVgq//ID0oy", + "instance": null, "targetOverrides": null } ] \ No newline at end of file diff --git a/assets/bundles/first/config/Battlebuff.json b/assets/bundles/first/config/Battlebuff.json index 8b7bd51..6e2e0bb 100644 --- a/assets/bundles/first/config/Battlebuff.json +++ b/assets/bundles/first/config/Battlebuff.json @@ -17,7 +17,7 @@ "desc": "一定几率召唤出倍率卡,拖到数字上升1级或2级", "icon": "倍率卡", "quality": 4, - "type": 1, + "type": 2, "functiontype": 2, "functionpar": "1000,80,20", "weight": 1, @@ -79,7 +79,7 @@ "quality": 3, "type": 2, "functiontype": 7, - "functionpar": 50003000, + "functionpar": "5000,3000", "weight": 1, "price": 120 }, @@ -185,7 +185,7 @@ "desc": "一定几率召唤出属性卡,拖到数字上随机变换一个属性", "icon": "属性卡", "quality": 3, - "type": 1, + "type": 2, "functiontype": 16, "functionpar": 1000, "weight": 1, diff --git a/assets/bundles/first/config/Const.json b/assets/bundles/first/config/Const.json index aded47d..545a357 100644 --- a/assets/bundles/first/config/Const.json +++ b/assets/bundles/first/config/Const.json @@ -220,5 +220,11 @@ "desc": "星期7地图id", "para": 0, "para1": "6,1,2" + }, + { + "id": 38, + "desc": "战斗中看视频加金币次数和对应数量,次数就是数组长度", + "para": 0, + "para1": "30,100,200" } ] \ No newline at end of file diff --git a/assets/bundles/icons/img/仙桃.png b/assets/bundles/icons/img/仙桃.png deleted file mode 100644 index 3f1460e11529780afedf37d0cc266c34ed1f3826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37113 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 Ve&?sP=Q#iX002ovPDHLkV1oY|=5+u7 literal 0 HcmV?d00001 diff --git a/assets/bundles/icons/img/仙桃.png.meta b/assets/bundles/icons/img/金币.png.meta similarity index 75% rename from assets/bundles/icons/img/仙桃.png.meta rename to assets/bundles/icons/img/金币.png.meta index e06a45a..7ea4b14 100644 --- a/assets/bundles/icons/img/仙桃.png.meta +++ b/assets/bundles/icons/img/金币.png.meta @@ -11,7 +11,7 @@ "6c48a": { "importer": "texture", "uuid": "838b701a-0e28-49f7-8d4d-175b36c48b6d@6c48a", - "displayName": "仙桃", + "displayName": "金币", "id": "6c48a", "name": "texture", "userData": { @@ -35,20 +35,20 @@ "f9941": { "importer": "sprite-frame", "uuid": "838b701a-0e28-49f7-8d4d-175b36c48b6d@f9941", - "displayName": "仙桃", + "displayName": "金币", "id": "f9941", "name": "spriteFrame", "userData": { "trimThreshold": 1, "rotated": false, "offsetX": 0, - "offsetY": -4, - "trimX": 8, - "trimY": 24, - "width": 184, - "height": 160, - "rawWidth": 200, - "rawHeight": 200, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 49, + "height": 47, + "rawWidth": 49, + "rawHeight": 47, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -60,17 +60,17 @@ "meshType": 0, "vertices": { "rawPosition": [ - -92, - -80, + -24.5, + -23.5, 0, - 92, - -80, + 24.5, + -23.5, 0, - -92, - 80, + -24.5, + 23.5, 0, - 92, - 80, + 24.5, + 23.5, 0 ], "indexes": [ @@ -82,33 +82,33 @@ 3 ], "uv": [ - 8, - 176, - 192, - 176, - 8, - 16, - 192, - 16 + 0, + 47, + 49, + 47, + 0, + 0, + 49, + 0 ], "nuv": [ - 0.04, - 0.08, - 0.96, - 0.08, - 0.04, - 0.88, - 0.96, - 0.88 + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1 ], "minPos": [ - -92, - -80, + -24.5, + -23.5, 0 ], "maxPos": [ - 92, - 80, + 24.5, + 23.5, 0 ] }, diff --git a/assets/mx/components/list/List.ts b/assets/mx/components/list/List.ts index 926078c..86e3bbc 100644 --- a/assets/mx/components/list/List.ts +++ b/assets/mx/components/list/List.ts @@ -397,8 +397,7 @@ export default class List extends Component { /** ScrollView.view(Mask 裁剪区)尺寸,用于虚拟列表可视范围计算 */ private _getViewUt(): UITransform { - const viewNode = this._scrollView?.view as Node | null; - return viewNode?.getComponent(UITransform) ?? this._thisNodeUt; + return this._scrollView?.view ?? this._thisNodeUt; } //---------------------------------------------------------------------------- diff --git a/assets/mx/module/merge/core/MergeSession.ts b/assets/mx/module/merge/core/MergeSession.ts index a942479..fdacd4d 100644 --- a/assets/mx/module/merge/core/MergeSession.ts +++ b/assets/mx/module/merge/core/MergeSession.ts @@ -84,7 +84,7 @@ export class MergeSession { this._coordOf = options.coordOf; this.bag = new BagBoard(options.bagSlotCount ?? 5); this.map = new MapTileBoard(); - this._upgrade = new UpgradeSystem(this._config); + this._upgrade = new UpgradeSystem(); } get compositions(): readonly ComposedUnit[] { diff --git a/assets/res/spine/保护派派.atlas b/assets/res/spine/保护派派.atlas new file mode 100644 index 0000000..9d9a29e --- /dev/null +++ b/assets/res/spine/保护派派.atlas @@ -0,0 +1,55 @@ + +保护派派.png +size: 194,67 +format: RGBA8888 +filter: Linear,Linear +repeat: none +π + rotate: true + xy: 139, 21 + size: 46, 40 + orig: 46, 40 + offset: 0, 0 + index: -1 +抖动1 + rotate: true + xy: 0, 0 + size: 67, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +抖动2 + rotate: false + xy: 70, 2 + size: 67, 65 + orig: 68, 65 + offset: 0, 0 + index: -1 +眼1 + rotate: true + xy: 139, 2 + size: 17, 21 + orig: 20, 23 + offset: 1, 1 + index: -1 +眼2 + rotate: true + xy: 162, 2 + size: 17, 21 + orig: 20, 23 + offset: 1, 1 + index: -1 +眼泪 + rotate: false + xy: 181, 47 + size: 13, 20 + orig: 13, 20 + offset: 0, 0 + index: -1 +眼睛2 + rotate: false + xy: 181, 37 + size: 6, 8 + orig: 8, 10 + offset: 1, 1 + index: -1 diff --git a/assets/res/spine/保护派派.atlas.meta b/assets/res/spine/保护派派.atlas.meta new file mode 100644 index 0000000..a236efb --- /dev/null +++ b/assets/res/spine/保护派派.atlas.meta @@ -0,0 +1,12 @@ +{ + "ver": "1.0.0", + "importer": "*", + "imported": true, + "uuid": "9dbebd97-b7db-41b2-9c9f-c632b77aedd2", + "files": [ + ".atlas", + ".json" + ], + "subMetas": {}, + "userData": {} +} diff --git a/assets/res/spine/保护派派.json b/assets/res/spine/保护派派.json new file mode 100644 index 0000000..3cd272c --- /dev/null +++ b/assets/res/spine/保护派派.json @@ -0,0 +1 @@ +{"skeleton":{"hash":"GSmpy5X6+pk9GoC8yL539dThMXw","spine":"3.8.75","x":-21.76,"y":-18.79,"width":45.76,"height":52.79},"bones":[{"name":"root"},{"name":"π","parent":"root","length":20.11,"rotation":90.34,"x":1.25,"y":-12.56},{"name":"π2","parent":"π","length":6.05,"rotation":-168.92,"x":13.74,"y":-6.41},{"name":"π3","parent":"π2","length":4.58,"rotation":27.02,"x":6.23,"y":0.02},{"name":"π4","parent":"π3","length":6.29,"rotation":46.89,"x":4.93,"y":0.16},{"name":"眼1","parent":"π","length":8.29,"rotation":-89.29,"x":27.62,"y":-6.78},{"name":"眼睛2","parent":"眼1","x":0.22,"y":8.05},{"name":"眼2","parent":"眼1","x":9.03,"y":29.95},{"name":"眼3","parent":"π","length":8.29,"rotation":-89.29,"x":27.72,"y":9.57},{"name":"眼睛3","parent":"眼3","x":0.22,"y":8.05},{"name":"眼4","parent":"眼3","x":9.03,"y":29.95},{"name":"眼泪","parent":"π","length":9.6,"rotation":179.66,"x":27.53,"y":10.74}],"slots":[{"name":"π","bone":"π","attachment":"π"},{"name":"眼2","bone":"眼1","attachment":"眼2"},{"name":"眼3","bone":"眼3","attachment":"眼2"},{"name":"眼睛2","bone":"眼睛2","attachment":"眼睛2"},{"name":"眼睛3","bone":"眼睛3","attachment":"眼睛2"},{"name":"眼22","bone":"眼2","attachment":"眼22"},{"name":"眼1","bone":"眼1","attachment":"眼1"},{"name":"眼23","bone":"眼4","attachment":"眼22"},{"name":"眼4","bone":"眼3","attachment":"眼1"},{"name":"抖动1","bone":"root"},{"name":"眼泪","bone":"眼泪"}],"skins":[{"name":"default","attachments":{"π":{"π":{"type":"mesh","uvs":[0.12367,0.03948,0.04295,0.08061,0.01537,0.15698,0.00515,0.25921,0.01434,0.40021,0.05624,0.48951,0.13389,0.52711,0.12776,0.63168,0.08689,0.73743,0.06134,0.81733,0.09915,0.94893,0.20541,0.98418,0.37502,0.99476,0.47106,0.97243,0.52317,0.87373,0.59571,0.94541,0.72037,0.97948,0.87567,0.95716,0.96763,0.88196,1,0.73978,0.9993,0.56001,0.9615,0.48128,0.8726,0.46718,0.95537,0.39903,0.98193,0.27331,0.96456,0.11351,0.89713,0.01481,0.68256,0.02068,0.46187,0.03126,0.27489,0.03713,0.50682,0.66811,0.49558,0.49068,0.4915,0.33441,0.46391,0.34028,0.46595,0.47541,0.46493,0.61758,0.47311,0.77856],"triangles":[24,22,27,24,27,25,32,28,27,33,28,32,29,28,33,0,4,3,32,27,22,34,33,32,31,34,32,0,2,1,2,0,3,6,5,4,22,31,32,29,4,0,6,29,33,6,33,34,29,6,4,35,6,34,35,34,31,7,6,35,30,31,22,35,31,30,36,35,30,15,14,30,36,30,14,30,19,15,36,10,8,9,8,10,36,7,35,13,36,14,7,36,8,36,11,10,36,12,11,13,12,36,25,27,26,23,22,24,19,22,20,20,22,21,22,19,30,15,19,16,18,17,19,17,16,19],"vertices":[1,1,32.09,17.37,1,1,1,30.46,21.09,1,1,1,27.42,22.38,1,1,1,23.33,22.87,1,1,1,17.69,22.48,1,1,1,14.1,20.58,1,1,1,12.58,17.01,1,1,1,8.4,17.32,1,1,1,4.18,19.22,1,1,1,0.99,20.42,1,1,1,-4.29,18.71,1,1,1,-5.72,13.83,1,1,1,-6.19,6.03,1,1,1,-5.33,1.61,1,3,1,-1.39,-0.81,0.90434,3,2.9,-10.93,0.08931,4,-9.49,-6.1,0.00635,3,1,-4.28,-4.13,0.47323,3,7.22,-10.1,0.42058,4,-5.93,-8.69,0.1062,3,1,-5.68,-9.86,0.17673,3,11.85,-6.46,0.3376,4,-0.1,-9.58,0.48567,3,1,-4.83,-17.01,0.01808,3,15.6,-0.31,0.02881,4,6.95,-8.1,0.95311,2,1,-1.84,-21.26,5.0E-5,4,10.92,-4.76,0.99995,2,2,12.87,14.16,0.03585,4,11.94,1.03,0.96415,2,2,5.81,15.55,0.28862,4,11.32,8.19,0.71138,3,2,2.38,14.47,0.40511,3,3.14,14.62,6.6E-4,4,9.33,11.19,0.59423,4,1,14.77,-16.98,0.00818,2,1.02,10.58,0.6894,3,0.16,11.77,0.00558,4,5.21,11.42,0.29684,3,1,17.48,-20.81,0.03645,2,-0.9,14.85,0.86294,4,8.78,14.45,0.10061,3,1,22.5,-22.06,0.0795,2,-5.59,17.04,0.87601,4,9.59,19.56,0.04449,3,1,28.9,-21.3,0.15437,2,-12.01,17.52,0.83554,4,8.27,25.86,0.01009,3,1,32.86,-18.22,0.20884,2,-16.49,15.26,0.78944,4,4.86,29.54,0.00171,2,1,32.69,-8.35,0.50028,2,-18.22,5.54,0.49972,2,1,32.32,1.81,0.92372,2,-19.81,-4.49,0.07628,2,1,32.14,10.41,0.99993,2,-21.28,-12.97,7.0E-5,3,1,6.84,-0.11,0.99436,2,5.57,-7.51,0.00186,3,-4.01,-6.41,0.00377,1,1,13.94,0.37,1,1,1,20.19,0.52,1,1,1,19.96,1.79,1,1,1,14.56,1.73,1,1,1,8.87,1.81,1,1,1,2.43,1.47,1],"hull":30}},"抖动1":{"抖动1":{"x":0.94,"y":9.07,"rotation":1.05,"width":68,"height":68},"抖动2":{"x":-0.1,"y":8.42,"width":68,"height":65}},"眼泪":{"眼泪":{"x":7.33,"y":0.1,"rotation":90,"width":13,"height":20}},"眼睛2":{"眼睛2":{"x":0.06,"y":-0.16,"rotation":-1.05,"width":8,"height":10}},"眼睛3":{"眼睛2":{"x":0.06,"y":-0.16,"rotation":-1.05,"width":8,"height":10}},"眼1":{"眼1":{"x":-0.73,"y":7.42,"rotation":-1.05,"width":20,"height":23}},"眼2":{"眼2":{"x":-0.73,"y":7.42,"rotation":-1.05,"width":20,"height":23}},"眼3":{"眼2":{"x":-0.73,"y":7.42,"rotation":-1.05,"width":20,"height":23}},"眼4":{"眼1":{"x":-0.73,"y":7.42,"rotation":-1.05,"width":20,"height":23}},"眼22":{"眼22":{"type":"clipping","end":"眼1","vertexCount":4,"vertices":[-22.4,13.56,-21.36,-12.23,-0.43,-11.24,-0.9,13.24]}},"眼23":{"眼22":{"type":"clipping","end":"眼4","vertexCount":4,"vertices":[-22.4,13.56,-21.36,-12.23,-0.43,-11.24,-0.9,13.24]}}}}],"animations":{"害怕":{"slots":{"眼泪":{"attachment":[{"name":"眼泪"}]},"抖动1":{"attachment":[{"time":0.1,"name":"抖动2"},{"time":0.2,"name":"抖动1"},{"time":0.3,"name":"抖动2"},{"time":0.4,"name":"抖动1"},{"time":0.5,"name":null},{"time":0.8667,"name":"抖动1"},{"time":0.9667,"name":"抖动2"},{"time":1.0667,"name":"抖动1"},{"time":1.1667,"name":"抖动2"},{"time":1.2667,"name":"抖动1"},{"time":1.3667,"name":"抖动2"},{"time":1.4667,"name":"抖动1"},{"time":1.5667,"name":null}]}},"bones":{"眼4":{"rotate":[{"angle":19.62}],"translate":[{"x":-4.82,"y":-6.95},{"time":0.1,"x":-4.84,"y":-7.84},{"time":0.2,"x":-4.82,"y":-6.95},{"time":0.3,"x":-4.84,"y":-7.84},{"time":0.4333,"x":-4.82,"y":-6.95},{"time":0.5667,"x":-4.84,"y":-7.84},{"time":0.6667,"x":-4.82,"y":-6.95},{"time":0.7667,"x":-4.84,"y":-7.84},{"time":0.8667,"x":-4.82,"y":-6.95},{"time":0.9667,"x":-4.84,"y":-7.84},{"time":1.1,"x":-4.82,"y":-6.95},{"time":1.2333,"x":-4.84,"y":-7.84},{"time":1.3333,"x":-4.82,"y":-6.95},{"time":1.4333,"x":-4.84,"y":-7.84},{"time":1.5333,"x":-4.82,"y":-6.95},{"time":1.6333,"x":-4.84,"y":-7.84},{"time":1.7667,"x":-4.82,"y":-6.95},{"time":1.9,"x":-4.84,"y":-7.84},{"time":2,"x":-4.82,"y":-6.95}]},"眼2":{"rotate":[{"angle":-19.03}],"translate":[{"x":6.41,"y":-12.74},{"time":0.1,"x":6.4,"y":-13.63},{"time":0.2,"x":6.41,"y":-12.74},{"time":0.3,"x":6.4,"y":-13.63},{"time":0.4333,"x":6.41,"y":-12.74},{"time":0.5667,"x":6.4,"y":-13.63},{"time":0.6667,"x":6.41,"y":-12.74},{"time":0.7667,"x":6.4,"y":-13.63},{"time":0.8667,"x":6.41,"y":-12.74},{"time":0.9667,"x":6.4,"y":-13.63},{"time":1.1,"x":6.41,"y":-12.74},{"time":1.2333,"x":6.4,"y":-13.63},{"time":1.3333,"x":6.41,"y":-12.74},{"time":1.4333,"x":6.4,"y":-13.63},{"time":1.5333,"x":6.41,"y":-12.74},{"time":1.6333,"x":6.4,"y":-13.63},{"time":1.7667,"x":6.41,"y":-12.74},{"time":1.9,"x":6.4,"y":-13.63},{"time":2,"x":6.41,"y":-12.74}]},"π2":{"rotate":[{},{"time":0.1,"angle":-1.6},{"time":0.1667},{"time":0.2667,"angle":-1.6},{"time":0.3333},{"time":0.4333,"angle":-1.6},{"time":0.5},{"time":0.6,"angle":-1.6},{"time":0.6667},{"time":0.7667,"angle":-1.6},{"time":0.8333},{"time":0.9333,"angle":-1.6},{"time":1},{"time":1.1,"angle":-1.6},{"time":1.1667},{"time":1.2667,"angle":-1.6},{"time":1.3333},{"time":1.4333,"angle":-1.6},{"time":1.5},{"time":1.6,"angle":-1.6},{"time":1.6667},{"time":1.7667,"angle":-1.6},{"time":1.8333},{"time":1.9333,"angle":-1.6},{"time":2}],"translate":[{},{"time":0.1,"x":-0.69,"y":1.19},{"time":0.1667},{"time":0.2667,"x":-0.69,"y":1.19},{"time":0.3333},{"time":0.4333,"x":-0.69,"y":1.19},{"time":0.5},{"time":0.6,"x":-0.69,"y":1.19},{"time":0.6667},{"time":0.7667,"x":-0.69,"y":1.19},{"time":0.8333},{"time":0.9333,"x":-0.69,"y":1.19},{"time":1},{"time":1.1,"x":-0.69,"y":1.19},{"time":1.1667},{"time":1.2667,"x":-0.69,"y":1.19},{"time":1.3333},{"time":1.4333,"x":-0.69,"y":1.19},{"time":1.5},{"time":1.6,"x":-0.69,"y":1.19},{"time":1.6667},{"time":1.7667,"x":-0.69,"y":1.19},{"time":1.8333},{"time":1.9333,"x":-0.69,"y":1.19},{"time":2}]},"π3":{"rotate":[{},{"time":0.1,"angle":-1.6},{"time":0.1667},{"time":0.2667,"angle":-1.6},{"time":0.3333},{"time":0.4333,"angle":-1.6},{"time":0.5},{"time":0.6,"angle":-1.6},{"time":0.6667},{"time":0.7667,"angle":-1.6},{"time":0.8333},{"time":0.9333,"angle":-1.6},{"time":1},{"time":1.1,"angle":-1.6},{"time":1.1667},{"time":1.2667,"angle":-1.6},{"time":1.3333},{"time":1.4333,"angle":-1.6},{"time":1.5},{"time":1.6,"angle":-1.6},{"time":1.6667},{"time":1.7667,"angle":-1.6},{"time":1.8333},{"time":1.9333,"angle":-1.6},{"time":2}]},"π4":{"rotate":[{},{"time":0.1,"angle":-1.6},{"time":0.1667},{"time":0.2667,"angle":-1.6},{"time":0.3333},{"time":0.4333,"angle":-1.6},{"time":0.5},{"time":0.6,"angle":-1.6},{"time":0.6667},{"time":0.7667,"angle":-1.6},{"time":0.8333},{"time":0.9333,"angle":-1.6},{"time":1},{"time":1.1,"angle":-1.6},{"time":1.1667},{"time":1.2667,"angle":-1.6},{"time":1.3333},{"time":1.4333,"angle":-1.6},{"time":1.5},{"time":1.6,"angle":-1.6},{"time":1.6667},{"time":1.7667,"angle":-1.6},{"time":1.8333},{"time":1.9333,"angle":-1.6},{"time":2}]},"眼睛3":{"translate":[{"x":-0.51,"y":-0.78}]},"眼泪":{"translate":[{"x":0.2,"y":-0.2}],"scale":[{"x":0.639,"y":0.639},{"time":0.3333,"x":0.734,"y":0.734},{"time":0.6667,"x":0.639,"y":0.639},{"time":1,"x":0.734,"y":0.734},{"time":1.3333,"x":0.639,"y":0.639},{"time":1.6667,"x":0.734,"y":0.734},{"time":2,"x":0.639,"y":0.639}]}}},"待机":{"bones":{"π2":{"rotate":[{},{"time":0.2333,"angle":3.03},{"time":0.5},{"time":0.7333,"angle":3.03},{"time":1},{"time":1.2333,"angle":3.03},{"time":1.5},{"time":1.7333,"angle":3.03},{"time":2},{"time":2.2333,"angle":3.03},{"time":2.5},{"time":2.7333,"angle":3.03},{"time":3},{"time":3.2333,"angle":3.03},{"time":3.5},{"time":3.7333,"angle":3.03},{"time":4}]},"π3":{"rotate":[{},{"time":0.2333,"angle":9.2},{"time":0.5},{"time":0.7333,"angle":9.2},{"time":1},{"time":1.2333,"angle":9.2},{"time":1.5},{"time":1.7333,"angle":9.2},{"time":2},{"time":2.2333,"angle":9.2},{"time":2.5},{"time":2.7333,"angle":9.2},{"time":3},{"time":3.2333,"angle":9.2},{"time":3.5},{"time":3.7333,"angle":9.2},{"time":4}]},"π4":{"rotate":[{},{"time":0.2333,"angle":15.91},{"time":0.5},{"time":0.7333,"angle":15.91},{"time":1},{"time":1.2333,"angle":15.91},{"time":1.5},{"time":1.7333,"angle":15.91},{"time":2},{"time":2.2333,"angle":15.91},{"time":2.5},{"time":2.7333,"angle":15.91},{"time":3},{"time":3.2333,"angle":15.91},{"time":3.5},{"time":3.7333,"angle":15.91},{"time":4}]},"眼睛3":{"translate":[{"time":0.3333},{"time":0.5,"x":-3.96,"y":1.57,"curve":"stepped"},{"time":1.3333,"x":-3.96,"y":1.57},{"time":1.5667,"x":-2.22,"y":-3.2,"curve":"stepped"},{"time":2.8333,"x":-2.22,"y":-3.2},{"time":3.1}]},"眼睛2":{"translate":[{"time":0.3333},{"time":0.5,"x":-3.96,"y":1.57,"curve":"stepped"},{"time":1.3333,"x":-3.96,"y":1.57},{"time":1.5667,"x":-2.22,"y":-3.2,"curve":"stepped"},{"time":2.8333,"x":-2.22,"y":-3.2},{"time":3.1}]},"眼4":{"translate":[{"time":2},{"time":2.1667,"x":0.38,"y":-11.13,"curve":"stepped"},{"time":2.8333,"x":0.38,"y":-11.13},{"time":3.1}]},"眼2":{"translate":[{"time":2},{"time":2.1667,"x":0.38,"y":-11.13,"curve":"stepped"},{"time":2.8333,"x":0.38,"y":-11.13},{"time":3.1}]},"π":{"rotate":[{"time":1.5},{"time":1.8333,"angle":-5.3,"curve":"stepped"},{"time":2.8,"angle":-5.3},{"time":3.1667}],"scale":[{},{"time":0.5,"x":0.977,"y":1.03},{"time":1},{"time":1.5,"x":0.977,"y":1.03},{"time":2},{"time":2.5,"x":0.977,"y":1.03},{"time":3},{"time":3.5,"x":0.977,"y":1.03},{"time":4}]}}}}} \ No newline at end of file diff --git a/assets/res/spine/保护派派.json.meta b/assets/res/spine/保护派派.json.meta new file mode 100644 index 0000000..f358b3a --- /dev/null +++ b/assets/res/spine/保护派派.json.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.2.7", + "importer": "spine-data", + "imported": true, + "uuid": "7349a7a2-5944-4811-993a-0febfe291be3", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "atlasUuid": "9dbebd97-b7db-41b2-9c9f-c632b77aedd2" + } +} diff --git a/assets/res/spine/保护派派.png b/assets/res/spine/保护派派.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae6a4f5441b15d7efbb0eb74632b3776578047b GIT binary patch literal 6279 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 literal 0 HcmV?d00001 diff --git a/assets/res/spine/保护派派.png.meta b/assets/res/spine/保护派派.png.meta new file mode 100644 index 0000000..aee1c00 --- /dev/null +++ b/assets/res/spine/保护派派.png.meta @@ -0,0 +1,134 @@ +{ + "ver": "1.0.27", + "importer": "image", + "imported": true, + "uuid": "74485d02-37cf-43f9-b793-460ffa49be2f", + "files": [ + ".json", + ".png" + ], + "subMetas": { + "6c48a": { + "importer": "texture", + "uuid": "74485d02-37cf-43f9-b793-460ffa49be2f@6c48a", + "displayName": "保护派派", + "id": "6c48a", + "name": "texture", + "userData": { + "wrapModeS": "clamp-to-edge", + "wrapModeT": "clamp-to-edge", + "imageUuidOrDatabaseUri": "74485d02-37cf-43f9-b793-460ffa49be2f", + "isUuid": true, + "visible": false, + "minfilter": "linear", + "magfilter": "linear", + "mipfilter": "none", + "anisotropy": 0 + }, + "ver": "1.0.22", + "imported": true, + "files": [ + ".json" + ], + "subMetas": {} + }, + "f9941": { + "importer": "sprite-frame", + "uuid": "74485d02-37cf-43f9-b793-460ffa49be2f@f9941", + "displayName": "保护派派", + "id": "f9941", + "name": "spriteFrame", + "userData": { + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 194, + "height": 67, + "rawWidth": 194, + "rawHeight": 67, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "packable": true, + "pixelsToUnit": 100, + "pivotX": 0.5, + "pivotY": 0.5, + "meshType": 0, + "vertices": { + "rawPosition": [ + -97, + -33.5, + 0, + 97, + -33.5, + 0, + -97, + 33.5, + 0, + 97, + 33.5, + 0 + ], + "indexes": [ + 0, + 1, + 2, + 2, + 1, + 3 + ], + "uv": [ + 0, + 67, + 194, + 67, + 0, + 0, + 194, + 0 + ], + "nuv": [ + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "minPos": [ + -97, + -33.5, + 0 + ], + "maxPos": [ + 97, + 33.5, + 0 + ] + }, + "isUuid": true, + "imageUuidOrDatabaseUri": "74485d02-37cf-43f9-b793-460ffa49be2f@6c48a", + "atlasUuid": "", + "trimType": "auto" + }, + "ver": "1.0.12", + "imported": true, + "files": [ + ".json" + ], + "subMetas": {} + } + }, + "userData": { + "type": "sprite-frame", + "fixAlphaTransparencyArtifacts": false, + "hasAlpha": true, + "redirect": "74485d02-37cf-43f9-b793-460ffa49be2f@6c48a" + } +} diff --git a/assets/res/spine/likeRole/数字.meta b/assets/res/spine/数字.meta similarity index 100% rename from assets/res/spine/likeRole/数字.meta rename to assets/res/spine/数字.meta diff --git a/assets/res/spine/likeRole/数字/数字1.atlas b/assets/res/spine/数字/数字1.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字1.atlas rename to assets/res/spine/数字/数字1.atlas diff --git a/assets/res/spine/likeRole/数字/数字1.atlas.meta b/assets/res/spine/数字/数字1.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字1.atlas.meta rename to assets/res/spine/数字/数字1.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字1.json b/assets/res/spine/数字/数字1.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字1.json rename to assets/res/spine/数字/数字1.json diff --git a/assets/res/spine/likeRole/数字/数字1.json.meta b/assets/res/spine/数字/数字1.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字1.json.meta rename to assets/res/spine/数字/数字1.json.meta diff --git a/assets/res/spine/likeRole/数字/数字1.png b/assets/res/spine/数字/数字1.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字1.png rename to assets/res/spine/数字/数字1.png diff --git a/assets/res/spine/likeRole/数字/数字1.png.meta b/assets/res/spine/数字/数字1.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字1.png.meta rename to assets/res/spine/数字/数字1.png.meta diff --git a/assets/res/spine/likeRole/数字/数字1024.atlas b/assets/res/spine/数字/数字1024.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字1024.atlas rename to assets/res/spine/数字/数字1024.atlas diff --git a/assets/res/spine/likeRole/数字/数字1024.atlas.meta b/assets/res/spine/数字/数字1024.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字1024.atlas.meta rename to assets/res/spine/数字/数字1024.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字1024.json b/assets/res/spine/数字/数字1024.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字1024.json rename to assets/res/spine/数字/数字1024.json diff --git a/assets/res/spine/likeRole/数字/数字1024.json.meta b/assets/res/spine/数字/数字1024.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字1024.json.meta rename to assets/res/spine/数字/数字1024.json.meta diff --git a/assets/res/spine/likeRole/数字/数字1024.png b/assets/res/spine/数字/数字1024.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字1024.png rename to assets/res/spine/数字/数字1024.png diff --git a/assets/res/spine/likeRole/数字/数字1024.png.meta b/assets/res/spine/数字/数字1024.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字1024.png.meta rename to assets/res/spine/数字/数字1024.png.meta diff --git a/assets/res/spine/likeRole/数字/数字128.atlas b/assets/res/spine/数字/数字128.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字128.atlas rename to assets/res/spine/数字/数字128.atlas diff --git a/assets/res/spine/likeRole/数字/数字128.atlas.meta b/assets/res/spine/数字/数字128.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字128.atlas.meta rename to assets/res/spine/数字/数字128.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字128.json b/assets/res/spine/数字/数字128.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字128.json rename to assets/res/spine/数字/数字128.json diff --git a/assets/res/spine/likeRole/数字/数字128.json.meta b/assets/res/spine/数字/数字128.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字128.json.meta rename to assets/res/spine/数字/数字128.json.meta diff --git a/assets/res/spine/likeRole/数字/数字128.png b/assets/res/spine/数字/数字128.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字128.png rename to assets/res/spine/数字/数字128.png diff --git a/assets/res/spine/likeRole/数字/数字128.png.meta b/assets/res/spine/数字/数字128.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字128.png.meta rename to assets/res/spine/数字/数字128.png.meta diff --git a/assets/res/spine/likeRole/数字/数字16.atlas b/assets/res/spine/数字/数字16.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字16.atlas rename to assets/res/spine/数字/数字16.atlas diff --git a/assets/res/spine/likeRole/数字/数字16.atlas.meta b/assets/res/spine/数字/数字16.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字16.atlas.meta rename to assets/res/spine/数字/数字16.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字16.json b/assets/res/spine/数字/数字16.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字16.json rename to assets/res/spine/数字/数字16.json diff --git a/assets/res/spine/likeRole/数字/数字16.json.meta b/assets/res/spine/数字/数字16.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字16.json.meta rename to assets/res/spine/数字/数字16.json.meta diff --git a/assets/res/spine/likeRole/数字/数字16.png b/assets/res/spine/数字/数字16.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字16.png rename to assets/res/spine/数字/数字16.png diff --git a/assets/res/spine/likeRole/数字/数字16.png.meta b/assets/res/spine/数字/数字16.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字16.png.meta rename to assets/res/spine/数字/数字16.png.meta diff --git a/assets/res/spine/likeRole/数字/数字2.atlas b/assets/res/spine/数字/数字2.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字2.atlas rename to assets/res/spine/数字/数字2.atlas diff --git a/assets/res/spine/likeRole/数字/数字2.atlas.meta b/assets/res/spine/数字/数字2.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字2.atlas.meta rename to assets/res/spine/数字/数字2.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字2.json b/assets/res/spine/数字/数字2.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字2.json rename to assets/res/spine/数字/数字2.json diff --git a/assets/res/spine/likeRole/数字/数字2.json.meta b/assets/res/spine/数字/数字2.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字2.json.meta rename to assets/res/spine/数字/数字2.json.meta diff --git a/assets/res/spine/likeRole/数字/数字2.png b/assets/res/spine/数字/数字2.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字2.png rename to assets/res/spine/数字/数字2.png diff --git a/assets/res/spine/likeRole/数字/数字2.png.meta b/assets/res/spine/数字/数字2.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字2.png.meta rename to assets/res/spine/数字/数字2.png.meta diff --git a/assets/res/spine/likeRole/数字/数字2048.atlas b/assets/res/spine/数字/数字2048.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字2048.atlas rename to assets/res/spine/数字/数字2048.atlas diff --git a/assets/res/spine/likeRole/数字/数字2048.atlas.meta b/assets/res/spine/数字/数字2048.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字2048.atlas.meta rename to assets/res/spine/数字/数字2048.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字2048.json b/assets/res/spine/数字/数字2048.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字2048.json rename to assets/res/spine/数字/数字2048.json diff --git a/assets/res/spine/likeRole/数字/数字2048.json.meta b/assets/res/spine/数字/数字2048.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字2048.json.meta rename to assets/res/spine/数字/数字2048.json.meta diff --git a/assets/res/spine/likeRole/数字/数字2048.png b/assets/res/spine/数字/数字2048.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字2048.png rename to assets/res/spine/数字/数字2048.png diff --git a/assets/res/spine/likeRole/数字/数字2048.png.meta b/assets/res/spine/数字/数字2048.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字2048.png.meta rename to assets/res/spine/数字/数字2048.png.meta diff --git a/assets/res/spine/likeRole/数字/数字256.atlas b/assets/res/spine/数字/数字256.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字256.atlas rename to assets/res/spine/数字/数字256.atlas diff --git a/assets/res/spine/likeRole/数字/数字256.atlas.meta b/assets/res/spine/数字/数字256.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字256.atlas.meta rename to assets/res/spine/数字/数字256.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字256.json b/assets/res/spine/数字/数字256.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字256.json rename to assets/res/spine/数字/数字256.json diff --git a/assets/res/spine/likeRole/数字/数字256.json.meta b/assets/res/spine/数字/数字256.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字256.json.meta rename to assets/res/spine/数字/数字256.json.meta diff --git a/assets/res/spine/likeRole/数字/数字256.png b/assets/res/spine/数字/数字256.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字256.png rename to assets/res/spine/数字/数字256.png diff --git a/assets/res/spine/likeRole/数字/数字256.png.meta b/assets/res/spine/数字/数字256.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字256.png.meta rename to assets/res/spine/数字/数字256.png.meta diff --git a/assets/res/spine/likeRole/数字/数字32.atlas b/assets/res/spine/数字/数字32.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字32.atlas rename to assets/res/spine/数字/数字32.atlas diff --git a/assets/res/spine/likeRole/数字/数字32.atlas.meta b/assets/res/spine/数字/数字32.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字32.atlas.meta rename to assets/res/spine/数字/数字32.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字32.json b/assets/res/spine/数字/数字32.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字32.json rename to assets/res/spine/数字/数字32.json diff --git a/assets/res/spine/likeRole/数字/数字32.json.meta b/assets/res/spine/数字/数字32.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字32.json.meta rename to assets/res/spine/数字/数字32.json.meta diff --git a/assets/res/spine/likeRole/数字/数字32.png b/assets/res/spine/数字/数字32.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字32.png rename to assets/res/spine/数字/数字32.png diff --git a/assets/res/spine/likeRole/数字/数字32.png.meta b/assets/res/spine/数字/数字32.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字32.png.meta rename to assets/res/spine/数字/数字32.png.meta diff --git a/assets/res/spine/likeRole/数字/数字4.atlas b/assets/res/spine/数字/数字4.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字4.atlas rename to assets/res/spine/数字/数字4.atlas diff --git a/assets/res/spine/likeRole/数字/数字4.atlas.meta b/assets/res/spine/数字/数字4.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字4.atlas.meta rename to assets/res/spine/数字/数字4.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字4.json b/assets/res/spine/数字/数字4.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字4.json rename to assets/res/spine/数字/数字4.json diff --git a/assets/res/spine/likeRole/数字/数字4.json.meta b/assets/res/spine/数字/数字4.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字4.json.meta rename to assets/res/spine/数字/数字4.json.meta diff --git a/assets/res/spine/likeRole/数字/数字4.png b/assets/res/spine/数字/数字4.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字4.png rename to assets/res/spine/数字/数字4.png diff --git a/assets/res/spine/likeRole/数字/数字4.png.meta b/assets/res/spine/数字/数字4.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字4.png.meta rename to assets/res/spine/数字/数字4.png.meta diff --git a/assets/res/spine/likeRole/数字/数字4096.atlas b/assets/res/spine/数字/数字4096.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字4096.atlas rename to assets/res/spine/数字/数字4096.atlas diff --git a/assets/res/spine/likeRole/数字/数字4096.atlas.meta b/assets/res/spine/数字/数字4096.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字4096.atlas.meta rename to assets/res/spine/数字/数字4096.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字4096.json b/assets/res/spine/数字/数字4096.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字4096.json rename to assets/res/spine/数字/数字4096.json diff --git a/assets/res/spine/likeRole/数字/数字4096.json.meta b/assets/res/spine/数字/数字4096.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字4096.json.meta rename to assets/res/spine/数字/数字4096.json.meta diff --git a/assets/res/spine/likeRole/数字/数字4096.png b/assets/res/spine/数字/数字4096.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字4096.png rename to assets/res/spine/数字/数字4096.png diff --git a/assets/res/spine/likeRole/数字/数字4096.png.meta b/assets/res/spine/数字/数字4096.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字4096.png.meta rename to assets/res/spine/数字/数字4096.png.meta diff --git a/assets/res/spine/likeRole/数字/数字512.atlas b/assets/res/spine/数字/数字512.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字512.atlas rename to assets/res/spine/数字/数字512.atlas diff --git a/assets/res/spine/likeRole/数字/数字512.atlas.meta b/assets/res/spine/数字/数字512.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字512.atlas.meta rename to assets/res/spine/数字/数字512.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字512.json b/assets/res/spine/数字/数字512.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字512.json rename to assets/res/spine/数字/数字512.json diff --git a/assets/res/spine/likeRole/数字/数字512.json.meta b/assets/res/spine/数字/数字512.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字512.json.meta rename to assets/res/spine/数字/数字512.json.meta diff --git a/assets/res/spine/likeRole/数字/数字512.png b/assets/res/spine/数字/数字512.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字512.png rename to assets/res/spine/数字/数字512.png diff --git a/assets/res/spine/likeRole/数字/数字512.png.meta b/assets/res/spine/数字/数字512.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字512.png.meta rename to assets/res/spine/数字/数字512.png.meta diff --git a/assets/res/spine/likeRole/数字/数字64.atlas b/assets/res/spine/数字/数字64.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字64.atlas rename to assets/res/spine/数字/数字64.atlas diff --git a/assets/res/spine/likeRole/数字/数字64.atlas.meta b/assets/res/spine/数字/数字64.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字64.atlas.meta rename to assets/res/spine/数字/数字64.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字64.json b/assets/res/spine/数字/数字64.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字64.json rename to assets/res/spine/数字/数字64.json diff --git a/assets/res/spine/likeRole/数字/数字64.json.meta b/assets/res/spine/数字/数字64.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字64.json.meta rename to assets/res/spine/数字/数字64.json.meta diff --git a/assets/res/spine/likeRole/数字/数字64.png b/assets/res/spine/数字/数字64.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字64.png rename to assets/res/spine/数字/数字64.png diff --git a/assets/res/spine/likeRole/数字/数字64.png.meta b/assets/res/spine/数字/数字64.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字64.png.meta rename to assets/res/spine/数字/数字64.png.meta diff --git a/assets/res/spine/likeRole/数字/数字8.atlas b/assets/res/spine/数字/数字8.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字8.atlas rename to assets/res/spine/数字/数字8.atlas diff --git a/assets/res/spine/likeRole/数字/数字8.atlas.meta b/assets/res/spine/数字/数字8.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字8.atlas.meta rename to assets/res/spine/数字/数字8.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字8.json b/assets/res/spine/数字/数字8.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字8.json rename to assets/res/spine/数字/数字8.json diff --git a/assets/res/spine/likeRole/数字/数字8.json.meta b/assets/res/spine/数字/数字8.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字8.json.meta rename to assets/res/spine/数字/数字8.json.meta diff --git a/assets/res/spine/likeRole/数字/数字8.png b/assets/res/spine/数字/数字8.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字8.png rename to assets/res/spine/数字/数字8.png diff --git a/assets/res/spine/likeRole/数字/数字8.png.meta b/assets/res/spine/数字/数字8.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字8.png.meta rename to assets/res/spine/数字/数字8.png.meta diff --git a/assets/res/spine/likeRole/数字/数字8192.atlas b/assets/res/spine/数字/数字8192.atlas similarity index 100% rename from assets/res/spine/likeRole/数字/数字8192.atlas rename to assets/res/spine/数字/数字8192.atlas diff --git a/assets/res/spine/likeRole/数字/数字8192.atlas.meta b/assets/res/spine/数字/数字8192.atlas.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字8192.atlas.meta rename to assets/res/spine/数字/数字8192.atlas.meta diff --git a/assets/res/spine/likeRole/数字/数字8192.json b/assets/res/spine/数字/数字8192.json similarity index 100% rename from assets/res/spine/likeRole/数字/数字8192.json rename to assets/res/spine/数字/数字8192.json diff --git a/assets/res/spine/likeRole/数字/数字8192.json.meta b/assets/res/spine/数字/数字8192.json.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字8192.json.meta rename to assets/res/spine/数字/数字8192.json.meta diff --git a/assets/res/spine/likeRole/数字/数字8192.png b/assets/res/spine/数字/数字8192.png similarity index 100% rename from assets/res/spine/likeRole/数字/数字8192.png rename to assets/res/spine/数字/数字8192.png diff --git a/assets/res/spine/likeRole/数字/数字8192.png.meta b/assets/res/spine/数字/数字8192.png.meta similarity index 100% rename from assets/res/spine/likeRole/数字/数字8192.png.meta rename to assets/res/spine/数字/数字8192.png.meta diff --git a/assets/script/battle/ai/runtime/AiActiveSkillHost.ts b/assets/script/battle/ai/runtime/AiActiveSkillHost.ts index 438ed0c..5d5e52f 100644 --- a/assets/script/battle/ai/runtime/AiActiveSkillHost.ts +++ b/assets/script/battle/ai/runtime/AiActiveSkillHost.ts @@ -30,6 +30,7 @@ import type { MapManager } from '../../map/legacy/MapManager'; import { buildEnemyMarchPathGridIndices, isEnemyMonsterWalkGrid, + resolveOwnSpawnPort, } from '../../map/MapPathQueries'; import { findEntityIdByGridIndex } from '../../runtime/DeployEntityQuery'; import { composeKey } from '../../runtime/ComposeUnitKey'; @@ -695,7 +696,7 @@ export class AiActiveSkillHost { const aiPlayerId = AiHeadlessBagHost.AI_PLAYER_ID; const ok = BattleGameExtraBossSkill.trySummon(battle, aiPlayerId); if (!ok) return this._failCast('召唤Boss失败(无配置/spawner)'); - const spawnPort = aiPlayerId === 0 ? 2 : 1; + const spawnPort = resolveOwnSpawnPort(aiPlayerId); aiOp(`AI 万神幡 AI#${aiPlayerId} 出怪口 port=${spawnPort} slot#${slotIndex}`); this._emitCastFx(slotIndex, parsed, BattleGameSkillDragKind.ExtraBoss, { kind: 'spawn', spawnPort }); return true; diff --git a/assets/script/battle/bag/AutoMergePlanner.ts b/assets/script/battle/bag/AutoMergePlanner.ts index a385bbf..90885cd 100644 --- a/assets/script/battle/bag/AutoMergePlanner.ts +++ b/assets/script/battle/bag/AutoMergePlanner.ts @@ -21,6 +21,8 @@ interface BoardSnapshot { bagSlots: Array; mapCells: Array<{ gridIndex: number; cell: MapCellSnapshot }>; mapTiles: Array<{ gridIndex: number; tile: MapTileRecord }>; + /** 与 MergeSession.restoreBoardState 对齐;自动合成试算不依赖组合态 */ + compositions: []; } /** 盘面单位快照:用于区分「真合成」与「落子/交换」 */ @@ -55,6 +57,7 @@ function exportBoardSnapshot(session: BattleBagSession): BoardSnapshot { bagSlots, mapCells, mapTiles, + compositions: [], }; } diff --git a/assets/script/battle/bag/BagPrepConfig.ts b/assets/script/battle/bag/BagPrepConfig.ts index 5b4b672..0c2c88f 100644 --- a/assets/script/battle/bag/BagPrepConfig.ts +++ b/assets/script/battle/bag/BagPrepConfig.ts @@ -69,6 +69,23 @@ export function getShieldPushCells(): number { return cells; } +/** + * 战斗看视频加金币奖励序列(Const id=38 para1)。 + * 次数=数组长度,第 N 次奖励=元素 N-1;非法项丢弃,全空则广告不可用。 + */ +export function getBattleCoinAdRewards(): number[] { + const raw = gg.data.table.getConstArray(ConstNumType.BattleCoinAdRewards); + const out: number[] = []; + for (let i = 0; i < raw.length; i++) { + const n = Math.floor(Number(raw[i]) || 0); + if (n > 0) out.push(n); + } + if (out.length <= 0) { + console.log('[BagPrepConfig] Const 局内金币广告奖励无效', ConstNumType.BattleCoinAdRewards); + } + return out; +} + /** 免费格子已下线 */ export function getFreeGridAdMax(_levelId: number): number { return 0; diff --git a/assets/script/battle/bond/InBattleBondHost.ts b/assets/script/battle/bond/InBattleBondHost.ts index 14ada14..e1d0248 100644 --- a/assets/script/battle/bond/InBattleBondHost.ts +++ b/assets/script/battle/bond/InBattleBondHost.ts @@ -1,20 +1,18 @@ -import { createMembershipSet, membershipAdd } from '../../../mx/tools/MembershipSet'; import type { EntityId } from 'db://assets/mx/module/ecs'; import type { IBattleRuntimeHandle } from '../types/ProjectBattleTypes'; import type { Player } from '../../game/Player'; import type { TextGrid } from '../view/TextGrid'; -import { parseSkillGroup } from './BondConfigParser'; -import { isPartnerWeaponActiveOnMap } from './BondEvaluator'; -import { applyBondAttrsToEntity, removeBondModifiers } from './BondEffectApplier'; +import { removeBondModifiers } from './BondEffectApplier'; import { entriesAffectingWeapon } from '../skill/GlobalSkillEffects'; import { getTowerLoadoutService } from '../combat/TowerLoadoutService'; -/** 局内羁绊宿主:按伙伴激活态动态物化 group 属性 */ +/** + * 局内羁绊宿主(旧词条 Skill.group / group2 已从配表删除)。 + * 保留调用点:仅清掉历史 bond modifier,不再物化属性。 + */ export class InBattleBondHost { private _runtime: IBattleRuntimeHandle | null = null; private _mapGrids: ReadonlyMap | undefined; - /** group2 伙伴上次是否在 map 攻击激活 */ - private _group2PartnerActive = new Map(); bindRuntime(runtime: IBattleRuntimeHandle): void { this._runtime = runtime; @@ -31,139 +29,44 @@ export class InBattleBondHost { unbind(): void { this._runtime = null; this._mapGrids = undefined; - this._group2PartnerActive.clear(); } - /** - * group2 羁绊:伙伴 Weapon1 在场且攻击激活时,词条效果翻倍(×2)。 - * 配表 group2 为伙伴 Hero.id。 - */ - getGroup2StackMultiplier(entry: ITableSkill): number { - const partnerId = Number((entry as ITableSkill & { group2?: number }).group2); - if (!Number.isFinite(partnerId) || partnerId <= 0) return 1; - if (!this._runtime) return 1; - return isPartnerWeaponActiveOnMap(this._runtime, partnerId, this._mapGrids) ? 2 : 1; + /** 旧 group2 翻倍已废弃;恒为 1 */ + getGroup2StackMultiplier(_entry: ITableSkill): number { + return 1; } - /** 组合激活态变化 / 词条物化后刷新 */ + /** 清已部署单位上的羁绊 modifier(词条表已删,不做物化) */ refreshPlayer(player: Player): void { const runtime = this._runtime; if (!runtime) return; const session = runtime.session; - const loadoutSvc = getTowerLoadoutService(); - const byWeapon = new Map(); - for (const entityId of player.deployedUnits) { if (!session.world.isAlive(entityId)) continue; - const weapon1Id = loadoutSvc.getLoadout(entityId)?.weapon1Id; - if (!weapon1Id) continue; - if (!byWeapon.has(weapon1Id)) byWeapon.set(weapon1Id, []); - byWeapon.get(weapon1Id)!.push(entityId); - } - - for (const [weapon1Id, entities] of byWeapon) { - const entries = entriesAffectingWeapon(player.selectedSkills, weapon1Id); - for (const entityId of entities) { - this._refreshEntity(entityId, entries); - } + removeBondModifiers(session, entityId); } - this._rematerializeGroup2WeaponsIfPartnerChanged(player); } refreshEntity(entityId: EntityId, player: Player): void { const loadout = getTowerLoadoutService().getLoadout(entityId); if (!loadout) return; - const entries = entriesAffectingWeapon(player.selectedSkills, loadout.weapon1Id); - this._refreshEntity(entityId, entries); - } - - private _refreshEntity( - entityId: EntityId, - entries: readonly ITableSkill[], - ): void { - const runtime = this._runtime; - if (!runtime) return; - const session = runtime.session; - if (!session.world.isAlive(entityId)) return; - - removeBondModifiers(session, entityId); - - const countById = new Map(); - for (const entry of entries) { - countById.set(entry.id, (countById.get(entry.id) ?? 0) + 1); - } - - const seen = createMembershipSet(); - for (const entry of entries) { - if (seen.has(entry.id)) continue; - membershipAdd(seen, entry.id); - - const groupRaw = String(entry.group ?? '').trim(); - if (!groupRaw) continue; - const parsed = parseSkillGroup(groupRaw); - if (!parsed || parsed.targetType !== 1) continue; - if (!isPartnerWeaponActiveOnMap(runtime, parsed.partnerWeapon1Id, this._mapGrids)) { - continue; - } - const stack = countById.get(entry.id) ?? 1; - applyBondAttrsToEntity( - session, - entityId, - parsed.attrs, - `bond_entry_${entry.id}`, - stack, - ); - } - } - - /** 伙伴上下场后重算带 group2 词条的武器 */ - private _rematerializeGroup2WeaponsIfPartnerChanged(player: Player): void { + // 保持调用形态;entriesAffectingWeapon 已恒空 + entriesAffectingWeapon(player.selectedSkills, loadout.weapon1Id); const runtime = this._runtime; - if (!runtime) return; - const session = runtime.session; - - const partnerIds = createMembershipSet(); - for (const entry of player.selectedSkills) { - const partnerId = Number((entry as ITableSkill & { group2?: number }).group2); - if (Number.isFinite(partnerId) && partnerId > 0) membershipAdd(partnerIds, partnerId); - } - if (partnerIds.size === 0) return; - - let changed = false; - for (const partnerId of partnerIds.keys()) { - const active = isPartnerWeaponActiveOnMap(runtime, partnerId, this._mapGrids); - if (this._group2PartnerActive.get(partnerId) === active) continue; - this._group2PartnerActive.set(partnerId, active); - changed = true; - } - if (!changed) return; - - const weapons = createMembershipSet(); - for (const entry of player.selectedSkills) { - const partnerId = Number((entry as ITableSkill & { group2?: number }).group2); - if (partnerId > 0 && partnerIds.has(partnerId)) { - membershipAdd(weapons, Number((entry as ITableSkill & { weapon?: number }).weapon) || 0); - } - } - if (weapons.size === 0) return; - - const loadoutSvc = getTowerLoadoutService(); - for (const entityId of player.deployedUnits) { - if (!session.world.isAlive(entityId)) continue; - const loadout = loadoutSvc.getLoadout(entityId); - if (!loadout || !weapons.has(loadout.weapon1Id)) continue; - this.refreshEntity(entityId, player); - } + if (!runtime?.session.world.isAlive(entityId)) return; + removeBondModifiers(runtime.session, entityId); } } let _host: InBattleBondHost | null = null; +/** 局内羁绊宿主单例 */ export function getInBattleBondHost(): InBattleBondHost { if (!_host) _host = new InBattleBondHost(); return _host; } +/** 测试重置 */ export function resetInBattleBondHostForTests(): void { _host = null; } diff --git a/assets/script/battle/combat/MonsterSkillHost.ts b/assets/script/battle/combat/MonsterSkillHost.ts index f6660f4..9badac5 100644 --- a/assets/script/battle/combat/MonsterSkillHost.ts +++ b/assets/script/battle/combat/MonsterSkillHost.ts @@ -1110,7 +1110,7 @@ export class MonsterSkillHost { console.log('[MonsterSkillHost] 千里眼缺少 Skeleton', label); return; } - const name = String(sk.defaultAnimation ?? '').trim(); + const name = String((sk as sp.Skeleton & { defaultAnimation?: string }).defaultAnimation ?? '').trim(); if (!name) { console.log('[MonsterSkillHost] 千里眼无默认动画', label); return; @@ -1426,7 +1426,7 @@ export class MonsterSkillHost { gg.res.putNode(node); return false; } - const animName = String(sk.defaultAnimation ?? '').trim(); + const animName = String((sk as sp.Skeleton & { defaultAnimation?: string }).defaultAnimation ?? '').trim(); if (!animName) { console.log('[MonsterSkillHost] 损毁文字无默认动画', DESTROY_PREFAB); gg.res.putNode(node); @@ -1607,7 +1607,7 @@ export class MonsterSkillHost { gg.res.putNode(node); return false; } - const animName = String(sk.defaultAnimation ?? '').trim(); + const animName = String((sk as sp.Skeleton & { defaultAnimation?: string }).defaultAnimation ?? '').trim(); if (!animName) { console.log('[MonsterSkillHost] 降雨无默认动画', RAIN_PREFAB); gg.res.putNode(node); diff --git a/assets/script/battle/combat/TowerQueryService.ts b/assets/script/battle/combat/TowerQueryService.ts index 7ca0756..dd9a3cf 100644 --- a/assets/script/battle/combat/TowerQueryService.ts +++ b/assets/script/battle/combat/TowerQueryService.ts @@ -30,10 +30,10 @@ import type { const TILE_TYPE_NAMES: Record = { 1: 'Element1', 2: 'Element2', - 3: 'Element3OrGrid', + /** type=3 与遗留 Grid 同值;新产品按五行 3 读 */ + [Weapon2TileType.Grid]: 'Element3OrGrid', 4: 'Element4Fire', 5: 'Element5', - [Weapon2TileType.Grid]: 'Grid', }; /** 文字 / 塔数据查询(战斗层唯一读入口) */ diff --git a/assets/script/battle/config/ChapterLevelBuilder.ts b/assets/script/battle/config/ChapterLevelBuilder.ts index a1f11de..e8fb9ba 100644 --- a/assets/script/battle/config/ChapterLevelBuilder.ts +++ b/assets/script/battle/config/ChapterLevelBuilder.ts @@ -242,12 +242,10 @@ export class ChapterLevelBuilder { return this.resolveMonsterPrefabFromRow(row); } - /** Monster 行 → battleGameMonster 预制体文件名 */ + /** Monster 行 → battleGameMonster 预制体文件名(icon → name) */ static resolveMonsterPrefabFromRow(row: ITableMonster): string | null { - const ext = row as ITableMonster & { model?: string }; const icon = typeof row.icon === 'string' ? row.icon.trim() : ''; - const model = typeof ext.model === 'string' ? ext.model.trim() : ''; - const raw = icon || model || row.name; + const raw = icon || row.name; return this.resolveMonsterPrefabName(raw); } diff --git a/assets/script/battle/config/TableBattleConfigProvider.ts b/assets/script/battle/config/TableBattleConfigProvider.ts index dfe7723..3aff90a 100644 --- a/assets/script/battle/config/TableBattleConfigProvider.ts +++ b/assets/script/battle/config/TableBattleConfigProvider.ts @@ -276,7 +276,7 @@ export class TableBattleConfigProvider implements IConfigProvider { if (parsed && !cfg) { console.log('[TableBattleConfigProvider] 出怪缺 monsterConfig,回退 Monster.hp', unitDefId); } - return finitePositiveHp((row as ITableMonster & { HP?: number }).HP ?? row.hp, 1); + return finitePositiveHp(row.hp, 1); } private ensureFallbackEnemy(): void { diff --git a/assets/script/battle/debug/BagRefreshDebugLog.ts b/assets/script/battle/debug/BagRefreshDebugLog.ts index 92ef94b..ebdb063 100644 --- a/assets/script/battle/debug/BagRefreshDebugLog.ts +++ b/assets/script/battle/debug/BagRefreshDebugLog.ts @@ -30,10 +30,10 @@ export function logBagRefreshSection(title: string): void { const TILE_TYPE_LABEL: Record = { 1: '五行1', 2: '五行2', - 3: '五行3/格', + /** type=3 与遗留 Grid 同值 */ + [Weapon2TileType.Grid]: '五行3/格', 4: '五行4(火)', 5: '五行5', - [Weapon2TileType.Grid]: '格子', }; export function formatWeapon2Brief( diff --git a/assets/script/battle/debug/GlobalSkillDebugLog.ts b/assets/script/battle/debug/GlobalSkillDebugLog.ts index 18e7929..6f8302a 100644 --- a/assets/script/battle/debug/GlobalSkillDebugLog.ts +++ b/assets/script/battle/debug/GlobalSkillDebugLog.ts @@ -169,7 +169,7 @@ export function logGlobalSkillPickCompare( ): void { if (!_enabled) return; _log('──────── 选技能前后对比 ────────'); - _log('本次选择:', picked.map((s) => `${s.id}:${s.name} base_attr=${s.base_attr || '-'}`).join(' | ')); + _log('本次选择:', picked.map((s) => `${s.id}:${s.name}`).join(' | ')); _log('已选列表 前:', before.skillBrief.join(', ') || '(空)'); _log('已选列表 后:', after.skillBrief.join(', ') || '(空)'); _log(`base_attr万分比 前: ${JSON.stringify(before.attrWan)}`); diff --git a/assets/script/battle/mechanism/MechanismResCollector.ts b/assets/script/battle/mechanism/MechanismResCollector.ts index 4b3d9c5..d8f6071 100644 --- a/assets/script/battle/mechanism/MechanismResCollector.ts +++ b/assets/script/battle/mechanism/MechanismResCollector.ts @@ -2,6 +2,7 @@ import { Prefab } from 'cc'; import { createMembershipSet, membershipAdd } from '../../../mx/tools/MembershipSet'; import { ChapterNewPlayTypeEnum } from '../../game/ChapterPlayTypes'; import { TableNames } from '../../game/ConfigTableData'; +import { ChapterLevelBuilder } from '../config/ChapterLevelBuilder'; import { WITCH_MECHANISM_MONSTER_ID } from './MechanismConstants'; import type { ResPakage } from 'db://assets/mx/module/res/ResourcesManager'; @@ -55,8 +56,9 @@ export function collectMechanismBattleRes(playIds: number[]): MechanismResEntry[ switch (rawId as ChapterNewPlayTypeEnum) { case ChapterNewPlayTypeEnum.Witch: { const row = gg.data.project.getMonsterDataByID(WITCH_MECHANISM_MONSTER_ID); - if (row?.model) { - add(MECH_BUNDLE.BattleGameMonster, 'prefab/monster/', row.model); + const prefab = row ? ChapterLevelBuilder.resolveMonsterPrefabFromRow(row) : null; + if (prefab) { + add(MECH_BUNDLE.BattleGameMonster, 'prefab/monster/', prefab); } add(MECH_BUNDLE.BattleGameMonster, 'prefab/', '怪物加血'); break; diff --git a/assets/script/battle/mechanism/MechanismServices.ts b/assets/script/battle/mechanism/MechanismServices.ts index 34654e2..b653546 100644 --- a/assets/script/battle/mechanism/MechanismServices.ts +++ b/assets/script/battle/mechanism/MechanismServices.ts @@ -718,7 +718,7 @@ export function calcParatroopMonsterHp(ctx: MechanismContext, monsterId: number) const monsterConfig = readMonsterConfigFromLevel(ctx.session.levelDef.extra); if (!monsterConfig) { console.error('[MechanismServices] monsterConfig missing,飞禽血量无法按波次系数计算'); - return Math.max(1, gg.data.project.getMonsterDataByID(monsterId)?.HP ?? 1); + return Math.max(1, gg.data.project.getMonsterDataByID(monsterId)?.hp ?? 1); } const difficultyRow = getUpcomingWaveDifficultyRow(ctx); return calcChapterMonsterHp(monsterId, 1, difficultyRow, monsterConfig); diff --git a/assets/script/battle/presentation/ExtraStrikePresenter.ts b/assets/script/battle/presentation/ExtraStrikePresenter.ts index 8b002dd..f46d6d5 100644 --- a/assets/script/battle/presentation/ExtraStrikePresenter.ts +++ b/assets/script/battle/presentation/ExtraStrikePresenter.ts @@ -108,9 +108,6 @@ export class ExtraStrikeHost { p.ctx.dealDamage(id, { scale: p.scale, damageType: DMG_TYPE, - // 命中效果类型+对应参数(空串走影子上下文默认=技能 atk_buff1/2) - skillAtkBuff1: p.hitEffect, - skillAtkBuff2: '', }); } } diff --git a/assets/script/battle/presentation/RingProjectilesPresenter.ts b/assets/script/battle/presentation/RingProjectilesPresenter.ts index 766ea79..cabb17c 100644 --- a/assets/script/battle/presentation/RingProjectilesPresenter.ts +++ b/assets/script/battle/presentation/RingProjectilesPresenter.ts @@ -293,7 +293,8 @@ export class ExtraRingHost { const skel = clone.getComponentInChildren(sp.Skeleton); if (skel?.isValid) { skel.timeScale = 1; - skel.setAnimation(0, String(skel.defaultAnimation || RING_ANIM), true); + const typed = skel as sp.Skeleton & { defaultAnimation?: string }; + skel.setAnimation(0, String(typed.defaultAnimation || RING_ANIM), true); } return clone; } diff --git a/assets/script/battle/runtime/BattleRuntime.ts b/assets/script/battle/runtime/BattleRuntime.ts index 0ebad82..fdd4953 100644 --- a/assets/script/battle/runtime/BattleRuntime.ts +++ b/assets/script/battle/runtime/BattleRuntime.ts @@ -92,6 +92,7 @@ import { parseChapterAdvertiseLimit, getChapterFreeBox, getChapterFreeTips, + getBattleCoinAdRewards, } from '../bag/BagPrepConfig'; import { parseLegacyMonsterId, parseMonsterUnitDefId } from '../config/MonsterHpCalculator'; import { MonsterDataManager, MonsterType } from '../../manager/MonsterDataManager'; @@ -333,6 +334,10 @@ export class BattleRuntime implements IBattleRuntimeHandle { menShenAdOfferVisible = false; /** 门神盾牌:本局已观看广告并放置陷阱 */ menShenAdConsumed = false; + /** 局内看视频加金币:已用次数 */ + coinAdUsed = 0; + /** 局内看视频加金币:每次奖励数量(Const38 para1) */ + coinAdRewards: number[] = []; /** 备战:本局剩余免费摆放提示次数(Chapter.free_tips) */ prepFreeTipsRemaining = 0; /** 备战:本局免费摆放提示上限(Chapter.free_tips,UI 展示用) */ @@ -1220,12 +1225,40 @@ export class BattleRuntime implements IBattleRuntimeHandle { this.bajiaoFanAdMax = limits[6] ?? 0; this.menShenAdOfferVisible = false; this.menShenAdConsumed = false; + this.coinAdRewards = getBattleCoinAdRewards(); + this.coinAdUsed = 0; this.curFailReviveLeftNum = limits[5] ?? limits[3] ?? 1; this.curAdAddHpLeftNum = 0; this.MonsterDeadNum = 0; this.TotalMonsterNum = this._countLevelMonsters(this.session.levelDef); } + /** 局内看视频加金币是否仍可观看 */ + canUseCoinAd(): boolean { + return this.coinAdUsed < this.coinAdRewards.length; + } + + /** 下一次看视频加金币数量;不可用时返回 0 */ + nextCoinAdAmount(): number { + if (!this.canUseCoinAd()) return 0; + return this.coinAdRewards[this.coinAdUsed] ?? 0; + } + + /** + * 观看金币广告成功:入账并消耗一次。 + * @returns 实际入账数量;不可用时 0 + */ + consumeCoinAd(): number { + const amount = this.nextCoinAdAmount(); + if (!(amount > 0)) { + console.log('[BattleRuntime] 金币广告不可用', this.coinAdUsed, this.coinAdRewards.length); + return 0; + } + this._addLocalGold(amount); + this.coinAdUsed++; + return amount; + } + getPrepFreeGridRemaining(): number { return Math.max(0, this.prepFreeGridRemaining); } diff --git a/assets/script/battle/skill/SkillPresentationEnv.ts b/assets/script/battle/skill/SkillPresentationEnv.ts index 0665b5a..d52fec2 100644 --- a/assets/script/battle/skill/SkillPresentationEnv.ts +++ b/assets/script/battle/skill/SkillPresentationEnv.ts @@ -93,7 +93,7 @@ export class SkillPresentationEnv { */ private static _readMapTextGrid(node: Node | null | undefined): IMapTextGrid | null { if (!node?.isValid) return null; - return node.getComponentInChildren('TextGrid') as IMapTextGrid | null; + return node.getComponentInChildren('TextGrid') as unknown as IMapTextGrid | null; } static unbind(): void { @@ -403,73 +403,49 @@ export class SkillPresentationEnv { return parseWheelSkillParts(parts); } - /** 施法者是否已选指定词条(按 tower weapon1 过滤) */ + /** 施法者已选技能是否含指定 id(旧词条 weapon 过滤已删) */ static casterHasSkillEntry(caster: EntityId, entryId: number): boolean { const session = this._battle?.session; if (!session?.world.isAlive(caster)) return false; - - const weapon1Id = resolveTowerHeroId(session.world, caster) - || this.getDeployed(caster)?.weapon1Id; - if (!weapon1Id) return false; - for (const player of this._resolvePlayersForCaster(session, caster)) { for (const entry of player.selectedSkills) { - if (Number(entry.weapon) !== weapon1Id) continue; if (Number(entry.id) === entryId) return true; } } return false; } - /** 塔上已生效的 skill_special 原始串(如 `2,2`);与 Player.selectedSkills 合并 */ + /** 塔上 AtkHookComp.specials(旧 Skill.skill_special 词条已删) */ static getSkillSpecials(caster: EntityId): readonly string[] { - return this._collectSkillSpecials(caster, null); + return this._collectSkillSpecials(caster, false); } - /** 大招词条 skill_special(up_type 2 / 4);如哪吒 1055 变大、1056 回旋 */ + /** 大招向 specials:head=3/4/5/8 */ static getUltSkillSpecials(caster: EntityId): readonly string[] { - return this._collectSkillSpecials( - caster, - (entry) => entry.up_type === 2 || entry.up_type === 4, - ); + return this._collectSkillSpecials(caster, true); } - private static _collectSkillSpecials( - caster: EntityId, - filter: ((entry: ITableSkill) => boolean) | null, - ): readonly string[] { + /** + * @param caster 施法者 + * @param ultOnly 是否只收大招 head + */ + private static _collectSkillSpecials(caster: EntityId, ultOnly: boolean): readonly string[] { const session = this._battle?.session; if (!session?.world.isAlive(caster)) return []; - let weapon1Id = resolveTowerHeroId(session.world, caster); - if (!weapon1Id) { - weapon1Id = this.getDeployed(caster)?.weapon1Id; - } - const out = createMembershipSet(); - for (const player of this._resolvePlayersForCaster(session, caster)) { - for (const entry of player.selectedSkills) { - if (weapon1Id && entry.weapon !== weapon1Id) continue; - if (filter && !filter(entry)) continue; - const raw = String(entry.skill_special ?? '').trim(); - if (raw) membershipAdd(out, raw); - } - } - const hook = session.world.getComponent(caster, AtkHookComp); if (hook?.specials?.length) { for (const raw of hook.specials) { const s = String(raw ?? '').trim(); if (!s) continue; - if (filter) { + if (ultOnly) { const head = Number(s.split(',')[0]); - // 大招 skill_special:3 散射 / 4 变大 / 5 回旋 / 8 轮半径脉冲(1 由 ultCanCrit 处理) if (head !== 3 && head !== 4 && head !== 5 && head !== 8) continue; } membershipAdd(out, s); } } - return membershipToArray(out); } diff --git a/assets/script/battle/skill/WangMuConfig.ts b/assets/script/battle/skill/WangMuConfig.ts index cd97028..fe07ba6 100644 --- a/assets/script/battle/skill/WangMuConfig.ts +++ b/assets/script/battle/skill/WangMuConfig.ts @@ -1,5 +1,4 @@ import { Vec3 } from 'cc'; -import { createMembershipSet, membershipAdd, membershipFromArray, membershipDedupeArray, type MembershipSet, type ReadonlyMembershipSet } from '../../../mx/tools/MembershipSet'; import type { BattleSession } from 'db://assets/mx/module/battle'; import { BattleTeamId } from 'db://assets/mx/module/battle/ecs/BattleTeamId'; import { AttrId, AttributeComp, TeamComp } from 'db://assets/mx/module/battle/ecs/Components'; @@ -25,10 +24,10 @@ export interface WangMuUltParams { durationSec: number; } +/** 旧词条 type12 加攻扩展(配表已删,collect 恒空) */ interface Extra12 { attrCode: number; wan: number; - group3: ReadonlyMembershipSet; } export function readWangMuUltParams( @@ -94,10 +93,9 @@ function applyTimedBuffs( let critWan = params.critWan; let critDamWan = params.critDamWan; for (const e of extras) { - const wan = e.group3.has(targetWeapon1Id) ? e.wan * 2 : e.wan; - if (e.attrCode === 1) atkWan += wan; - else if (e.attrCode === 3) critWan += wan; - else if (e.attrCode === 4) critDamWan += wan; + if (e.attrCode === 1) atkWan += e.wan; + else if (e.attrCode === 3) critWan += e.wan; + else if (e.attrCode === 4) critDamWan += e.wan; } const remain = params.durationSec; const attrs = session.attributes; @@ -184,23 +182,9 @@ function applyFieldAtkSteal(session: BattleSession, caster: EntityId, ownerId: n logWangMuFieldAtkSteal(caster, wan, allyLines, sum, extra, before, after); } -function collectType12(caster: EntityId): Extra12[] { - const out: Extra12[] = []; - for (const player of SkillPresentationEnv.getPlayersForCaster(caster)) { - for (const entry of player.selectedSkills) { - if (entry.weapon !== WANG_MU_WEAPON1_ID) continue; - const raw = String(entry.skill_special ?? '').trim(); - if (!raw) continue; - const p = raw.split(',').map(Number); - if (p[0] !== 12 || p.length < 3) continue; - out.push({ - attrCode: p[1] ?? 0, - wan: p[2] ?? 0, - group3: parseIdSet(entry.group3), - }); - } - } - return out; +/** 旧词条 Skill.skill_special type12 / group3 已删;无表字段可驱动 */ +function collectType12(_caster: EntityId): Extra12[] { + return []; } function casterHasSpecialHead(caster: EntityId, head: number): boolean { @@ -219,15 +203,6 @@ function readType14Wan(caster: EntityId): number { return wan; } -function parseIdSet(raw: string): MembershipSet { - const out = createMembershipSet(); - for (const part of String(raw ?? '').split(',')) { - const n = Number(part); - if (Number.isFinite(n) && n > 0) membershipAdd(out, n); - } - return out; -} - function forEachAlly(session: BattleSession, caster: EntityId, fn: (id: EntityId) => void): void { const team = session.world.getComponent(caster, TeamComp); if (!team) return; diff --git a/assets/script/battle/view/AreaUnlockGuidePresenter.ts b/assets/script/battle/view/AreaUnlockGuidePresenter.ts index 62627cc..0acbeb8 100644 --- a/assets/script/battle/view/AreaUnlockGuidePresenter.ts +++ b/assets/script/battle/view/AreaUnlockGuidePresenter.ts @@ -1,4 +1,4 @@ -import { Color, Graphics, Node, Sorting2D, UITransform, Vec3, isValid, sp } from 'cc'; +import { Color, Graphics, Node, UITransform, Vec3, isValid, sp } from 'cc'; import { isElementGlyphType } from 'db://assets/mx/module/merge'; import { GBundle } from '../../game/ConfigRes'; import { AI_VIEW_LOCAL_CAMP } from '../ai/runtime/AiCampArea'; @@ -18,18 +18,14 @@ const FRAME_ANIM = 'animation'; const LINE_LAYER = 'ui_areaUnlockGuideLine'; /** 黑白交替每段长度(对齐效果图) */ const DASH_LEN = 12; -/** 斑马段半宽(实心矩形,避免细 stroke 在深色底上看不见) */ +/** 斑马段半宽 */ const DASH_HALF_W = 2.5; -/** 描边相对半宽加宽,保证黑/白段在任意底上都可见 */ +/** 描边相对半宽加宽 */ const DASH_OUTLINE_EXTRA = 1.5; /** 背包端取字块顶边中点的向上偏移 */ const BAG_TOP_PAD = 2; /** 气泡端取底边中点的向下偏移 */ const TIP_BOTTOM_PAD = 2; -/** 虚线框须压在字形之上(textGrid skin Sorting2D order=3,canUpEff=4) */ -const FRAME_SORT_LAYER = 3; -/** 虚线框 Sorting2D order */ -const FRAME_SORT_ORDER = 6; /** 交替色:黑 */ const DASH_BLACK = new Color(15, 15, 15, 255); /** 交替色:白 */ @@ -54,14 +50,17 @@ export interface AreaUnlockGuideRefresh { campAreaId?: number; /** 取背包槽字块 */ slotGridAt: (slotIndex: number) => TextGrid | null; + /** 取背包槽位节点(虚线框挂这里,禁止挂 TextGrid,避免合成叠字) */ + slotNodeAt: (slotIndex: number) => Node | null; /** 槽位是否可拖(开启且非待开启) */ canDragSlot: (slotIndex: number) => boolean; - /** 为 true 时只清不显(拖动中 / 入场中) */ + /** 为 true 时只清不显(拖动中 / 入场中 / 落子飞行中) */ skip?: boolean; } /** * 背包可解锁当前地图区域时:随机标一个背包字 + 连到格子锁气泡。 + * 虚线框挂在槽位节点上,不进入 TextGrid 子树,避免合成/回收把框和字皮搅在一起。 */ export class AreaUnlockGuidePresenter { /** 连线层父节点 */ @@ -103,8 +102,10 @@ export class AreaUnlockGuidePresenter { /** 立刻隐藏虚线框与连线 */ clear(): void { + const prevHost = this._frame?.parent; this._slotIndex = null; this._releaseFrame(); + if (prevHost?.isValid) this._purgeOrphanFrames(prevHost); if (this._graphics?.isValid) this._graphics.clear(); if (this._lineLayer?.isValid) this._lineLayer.active = false; } @@ -145,11 +146,12 @@ export class AreaUnlockGuidePresenter { slot = candidates[Math.floor(Math.random() * candidates.length)]; } const grid = opts.slotGridAt(slot); - if (!grid?.node?.isValid) { + const slotNode = opts.slotNodeAt(slot); + if (!grid?.node?.isValid || !slotNode?.isValid) { this.clear(); return; } - if (!this._attachFrame(grid.node)) { + if (!this._attachFrame(slotNode, grid.node)) { this.clear(); return; } @@ -192,10 +194,13 @@ export class AreaUnlockGuidePresenter { } /** - * 把虚线框挂到背包字块上并循环播放。 - * @param host 字块节点 + * 虚线框挂到背包槽位(不是 TextGrid),与字块同中心,不参与合成节点树。 + * @param slotNode 背包槽 + * @param glyphNode 字块(仅用于对齐位置) */ - private _attachFrame(host: Node): boolean { + private _attachFrame(slotNode: Node, glyphNode: Node): boolean { + this._purgeOrphanFrames(slotNode); + this._purgeOrphanFrames(glyphNode); if (!this._frame?.isValid) { if (typeof gg === 'undefined' || !gg.res?.getNode) { console.warn('[AreaUnlockGuide] gg.res 未就绪,无法加载引导虚线框'); @@ -210,40 +215,49 @@ export class AreaUnlockGuidePresenter { } const frame = this._frame; if (!frame.isValid) return false; - frame.layer = host.layer; - if (frame.parent !== host) { - frame.parent = host; - frame.setPosition(0, 0, 0); - frame.setScale(1, 1, 1); + frame.layer = slotNode.layer; + if (frame.parent !== slotNode) { + frame.parent = slotNode; } - frame.setSiblingIndex(host.children.length - 1); - this._applyFrameSorting(frame); + // 与槽内字块同局部坐标,避免挂 TextGrid 导致合成叠字 + frame.setPosition(glyphNode.position.x, glyphNode.position.y, glyphNode.position.z); + frame.setScale(1, 1, 1); + frame.setSiblingIndex(slotNode.children.length - 1); + this._disableNodeHit(frame); frame.active = true; const sk = frame.getComponent(sp.Skeleton) ?? frame.getComponentInChildren(sp.Skeleton); if (sk?.isValid) { - sk.node.layer = host.layer; + sk.node.layer = slotNode.layer; BattleSpinePlayback.play(sk, FRAME_ANIM, { loop: true, optional: true }); } return true; } /** - * 虚线框加 Sorting2D,避免被 textGrid 字形盖住。 - * @param frame 引导虚线框 + * 关闭节点树命中,防止 Spine/UITransform 截获拖拽。 + * @param root 虚线框或连线层 */ - private _applyFrameSorting(frame: Node): void { - let rootSort = frame.getComponent(Sorting2D); - if (!rootSort) rootSort = frame.addComponent(Sorting2D); - rootSort.sortingLayer = FRAME_SORT_LAYER; - rootSort.sortingOrder = FRAME_SORT_ORDER; - const skels = frame.getComponentsInChildren(sp.Skeleton); - for (let i = 0; i < skels.length; i++) { - const n = skels[i]?.node; - if (!n?.isValid) continue; - let sort = n.getComponent(Sorting2D); - if (!sort) sort = n.addComponent(Sorting2D); - sort.sortingLayer = FRAME_SORT_LAYER; - sort.sortingOrder = FRAME_SORT_ORDER; + private _disableNodeHit(root: Node): void { + const uts = root.getComponentsInChildren(UITransform); + for (let i = 0; i < uts.length; i++) { + const ut = uts[i]; + if (!ut) continue; + (ut as UITransform & { hitTest: () => boolean }).hitTest = () => false; + } + } + + /** + * 清掉残留虚线框(含误挂在 TextGrid 上的旧实现残留)。 + * @param host 槽位或字块 + */ + private _purgeOrphanFrames(host: Node): void { + const children = host.children; + for (let i = children.length - 1; i >= 0; i--) { + const child = children[i]; + if (!child?.isValid || child.name !== FRAME_NAME) continue; + if (child === this._frame) continue; + if (child['resKey']) gg.res.putNode(child); + else child.destroy(); } } @@ -277,9 +291,11 @@ export class AreaUnlockGuidePresenter { else ut.setContentSize(2000, 2000); ut.setAnchorPoint(0.5, 0.5); layer.addComponent(Graphics); + this._disableNodeHit(layer); } this._lineLayer = layer; this._graphics = layer.getComponent(Graphics); + this._disableNodeHit(layer); layer.active = false; } @@ -312,7 +328,7 @@ export class AreaUnlockGuidePresenter { } /** - * 黑白段交替实心绳:每段先画反色描边再画本色,深色/浅色底上都清晰。 + * 黑白段交替实心绳:每段先画反色描边再画本色。 * @param g Graphics * @param x1 起点 x * @param y1 起点 y @@ -340,7 +356,7 @@ export class AreaUnlockGuidePresenter { } /** - * 沿路径画一段实心矩形(比 stroke 短段更稳、更粗)。 + * 沿路径画一段实心矩形。 * @param g Graphics * @param x1 路径起点 x * @param y1 路径起点 y diff --git a/assets/script/battle/view/BoardPlaceFlightExecutor.ts b/assets/script/battle/view/BoardPlaceFlightExecutor.ts index 8a054c8..865db75 100644 --- a/assets/script/battle/view/BoardPlaceFlightExecutor.ts +++ b/assets/script/battle/view/BoardPlaceFlightExecutor.ts @@ -106,14 +106,14 @@ export class BoardPlaceFlightExecutor { let pending = swapLeg ? 2 : 1; let settled = false; const failState = { failed: false }; - let safetyTimer = 0; + let safetyTimer: ReturnType | null = null; const onAnimDone = (): void => { if (settled) return; pending--; if (pending > 0) return; settled = true; - clearTimeout(safetyTimer); + if (safetyTimer != null) clearTimeout(safetyTimer); BoardPlaceFlightExecutor._completeFlight(req, failState); }; diff --git a/assets/script/battle/view/CampHpBarPresenter.ts b/assets/script/battle/view/CampHpBarPresenter.ts index 4f3bf24..6193718 100644 --- a/assets/script/battle/view/CampHpBarPresenter.ts +++ b/assets/script/battle/view/CampHpBarPresenter.ts @@ -1,14 +1,23 @@ -import { instantiate, Layout, Node, Sorting2D, tween, Tween, UIOpacity, UITransform, Vec3 } from 'cc'; -import { GBundle } from '../../game/ConfigRes'; +import { instantiate, Layout, Node, Sorting2D, sp, tween, Tween, UIOpacity, UITransform, Vec3 } from 'cc'; +import type { EntityId } from 'db://assets/mx/module/ecs'; import { BATTLE_EVENT_ALL, BattleEventType, BattlePhase, + BattleTeamId, + MovementComp, + TeamComp, + isBajiaoBlowRetreating, + isYanSoulClaimed, type BattleEvent, } from 'db://assets/mx/module/battle'; -import type { ProjectBattleHandle } from '../runtime/BattleRuntime'; +import { GBundle } from '../../game/ConfigRes'; +import { MonsterType } from '../../manager/MonsterDataManager'; +import { isMechanismUnit } from '../mechanism/MechanismServices'; import type { MapManager } from '../map/legacy/MapManager'; import { resolveSpawnGoalWallName } from '../map/MapPathQueries'; +import { BattleSpinePlayback } from '../presentation/BattleSpinePlayback'; +import type { ProjectBattleHandle } from '../runtime/BattleRuntime'; /** 血条轨道总宽(与预制体「血量」节点一致) */ const BAR_TRACK_W = 60; @@ -20,6 +29,8 @@ const PREFAB_NAME = '营地血条'; const TRACK_NAME = '血量'; /** 血格模板节点名 */ const PIP_NAME = '长血格'; +/** π 动效节点名 */ +const PAI_NAME = '保护派派'; /** 出怪口节点名前缀(spawnPoint_N) */ const SPAWN_PREFIX = 'spawnPoint_'; /** 血条贴营地外观的外扩(像素);负值表示向营地内收,避开贴图透明边 */ @@ -30,10 +41,18 @@ const BAR_SORT_LAYER = 3; const BAR_SORT_ORDER = 20; /** 扣血格渐隐秒 */ const PIP_FADE_SEC = 0.2; +/** π 默认待机 */ +const PAI_ANIM_IDLE = '待机'; +/** π 怪物靠近时 */ +const PAI_ANIM_SCARE = '害怕'; +/** 进攻怪剩余路径格数 ≤ 此值视为靠近(与危机提示一致) */ +const SCARE_PATH_CELLS = 3; +/** 靠近检测降频(帧) */ +const SCARE_SCAN_PERIOD = 8; /** 单营血条绑定 */ interface CampBar { - /** 玩家槽 ID */ + /** 玩家槽 ID(被进攻的防守方) */ playerId: number; /** 血条根节点 */ root: Node; @@ -45,9 +64,13 @@ interface CampBar { pips: Node[]; /** 开场最大血量(用于格宽) */ maxHp: number; + /** 保护派派 Spine */ + skeleton: sp.Skeleton | null; + /** 是否正在播害怕 */ + scared: boolean; } -/** 己方/敌方营地血条:格数=当前血,扣血渐隐回收 */ +/** 己方/敌方营地血条:格数=当前血,扣血渐隐回收;π 默认待机、怪靠近播害怕 */ export class CampHpBarPresenter { /** 当前战斗 */ private _battle: ProjectBattleHandle | null = null; @@ -57,9 +80,11 @@ export class CampHpBarPresenter { private readonly _bars: CampBar[] = []; /** 渐隐完成待回收队列(FIFO,与 tween 启动顺序一致) */ private readonly _fadeQueue: Node[] = []; + /** 靠近扫描帧计数 */ + private _scareScanAcc = 0; /** - * 按本图挂血条:血条贴在该口怪物的终点下方。 + * 按本图挂血条:贴在该口怪物终点上方(预制体血条在上、π 在下,双方同一套)。 * @param battle 战斗句柄 * @param map 地图 */ @@ -81,6 +106,17 @@ export class CampHpBarPresenter { } } + /** 帧刷新:怪物靠近时切害怕,否则待机 */ + tick(): void { + const battle = this._battle; + if (!battle || battle.session.ended || this._bars.length <= 0) return; + this._scareScanAcc++; + if (this._scareScanAcc % SCARE_SCAN_PERIOD !== 1) return; + for (let i = 0; i < this._bars.length; i++) { + this._refreshScare(battle, this._bars[i]); + } + } + /** 回收节点、停 tween、解事件 */ unbind(): void { const battle = this._battle; @@ -89,6 +125,7 @@ export class CampHpBarPresenter { } this._battle = null; this._mapNode = null; + this._scareScanAcc = 0; this._clearFades(); for (let i = 0; i < this._bars.length; i++) { this._recycleBar(this._bars[i]); @@ -169,6 +206,7 @@ export class CampHpBarPresenter { root.parent = mapNode; this._syncLayer(root, anchor.layer); this._placeAtCamp(root, anchor); + const skeleton = this._resolvePaiSkeleton(root); const bar: CampBar = { playerId, root, @@ -176,8 +214,11 @@ export class CampHpBarPresenter { template, pips: [], maxHp, + skeleton, + scared: false, }; this._bars.push(bar); + this._playPai(bar, false); this._fillPips(bar, slot.wallHp); } @@ -219,7 +260,7 @@ export class CampHpBarPresenter { } /** - * 双方血条都贴在攻击点下方。 + * 双方都贴攻击点上方:血条在上、π 在下,落在中间墙两侧格子上。 * @param root 血条根 * @param anchor 位置节点(wallTargetN) */ @@ -235,12 +276,100 @@ export class CampHpBarPresenter { console.log('[CampHpBar] 血条无 UITransform'); } const barHalfH = barUt ? barUt.height * 0.5 : 0; - const edgeLocalY = -spawnUt.height * spawnUt.anchorY; - const localY = edgeLocalY - (barHalfH + BAR_EDGE_GAP); + const edgeLocalY = spawnUt.height * (1 - spawnUt.anchorY); + const localY = edgeLocalY + (barHalfH + BAR_EDGE_GAP); const world = spawnUt.convertToWorldSpaceAR(new Vec3(0, localY, 0)); root.setWorldPosition(world); } + /** + * @param root 血条根 + */ + private _resolvePaiSkeleton(root: Node): sp.Skeleton | null { + const pai = root.getChildByName(PAI_NAME); + if (!pai?.isValid) { + console.warn('[CampHpBar] 预制体缺「保护派派」'); + return null; + } + const skel = pai.getComponent(sp.Skeleton); + if (!skel) { + console.warn('[CampHpBar] 保护派派无 Skeleton'); + return null; + } + return skel; + } + + /** + * @param battle 战斗 + * @param bar 血条 + */ + private _refreshScare(battle: ProjectBattleHandle, bar: CampBar): void { + if (!bar.skeleton?.isValid) return; + const near = this._hasNearAttacker(battle, bar.playerId); + if (near === bar.scared) return; + this._playPai(bar, near); + } + + /** + * 进攻该防守方的怪是否已进入靠近距离。 + * @param battle 战斗 + * @param defenderPlayerId 防守方 + */ + private _hasNearAttacker(battle: ProjectBattleHandle, defenderPlayerId: number): boolean { + const session = battle.session; + let found = false; + session.world.forEachAlive((entityId) => { + if (found) return; + if (!this._isScareCandidate(battle, defenderPlayerId, entityId)) return; + const move = session.world.getComponent(entityId, MovementComp); + if (!move) return; + if (move.reachedGoal) { + found = true; + return; + } + const remainCells = move.path.length - move.pathIndex; + if (remainCells <= SCARE_PATH_CELLS) found = true; + }); + return found; + } + + /** + * @param battle 战斗 + * @param defenderPlayerId 防守方 + * @param entityId 实体 + */ + private _isScareCandidate(battle: ProjectBattleHandle, defenderPlayerId: number, entityId: EntityId): boolean { + const session = battle.session; + const world = session.world; + if (!world.isAlive(entityId)) return false; + if (isMechanismUnit(session, entityId)) return false; + const team = world.getComponent(entityId, TeamComp); + if (!team || !BattleTeamId.isEnemyTeam(team.team)) return false; + if (Math.max(0, Math.floor(Number(team.ownerId) || 0)) !== defenderPlayerId) return false; + const row = battle.resolveMonsterRow(entityId); + if (!row) return false; + const type = Math.floor(Number(row.type)); + if (type !== MonsterType.SmallMonster && type !== MonsterType.Boss && type !== MonsterType.SummonMonster) { + return false; + } + const move = world.getComponent(entityId, MovementComp); + if (!move || move.spawnProtected || move.presentLocked || move.imprisoned) return false; + if (isYanSoulClaimed(move) || isBajiaoBlowRetreating(move)) return false; + return true; + } + + /** + * @param bar 血条 + * @param scare 是否害怕 + */ + private _playPai(bar: CampBar, scare: boolean): void { + const skel = bar.skeleton; + if (!skel?.isValid) return; + bar.scared = scare; + const name = scare ? PAI_ANIM_SCARE : PAI_ANIM_IDLE; + BattleSpinePlayback.play(skel, name, { loop: true, optional: true }); + } + /** * 槽位当前最大血;被动/AI 加血后必须重读,不能用挂条时的快照。 * @param bar 血条 @@ -405,6 +534,10 @@ export class CampHpBarPresenter { */ private _recycleBar(bar: CampBar): void { this._destroyPips(bar); + const skel = bar.skeleton; + if (skel?.isValid) BattleSpinePlayback.clearPendingComplete(skel); + bar.skeleton = null; + bar.scared = false; if (bar.root?.isValid) { Tween.stopAllByTarget(bar.root); gg.res.putNode(bar.root); diff --git a/assets/script/battle/view/CocosBagBoardView.ts b/assets/script/battle/view/CocosBagBoardView.ts index 444eb33..b703232 100644 --- a/assets/script/battle/view/CocosBagBoardView.ts +++ b/assets/script/battle/view/CocosBagBoardView.ts @@ -943,10 +943,10 @@ export class CocosBagBoardView { const grid = this._resolveBagTextGridForUpgrade(bagSlot, slotNode); const record = this._bagSession.getBagSlots()[bagSlot]; if (grid?.isValid && record) { + this._grids.setBagGrid(bagSlot, grid); grid.applyMapLevel(record.level ?? 1); - grid.enableDrag(this._canEnableBagGridDrag(grid)); - this._bindDrag(grid); } + this._sanitizeBagSlotAfterMerge(bagSlot); this._playBagUpgradeEffect(bagSlot); this._refreshCanUpgradeHints(); } @@ -3203,6 +3203,8 @@ export class CocosBagBoardView { let mapDrag: { fromGridIndex: number; weapon2Id: number; tileSource?: TileSource } | undefined; let type3Backup: { gridIndex: number; tile: MapTileRecord } | null = null; + // 任意拖动先清解锁引导,避免框/连线参与合成节点树造成叠字 + this._unlockGuide.clear(); if (source.kind === 'bag') { const slot = this._bagSession!.getBagSlots()[source.slotIndex]; if (!slot || Number(slot.weapon2Id) !== grid.weapon2Id) { @@ -3210,9 +3212,6 @@ export class CocosBagBoardView { this._rebuildFromSession(); return; } - if (this._unlockGuide.slotIndex === source.slotIndex) { - this._unlockGuide.clear(); - } } else if (source.kind === 'map') { const mapIndex = this._resolveMapGridIndexForTextGrid(grid); if (mapIndex == null) { @@ -3728,7 +3727,10 @@ export class CocosBagBoardView { swapCommit: swapToSource && displacedGrid ? { grid: displacedGrid, target: { kind: 'bag', slotIndex: fromSlot } } : undefined, - hooks: this._createPlaceHooks({ onSuccessRebuild: 'flush' }), + hooks: this._createPlaceHooks({ + onSuccessRebuild: 'flush', + onComplete: () => this._refreshDragEnabled(), + }), }); } @@ -4412,6 +4414,7 @@ export class CocosBagBoardView { break; } if (this._applyBagUpgradeInPlace(event.slotIndex, event.level)) { + this._sanitizeBagSlotAfterMerge(event.slotIndex); if (!this._suppressDefaultUpgradeFx) { this._playBagUpgradeEffect(event.slotIndex); } @@ -5213,16 +5216,51 @@ if (weapon2Id === GRID_WEAPON2_ID) return true; this._unlockGuide.clear(); return; } + // 落子飞行 / drop 同步中禁止刷新,否则框会踩进合成中的 TextGrid 树 + const skip = this._activeDrag != null + || this._bagEntrancePlaying + || !this._canDrag() + || this._mapDropAnimInflight > 0 + || this._dropSyncPhase !== 'idle'; this._unlockGuide.refresh({ bagSession: this._bagSession, map: this._map, campAreaId: AI_VIEW_LOCAL_CAMP, slotGridAt: (slotIndex) => this._slotGrids.get(slotIndex) ?? null, + slotNodeAt: (slotIndex) => this._bagSlotNodeAt(slotIndex), canDragSlot: (slotIndex) => this._land.stateOf(slotIndex) === TextListCellState.Open, - skip: this._activeDrag != null || this._bagEntrancePlaying || !this._canDrag(), + skip, }); } + /** + * 背包合成后:槽内只留一块真身,清 select,避免叠字/红框残留。 + * @param slotIndex 合成目标槽 + */ + private _sanitizeBagSlotAfterMerge(slotIndex: number): void { + const slotNode = this._bagSlotNodeAt(slotIndex); + if (!slotNode?.isValid) return; + const keep = this._slotGrids.get(slotIndex); + for (const child of [...slotNode.children]) { + if (!child?.isValid) continue; + if (child.name === '引导虚线框') { + if (child['resKey']) gg.res.putNode(child); + else child.destroy(); + continue; + } + const tg = child.getComponent(TextGrid); + if (!tg?.isValid) continue; + if (tg === keep) continue; + this._forceRecycleTextGrid(tg); + } + if (keep?.isValid) { + keep.isSelectStatus = false; + keep.isRedSelectStatus = false; + keep.enableDrag(this._canEnableBagGridDrag(keep)); + this._bindDrag(keep); + } + } + private _playBagUpgradeEffect(slotIndex: number): void { BattleAudio.playUpgrade(); this._playLevelUpTextForBag(slotIndex); @@ -6740,7 +6778,10 @@ if (weapon2Id === GRID_WEAPON2_ID) return true; const tg = this._slotGrids.get(slotIndex); if (!selected) { - if (tg?.node?.isValid) tg.isSelectStatus = false; + if (tg?.node?.isValid) { + tg.isSelectStatus = false; + tg.isRedSelectStatus = false; + } if (slotSelect && isValid(slotSelect)) slotSelect.active = false; return; } diff --git a/assets/script/battle/view/GridUpgradeSpineEffect.ts b/assets/script/battle/view/GridUpgradeSpineEffect.ts index d1bebb2..e5f0b60 100644 --- a/assets/script/battle/view/GridUpgradeSpineEffect.ts +++ b/assets/script/battle/view/GridUpgradeSpineEffect.ts @@ -132,11 +132,11 @@ function playNamedSpine( BattleSpinePlayback.resetTracks(spine); let settled = false; - let hideTimer = 0; + let hideTimer: ReturnType | null = null; const finish = (): void => { if (settled) return; settled = true; - clearTimeout(hideTimer); + if (hideTimer != null) clearTimeout(hideTimer); if (spineNode?.isValid) spineNode.active = false; onComplete?.(); }; diff --git a/assets/script/com/itemPic.ts b/assets/script/com/itemPic.ts index 5dea984..6e32aa2 100644 --- a/assets/script/com/itemPic.ts +++ b/assets/script/com/itemPic.ts @@ -75,7 +75,7 @@ export class itemPic extends Component { let spineQuality4 = icon?.getChildByName('橙色'); let spineQuality5 = icon?.getChildByName('红色'); if (this.lbName) this.lbName.string = gg.lang.get(itemData.name);//itemData.name; - if (this.lbDesc) this.lbDesc.string = gg.lang.get(itemData.desc1);//itemData.desc1; + if (this.lbDesc) this.lbDesc.string = gg.lang.get(itemData.desc); if (spineQuality3) spineQuality3.active = itemData.quality == 3 if (spineQuality4) spineQuality4.active = itemData.quality == 4 if (spineQuality5) spineQuality5.active = false diff --git a/assets/script/game/ConfigProjectData.ts b/assets/script/game/ConfigProjectData.ts index d716efc..6d3c71c 100644 --- a/assets/script/game/ConfigProjectData.ts +++ b/assets/script/game/ConfigProjectData.ts @@ -4,7 +4,6 @@ import { LevelFieldResolver } from "../manager/LevelFieldResolver"; import { SkillMultiplyType, TableNames } from "./ConfigTableData"; import { heroNormalSkillId, isBasicHero } from '../battle/config/BattleHeroTable'; import { resolveAtkLevelCoef } from '../battle/combat/TowerStatResolver'; -import { parseEntryBaseAttr } from '../battle/skill/SkillEntryParse'; import type { IBattleRuntimeHandle } from '../battle/types/ProjectBattleTypes'; import MTools from "../../mx/tools/MTools"; import { DailyWinStats } from '../manager/DailyWinStats'; @@ -808,16 +807,11 @@ export class ConfigProjectData extends Singleton { const t2 = skill.multiply_type2; const v2 = skill.multiply_num2; if (t2 === type) sum += v2 ?? 0; - for (const { type: attrType, value } of parseEntryBaseAttr(skill.base_attr)) { - if (ConfigProjectData._baseAttrToMultiplyType[attrType] === type) { - sum += value / 10000; - } - } } return sum; } - /**根据一组技能获取所有乘区类型(兼容旧 multiply_type + 新 base_attr) */ + /** 根据一组技能获取所有乘区类型(旧 base_attr 词条已删,仅兼容遗留 multiply_type 扩展字段) */ getAllMultiplyType(skillArr: ITableSkill[]) { const typeArr: number[] = []; for (let i = 0; i < skillArr.length; i++) { @@ -829,12 +823,6 @@ export class ConfigProjectData extends Singleton { const t2 = skill.multiply_type2; if (t1 > 0 && typeArr.indexOf(t1) === -1) typeArr.push(t1); if (t2 > 0 && typeArr.indexOf(t2) === -1) typeArr.push(t2); - for (const { type: attrType } of parseEntryBaseAttr(skill.base_attr)) { - const multType = ConfigProjectData._baseAttrToMultiplyType[attrType]; - if (multType > 0 && typeArr.indexOf(multType) === -1) { - typeArr.push(multType); - } - } } return typeArr; } @@ -891,8 +879,8 @@ export class ConfigProjectData extends Singleton { const w1 = this.getWeapon1Data(weapon1Id); if (!w1 || composeLevel <= 0) return 0; - const weaponSkills = skills.filter(s => s.weapon === weapon1Id); - const dpsMult = this.calculateDPSWeight(weaponSkills, weapon1Id); + // 旧词条 Skill.weapon 已删:DPS 乘区用传入 skills(局外带入/调试),无则按 1 + const dpsMult = this.calculateDPSWeight(skills as ITableSkill[], weapon1Id); const levelLimit = w1.level_limit > 0 ? w1.level_limit : composeLevel; const effectiveLevel = Math.max(1, Math.min(composeLevel, levelLimit)); diff --git a/assets/script/game/ConfigRes.ts b/assets/script/game/ConfigRes.ts index 498cfd5..12af2fa 100644 --- a/assets/script/game/ConfigRes.ts +++ b/assets/script/game/ConfigRes.ts @@ -160,8 +160,8 @@ export class GPath { } /** 每日商店飘字标题(icons/shopSkillTitle/{name}) */ static ShopSkillTitle(name: string | number) { return "shopSkillTitle/" + name; } - /**通用仙桃图标(icons/img/仙桃) */ - static CommPeach() { return "img/仙桃"; } + /**通用金币图标(icons/img/金币) */ + static CommPeach() { return "img/金币"; } /** 五行属性图标(icons/img/金|木|水|火|土) */ static ElementAttr(name: string) { return "img/" + name; } /**障碍物 */ diff --git a/assets/script/game/GameData.ts b/assets/script/game/GameData.ts index 856ebc3..d94adc2 100644 --- a/assets/script/game/GameData.ts +++ b/assets/script/game/GameData.ts @@ -1104,7 +1104,8 @@ export class GameData extends Singleton { const itemData = this.table.getItemData(goodID); if (!itemData || itemData.quality !== quality1) continue; qualityArray1.push(goodID); - weightArray1.push(itemData.weight); + // Item 表无 weight:同品质碎片池等权 + weightArray1.push(1); } fragmentArrayAll.push( ...MTools.getRandomByWeightArray(num1, qualityArray1, weightArray1), diff --git a/assets/script/game/GameDataEnums.ts b/assets/script/game/GameDataEnums.ts index d987926..31a0b75 100644 --- a/assets/script/game/GameDataEnums.ts +++ b/assets/script/game/GameDataEnums.ts @@ -550,6 +550,8 @@ export enum ConstNumType { WeekMapSat = 36, /** 周日匹配地图池 para1:Level.id 逗号分隔 */ WeekMapSun = 37, + /** 战斗中看视频加金币:para1 为每次奖励数量,次数=数组长度 */ + BattleCoinAdRewards = 38, } export enum TaskType { diff --git a/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts b/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts index bb08c29..9dec7eb 100644 --- a/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts +++ b/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts @@ -15,8 +15,8 @@ const PLUS_OFFSET_X = 40 / FLY_VISUAL_SCALE; const PLUS_CHILD = 'dropPlusOne'; /** - * 战斗内仙桃飘字:使用 battleGame/prefab/coinFly。 - * 起点 skill1/skill2,终点 ui_money。 + * 战斗内金币飘字:使用 battleGame/prefab/coinFly。 + * 起点击杀/回收点,终点底部 btnCoin/金币。 */ export class BattlePeachCoinFlyPresenter { private _moneyNode: Node | null = null; @@ -26,7 +26,7 @@ export class BattlePeachCoinFlyPresenter { /** 掉落 +1 飘字 */ private readonly _plusQueue: Node[] = []; - /** 绑定目标 ui_money 与飞行层(ui_fly) */ + /** 绑定飞向目标(btnCoin/金币)与飞行层(ui_fly) */ bind(moneyNode: Node | null | undefined, flyLayer: Node | null | undefined): void { this._moneyNode = moneyNode?.isValid ? moneyNode : null; this._flyLayer = flyLayer?.isValid ? flyLayer : null; diff --git a/assets/script/ui/BattleGame/CoinFly.ts b/assets/script/ui/BattleGame/CoinFly.ts index c167e1e..795a145 100644 --- a/assets/script/ui/BattleGame/CoinFly.ts +++ b/assets/script/ui/BattleGame/CoinFly.ts @@ -1,5 +1,5 @@ -import { _decorator, Component, tween, Tween, Vec3 } from 'cc'; +import { _decorator, Component, Node, tween, Tween, Vec3 } from 'cc'; const { ccclass } = _decorator; /** 蹦跳峰值相对起点世界 Y 偏移(与乾坤袋回收飘桃一致) */ diff --git a/assets/script/ui/BattleGame/UIBattleGame.ts b/assets/script/ui/BattleGame/UIBattleGame.ts index 57f1f3e..f69a22d 100644 --- a/assets/script/ui/BattleGame/UIBattleGame.ts +++ b/assets/script/ui/BattleGame/UIBattleGame.ts @@ -4,7 +4,7 @@ // time: Tue Aug 18 2026 // desc: 战斗界面 — 地图、出怪、背包刷新(召唤) //********************* -import { _decorator, find, Label, Node, Sprite, Tween, tween, v3, Vec3, sp } from 'cc'; +import { _decorator, find, game, Label, Node, Sprite, Tween, tween, v3, Vec3, sp } from 'cc'; import { Auto_BattleGame } from './Auto_BattleGame'; import { CocosBattleMapHost } from '../../battle/map/CocosBattleMapHost'; import { applyMapTopologyToSession } from '../../battle/map/importTopologyFromMapManager'; @@ -21,6 +21,7 @@ import { getDiscountedBagNormalRefreshCost } from '../../battle/bag/BagPrepConfi import { resolveCarriedSummonCostReduceWan } from '../../manager/battleBuff/BattleBuffPassiveSkillUtil'; import type { ProjectBattleHandle } from '../../battle/runtime/BattleRuntime'; import { BattleAudio } from '../../battle/audio/BattleAudio'; +import { BattleUiPauseGate } from '../../battle/BattleUiPauseGate'; import { SkillController } from '../../battle/skill/SkillController'; import { SkillPresentationEnv } from '../../battle/skill/SkillPresentationEnv'; import { MonsterType } from '../../manager/MonsterDataManager'; @@ -83,6 +84,8 @@ const REFRESH_BOUNCE_AMP = 0.1; const REFRESH_BOUNCE_SEC = 0.22; /** 开局未放置数字则强制开怪的等待秒数 */ const FIRST_PLACE_COMBAT_TIMEOUT_SEC = 10; +/** 看视频加金币期间暂停 token */ +const COIN_AD_PAUSE_TOKEN = 'ad:battleCoin'; /** 砚台 Spine:资源里名字取反,出字过程播「待机」 */ const INKSTONE_SPINE_SPAWN = '待机'; @@ -186,6 +189,12 @@ export class UIBattleGame extends Auto_BattleGame { private _peachUiGold = -1; /** 召唤消耗缓存 */ private _peachUiCost = -1; + /** 金币广告已用次数缓存 */ + private _peachUiCoinAdUsed = -1; + /** btnCoin/视频标 */ + private _coinAdVideoIcon: Node | null = null; + /** 看视频加金币进行中 */ + private _coinAdPending = false; /** 波次 UI 缓存 */ private _waveUiIdx = -999; /** AI 技能条降频 */ @@ -304,7 +313,12 @@ export class UIBattleGame extends Auto_BattleGame { this._otherSkillView = new BattleGameOtherSkillView(this.ui_otherskill1List, this.ui_otherskill2List); this._otherSkillView.setOwnedDesc(this._otherOwnedDesc); this._otherSkillView.refresh(); + if (this.ui_money?.isValid) this.ui_money.active = false; + this._coinAdVideoIcon = this.btnCoin?.getChildByName('视频标') ?? null; this._waveUiIdx = -999; + this._peachUiGold = -1; + this._peachUiCost = -1; + this._peachUiCoinAdUsed = -1; this._refreshPeachUi(); this._refreshWaveUi(); this._syncIllustratedHint(false); @@ -340,6 +354,7 @@ export class UIBattleGame extends Auto_BattleGame { } this._bagView?.tickPeachTreePresentations(); getBattleGameMonsterCrisisHintPresenter().tick(); + this._campHpBar.tick(); } this._bindNetTrap?.tick(dt); this._fireTrap?.tick(dt); @@ -736,12 +751,13 @@ export class UIBattleGame extends Auto_BattleGame { getBattleBuffBaseThunderHost().bind(battle, this._baseThunderFx); } - /** 绑定 ui_money 飞桃(击杀 / 回收共用) */ + /** 绑定底部金币飞币(击杀 / 回收共用) */ private _ensurePeachCoinFly(): void { if (!this._peachCoinFly) { this._peachCoinFly = new BattlePeachCoinFlyPresenter(); } - this._peachCoinFly.bind(this.ui_money, this.ui_fly ?? this.ui_mapParentNode); + const moneyTarget = this.btnCoin?.getChildByName('金币') ?? this.btnCoin; + this._peachCoinFly.bind(moneyTarget, this.ui_fly ?? this.ui_mapParentNode); } /** 绑定乾坤袋回收演出 */ @@ -958,7 +974,7 @@ export class UIBattleGame extends Auto_BattleGame { sc.refreshEntitySkillBindings(map, this._bagView?.getMapGrids()); } - /** 刷新顶部桃子数、召唤消耗与按钮填充状态 */ + /** 刷新底部金币数、召唤消耗、金币广告与按钮填充状态 */ private _refreshPeachUi(): void { const battle = this._battle; if (!battle) return; @@ -967,12 +983,15 @@ export class UIBattleGame extends Auto_BattleGame { const cost = battle.bagSession ? battle.bagSession.normalRefreshCost : getDiscountedBagNormalRefreshCost(0, resolveCarriedSummonCostReduceWan().reduceWan); - if (gold === this._peachUiGold && cost === this._peachUiCost) return; + const coinAdUsed = battle.coinAdUsed; + if (gold === this._peachUiGold && cost === this._peachUiCost && coinAdUsed === this._peachUiCoinAdUsed) return; this._peachUiGold = gold; this._peachUiCost = cost; - if (this.lb_money?.isValid) { - this.lb_money.string = `${gold}`; + this._peachUiCoinAdUsed = coinAdUsed; + if (this.lb_coin?.isValid) { + this.lb_coin.string = `${gold}`; } + this._syncCoinAdUi(battle); if (this.lb_RefreshNeed?.isValid) { this.lb_RefreshNeed.string = `${cost}`; } @@ -1000,6 +1019,35 @@ export class UIBattleGame extends Auto_BattleGame { this._syncRefreshBounce(enough); } + /** + * 同步 btnCoin 广告区:次数未满显示下一次 +数量与 used+1/max;用尽则隐藏。 + * @param battle 当前对局 + */ + private _syncCoinAdUi(battle: ProjectBattleHandle): void { + const canAd = battle.canUseCoinAd(); + const amount = battle.nextCoinAdAmount(); + const max = battle.coinAdRewards.length; + this._setNodeActive(this._coinAdVideoIcon, canAd); + this._setNodeActive(this.lb_coinAdLimit?.node ?? null, canAd); + this._setNodeActive(this.lb_coinAdNum?.node ?? null, canAd); + if (!canAd) return; + if (this.lb_coinAdNum?.isValid) { + this.lb_coinAdNum.string = `+${amount}`; + } + if (this.lb_coinAdLimit?.isValid) { + this.lb_coinAdLimit.string = `${battle.coinAdUsed + 1}/${max}`; + } + } + + /** + * 安全设置节点显隐。 + * @param node 目标节点 + * @param active 是否显示 + */ + private _setNodeActive(node: Node | null, active: boolean): void { + if (node?.isValid && node.active !== active) node.active = active; + } + /** btnRefresh/bg2:水平从右到左;fillRange = min(-0.1, -(1 - 桃子/消耗)),凑够为 0 */ private _setupRefreshFillSprite(): void { const sprite = this._refreshFill; @@ -1214,6 +1262,12 @@ export class UIBattleGame extends Auto_BattleGame { this._illustratedHintShownThisBattle = false; this._peachUiGold = -1; this._peachUiCost = -1; + this._peachUiCoinAdUsed = -1; + this._coinAdVideoIcon = null; + if (this._coinAdPending) { + this._coinAdPending = false; + BattleUiPauseGate.release(COIN_AD_PAUSE_TOKEN); + } this._waveUiIdx = -999; this._aiSkillUiFrame = 0; this._lbWaveTip = null; @@ -1247,8 +1301,45 @@ export class UIBattleGame extends Auto_BattleGame { } + /** 底部金币:看视频加币 */ + click_btnCoin(): void { + this._tryWatchCoinAd(); + } + + /** 旧入口:转调看视频加币 */ click_btnGetMoneyAd(): void { + this._tryWatchCoinAd(); + } + /** 观看激励视频,按 Const38 下一次数量加金币 */ + private _tryWatchCoinAd(): void { + const battle = this._battle; + if (!battle || this._coinAdPending) return; + if (!battle.canUseCoinAd()) return; + + this._coinAdPending = true; + BattleUiPauseGate.acquire(COIN_AD_PAUSE_TOKEN); + gg.sdk.showVideoAd((res) => { + if (!this._coinAdPending) return; + this._coinAdPending = false; + BattleUiPauseGate.release(COIN_AD_PAUSE_TOKEN); + if (game.isPaused()) game.resume(); + if (!res) { + gg.ui.showToast('观看视频失败'); + return; + } + const b = this._battle; + if (!b?.canUseCoinAd()) return; + b.IsWatchAd = true; + const amount = b.consumeCoinAd(); + if (!(amount > 0)) { + console.log('[UIBattleGame] 金币广告入账失败'); + return; + } + const curWaveNum = gg.game.CurentBattle.CurentWaveNum; + gg.sdk.reportDY('inLevel', `${gg.game.getReportDYBattleCountLabel(curWaveNum)}-AD-广告获得金币`); + this._refreshPeachUi(); + }); } click_btnIllustrated(): void { @@ -1291,7 +1382,7 @@ export class UIBattleGame extends Auto_BattleGame { if (result === 'no_slot') { gg.ui.showToast('暂无空格'); } else if (result === 'not_enough') { - gg.ui.showToast('桃子不足'); + gg.ui.showToast('金币不足'); } else { gg.ui.showToast('刷新失败'); console.log('[UIBattleGame] tryFillEmptyOpenSlots failed', result); diff --git a/assets/script/ui/BattleWeaponDesc/UIBattleWeaponDesc.ts b/assets/script/ui/BattleWeaponDesc/UIBattleWeaponDesc.ts index 8b4c94f..c760e09 100644 --- a/assets/script/ui/BattleWeaponDesc/UIBattleWeaponDesc.ts +++ b/assets/script/ui/BattleWeaponDesc/UIBattleWeaponDesc.ts @@ -316,8 +316,10 @@ export class UIBattleWeaponDesc extends Auto_BattleWeaponDesc { const bg2 = item.getChildByName('bg2'); if (!bg?.isValid || !bg2?.isValid) return; - bg.getOrAddComponent(SpriteLoad).setSprite(GPath.popRes('battleGameResult', `texture/q${entry.quality}`), GBundle.PopBattle); - bg2.getOrAddComponent(SpriteLoad).setSprite(GPath.popRes('battleGameResult', `texture/q${entry.quality}开`), GBundle.PopBattle); + // Skill 表无 quality(旧词条品级已删);遗留列表用默认框 + const q = 1; + bg.getOrAddComponent(SpriteLoad).setSprite(GPath.popRes('battleGameResult', `texture/q${q}`), GBundle.PopBattle); + bg2.getOrAddComponent(SpriteLoad).setSprite(GPath.popRes('battleGameResult', `texture/q${q}开`), GBundle.PopBattle); const name = gg.lang.get(entry.name ?? ''); const desc = gg.lang.get(entry.desc ?? ''); diff --git a/assets/script/ui/GetReward/RewardGrid.ts b/assets/script/ui/GetReward/RewardGrid.ts index a53ba53..ad019fe 100644 --- a/assets/script/ui/GetReward/RewardGrid.ts +++ b/assets/script/ui/GetReward/RewardGrid.ts @@ -68,9 +68,10 @@ export class RewardGrid extends Component { let isHaveWeapon = gg.data.project.isWeaponUnlocked(this.Data.id); if (isHaveWeapon) { - //有武器转为碎片数量 - this.suipianNode.active = true - this.num.string = 'x' + MTools.formatChineseUnit({ num: this.Data.num * itemData.transition }); + // 有武器转为碎片:按 Weapon.synthesisnumber(Item 无 transition) + this.suipianNode.active = true; + const scrapMul = Math.max(1, gg.data.project.getWeaponFlagNumByLevel(this.Data.id)); + this.num.string = 'x' + MTools.formatChineseUnit({ num: this.Data.num * scrapMul }); } else { //没有武器正常数量 this.suipianNode.active = false diff --git a/assets/script/ui/GetReward/UIGetReward.ts b/assets/script/ui/GetReward/UIGetReward.ts index 61fcd0f..fe5ba7b 100644 --- a/assets/script/ui/GetReward/UIGetReward.ts +++ b/assets/script/ui/GetReward/UIGetReward.ts @@ -168,13 +168,13 @@ export class UIGetReward extends Auto_GetReward { let isHaveWeapon = gg.data.project.isWeaponUnlocked(data.id); if (isHaveWeapon) { - //有武器转为碎片数量 - //武器属性 + // 有武器转为碎片:按 Weapon.synthesisnumber(Item 无 transition) let weaponData = gg.data.project.getWeaponData(data.id); const scrapId = gg.data.project.getWeaponScrapId(weaponData.id); let itemData = gg.data.table.getItemData(scrapId); if (!itemData) continue; - gg.data.addItemNum(scrapId, data.num * itemData.transition); + const scrapMul = Math.max(1, gg.data.project.getWeaponFlagNumByLevel(data.id)); + gg.data.addItemNum(scrapId, data.num * scrapMul); } else { //没有武器添加武器数据 gg.data.project.unlockWeapon(data.id); diff --git a/assets/script/ui/PopDailyShopLottery/UIPopDailyShopLottery.ts b/assets/script/ui/PopDailyShopLottery/UIPopDailyShopLottery.ts index 9def968..101a834 100644 --- a/assets/script/ui/PopDailyShopLottery/UIPopDailyShopLottery.ts +++ b/assets/script/ui/PopDailyShopLottery/UIPopDailyShopLottery.ts @@ -522,7 +522,7 @@ export class UIPopDailyShopLottery extends Auto_PopDailyShopLottery { if (!node?.isValid) { resolve(); return; } tween(node) .to(dur, { scale: v3(scale, scale, 1) }) - .call(resolve) + .call(() => { resolve(); }) .start(); }); } diff --git a/assets/script/ui/PopGM/UIPopGM.ts b/assets/script/ui/PopGM/UIPopGM.ts index 62ca68b..45aaeca 100644 --- a/assets/script/ui/PopGM/UIPopGM.ts +++ b/assets/script/ui/PopGM/UIPopGM.ts @@ -4,7 +4,7 @@ // time: Mon Apr 20 2026 // desc: //********************* -import { _decorator, Component, Node, find, Color, instantiate, Label, EditBox, RichText } from 'cc'; +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'; @@ -112,38 +112,9 @@ export class UIPopGM extends Auto_PopGM { n.on(Node.EventType.TOUCH_END, this.onClickWp.bind(this, n, w1), this); } - //已选武器 - let selectedList = allList.filter(item => this.curentwpArr.includes(Number(item.id))); - //所有技能(词条表 Skill,按 weapon 字段关联 Weapon1) - let allSkillList = gg.data.table.getTableList(TableNames.Skill); - //已选武器的所有技能 - let selectedSkillList = allSkillList.filter(item => - selectedList.some(w => Number(w.id) === Number(item.weapon)), - ); + // 旧词条 Skill.weapon / quality 已删:GM「已选武器技能」列表清空 this.ui_waSelectSkillList.children.map(x => x.active = false); - for (let i = 0; i < selectedSkillList.length; i++) { - const s2 = selectedSkillList[i]; - const w2 = gg.data.project.getWeaponData(s2.weapon); - let n: Node = null; - if (i < this.ui_waSelectSkillList.children.length) { - n = this.ui_waSelectSkillList.children[i]; - } - else { - n = instantiate(this.ui_waSelectSkillList.children[0]); - this.ui_waSelectSkillList.addChild(n); - } - n.active = true; - let bg = n.getChildByName('bg'); - let lbName = n.getChildByName('lbName'); - let lbDesc = n.getChildByName('lbDesc'); - let select = n.getChildByName('select'); - lbName.getComponent(Label).string = gg.lang.get(w2.name); - lbDesc.getComponent(RichText).string = gg.lang.get(s2.desc); - select.active = this.curentskillArr.includes(Number(s2.id)); - bg.color = this.colors[s2.quality - 1]; - n.targetOff(Node.EventType.TOUCH_END); - n.on(Node.EventType.TOUCH_END, this.onClickWpSelect.bind(this, n, s2), this); - } + this.curentskillArr.length = 0; } updateSetLevel() { diff --git a/settings/v2/packages/information.json b/settings/v2/packages/information.json index a231c25..7513fb4 100644 --- a/settings/v2/packages/information.json +++ b/settings/v2/packages/information.json @@ -7,7 +7,7 @@ "enable": true, "customSplash": { "complete": true, - "form": "https://creator-api.cocos.com/api/form/show?sid=ec6b43bddfc8957bdecb688b13a99021" + "form": "https://creator-api.cocos.com/api/form/show?sid=ee5002d3a748aae1e43db5c9cbeb0f5f" } }, "removeSplash": { @@ -16,7 +16,7 @@ "enable": true, "removeSplash": { "complete": true, - "form": "https://creator-api.cocos.com/api/form/show?sid=ec6b43bddfc8957bdecb688b13a99021" + "form": "https://creator-api.cocos.com/api/form/show?sid=ee5002d3a748aae1e43db5c9cbeb0f5f" } } } diff --git a/配置表/excelList/常量表.xlsx b/配置表/excelList/常量表.xlsx index ca757a3d715e41ca2f0abed77aa8c93f83c201f4..944dd7d4ac086fc72f39e0c27d097521ec6602a8 100644 GIT binary patch delta 4300 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 delta 4258 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