From d69c1a4f0d925b2f40733d34d19974da267772c3 Mon Sep 17 00:00:00 2001 From: humingxing <930621236@qq.com> Date: Sat, 3 Oct 2026 18:01:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=99=AE=E6=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battleGame/prefab/BattleGame.prefab | 1211 +++++++++-------- .../battleGame/prefab/格子锁.prefab | 13 +- .../battleHero/prefab/skill/剑阵.prefab | 6 +- .../battleHero/prefab/skill/水弹.prefab | 239 ++++ .../prefab/skill/水弹.prefab.meta | 13 + .../{玉帝飞剑.prefab => 飞剑.prefab} | 26 +- ...�飞剑.prefab.meta => 飞剑.prefab.meta} | 2 +- .../prefab/weapon/weaponType1.prefab | 16 +- .../prefab/weapon/weaponType2.prefab | 22 +- .../prefab/weapon/weaponType3.prefab | 14 +- .../prefab/weapon/weaponType4.prefab | 34 +- .../prefab/weapon/weaponType5.prefab | 354 +++++ .../prefab/weapon/weaponType5.prefab.meta | 13 + assets/bundles/first/config/Skill.json | 180 +-- .../merge/config/IComposeConfigProvider.ts | 8 +- assets/mx/module/merge/core/MergeSession.ts | 30 + .../script/battle/ai/bridge/AiBattleBridge.ts | 4 +- .../script/battle/ai/runtime/AiMapTextHost.ts | 10 + .../script/battle/ai/runtime/AiSkillHost.ts | 11 +- assets/script/battle/bag/BattleBagSession.ts | 15 + .../battle/bag/WeaponComposeConfigProvider.ts | 30 +- .../battle/combat/TowerLoadoutService.ts | 8 +- .../script/battle/combat/TowerStatResolver.ts | 18 +- .../script/battle/config/BattleHeroTable.ts | 19 + .../script/battle/config/LevelWaveParser.ts | 8 +- assets/script/battle/heros/HeroActor.ts | 6 +- .../script/battle/map/legacy/MapAreaUnlock.ts | 24 +- .../battle/presentation/SkillVisualChannel.ts | 258 +++- .../battle/res/BattleHeroResCollector.ts | 5 +- assets/script/battle/skill/SkillController.ts | 16 +- assets/script/battle/view/HeroWeaponMount.ts | 129 +- .../script/battle/view/MapDragGuideHelper.ts | 5 +- assets/script/battle/view/TextGrid.ts | 60 + assets/script/game/ResPkgBuilder.ts | 3 - assets/script/ui/BattleGame/UIBattleGame.ts | 39 +- docs/方案-出怪逻辑实现.md | 2 +- 配置表/excelList/技能表.xlsx | Bin 20690 -> 21437 bytes 37 files changed, 2015 insertions(+), 836 deletions(-) create mode 100644 assets/bundles/battleHero/prefab/skill/水弹.prefab create mode 100644 assets/bundles/battleHero/prefab/skill/水弹.prefab.meta rename assets/bundles/battleHero/prefab/skill/{玉帝飞剑.prefab => 飞剑.prefab} (91%) rename assets/bundles/battleHero/prefab/skill/{玉帝飞剑.prefab.meta => 飞剑.prefab.meta} (84%) create mode 100644 assets/bundles/battleHero/prefab/weapon/weaponType5.prefab create mode 100644 assets/bundles/battleHero/prefab/weapon/weaponType5.prefab.meta diff --git a/assets/bundles/battleGame/prefab/BattleGame.prefab b/assets/bundles/battleGame/prefab/BattleGame.prefab index 5bbe23d..78d3661 100644 --- a/assets/bundles/battleGame/prefab/BattleGame.prefab +++ b/assets/bundles/battleGame/prefab/BattleGame.prefab @@ -34,53 +34,53 @@ "__id__": 171 }, { - "__id__": 670 + "__id__": 679 }, { - "__id__": 746 + "__id__": 755 }, { - "__id__": 752 + "__id__": 761 }, { - "__id__": 756 + "__id__": 765 }, { - "__id__": 770 + "__id__": 779 }, { - "__id__": 798 + "__id__": 807 }, { - "__id__": 826 + "__id__": 835 }, { - "__id__": 854 + "__id__": 863 } ], "_active": true, "_components": [ { - "__id__": 886 + "__id__": 895 }, { - "__id__": 888 + "__id__": 897 }, { - "__id__": 890 + "__id__": 899 }, { - "__id__": 892 + "__id__": 901 }, { - "__id__": 894 + "__id__": 903 }, { - "__id__": 896 + "__id__": 905 } ], "_prefab": { - "__id__": 898 + "__id__": 907 }, "_lpos": { "__type__": "cc.Vec3", @@ -3559,14 +3559,14 @@ "_active": true, "_components": [ { - "__id__": 665 + "__id__": 674 }, { - "__id__": 667 + "__id__": 676 } ], "_prefab": { - "__id__": 669 + "__id__": 678 }, "_lpos": { "__type__": "cc.Vec3", @@ -3631,29 +3631,29 @@ "__id__": 499 }, { - "__id__": 529 + "__id__": 538 }, { - "__id__": 575 + "__id__": 584 }, { - "__id__": 595 + "__id__": 604 }, { - "__id__": 614 + "__id__": 623 }, { - "__id__": 620 + "__id__": 629 } ], "_active": true, "_components": [ { - "__id__": 662 + "__id__": 671 } ], "_prefab": { - "__id__": 664 + "__id__": 673 }, "_lpos": { "__type__": "cc.Vec3", @@ -9668,22 +9668,22 @@ "__id__": 500 }, { - "__id__": 518 + "__id__": 527 } ], "_active": true, "_components": [ { - "__id__": 526 + "__id__": 535 } ], "_prefab": { - "__id__": 528 + "__id__": 537 }, "_lpos": { "__type__": "cc.Vec3", "x": 0, - "y": 231.475, + "y": 326.155, "z": 0 }, "_lrot": { @@ -9732,8 +9732,7 @@ "fileId": "1aMAzMzc5NTribLGuHEoWV", "instance": { "__id__": 502 - }, - "targetOverrides": null + } }, { "__type__": "cc.PrefabInstance", @@ -9751,34 +9750,34 @@ "__id__": 505 }, { - "__id__": 506 + "__id__": 507 }, { - "__id__": 507 + "__id__": 509 }, { - "__id__": 508 + "__id__": 511 }, { - "__id__": 510 + "__id__": 513 }, { - "__id__": 512 + "__id__": 515 }, { - "__id__": 513 + "__id__": 517 }, { - "__id__": 514 + "__id__": 519 }, { - "__id__": 515 + "__id__": 521 }, { - "__id__": 516 + "__id__": 523 }, { - "__id__": 517 + "__id__": 525 } ], "removedComponents": [] @@ -9802,22 +9801,28 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 504 + "__id__": 506 }, "propertyPath": [ "_lpos" ], "value": { "__type__": "cc.Vec3", - "x": -250, + "x": -68.401, "y": 0, "z": 0 } }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "1aMAzMzc5NTribLGuHEoWV" + ] + }, { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 504 + "__id__": 508 }, "propertyPath": [ "_lrot" @@ -9830,10 +9835,16 @@ "w": 1 } }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "1aMAzMzc5NTribLGuHEoWV" + ] + }, { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 504 + "__id__": 510 }, "propertyPath": [ "_euler" @@ -9845,10 +9856,16 @@ "z": 0 } }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "1aMAzMzc5NTribLGuHEoWV" + ] + }, { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 509 + "__id__": 512 }, "propertyPath": [ "_active" @@ -9864,7 +9881,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 511 + "__id__": 514 }, "propertyPath": [ "_fillStart" @@ -9880,17 +9897,23 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 511 + "__id__": 516 }, "propertyPath": [ "_fillRange" ], "value": 1 }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "0biHPUDyNCvq5xhE97po1Q" + ] + }, { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 509 + "__id__": 518 }, "propertyPath": [ "_lrot" @@ -9903,10 +9926,16 @@ "w": 1 } }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "83dRLp6vJPr5YW/AdrqClc" + ] + }, { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 509 + "__id__": 520 }, "propertyPath": [ "_euler" @@ -9918,10 +9947,16 @@ "z": 0 } }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "83dRLp6vJPr5YW/AdrqClc" + ] + }, { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 509 + "__id__": 522 }, "propertyPath": [ "_lscale" @@ -9933,10 +9968,16 @@ "z": 1 } }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "83dRLp6vJPr5YW/AdrqClc" + ] + }, { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 511 + "__id__": 524 }, "propertyPath": [ "_fillCenter" @@ -9947,16 +9988,28 @@ "y": 0.5 } }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "0biHPUDyNCvq5xhE97po1Q" + ] + }, { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 511 + "__id__": 526 }, "propertyPath": [ "_fillType" ], "value": 2 }, + { + "__type__": "cc.TargetInfo", + "localID": [ + "0biHPUDyNCvq5xhE97po1Q" + ] + }, { "__type__": "cc.Node", "_objFlags": 0, @@ -9964,14 +10017,14 @@ "__id__": 499 }, "_prefab": { - "__id__": 519 + "__id__": 528 }, "__editorExtras__": {} }, { "__type__": "cc.PrefabInfo", "root": { - "__id__": 518 + "__id__": 527 }, "asset": { "__uuid__": "af9aa6b3-9c54-4fa4-b599-0c91f7442ed2", @@ -9979,7 +10032,7 @@ }, "fileId": "1aMAzMzc5NTribLGuHEoWV", "instance": { - "__id__": 520 + "__id__": 529 }, "targetOverrides": null }, @@ -9993,16 +10046,16 @@ "mountedComponents": [], "propertyOverrides": [ { - "__id__": 521 + "__id__": 530 }, { - "__id__": 523 + "__id__": 532 }, { - "__id__": 524 + "__id__": 533 }, { - "__id__": 525 + "__id__": 534 } ], "removedComponents": [] @@ -10010,7 +10063,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 522 + "__id__": 531 }, "propertyPath": [ "_name" @@ -10026,14 +10079,14 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 522 + "__id__": 531 }, "propertyPath": [ "_lpos" ], "value": { "__type__": "cc.Vec3", - "x": 250, + "x": 51.327, "y": 0, "z": 0 } @@ -10041,7 +10094,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 522 + "__id__": 531 }, "propertyPath": [ "_lrot" @@ -10057,7 +10110,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 522 + "__id__": 531 }, "propertyPath": [ "_euler" @@ -10079,7 +10132,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 527 + "__id__": 536 }, "_contentSize": { "__type__": "cc.Size", @@ -10120,29 +10173,29 @@ }, "_children": [ { - "__id__": 530 + "__id__": 539 }, { - "__id__": 536 + "__id__": 545 }, { - "__id__": 548 + "__id__": 557 } ], "_active": false, "_components": [ { - "__id__": 568 + "__id__": 577 }, { - "__id__": 570 + "__id__": 579 }, { - "__id__": 572 + "__id__": 581 } ], "_prefab": { - "__id__": 574 + "__id__": 583 }, "_lpos": { "__type__": "cc.Vec3", @@ -10179,20 +10232,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 529 + "__id__": 538 }, "_children": [], "_active": true, "_components": [ { - "__id__": 531 + "__id__": 540 }, { - "__id__": 533 + "__id__": 542 } ], "_prefab": { - "__id__": 535 + "__id__": 544 }, "_lpos": { "__type__": "cc.Vec3", @@ -10229,11 +10282,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 530 + "__id__": 539 }, "_enabled": true, "__prefab": { - "__id__": 532 + "__id__": 541 }, "_contentSize": { "__type__": "cc.Size", @@ -10257,11 +10310,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 530 + "__id__": 539 }, "_enabled": true, "__prefab": { - "__id__": 534 + "__id__": 543 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -10315,24 +10368,24 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 529 + "__id__": 538 }, "_children": [ { - "__id__": 537 + "__id__": 546 } ], "_active": true, "_components": [ { - "__id__": 543 + "__id__": 552 }, { - "__id__": 545 + "__id__": 554 } ], "_prefab": { - "__id__": 547 + "__id__": 556 }, "_lpos": { "__type__": "cc.Vec3", @@ -10369,20 +10422,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 536 + "__id__": 545 }, "_children": [], "_active": true, "_components": [ { - "__id__": 538 + "__id__": 547 }, { - "__id__": 540 + "__id__": 549 } ], "_prefab": { - "__id__": 542 + "__id__": 551 }, "_lpos": { "__type__": "cc.Vec3", @@ -10419,11 +10472,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 537 + "__id__": 546 }, "_enabled": true, "__prefab": { - "__id__": 539 + "__id__": 548 }, "_contentSize": { "__type__": "cc.Size", @@ -10447,11 +10500,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 537 + "__id__": 546 }, "_enabled": true, "__prefab": { - "__id__": 541 + "__id__": 550 }, "_lineHeight": 40, "_string": "", @@ -10498,11 +10551,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 536 + "__id__": 545 }, "_enabled": true, "__prefab": { - "__id__": 544 + "__id__": 553 }, "_contentSize": { "__type__": "cc.Size", @@ -10526,11 +10579,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 536 + "__id__": 545 }, "_enabled": true, "__prefab": { - "__id__": 546 + "__id__": 555 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -10582,17 +10635,17 @@ "__type__": "cc.Node", "_objFlags": 0, "_parent": { - "__id__": 529 + "__id__": 538 }, "_prefab": { - "__id__": 549 + "__id__": 558 }, "__editorExtras__": {} }, { "__type__": "cc.PrefabInfo", "root": { - "__id__": 548 + "__id__": 557 }, "asset": { "__uuid__": "834225e5-0107-4dc8-98b5-e203873774ae", @@ -10600,7 +10653,7 @@ }, "fileId": "50SV7PXetCj5ArE9+5F3+9", "instance": { - "__id__": 550 + "__id__": 559 }, "targetOverrides": null }, @@ -10614,43 +10667,43 @@ "mountedComponents": [], "propertyOverrides": [ { - "__id__": 551 + "__id__": 560 }, { - "__id__": 553 + "__id__": 562 }, { - "__id__": 554 + "__id__": 563 }, { - "__id__": 555 + "__id__": 564 }, { - "__id__": 556 + "__id__": 565 }, { - "__id__": 558 + "__id__": 567 }, { - "__id__": 560 + "__id__": 569 }, { - "__id__": 561 + "__id__": 570 }, { - "__id__": 562 + "__id__": 571 }, { - "__id__": 563 + "__id__": 572 }, { - "__id__": 564 + "__id__": 573 }, { - "__id__": 566 + "__id__": 575 }, { - "__id__": 567 + "__id__": 576 } ], "removedComponents": [] @@ -10658,7 +10711,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 552 + "__id__": 561 }, "propertyPath": [ "_name" @@ -10674,7 +10727,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 552 + "__id__": 561 }, "propertyPath": [ "_lpos" @@ -10689,7 +10742,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 552 + "__id__": 561 }, "propertyPath": [ "_lrot" @@ -10705,7 +10758,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 552 + "__id__": 561 }, "propertyPath": [ "_euler" @@ -10720,7 +10773,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 557 + "__id__": 566 }, "propertyPath": [ "_string" @@ -10736,7 +10789,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 559 + "__id__": 568 }, "propertyPath": [ "_contentSize" @@ -10756,7 +10809,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 557 + "__id__": 566 }, "propertyPath": [ "_color" @@ -10772,7 +10825,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 557 + "__id__": 566 }, "propertyPath": [ "_outlineColor" @@ -10788,7 +10841,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 557 + "__id__": 566 }, "propertyPath": [ "_fontSize" @@ -10798,7 +10851,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 557 + "__id__": 566 }, "propertyPath": [ "_actualFontSize" @@ -10808,7 +10861,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 565 + "__id__": 574 }, "propertyPath": [ "key" @@ -10824,7 +10877,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 557 + "__id__": 566 }, "propertyPath": [ "_outlineWidth" @@ -10834,7 +10887,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 557 + "__id__": 566 }, "propertyPath": [ "_isItalic" @@ -10847,11 +10900,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 529 + "__id__": 538 }, "_enabled": true, "__prefab": { - "__id__": 569 + "__id__": 578 }, "_contentSize": { "__type__": "cc.Size", @@ -10875,11 +10928,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 529 + "__id__": 538 }, "_enabled": true, "__prefab": { - "__id__": 571 + "__id__": 580 }, "clickEvents": [], "_interactable": true, @@ -10931,11 +10984,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 529 + "__id__": 538 }, "_enabled": true, "__prefab": { - "__id__": 573 + "__id__": 582 }, "_id": "" }, @@ -10966,26 +11019,26 @@ }, "_children": [ { - "__id__": 576 + "__id__": 585 }, { - "__id__": 582 + "__id__": 591 } ], "_active": false, "_components": [ { - "__id__": 588 + "__id__": 597 }, { - "__id__": 590 + "__id__": 599 }, { - "__id__": 592 + "__id__": 601 } ], "_prefab": { - "__id__": 594 + "__id__": 603 }, "_lpos": { "__type__": "cc.Vec3", @@ -11022,20 +11075,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 575 + "__id__": 584 }, "_children": [], "_active": true, "_components": [ { - "__id__": 577 + "__id__": 586 }, { - "__id__": 579 + "__id__": 588 } ], "_prefab": { - "__id__": 581 + "__id__": 590 }, "_lpos": { "__type__": "cc.Vec3", @@ -11072,11 +11125,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 576 + "__id__": 585 }, "_enabled": true, "__prefab": { - "__id__": 578 + "__id__": 587 }, "_contentSize": { "__type__": "cc.Size", @@ -11100,11 +11153,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 576 + "__id__": 585 }, "_enabled": true, "__prefab": { - "__id__": 580 + "__id__": 589 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -11158,20 +11211,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 575 + "__id__": 584 }, "_children": [], "_active": false, "_components": [ { - "__id__": 583 + "__id__": 592 }, { - "__id__": 585 + "__id__": 594 } ], "_prefab": { - "__id__": 587 + "__id__": 596 }, "_lpos": { "__type__": "cc.Vec3", @@ -11208,11 +11261,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 582 + "__id__": 591 }, "_enabled": true, "__prefab": { - "__id__": 584 + "__id__": 593 }, "_contentSize": { "__type__": "cc.Size", @@ -11236,11 +11289,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 582 + "__id__": 591 }, "_enabled": true, "__prefab": { - "__id__": 586 + "__id__": 595 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -11294,11 +11347,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 575 + "__id__": 584 }, "_enabled": true, "__prefab": { - "__id__": 589 + "__id__": 598 }, "_contentSize": { "__type__": "cc.Size", @@ -11322,11 +11375,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 575 + "__id__": 584 }, "_enabled": true, "__prefab": { - "__id__": 591 + "__id__": 600 }, "clickEvents": [], "_interactable": true, @@ -11366,7 +11419,7 @@ "_duration": 0.1, "_zoomScale": 1.2, "_target": { - "__id__": 575 + "__id__": 584 }, "_id": "" }, @@ -11380,11 +11433,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 575 + "__id__": 584 }, "_enabled": true, "__prefab": { - "__id__": 593 + "__id__": 602 }, "_id": "" }, @@ -11415,25 +11468,25 @@ }, "_children": [ { - "__id__": 596 + "__id__": 605 } ], "_active": true, "_components": [ { - "__id__": 609 + "__id__": 618 }, { - "__id__": 611 + "__id__": 620 } ], "_prefab": { - "__id__": 613 + "__id__": 622 }, "_lpos": { "__type__": "cc.Vec3", - "x": -320.136, - "y": 81.673, + "x": 150.159, + "y": 312.94, "z": 0 }, "_lrot": { @@ -11463,17 +11516,17 @@ "__type__": "cc.Node", "_objFlags": 0, "_parent": { - "__id__": 595 + "__id__": 604 }, "_prefab": { - "__id__": 597 + "__id__": 606 }, "__editorExtras__": {} }, { "__type__": "cc.PrefabInfo", "root": { - "__id__": 596 + "__id__": 605 }, "asset": { "__uuid__": "8c3b6798-7d6f-413a-8294-42d192319365", @@ -11481,7 +11534,7 @@ }, "fileId": "72a/87Jc9HLoBBUpzMZMyg", "instance": { - "__id__": 598 + "__id__": 607 }, "targetOverrides": null }, @@ -11495,25 +11548,25 @@ "mountedComponents": [], "propertyOverrides": [ { - "__id__": 599 + "__id__": 608 }, { - "__id__": 601 + "__id__": 610 }, { - "__id__": 602 + "__id__": 611 }, { - "__id__": 603 + "__id__": 612 }, { - "__id__": 604 + "__id__": 613 }, { - "__id__": 605 + "__id__": 614 }, { - "__id__": 607 + "__id__": 616 } ], "removedComponents": [] @@ -11521,7 +11574,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 600 + "__id__": 609 }, "propertyPath": [ "_name" @@ -11537,7 +11590,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 600 + "__id__": 609 }, "propertyPath": [ "_lpos" @@ -11552,7 +11605,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 600 + "__id__": 609 }, "propertyPath": [ "_lrot" @@ -11568,7 +11621,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 600 + "__id__": 609 }, "propertyPath": [ "_euler" @@ -11583,7 +11636,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 600 + "__id__": 609 }, "propertyPath": [ "_active" @@ -11593,7 +11646,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 606 + "__id__": 615 }, "propertyPath": [ "_active" @@ -11609,7 +11662,7 @@ { "__type__": "CCPropertyOverrideInfo", "targetInfo": { - "__id__": 608 + "__id__": 617 }, "propertyPath": [ "_lscale" @@ -11633,11 +11686,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 595 + "__id__": 604 }, "_enabled": true, "__prefab": { - "__id__": 610 + "__id__": 619 }, "_contentSize": { "__type__": "cc.Size", @@ -11661,11 +11714,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 595 + "__id__": 604 }, "_enabled": true, "__prefab": { - "__id__": 612 + "__id__": 621 }, "_resizeMode": 1, "_layoutType": 1, @@ -11718,14 +11771,14 @@ "_active": false, "_components": [ { - "__id__": 615 + "__id__": 624 }, { - "__id__": 617 + "__id__": 626 } ], "_prefab": { - "__id__": 619 + "__id__": 628 }, "_lpos": { "__type__": "cc.Vec3", @@ -11762,11 +11815,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 614 + "__id__": 623 }, "_enabled": true, "__prefab": { - "__id__": 616 + "__id__": 625 }, "_contentSize": { "__type__": "cc.Size", @@ -11790,11 +11843,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 614 + "__id__": 623 }, "_enabled": true, "__prefab": { - "__id__": 618 + "__id__": 627 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -11852,35 +11905,35 @@ }, "_children": [ { - "__id__": 621 + "__id__": 630 }, { - "__id__": 627 + "__id__": 636 }, { - "__id__": 633 + "__id__": 642 }, { - "__id__": 639 + "__id__": 648 }, { - "__id__": 645 + "__id__": 654 }, { - "__id__": 651 + "__id__": 660 } ], "_active": false, "_components": [ { - "__id__": 657 + "__id__": 666 }, { - "__id__": 659 + "__id__": 668 } ], "_prefab": { - "__id__": 661 + "__id__": 670 }, "_lpos": { "__type__": "cc.Vec3", @@ -11917,20 +11970,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 620 + "__id__": 629 }, "_children": [], "_active": true, "_components": [ { - "__id__": 622 + "__id__": 631 }, { - "__id__": 624 + "__id__": 633 } ], "_prefab": { - "__id__": 626 + "__id__": 635 }, "_lpos": { "__type__": "cc.Vec3", @@ -11967,11 +12020,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 621 + "__id__": 630 }, "_enabled": true, "__prefab": { - "__id__": 623 + "__id__": 632 }, "_contentSize": { "__type__": "cc.Size", @@ -11995,11 +12048,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 621 + "__id__": 630 }, "_enabled": true, "__prefab": { - "__id__": 625 + "__id__": 634 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -12053,20 +12106,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 620 + "__id__": 629 }, "_children": [], "_active": false, "_components": [ { - "__id__": 628 + "__id__": 637 }, { - "__id__": 630 + "__id__": 639 } ], "_prefab": { - "__id__": 632 + "__id__": 641 }, "_lpos": { "__type__": "cc.Vec3", @@ -12103,11 +12156,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 627 + "__id__": 636 }, "_enabled": true, "__prefab": { - "__id__": 629 + "__id__": 638 }, "_contentSize": { "__type__": "cc.Size", @@ -12131,11 +12184,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 627 + "__id__": 636 }, "_enabled": true, "__prefab": { - "__id__": 631 + "__id__": 640 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -12189,20 +12242,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 620 + "__id__": 629 }, "_children": [], "_active": true, "_components": [ { - "__id__": 634 + "__id__": 643 }, { - "__id__": 636 + "__id__": 645 } ], "_prefab": { - "__id__": 638 + "__id__": 647 }, "_lpos": { "__type__": "cc.Vec3", @@ -12239,11 +12292,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 633 + "__id__": 642 }, "_enabled": true, "__prefab": { - "__id__": 635 + "__id__": 644 }, "_contentSize": { "__type__": "cc.Size", @@ -12267,11 +12320,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 633 + "__id__": 642 }, "_enabled": true, "__prefab": { - "__id__": 637 + "__id__": 646 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -12325,20 +12378,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 620 + "__id__": 629 }, "_children": [], "_active": true, "_components": [ { - "__id__": 640 + "__id__": 649 }, { - "__id__": 642 + "__id__": 651 } ], "_prefab": { - "__id__": 644 + "__id__": 653 }, "_lpos": { "__type__": "cc.Vec3", @@ -12375,11 +12428,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 639 + "__id__": 648 }, "_enabled": true, "__prefab": { - "__id__": 641 + "__id__": 650 }, "_contentSize": { "__type__": "cc.Size", @@ -12403,11 +12456,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 639 + "__id__": 648 }, "_enabled": true, "__prefab": { - "__id__": 643 + "__id__": 652 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -12461,20 +12514,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 620 + "__id__": 629 }, "_children": [], "_active": true, "_components": [ { - "__id__": 646 + "__id__": 655 }, { - "__id__": 648 + "__id__": 657 } ], "_prefab": { - "__id__": 650 + "__id__": 659 }, "_lpos": { "__type__": "cc.Vec3", @@ -12511,11 +12564,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 645 + "__id__": 654 }, "_enabled": true, "__prefab": { - "__id__": 647 + "__id__": 656 }, "_contentSize": { "__type__": "cc.Size", @@ -12539,11 +12592,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 645 + "__id__": 654 }, "_enabled": true, "__prefab": { - "__id__": 649 + "__id__": 658 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -12597,20 +12650,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 620 + "__id__": 629 }, "_children": [], "_active": true, "_components": [ { - "__id__": 652 + "__id__": 661 }, { - "__id__": 654 + "__id__": 663 } ], "_prefab": { - "__id__": 656 + "__id__": 665 }, "_lpos": { "__type__": "cc.Vec3", @@ -12647,11 +12700,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 651 + "__id__": 660 }, "_enabled": true, "__prefab": { - "__id__": 653 + "__id__": 662 }, "_contentSize": { "__type__": "cc.Size", @@ -12675,11 +12728,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 651 + "__id__": 660 }, "_enabled": true, "__prefab": { - "__id__": 655 + "__id__": 664 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -12756,11 +12809,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 620 + "__id__": 629 }, "_enabled": true, "__prefab": { - "__id__": 658 + "__id__": 667 }, "_contentSize": { "__type__": "cc.Size", @@ -12784,11 +12837,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 620 + "__id__": 629 }, "_enabled": true, "__prefab": { - "__id__": 660 + "__id__": 669 }, "clickEvents": [], "_interactable": true, @@ -12857,7 +12910,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 663 + "__id__": 672 }, "_contentSize": { "__type__": "cc.Size", @@ -12898,7 +12951,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 666 + "__id__": 675 }, "_contentSize": { "__type__": "cc.Size", @@ -12926,7 +12979,7 @@ }, "_enabled": false, "__prefab": { - "__id__": 668 + "__id__": 677 }, "_alignFlags": 4, "_target": null, @@ -12975,56 +13028,56 @@ }, "_children": [ { - "__id__": 671 + "__id__": 680 }, { - "__id__": 677 + "__id__": 686 }, { - "__id__": 683 + "__id__": 692 }, { - "__id__": 689 + "__id__": 698 }, { - "__id__": 695 + "__id__": 704 }, { - "__id__": 701 + "__id__": 710 }, { - "__id__": 707 + "__id__": 716 }, { - "__id__": 713 + "__id__": 722 }, { - "__id__": 719 + "__id__": 728 }, { - "__id__": 725 + "__id__": 734 }, { - "__id__": 731 + "__id__": 740 } ], "_active": false, "_components": [ { - "__id__": 737 + "__id__": 746 }, { - "__id__": 739 + "__id__": 748 }, { - "__id__": 741 + "__id__": 750 }, { - "__id__": 743 + "__id__": 752 } ], "_prefab": { - "__id__": 745 + "__id__": 754 }, "_lpos": { "__type__": "cc.Vec3", @@ -13061,20 +13114,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 672 + "__id__": 681 }, { - "__id__": 674 + "__id__": 683 } ], "_prefab": { - "__id__": 676 + "__id__": 685 }, "_lpos": { "__type__": "cc.Vec3", @@ -13111,11 +13164,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 671 + "__id__": 680 }, "_enabled": true, "__prefab": { - "__id__": 673 + "__id__": 682 }, "_contentSize": { "__type__": "cc.Size", @@ -13139,11 +13192,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 671 + "__id__": 680 }, "_enabled": true, "__prefab": { - "__id__": 675 + "__id__": 684 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -13197,20 +13250,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 678 + "__id__": 687 }, { - "__id__": 680 + "__id__": 689 } ], "_prefab": { - "__id__": 682 + "__id__": 691 }, "_lpos": { "__type__": "cc.Vec3", @@ -13247,11 +13300,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 677 + "__id__": 686 }, "_enabled": true, "__prefab": { - "__id__": 679 + "__id__": 688 }, "_contentSize": { "__type__": "cc.Size", @@ -13275,11 +13328,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 677 + "__id__": 686 }, "_enabled": true, "__prefab": { - "__id__": 681 + "__id__": 690 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -13333,20 +13386,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 684 + "__id__": 693 }, { - "__id__": 686 + "__id__": 695 } ], "_prefab": { - "__id__": 688 + "__id__": 697 }, "_lpos": { "__type__": "cc.Vec3", @@ -13383,11 +13436,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 683 + "__id__": 692 }, "_enabled": true, "__prefab": { - "__id__": 685 + "__id__": 694 }, "_contentSize": { "__type__": "cc.Size", @@ -13411,11 +13464,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 683 + "__id__": 692 }, "_enabled": true, "__prefab": { - "__id__": 687 + "__id__": 696 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -13469,20 +13522,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 690 + "__id__": 699 }, { - "__id__": 692 + "__id__": 701 } ], "_prefab": { - "__id__": 694 + "__id__": 703 }, "_lpos": { "__type__": "cc.Vec3", @@ -13519,11 +13572,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 689 + "__id__": 698 }, "_enabled": true, "__prefab": { - "__id__": 691 + "__id__": 700 }, "_contentSize": { "__type__": "cc.Size", @@ -13547,11 +13600,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 689 + "__id__": 698 }, "_enabled": true, "__prefab": { - "__id__": 693 + "__id__": 702 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -13605,20 +13658,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 696 + "__id__": 705 }, { - "__id__": 698 + "__id__": 707 } ], "_prefab": { - "__id__": 700 + "__id__": 709 }, "_lpos": { "__type__": "cc.Vec3", @@ -13655,11 +13708,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 695 + "__id__": 704 }, "_enabled": true, "__prefab": { - "__id__": 697 + "__id__": 706 }, "_contentSize": { "__type__": "cc.Size", @@ -13683,11 +13736,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 695 + "__id__": 704 }, "_enabled": true, "__prefab": { - "__id__": 699 + "__id__": 708 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -13741,20 +13794,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 702 + "__id__": 711 }, { - "__id__": 704 + "__id__": 713 } ], "_prefab": { - "__id__": 706 + "__id__": 715 }, "_lpos": { "__type__": "cc.Vec3", @@ -13791,11 +13844,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 701 + "__id__": 710 }, "_enabled": true, "__prefab": { - "__id__": 703 + "__id__": 712 }, "_contentSize": { "__type__": "cc.Size", @@ -13819,11 +13872,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 701 + "__id__": 710 }, "_enabled": true, "__prefab": { - "__id__": 705 + "__id__": 714 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -13877,20 +13930,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 708 + "__id__": 717 }, { - "__id__": 710 + "__id__": 719 } ], "_prefab": { - "__id__": 712 + "__id__": 721 }, "_lpos": { "__type__": "cc.Vec3", @@ -13927,11 +13980,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 707 + "__id__": 716 }, "_enabled": true, "__prefab": { - "__id__": 709 + "__id__": 718 }, "_contentSize": { "__type__": "cc.Size", @@ -13955,11 +14008,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 707 + "__id__": 716 }, "_enabled": true, "__prefab": { - "__id__": 711 + "__id__": 720 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -14013,20 +14066,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 714 + "__id__": 723 }, { - "__id__": 716 + "__id__": 725 } ], "_prefab": { - "__id__": 718 + "__id__": 727 }, "_lpos": { "__type__": "cc.Vec3", @@ -14063,11 +14116,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 713 + "__id__": 722 }, "_enabled": true, "__prefab": { - "__id__": 715 + "__id__": 724 }, "_contentSize": { "__type__": "cc.Size", @@ -14091,11 +14144,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 713 + "__id__": 722 }, "_enabled": true, "__prefab": { - "__id__": 717 + "__id__": 726 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -14149,20 +14202,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 720 + "__id__": 729 }, { - "__id__": 722 + "__id__": 731 } ], "_prefab": { - "__id__": 724 + "__id__": 733 }, "_lpos": { "__type__": "cc.Vec3", @@ -14199,11 +14252,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 719 + "__id__": 728 }, "_enabled": true, "__prefab": { - "__id__": 721 + "__id__": 730 }, "_contentSize": { "__type__": "cc.Size", @@ -14227,11 +14280,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 719 + "__id__": 728 }, "_enabled": true, "__prefab": { - "__id__": 723 + "__id__": 732 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -14285,20 +14338,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 726 + "__id__": 735 }, { - "__id__": 728 + "__id__": 737 } ], "_prefab": { - "__id__": 730 + "__id__": 739 }, "_lpos": { "__type__": "cc.Vec3", @@ -14335,11 +14388,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 725 + "__id__": 734 }, "_enabled": true, "__prefab": { - "__id__": 727 + "__id__": 736 }, "_contentSize": { "__type__": "cc.Size", @@ -14363,11 +14416,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 725 + "__id__": 734 }, "_enabled": true, "__prefab": { - "__id__": 729 + "__id__": 738 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -14421,20 +14474,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 670 + "__id__": 679 }, "_children": [], "_active": true, "_components": [ { - "__id__": 732 + "__id__": 741 }, { - "__id__": 734 + "__id__": 743 } ], "_prefab": { - "__id__": 736 + "__id__": 745 }, "_lpos": { "__type__": "cc.Vec3", @@ -14471,11 +14524,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 731 + "__id__": 740 }, "_enabled": true, "__prefab": { - "__id__": 733 + "__id__": 742 }, "_contentSize": { "__type__": "cc.Size", @@ -14499,11 +14552,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 731 + "__id__": 740 }, "_enabled": true, "__prefab": { - "__id__": 735 + "__id__": 744 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -14557,11 +14610,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 670 + "__id__": 679 }, "_enabled": true, "__prefab": { - "__id__": 738 + "__id__": 747 }, "_contentSize": { "__type__": "cc.Size", @@ -14585,11 +14638,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 670 + "__id__": 679 }, "_enabled": true, "__prefab": { - "__id__": 740 + "__id__": 749 }, "_type": 0, "_inverted": false, @@ -14607,11 +14660,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 670 + "__id__": 679 }, "_enabled": true, "__prefab": { - "__id__": 742 + "__id__": 751 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -14653,11 +14706,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 670 + "__id__": 679 }, "_enabled": false, "__prefab": { - "__id__": 744 + "__id__": 753 }, "_resizeMode": 0, "_layoutType": 1, @@ -14710,14 +14763,14 @@ "_active": false, "_components": [ { - "__id__": 747 + "__id__": 756 }, { - "__id__": 749 + "__id__": 758 } ], "_prefab": { - "__id__": 751 + "__id__": 760 }, "_lpos": { "__type__": "cc.Vec3", @@ -14754,11 +14807,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 746 + "__id__": 755 }, "_enabled": true, "__prefab": { - "__id__": 748 + "__id__": 757 }, "_contentSize": { "__type__": "cc.Size", @@ -14782,11 +14835,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 746 + "__id__": 755 }, "_enabled": true, "__prefab": { - "__id__": 750 + "__id__": 759 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -14846,11 +14899,11 @@ "_active": false, "_components": [ { - "__id__": 753 + "__id__": 762 } ], "_prefab": { - "__id__": 755 + "__id__": 764 }, "_lpos": { "__type__": "cc.Vec3", @@ -14887,11 +14940,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 752 + "__id__": 761 }, "_enabled": true, "__prefab": { - "__id__": 754 + "__id__": 763 }, "_contentSize": { "__type__": "cc.Size", @@ -14932,23 +14985,23 @@ }, "_children": [ { - "__id__": 757 + "__id__": 766 } ], "_active": false, "_components": [ { - "__id__": 763 + "__id__": 772 }, { - "__id__": 765 + "__id__": 774 }, { - "__id__": 767 + "__id__": 776 } ], "_prefab": { - "__id__": 769 + "__id__": 778 }, "_lpos": { "__type__": "cc.Vec3", @@ -14985,20 +15038,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 756 + "__id__": 765 }, "_children": [], "_active": true, "_components": [ { - "__id__": 758 + "__id__": 767 }, { - "__id__": 760 + "__id__": 769 } ], "_prefab": { - "__id__": 762 + "__id__": 771 }, "_lpos": { "__type__": "cc.Vec3", @@ -15035,11 +15088,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 757 + "__id__": 766 }, "_enabled": true, "__prefab": { - "__id__": 759 + "__id__": 768 }, "_contentSize": { "__type__": "cc.Size", @@ -15063,11 +15116,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 757 + "__id__": 766 }, "_enabled": true, "__prefab": { - "__id__": 761 + "__id__": 770 }, "_lineHeight": 40, "_string": "Rich", @@ -15114,11 +15167,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 756 + "__id__": 765 }, "_enabled": true, "__prefab": { - "__id__": 764 + "__id__": 773 }, "_contentSize": { "__type__": "cc.Size", @@ -15142,11 +15195,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 756 + "__id__": 765 }, "_enabled": true, "__prefab": { - "__id__": 766 + "__id__": 775 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -15187,11 +15240,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 756 + "__id__": 765 }, "_enabled": true, "__prefab": { - "__id__": 768 + "__id__": 777 }, "_resizeMode": 1, "_layoutType": 1, @@ -15242,23 +15295,23 @@ }, "_children": [ { - "__id__": 771 + "__id__": 780 } ], "_active": false, "_components": [ { - "__id__": 791 + "__id__": 800 }, { - "__id__": 793 + "__id__": 802 }, { - "__id__": 795 + "__id__": 804 } ], "_prefab": { - "__id__": 797 + "__id__": 806 }, "_lpos": { "__type__": "cc.Vec3", @@ -15295,30 +15348,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 770 + "__id__": 779 }, "_children": [ { - "__id__": 772 + "__id__": 781 }, { - "__id__": 778 + "__id__": 787 } ], "_active": true, "_components": [ { - "__id__": 784 + "__id__": 793 }, { - "__id__": 786 + "__id__": 795 }, { - "__id__": 788 + "__id__": 797 } ], "_prefab": { - "__id__": 790 + "__id__": 799 }, "_lpos": { "__type__": "cc.Vec3", @@ -15355,20 +15408,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 771 + "__id__": 780 }, "_children": [], "_active": true, "_components": [ { - "__id__": 773 + "__id__": 782 }, { - "__id__": 775 + "__id__": 784 } ], "_prefab": { - "__id__": 777 + "__id__": 786 }, "_lpos": { "__type__": "cc.Vec3", @@ -15405,11 +15458,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 772 + "__id__": 781 }, "_enabled": true, "__prefab": { - "__id__": 774 + "__id__": 783 }, "_contentSize": { "__type__": "cc.Size", @@ -15433,11 +15486,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 772 + "__id__": 781 }, "_enabled": true, "__prefab": { - "__id__": 776 + "__id__": 785 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -15514,20 +15567,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 771 + "__id__": 780 }, "_children": [], "_active": true, "_components": [ { - "__id__": 779 + "__id__": 788 }, { - "__id__": 781 + "__id__": 790 } ], "_prefab": { - "__id__": 783 + "__id__": 792 }, "_lpos": { "__type__": "cc.Vec3", @@ -15564,11 +15617,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 778 + "__id__": 787 }, "_enabled": true, "__prefab": { - "__id__": 780 + "__id__": 789 }, "_contentSize": { "__type__": "cc.Size", @@ -15592,11 +15645,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 778 + "__id__": 787 }, "_enabled": true, "__prefab": { - "__id__": 782 + "__id__": 791 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -15673,11 +15726,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 771 + "__id__": 780 }, "_enabled": true, "__prefab": { - "__id__": 785 + "__id__": 794 }, "_contentSize": { "__type__": "cc.Size", @@ -15701,11 +15754,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 771 + "__id__": 780 }, "_enabled": true, "__prefab": { - "__id__": 787 + "__id__": 796 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -15746,11 +15799,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 771 + "__id__": 780 }, "_enabled": true, "__prefab": { - "__id__": 789 + "__id__": 798 }, "_id": "" }, @@ -15777,11 +15830,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 770 + "__id__": 779 }, "_enabled": true, "__prefab": { - "__id__": 792 + "__id__": 801 }, "_contentSize": { "__type__": "cc.Size", @@ -15805,11 +15858,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 770 + "__id__": 779 }, "_enabled": true, "__prefab": { - "__id__": 794 + "__id__": 803 }, "_alignFlags": 45, "_target": null, @@ -15841,11 +15894,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 770 + "__id__": 779 }, "_enabled": true, "__prefab": { - "__id__": 796 + "__id__": 805 }, "_id": "" }, @@ -15876,23 +15929,23 @@ }, "_children": [ { - "__id__": 799 + "__id__": 808 } ], "_active": false, "_components": [ { - "__id__": 819 + "__id__": 828 }, { - "__id__": 821 + "__id__": 830 }, { - "__id__": 823 + "__id__": 832 } ], "_prefab": { - "__id__": 825 + "__id__": 834 }, "_lpos": { "__type__": "cc.Vec3", @@ -15929,30 +15982,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 798 + "__id__": 807 }, "_children": [ { - "__id__": 800 + "__id__": 809 }, { - "__id__": 806 + "__id__": 815 } ], "_active": true, "_components": [ { - "__id__": 812 + "__id__": 821 }, { - "__id__": 814 + "__id__": 823 }, { - "__id__": 816 + "__id__": 825 } ], "_prefab": { - "__id__": 818 + "__id__": 827 }, "_lpos": { "__type__": "cc.Vec3", @@ -15989,20 +16042,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 799 + "__id__": 808 }, "_children": [], "_active": true, "_components": [ { - "__id__": 801 + "__id__": 810 }, { - "__id__": 803 + "__id__": 812 } ], "_prefab": { - "__id__": 805 + "__id__": 814 }, "_lpos": { "__type__": "cc.Vec3", @@ -16039,11 +16092,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 800 + "__id__": 809 }, "_enabled": true, "__prefab": { - "__id__": 802 + "__id__": 811 }, "_contentSize": { "__type__": "cc.Size", @@ -16067,11 +16120,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 800 + "__id__": 809 }, "_enabled": true, "__prefab": { - "__id__": 804 + "__id__": 813 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -16148,20 +16201,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 799 + "__id__": 808 }, "_children": [], "_active": true, "_components": [ { - "__id__": 807 + "__id__": 816 }, { - "__id__": 809 + "__id__": 818 } ], "_prefab": { - "__id__": 811 + "__id__": 820 }, "_lpos": { "__type__": "cc.Vec3", @@ -16198,11 +16251,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 806 + "__id__": 815 }, "_enabled": true, "__prefab": { - "__id__": 808 + "__id__": 817 }, "_contentSize": { "__type__": "cc.Size", @@ -16226,11 +16279,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 806 + "__id__": 815 }, "_enabled": true, "__prefab": { - "__id__": 810 + "__id__": 819 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -16307,11 +16360,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 799 + "__id__": 808 }, "_enabled": true, "__prefab": { - "__id__": 813 + "__id__": 822 }, "_contentSize": { "__type__": "cc.Size", @@ -16335,11 +16388,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 799 + "__id__": 808 }, "_enabled": true, "__prefab": { - "__id__": 815 + "__id__": 824 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -16380,11 +16433,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 799 + "__id__": 808 }, "_enabled": true, "__prefab": { - "__id__": 817 + "__id__": 826 }, "_id": "" }, @@ -16411,11 +16464,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 798 + "__id__": 807 }, "_enabled": true, "__prefab": { - "__id__": 820 + "__id__": 829 }, "_contentSize": { "__type__": "cc.Size", @@ -16439,11 +16492,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 798 + "__id__": 807 }, "_enabled": true, "__prefab": { - "__id__": 822 + "__id__": 831 }, "_alignFlags": 45, "_target": null, @@ -16475,11 +16528,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 798 + "__id__": 807 }, "_enabled": true, "__prefab": { - "__id__": 824 + "__id__": 833 }, "_id": "" }, @@ -16510,23 +16563,23 @@ }, "_children": [ { - "__id__": 827 + "__id__": 836 } ], "_active": false, "_components": [ { - "__id__": 847 + "__id__": 856 }, { - "__id__": 849 + "__id__": 858 }, { - "__id__": 851 + "__id__": 860 } ], "_prefab": { - "__id__": 853 + "__id__": 862 }, "_lpos": { "__type__": "cc.Vec3", @@ -16563,30 +16616,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 826 + "__id__": 835 }, "_children": [ { - "__id__": 828 + "__id__": 837 }, { - "__id__": 834 + "__id__": 843 } ], "_active": true, "_components": [ { - "__id__": 840 + "__id__": 849 }, { - "__id__": 842 + "__id__": 851 }, { - "__id__": 844 + "__id__": 853 } ], "_prefab": { - "__id__": 846 + "__id__": 855 }, "_lpos": { "__type__": "cc.Vec3", @@ -16623,20 +16676,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 827 + "__id__": 836 }, "_children": [], "_active": true, "_components": [ { - "__id__": 829 + "__id__": 838 }, { - "__id__": 831 + "__id__": 840 } ], "_prefab": { - "__id__": 833 + "__id__": 842 }, "_lpos": { "__type__": "cc.Vec3", @@ -16673,11 +16726,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 828 + "__id__": 837 }, "_enabled": true, "__prefab": { - "__id__": 830 + "__id__": 839 }, "_contentSize": { "__type__": "cc.Size", @@ -16701,11 +16754,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 828 + "__id__": 837 }, "_enabled": true, "__prefab": { - "__id__": 832 + "__id__": 841 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -16782,20 +16835,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 827 + "__id__": 836 }, "_children": [], "_active": true, "_components": [ { - "__id__": 835 + "__id__": 844 }, { - "__id__": 837 + "__id__": 846 } ], "_prefab": { - "__id__": 839 + "__id__": 848 }, "_lpos": { "__type__": "cc.Vec3", @@ -16832,11 +16885,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 834 + "__id__": 843 }, "_enabled": true, "__prefab": { - "__id__": 836 + "__id__": 845 }, "_contentSize": { "__type__": "cc.Size", @@ -16860,11 +16913,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 834 + "__id__": 843 }, "_enabled": true, "__prefab": { - "__id__": 838 + "__id__": 847 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -16941,11 +16994,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 827 + "__id__": 836 }, "_enabled": true, "__prefab": { - "__id__": 841 + "__id__": 850 }, "_contentSize": { "__type__": "cc.Size", @@ -16969,11 +17022,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 827 + "__id__": 836 }, "_enabled": true, "__prefab": { - "__id__": 843 + "__id__": 852 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -17014,11 +17067,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 827 + "__id__": 836 }, "_enabled": true, "__prefab": { - "__id__": 845 + "__id__": 854 }, "_id": "" }, @@ -17045,11 +17098,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 826 + "__id__": 835 }, "_enabled": true, "__prefab": { - "__id__": 848 + "__id__": 857 }, "_contentSize": { "__type__": "cc.Size", @@ -17073,11 +17126,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 826 + "__id__": 835 }, "_enabled": true, "__prefab": { - "__id__": 850 + "__id__": 859 }, "_alignFlags": 45, "_target": null, @@ -17109,11 +17162,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 826 + "__id__": 835 }, "_enabled": true, "__prefab": { - "__id__": 852 + "__id__": 861 }, "_id": "" }, @@ -17144,23 +17197,23 @@ }, "_children": [ { - "__id__": 855 + "__id__": 864 }, { - "__id__": 861 + "__id__": 870 }, { - "__id__": 877 + "__id__": 886 } ], "_active": false, "_components": [ { - "__id__": 883 + "__id__": 892 } ], "_prefab": { - "__id__": 885 + "__id__": 894 }, "_lpos": { "__type__": "cc.Vec3", @@ -17197,20 +17250,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 854 + "__id__": 863 }, "_children": [], "_active": true, "_components": [ { - "__id__": 856 + "__id__": 865 }, { - "__id__": 858 + "__id__": 867 } ], "_prefab": { - "__id__": 860 + "__id__": 869 }, "_lpos": { "__type__": "cc.Vec3", @@ -17247,11 +17300,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 855 + "__id__": 864 }, "_enabled": true, "__prefab": { - "__id__": 857 + "__id__": 866 }, "_contentSize": { "__type__": "cc.Size", @@ -17275,11 +17328,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 855 + "__id__": 864 }, "_enabled": true, "__prefab": { - "__id__": 859 + "__id__": 868 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -17333,24 +17386,24 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 854 + "__id__": 863 }, "_children": [ { - "__id__": 862 + "__id__": 871 }, { - "__id__": 868 + "__id__": 877 } ], "_active": true, "_components": [ { - "__id__": 874 + "__id__": 883 } ], "_prefab": { - "__id__": 876 + "__id__": 885 }, "_lpos": { "__type__": "cc.Vec3", @@ -17387,20 +17440,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 861 + "__id__": 870 }, "_children": [], "_active": true, "_components": [ { - "__id__": 863 + "__id__": 872 }, { - "__id__": 865 + "__id__": 874 } ], "_prefab": { - "__id__": 867 + "__id__": 876 }, "_lpos": { "__type__": "cc.Vec3", @@ -17437,11 +17490,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 862 + "__id__": 871 }, "_enabled": true, "__prefab": { - "__id__": 864 + "__id__": 873 }, "_contentSize": { "__type__": "cc.Size", @@ -17465,11 +17518,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 862 + "__id__": 871 }, "_enabled": true, "__prefab": { - "__id__": 866 + "__id__": 875 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -17523,20 +17576,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 861 + "__id__": 870 }, "_children": [], "_active": false, "_components": [ { - "__id__": 869 + "__id__": 878 }, { - "__id__": 871 + "__id__": 880 } ], "_prefab": { - "__id__": 873 + "__id__": 882 }, "_lpos": { "__type__": "cc.Vec3", @@ -17573,11 +17626,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 868 + "__id__": 877 }, "_enabled": true, "__prefab": { - "__id__": 870 + "__id__": 879 }, "_contentSize": { "__type__": "cc.Size", @@ -17601,11 +17654,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 868 + "__id__": 877 }, "_enabled": true, "__prefab": { - "__id__": 872 + "__id__": 881 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -17659,11 +17712,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 861 + "__id__": 870 }, "_enabled": true, "__prefab": { - "__id__": 875 + "__id__": 884 }, "_contentSize": { "__type__": "cc.Size", @@ -17700,20 +17753,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 854 + "__id__": 863 }, "_children": [], "_active": true, "_components": [ { - "__id__": 878 + "__id__": 887 }, { - "__id__": 880 + "__id__": 889 } ], "_prefab": { - "__id__": 882 + "__id__": 891 }, "_lpos": { "__type__": "cc.Vec3", @@ -17750,11 +17803,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 877 + "__id__": 886 }, "_enabled": true, "__prefab": { - "__id__": 879 + "__id__": 888 }, "_contentSize": { "__type__": "cc.Size", @@ -17778,11 +17831,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 877 + "__id__": 886 }, "_enabled": true, "__prefab": { - "__id__": 881 + "__id__": 890 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -17836,11 +17889,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 854 + "__id__": 863 }, "_enabled": true, "__prefab": { - "__id__": 884 + "__id__": 893 }, "_contentSize": { "__type__": "cc.Size", @@ -17881,7 +17934,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 887 + "__id__": 896 }, "_contentSize": { "__type__": "cc.Size", @@ -17909,7 +17962,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 889 + "__id__": 898 }, "_alignFlags": 45, "_target": null, @@ -17945,7 +17998,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 891 + "__id__": 900 }, "_id": "" }, @@ -17963,7 +18016,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 893 + "__id__": 902 }, "_type": 0, "_inverted": false, @@ -17985,7 +18038,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 895 + "__id__": 904 }, "_id": "" }, @@ -18003,7 +18056,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 897 + "__id__": 906 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -18052,13 +18105,13 @@ "targetOverrides": null, "nestedPrefabInstanceRoots": [ { - "__id__": 596 + "__id__": 605 }, { - "__id__": 548 + "__id__": 557 }, { - "__id__": 518 + "__id__": 527 }, { "__id__": 500 diff --git a/assets/bundles/battleGame/prefab/格子锁.prefab b/assets/bundles/battleGame/prefab/格子锁.prefab index 2f43a53..eb31893 100644 --- a/assets/bundles/battleGame/prefab/格子锁.prefab +++ b/assets/bundles/battleGame/prefab/格子锁.prefab @@ -92,7 +92,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -17.1845703125, + "x": -16.1845703125, "y": 0, "z": 0 }, @@ -228,7 +228,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 12.5, + "x": 13.5, "y": 0, "z": 0 }, @@ -378,7 +378,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 82.369140625, + "width": 84.369140625, "height": 68 }, "_anchorPoint": { @@ -457,7 +457,7 @@ "height": 40 }, "_startAxis": 0, - "_paddingLeft": 3, + "_paddingLeft": 5, "_paddingRight": 10, "_paddingTop": 0, "_paddingBottom": 0, @@ -473,7 +473,7 @@ }, { "__type__": "cc.CompPrefabInfo", - "fileId": "acA5MrJQNI66W+fTtjgwyu" + "fileId": "70ZyhmoIhBg4ERUGYZrVVb" }, { "__type__": "cc.PrefabInfo", @@ -484,7 +484,6 @@ "__id__": 0 }, "fileId": "a01BJWthhKbr3LbCXP7YXR", - "instance": null, - "targetOverrides": null + "instance": null } ] \ No newline at end of file diff --git a/assets/bundles/battleHero/prefab/skill/剑阵.prefab b/assets/bundles/battleHero/prefab/skill/剑阵.prefab index aa5552a..d0dfd55 100644 --- a/assets/bundles/battleHero/prefab/skill/剑阵.prefab +++ b/assets/bundles/battleHero/prefab/skill/剑阵.prefab @@ -164,11 +164,11 @@ "a": 255 }, "_skeletonData": { - "__uuid__": "b08da8a5-db6f-422d-8058-f2ae8c8dc279", + "__uuid__": "7b03a26d-8a9f-4312-a397-d414e1ef4574", "__expectedType__": "sp.SkeletonData" }, - "defaultSkin": "轩辕剑", - "defaultAnimation": "诛仙剑技能", + "defaultSkin": "default", + "defaultAnimation": "剑阵", "_premultipliedAlpha": true, "_timeScale": 1, "_preCacheMode": 0, diff --git a/assets/bundles/battleHero/prefab/skill/水弹.prefab b/assets/bundles/battleHero/prefab/skill/水弹.prefab new file mode 100644 index 0000000..8cdd929 --- /dev/null +++ b/assets/bundles/battleHero/prefab/skill/水弹.prefab @@ -0,0 +1,239 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "水弹", + "_objFlags": 0, + "__editorExtras__": {}, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "persistent": false + }, + { + "__type__": "cc.Node", + "_name": "水弹", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": null, + "_children": [ + { + "__id__": 2 + } + ], + "_active": true, + "_components": [ + { + "__id__": 8 + } + ], + "_prefab": { + "__id__": 10 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "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.Node", + "_name": "飞行水弹", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 3 + }, + { + "__id__": 5 + } + ], + "_prefab": { + "__id__": 7 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 1, + "w": 6.123233995736766e-17 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 180 + }, + "_id": "" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 2 + }, + "_enabled": true, + "__prefab": { + "__id__": 4 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 322, + "height": 122 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "fdzTh+tYZEhI11kKqjFBe7" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 2 + }, + "_enabled": true, + "__prefab": { + "__id__": 6 + }, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_spriteFrame": { + "__uuid__": "d0abd767-3ed4-49ca-b7dd-e295c41cd319@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 0, + "_fillType": 0, + "_sizeMode": 1, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "cfciGdRx1ORZesbsRtCqtj" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "41giWeE6BPxKcxypzVJSnI", + "instance": null, + "targetOverrides": null, + "nestedPrefabInstanceRoots": null + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 1 + }, + "_enabled": true, + "__prefab": { + "__id__": 9 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 200, + "height": 200 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "451RzMpQpFLalWlPKOafD2" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "38JEit66ZI+Y7iGQ+17T7W", + "instance": null, + "targetOverrides": null + } +] \ No newline at end of file diff --git a/assets/bundles/battleHero/prefab/skill/水弹.prefab.meta b/assets/bundles/battleHero/prefab/skill/水弹.prefab.meta new file mode 100644 index 0000000..f381fb1 --- /dev/null +++ b/assets/bundles/battleHero/prefab/skill/水弹.prefab.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "4148572e-42b7-48ae-9ef7-df2889a4e162", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "水弹" + } +} diff --git a/assets/bundles/battleHero/prefab/skill/玉帝飞剑.prefab b/assets/bundles/battleHero/prefab/skill/飞剑.prefab similarity index 91% rename from assets/bundles/battleHero/prefab/skill/玉帝飞剑.prefab rename to assets/bundles/battleHero/prefab/skill/飞剑.prefab index e710d54..ca856f9 100644 --- a/assets/bundles/battleHero/prefab/skill/玉帝飞剑.prefab +++ b/assets/bundles/battleHero/prefab/skill/飞剑.prefab @@ -1,7 +1,7 @@ [ { "__type__": "cc.Prefab", - "_name": "玉帝飞剑", + "_name": "飞剑", "_objFlags": 0, "__editorExtras__": {}, "_native": "", @@ -13,7 +13,7 @@ }, { "__type__": "cc.Node", - "_name": "玉帝飞剑", + "_name": "飞剑", "_objFlags": 0, "__editorExtras__": {}, "_parent": null, @@ -94,8 +94,8 @@ "__type__": "cc.Quat", "x": 0, "y": 0, - "z": 1, - "w": 6.123233995736766e-17 + "z": -0.7071067811865475, + "w": 0.7071067811865476 }, "_lscale": { "__type__": "cc.Vec3", @@ -109,7 +109,7 @@ "__type__": "cc.Vec3", "x": 0, "y": 0, - "z": 180 + "z": -90 }, "_id": "" }, @@ -127,13 +127,13 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 29.399999618530273, - "height": 52.79999923706055 + "width": 38.47999954223633, + "height": 79.19999694824219 }, "_anchorPoint": { "__type__": "cc.Vec2", - "x": 0.8789115812199337, - "y": 0.6850378540073432 + "x": 0.47193347358227933, + "y": 0.3867424285481165 }, "_id": "" }, @@ -164,12 +164,12 @@ "a": 255 }, "_skeletonData": { - "__uuid__": "b08da8a5-db6f-422d-8058-f2ae8c8dc279", + "__uuid__": "dcce3833-3da9-44f4-ba04-72175d2ae9db", "__expectedType__": "sp.SkeletonData" }, - "defaultSkin": "诛仙剑", - "defaultAnimation": "玉帝普攻", - "_premultipliedAlpha": true, + "defaultSkin": "default", + "defaultAnimation": "飞剑", + "_premultipliedAlpha": false, "_timeScale": 1, "_preCacheMode": 0, "_cacheMode": 0, diff --git a/assets/bundles/battleHero/prefab/skill/玉帝飞剑.prefab.meta b/assets/bundles/battleHero/prefab/skill/飞剑.prefab.meta similarity index 84% rename from assets/bundles/battleHero/prefab/skill/玉帝飞剑.prefab.meta rename to assets/bundles/battleHero/prefab/skill/飞剑.prefab.meta index 95ff0ee..f1d1ec7 100644 --- a/assets/bundles/battleHero/prefab/skill/玉帝飞剑.prefab.meta +++ b/assets/bundles/battleHero/prefab/skill/飞剑.prefab.meta @@ -8,6 +8,6 @@ ], "subMetas": {}, "userData": { - "syncNodeName": "玉帝飞剑" + "syncNodeName": "飞剑" } } diff --git a/assets/bundles/battleHero/prefab/weapon/weaponType1.prefab b/assets/bundles/battleHero/prefab/weapon/weaponType1.prefab index a8a5d62..d12f174 100644 --- a/assets/bundles/battleHero/prefab/weapon/weaponType1.prefab +++ b/assets/bundles/battleHero/prefab/weapon/weaponType1.prefab @@ -178,13 +178,13 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 29.399999618530273, - "height": 52.79999923706055 + "width": 38.47999954223633, + "height": 79.19999694824219 }, "_anchorPoint": { "__type__": "cc.Vec2", - "x": 0.8789115812199337, - "y": 0.6850378540073432 + "x": 0.47193347358227933, + "y": 0.3867424285481165 }, "_id": "" }, @@ -215,12 +215,12 @@ "a": 255 }, "_skeletonData": { - "__uuid__": "b08da8a5-db6f-422d-8058-f2ae8c8dc279", + "__uuid__": "dcce3833-3da9-44f4-ba04-72175d2ae9db", "__expectedType__": "sp.SkeletonData" }, - "defaultSkin": "诛仙剑", - "defaultAnimation": "攻击", - "_premultipliedAlpha": true, + "defaultSkin": "default", + "defaultAnimation": "待机", + "_premultipliedAlpha": false, "_timeScale": 1, "_preCacheMode": 0, "_cacheMode": 0, diff --git a/assets/bundles/battleHero/prefab/weapon/weaponType2.prefab b/assets/bundles/battleHero/prefab/weapon/weaponType2.prefab index 7fc6280..8914c7a 100644 --- a/assets/bundles/battleHero/prefab/weapon/weaponType2.prefab +++ b/assets/bundles/battleHero/prefab/weapon/weaponType2.prefab @@ -146,7 +146,7 @@ "x": 0, "y": 0, "z": 1, - "w": -6.123233995736766e-17 + "w": 6.123233995736766e-17 }, "_lscale": { "__type__": "cc.Vec3", @@ -158,9 +158,9 @@ "_layer": 33554432, "_euler": { "__type__": "cc.Vec3", - "x": -180, - "y": -180, - "z": -7.016709298534876e-15 + "x": 0, + "y": 0, + "z": 180 }, "_id": "" }, @@ -178,13 +178,13 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 58, - "height": 92 + "width": 94.87000274658203, + "height": 108.30000305175781 }, "_anchorPoint": { "__type__": "cc.Vec2", - "x": 0.5594827717748182, - "y": 0.39749999668287195 + "x": 0.48223883920619237, + "y": 0.39464451037956905 }, "_id": "" }, @@ -215,12 +215,12 @@ "a": 255 }, "_skeletonData": { - "__uuid__": "16b7dfbc-1936-4d60-a737-52963d4b85b9", + "__uuid__": "35c3ad81-2132-4358-8e17-a1063d1b12d7", "__expectedType__": "sp.SkeletonData" }, - "defaultSkin": "木枪", + "defaultSkin": "default", "defaultAnimation": "待机", - "_premultipliedAlpha": true, + "_premultipliedAlpha": false, "_timeScale": 1, "_preCacheMode": 0, "_cacheMode": 0, diff --git a/assets/bundles/battleHero/prefab/weapon/weaponType3.prefab b/assets/bundles/battleHero/prefab/weapon/weaponType3.prefab index 5601789..4b12880 100644 --- a/assets/bundles/battleHero/prefab/weapon/weaponType3.prefab +++ b/assets/bundles/battleHero/prefab/weapon/weaponType3.prefab @@ -178,13 +178,13 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 58.5, - "height": 91.5 + "width": 36.45000076293945, + "height": 83.4800033569336 }, "_anchorPoint": { "__type__": "cc.Vec2", - "x": 0.6201709193042201, - "y": 0.4168305944223873 + "x": 0.49026064376390155, + "y": 0.39758022630640355 }, "_id": "" }, @@ -215,12 +215,12 @@ "a": 255 }, "_skeletonData": { - "__uuid__": "5537a63c-69d8-40db-ae9a-dec12ffb9d73", + "__uuid__": "c9a6d736-aeee-4865-a852-c4998d8827d1", "__expectedType__": "sp.SkeletonData" }, - "defaultSkin": "木棍", + "defaultSkin": "default", "defaultAnimation": "待机", - "_premultipliedAlpha": true, + "_premultipliedAlpha": false, "_timeScale": 1, "_preCacheMode": 0, "_cacheMode": 0, diff --git a/assets/bundles/battleHero/prefab/weapon/weaponType4.prefab b/assets/bundles/battleHero/prefab/weapon/weaponType4.prefab index 5fe46ea..7869b67 100644 --- a/assets/bundles/battleHero/prefab/weapon/weaponType4.prefab +++ b/assets/bundles/battleHero/prefab/weapon/weaponType4.prefab @@ -181,13 +181,13 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 62.04999923706055, - "height": 63.150001525878906 + "width": 75.98999786376953, + "height": 95.4800033569336 }, "_anchorPoint": { "__type__": "cc.Vec2", - "x": 0.7932312945349005, - "y": 0.47474265744792593 + "x": 0.8398473679290928, + "y": 0.48324254050518767 }, "_id": "" }, @@ -218,12 +218,12 @@ "a": 255 }, "_skeletonData": { - "__uuid__": "9a08eed3-aab7-42cf-8174-f8a06045dce3", + "__uuid__": "2cfd40d1-8308-45e0-9d48-fc9918263deb", "__expectedType__": "sp.SkeletonData" }, - "defaultSkin": "木弓", - "defaultAnimation": "攻击", - "_premultipliedAlpha": true, + "defaultSkin": "default", + "defaultAnimation": "待机", + "_premultipliedAlpha": false, "_timeScale": 1, "_preCacheMode": 0, "_cacheMode": 0, @@ -350,8 +350,8 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -8.486, - "y": 0, + "x": 0, + "y": 4.903, "z": 0 }, "_lrot": { @@ -391,13 +391,13 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 62.04999923706055, - "height": 63.150001525878906 + "width": 75.98999786376953, + "height": 95.4800033569336 }, "_anchorPoint": { "__type__": "cc.Vec2", - "x": 0.7932312945349005, - "y": 0.47474265744792593 + "x": 0.8398473679290928, + "y": 0.48324254050518767 }, "_id": "" }, @@ -428,12 +428,12 @@ "a": 255 }, "_skeletonData": { - "__uuid__": "9a08eed3-aab7-42cf-8174-f8a06045dce3", + "__uuid__": "2cfd40d1-8308-45e0-9d48-fc9918263deb", "__expectedType__": "sp.SkeletonData" }, - "defaultSkin": "木弓", + "defaultSkin": "default", "defaultAnimation": "飞行箭矢", - "_premultipliedAlpha": true, + "_premultipliedAlpha": false, "_timeScale": 1, "_preCacheMode": 0, "_cacheMode": 0, diff --git a/assets/bundles/battleHero/prefab/weapon/weaponType5.prefab b/assets/bundles/battleHero/prefab/weapon/weaponType5.prefab new file mode 100644 index 0000000..84f961c --- /dev/null +++ b/assets/bundles/battleHero/prefab/weapon/weaponType5.prefab @@ -0,0 +1,354 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "weaponType5", + "_objFlags": 0, + "__editorExtras__": {}, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "persistent": false + }, + { + "__type__": "cc.Node", + "_name": "weaponType5", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": null, + "_children": [ + { + "__id__": 2 + } + ], + "_active": true, + "_components": [ + { + "__id__": 14 + } + ], + "_prefab": { + "__id__": 16 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "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.Node", + "_name": "weapon", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 3 + } + ], + "_active": true, + "_components": [ + { + "__id__": 11 + } + ], + "_prefab": { + "__id__": 13 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 1, + "w": 6.123233995736766e-17 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 180 + }, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "skin", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 2 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 4 + }, + { + "__id__": 6 + }, + { + "__id__": 8 + } + ], + "_prefab": { + "__id__": 10 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 1, + "w": 6.123233995736766e-17 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 180 + }, + "_id": "" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 3 + }, + "_enabled": true, + "__prefab": { + "__id__": 5 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 73.52999877929688, + "height": 96.18000030517578 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5167958742126253, + "y": 0.46049075457472155 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "10Ma4aWlBFk6tBs31iA9DF" + }, + { + "__type__": "sp.Skeleton", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 3 + }, + "_enabled": true, + "__prefab": { + "__id__": 7 + }, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_skeletonData": { + "__uuid__": "542e1bba-b475-48e1-93b2-89480d605a79", + "__expectedType__": "sp.SkeletonData" + }, + "defaultSkin": "红缨枪", + "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": "53Oqvwb2JMo7/t619sZApZ" + }, + { + "__type__": "cc.Sorting2D", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 3 + }, + "_enabled": true, + "__prefab": { + "__id__": 9 + }, + "_sortingLayer": 3, + "_sortingOrder": 3, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "c5Vivgz8hNoqVvdPwfRfMe" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5eJtTesAhFjKJGfAwMDj8P", + "instance": null, + "targetOverrides": null, + "nestedPrefabInstanceRoots": null + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 2 + }, + "_enabled": true, + "__prefab": { + "__id__": 12 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 100, + "height": 100 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "859ErfVzpFGosE8chK2XD9" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "12h5zzJolI66bNtwPs5kJw", + "instance": null, + "targetOverrides": null, + "nestedPrefabInstanceRoots": null + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 1 + }, + "_enabled": true, + "__prefab": { + "__id__": 15 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 83, + "height": 83 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "d9phYN8o1N0pHVkixsNcQj" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "15uJpnkDNKApBLkoqMhhsr", + "instance": null, + "targetOverrides": null + } +] \ No newline at end of file diff --git a/assets/bundles/battleHero/prefab/weapon/weaponType5.prefab.meta b/assets/bundles/battleHero/prefab/weapon/weaponType5.prefab.meta new file mode 100644 index 0000000..075e181 --- /dev/null +++ b/assets/bundles/battleHero/prefab/weapon/weaponType5.prefab.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "f9ea9d9f-0c4b-4bbd-ae53-0f953ad77b53", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "weaponType5" + } +} diff --git a/assets/bundles/first/config/Skill.json b/assets/bundles/first/config/Skill.json index bd9ce94..e365c5b 100644 --- a/assets/bundles/first/config/Skill.json +++ b/assets/bundles/first/config/Skill.json @@ -8,7 +8,7 @@ "level": 0, "cd": 0.8, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -30,7 +30,7 @@ "level": 0, "cd": 0.8, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -52,7 +52,7 @@ "level": 0, "cd": 0.8, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -74,7 +74,7 @@ "level": 0, "cd": 0.8, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -96,7 +96,7 @@ "level": 0, "cd": 0.8, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -118,7 +118,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -140,7 +140,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 260, @@ -162,7 +162,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 260, @@ -184,7 +184,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 300, @@ -206,7 +206,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 300, @@ -228,7 +228,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -250,7 +250,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -272,7 +272,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -294,7 +294,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -316,7 +316,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -338,7 +338,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -360,7 +360,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -382,7 +382,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -404,7 +404,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -426,7 +426,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -448,7 +448,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -470,7 +470,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -492,7 +492,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -514,7 +514,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -536,7 +536,7 @@ "level": 0, "cd": 1, "priority": 0, - "animation": "攻击", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -558,7 +558,7 @@ "level": 0, "cd": 2.4, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -580,7 +580,7 @@ "level": 0, "cd": 1.6, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -602,7 +602,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -624,7 +624,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -646,7 +646,7 @@ "level": 0, "cd": 1.6, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -668,7 +668,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -690,7 +690,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -712,7 +712,7 @@ "level": 0, "cd": 1.6, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -734,7 +734,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -756,7 +756,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -778,7 +778,7 @@ "level": 0, "cd": 1.6, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -800,7 +800,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -822,7 +822,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -844,7 +844,7 @@ "level": 0, "cd": 16, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -866,7 +866,7 @@ "level": 0, "cd": 12, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -888,7 +888,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "悟空专属技能效果", "showeffect": "", "target_stage": 0, "range": 0, @@ -910,7 +910,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -932,7 +932,7 @@ "level": 0, "cd": 12, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -954,7 +954,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "悟空专属技能效果", "showeffect": "", "target_stage": 0, "range": 0, @@ -976,7 +976,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -998,7 +998,7 @@ "level": 0, "cd": 12, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1020,7 +1020,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "悟空专属技能效果", "showeffect": "", "target_stage": 0, "range": 0, @@ -1042,7 +1042,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1064,7 +1064,7 @@ "level": 0, "cd": 12, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1086,7 +1086,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "悟空专属技能效果", "showeffect": "", "target_stage": 0, "range": 0, @@ -1108,7 +1108,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1130,7 +1130,7 @@ "level": 0, "cd": 2, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1152,7 +1152,7 @@ "level": 0, "cd": 2, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1174,7 +1174,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "暴风雪技能", "showeffect": "", "target_stage": 0, "range": 0, @@ -1196,7 +1196,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1218,7 +1218,7 @@ "level": 0, "cd": 2, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1240,7 +1240,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "暴风雪技能", "showeffect": "", "target_stage": 0, "range": 0, @@ -1262,7 +1262,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1284,7 +1284,7 @@ "level": 0, "cd": 2, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1306,7 +1306,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "暴风雪技能", "showeffect": "", "target_stage": 0, "range": 0, @@ -1328,7 +1328,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1350,7 +1350,7 @@ "level": 0, "cd": 2, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1372,7 +1372,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "暴风雪技能", "showeffect": "", "target_stage": 0, "range": 0, @@ -1394,7 +1394,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "水弹攻击1", "showeffect": "", "target_stage": 0, "range": 0, @@ -1416,7 +1416,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 0, "range": 0, @@ -1438,7 +1438,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 0, "range": 0, @@ -1460,7 +1460,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 1, "range": 0, @@ -1482,7 +1482,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 1, "range": 0, @@ -1504,7 +1504,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 0, "range": 0, @@ -1526,7 +1526,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 1, "range": 0, @@ -1548,7 +1548,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 1, "range": 0, @@ -1570,7 +1570,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 0, "range": 0, @@ -1592,7 +1592,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 1, "range": 0, @@ -1614,7 +1614,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 1, "range": 0, @@ -1636,7 +1636,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 0, "range": 0, @@ -1658,7 +1658,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 1, "range": 0, @@ -1680,7 +1680,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 1, "range": 0, @@ -1702,7 +1702,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 3, "range": 0, @@ -1724,7 +1724,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击", "showeffect": "", "target_stage": 3, "range": 0, @@ -1746,7 +1746,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -1768,7 +1768,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -1790,7 +1790,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 3, "range": 0, @@ -1812,7 +1812,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -1834,7 +1834,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -1856,7 +1856,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 3, "range": 0, @@ -1878,7 +1878,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -1900,7 +1900,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -1922,7 +1922,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 3, "range": 0, @@ -1944,7 +1944,7 @@ "level": 0, "cd": 20, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, @@ -1966,7 +1966,7 @@ "level": 0, "cd": 0, "priority": 100, - "animation": "", + "animation": "攻击1", "showeffect": "", "target_stage": 1, "range": 0, diff --git a/assets/mx/module/merge/config/IComposeConfigProvider.ts b/assets/mx/module/merge/config/IComposeConfigProvider.ts index 0e4dad4..6fe482a 100644 --- a/assets/mx/module/merge/config/IComposeConfigProvider.ts +++ b/assets/mx/module/merge/config/IComposeConfigProvider.ts @@ -12,6 +12,12 @@ export interface IComposeConfigProvider { passiveSpawnKeepsDigCell(weapon2Id: number): boolean; /** 保持 Dig 格的字块(蟠桃树)可合成等级上限 */ getKeepDigTileMaxLevel(weapon2Id: number): number; - /** 五行 Text.type 可合成到的最高显示等级(Hero.level 最大值) */ + /** 五行显示等级上限:同 herotype 的 Hero.level 最大值 */ getElementMaxLevel(textType: number): number; + /** + * 五行 Hero.id:herotype=Text.type 且 level=显示等级。 + * @param textType Text.type(1–5) + * @param level 显示等级 + */ + getElementHeroId(textType: number, level: number): number | null; } diff --git a/assets/mx/module/merge/core/MergeSession.ts b/assets/mx/module/merge/core/MergeSession.ts index b5e14ce..1491ec7 100644 --- a/assets/mx/module/merge/core/MergeSession.ts +++ b/assets/mx/module/merge/core/MergeSession.ts @@ -1358,6 +1358,7 @@ export class MergeSession { if (!used.has(gridIndex)) restLayout.set(gridIndex, weapon2Id); }); const found = this._matcher.findCompositions(restLayout, this._coordOf); + this._appendElementCompositions(restLayout, found); this._compositions = preserved.concat(this._filterUniqueMultiHeroes(preserved, found)); const activeKeys = createMembershipSet(); @@ -1382,6 +1383,35 @@ export class MergeSession { this.emit(MergeEventFactory.composeChanged(this._compositions)); } + /** + * 五行单格:按 Text.type + 显示等级解析 Hero.id,作为可部署攻击单位。 + * @param restLayout 未被多格组合占用的字块 + * @param found 匹配结果(就地追加) + */ + private _appendElementCompositions(restLayout: Map, found: ComposedUnit[]): void { + const occupied = createMembershipSet(); + for (let i = 0; i < found.length; i++) { + const indices = found[i].gridIndices; + for (let j = 0; j < indices.length; j++) membershipAdd(occupied, indices[j]); + } + restLayout.forEach((weapon2Id, gridIndex) => { + if (occupied.has(gridIndex)) return; + const type = Math.floor(this._config.getWeapon2Type(weapon2Id)); + if (!isElementGlyphType(type)) return; + const tile = this.map.getTile(gridIndex); + const level = Math.max(1, Math.floor(tile?.level ?? 1)); + const heroId = this._config.getElementHeroId(type, level); + if (!(heroId > 0)) return; + membershipAdd(occupied, gridIndex); + found.push({ + weapon1Id: heroId, + level, + gridIndices: [gridIndex], + direction: 'horizontal', + }); + }); + } + /** * 多格神将:同 weapon1Id(Hero.id)本方最多 1 个;已有则新匹配保持散字不成第二将。 * @param preserved 已保留组合 diff --git a/assets/script/battle/ai/bridge/AiBattleBridge.ts b/assets/script/battle/ai/bridge/AiBattleBridge.ts index b6ed255..938f949 100644 --- a/assets/script/battle/ai/bridge/AiBattleBridge.ts +++ b/assets/script/battle/ai/bridge/AiBattleBridge.ts @@ -242,7 +242,7 @@ export class AiBattleBridge { this._map = map; this._profile = resolved; if (skillParent) { - this._skillHost.bind(battle, map, skillParent); + this._skillHost.bind(battle, map, skillParent, this._mapText.getMapGrids()); } else { aiLog('[AiBattleBridge] skillParent missing: AI towers may not attack'); } @@ -283,7 +283,7 @@ export class AiBattleBridge { if (!map || !bag || !battle) return; const aiPlayer = battle.getPlayer(AiHeadlessBagHost.AI_PLAYER_ID) ?? null; this._mapText.requestSync(bag, map, aiPlayer); - this._skillHost.refresh(map); + this._skillHost.refresh(map, this._mapText.getMapGrids()); }; /** 刷新拍:乾坤袋回收背包多余字 */ diff --git a/assets/script/battle/ai/runtime/AiMapTextHost.ts b/assets/script/battle/ai/runtime/AiMapTextHost.ts index c8842e6..7114088 100644 --- a/assets/script/battle/ai/runtime/AiMapTextHost.ts +++ b/assets/script/battle/ai/runtime/AiMapTextHost.ts @@ -852,4 +852,14 @@ export class AiMapTextHost { if (rec.grid?.isValid) visitor(rec.grid, rec.gridIndex); } } + + /** SkillController 用的格 → TextGrid */ + getMapGrids(): ReadonlyMap { + const out = new Map(); + for (let i = 0; i < this._recs.length; i++) { + const rec = this._recs[i]; + if (rec.grid?.isValid) out.set(rec.gridIndex, rec.grid); + } + return out; + } } diff --git a/assets/script/battle/ai/runtime/AiSkillHost.ts b/assets/script/battle/ai/runtime/AiSkillHost.ts index 89e0c78..7c97ede 100644 --- a/assets/script/battle/ai/runtime/AiSkillHost.ts +++ b/assets/script/battle/ai/runtime/AiSkillHost.ts @@ -4,6 +4,7 @@ import type { ProjectBattleHandle } from '../../runtime/BattleRuntime'; import type { MapManager } from '../../map/legacy/MapManager'; import { SkillController } from '../../skill/SkillController'; import { AiHeadlessBagHost } from './AiHeadlessBagHost'; +import type { TextGrid } from '../../view/TextGrid'; /** * AI 技能表现宿主:独立 SkillController,承接 AI 塔 PresentationCue。 @@ -18,8 +19,9 @@ export class AiSkillHost { * @param battle 战斗 * @param map 地图 * @param parent UI 节点(挂载组件) + * @param mapGrids AI 地图 TextGrid */ - bind(battle: ProjectBattleHandle, map: MapManager, parent: Node): boolean { + bind(battle: ProjectBattleHandle, map: MapManager, parent: Node, mapGrids?: ReadonlyMap): boolean { this.dispose(); const aiPlayer = battle.getPlayer(AiHeadlessBagHost.AI_PLAYER_ID); if (!aiPlayer) { @@ -38,7 +40,7 @@ export class AiSkillHost { let sc = host.getComponent(SkillController); if (!sc) sc = host.addComponent(SkillController); sc.bind(aiPlayer, battle); - sc.refreshEntitySkillBindings(map); + sc.refreshEntitySkillBindings(map, mapGrids); aiPlayer.skillController = sc; this._hostNode = host; this._controller = sc; @@ -49,9 +51,10 @@ export class AiSkillHost { /** * 部署变化后刷新 entity→Skill 映射。 * @param map 地图 + * @param mapGrids AI 地图 TextGrid */ - refresh(map: MapManager): void { - this._controller?.refreshEntitySkillBindings(map); + refresh(map: MapManager, mapGrids?: ReadonlyMap): void { + this._controller?.refreshEntitySkillBindings(map, mapGrids); } /** 解除绑定 */ diff --git a/assets/script/battle/bag/BattleBagSession.ts b/assets/script/battle/bag/BattleBagSession.ts index 00d74b3..3d58a07 100644 --- a/assets/script/battle/bag/BattleBagSession.ts +++ b/assets/script/battle/bag/BattleBagSession.ts @@ -901,6 +901,21 @@ export class BattleBagSession { this._map.areaUnlock.setLevel(levelId, levelValue); } + /** + * 拖字是否满足当前解锁区域:Text.type 对齐 unlockland 类型(0 为任意),显示等级达到需求。 + * @param gridIndex 落点 + * @param weapon2Id 文字 id + * @param level 字块显示等级 + */ + canUnlockArea(gridIndex: number, weapon2Id: number, level?: number): boolean { + const grid = this.validator.getGridByIndex(gridIndex); + if (!grid?.isAreaUnlock) return false; + const lv = Math.floor(Number(level)); + if (!(lv > 0)) return false; + WeaponComposeConfigProvider.instance.load(); + return this._map.areaUnlock.canDrag(grid, this._heroOfGlyph({ weapon2Id, level: lv })); + } + /** * 五行字拖到当前解锁区域:类型/显示等级符合则整区可放置并播 openSpine,随后字落在当前格。 * @param source 拖拽源 diff --git a/assets/script/battle/bag/WeaponComposeConfigProvider.ts b/assets/script/battle/bag/WeaponComposeConfigProvider.ts index 2ee16ef..9a9cf45 100644 --- a/assets/script/battle/bag/WeaponComposeConfigProvider.ts +++ b/assets/script/battle/bag/WeaponComposeConfigProvider.ts @@ -159,9 +159,15 @@ export class WeaponComposeConfigProvider implements IComposeConfigProvider { const row = this._weapon1List.find((w) => Number(w.id) === id); if (!row) { console.log('[WeaponCompose] Hero 缺失,等级上限按 1', id); - } else { - console.log('[WeaponCompose] Hero.level_limit 未配置,等级上限按 1', id); + return 1; + } + const ht = Math.floor(Number(row.herotype)); + if (ht >= 1 && ht <= 5) { + const max = this.getElementMaxLevel(ht); + this._maxLevel.set(id, max); + return max; } + console.log('[WeaponCompose] Hero.level_limit 未配置,等级上限按 1', id); return 1; } @@ -205,6 +211,26 @@ export class WeaponComposeConfigProvider implements IComposeConfigProvider { return max; } + /** + * 五行 Hero.id:herotype 与显示等级对齐。 + * @param textType Text.type(1–5) + * @param level 显示等级 + */ + getElementHeroId(textType: number, level: number): number | null { + this.load(); + const type = Math.floor(Number(textType)); + const lv = Math.floor(Number(level)); + if (type < 1 || type > 5 || !(lv > 0)) return null; + for (let i = 0; i < this._weapon1List.length; i++) { + const hero = this._weapon1List[i]; + if (Math.floor(Number(hero.herotype)) !== type) continue; + if (Math.floor(Number(hero.level)) !== lv) continue; + return Number(hero.id); + } + console.log('[WeaponCompose] 无五行英雄', type, lv); + return null; + } + /** 蟠桃树合成等级上限(读 Hero.level_limit);其它 weapon2 返回 1 */ getKeepDigTileMaxLevel(weapon2Id: number): number { this.load(); diff --git a/assets/script/battle/combat/TowerLoadoutService.ts b/assets/script/battle/combat/TowerLoadoutService.ts index 227618f..4b7c033 100644 --- a/assets/script/battle/combat/TowerLoadoutService.ts +++ b/assets/script/battle/combat/TowerLoadoutService.ts @@ -19,7 +19,7 @@ import type { TowerLoadout } from './TowerQueryTypes'; export type { TowerLoadout }; import { SkillAbilityBuilder } from '../config/baseAtk/SkillAbilityBuilder'; -import { heroNormalSkillId, heroUltSkillId } from '../config/BattleHeroTable'; +import { heroNormalSkillId, heroUltSkillId, isElementHero } from '../config/BattleHeroTable'; import { dumpKnifeFinalAttack, logKnifeBaseAttack } from '../debug/AtkDebugLogCore'; import { isAtkDebugWeapon } from '../debug/AtkDebugConstants'; import { getPassiveSkillHost } from './PassiveSkillRuntime'; @@ -38,21 +38,21 @@ export function setAiHeroWeaponResolver(resolver: ((heroId: number) => number | _aiHeroWeaponResolver = resolver; } -/** 解析英雄当前战斗武器 id(本机走装备;AI 走匹配档案掷骰) */ +/** 解析英雄当前战斗武器 id(本机走装备;AI 走匹配档案掷骰)。五行数字只用 herotype 预制体,不查 Weapon 表。 */ export function resolveHeroBattleWeaponId(heroId: number, player?: Player | null): number { + const hero = gg.data.table.getTableData(TableNames.Hero, heroId); + if (isElementHero(hero)) return 0; if (player && !player.isLocal) { if (_aiHeroWeaponResolver) { const aiId = _aiHeroWeaponResolver(heroId); if (typeof aiId === 'number' && aiId > 0) return aiId; } - const hero = gg.data.table.getTableData(TableNames.Hero, heroId); return Number(hero?.startweapon) || 0; } try { const id = gg.equip?.getHeroDisplayWeaponId?.(heroId); if (typeof id === 'number' && id > 0) return id; } catch { /* equip 未就绪 */ } - const hero = gg.data.table.getTableData(TableNames.Hero, heroId); return Number(hero?.startweapon) || 0; } diff --git a/assets/script/battle/combat/TowerStatResolver.ts b/assets/script/battle/combat/TowerStatResolver.ts index 9c305b9..87c3483 100644 --- a/assets/script/battle/combat/TowerStatResolver.ts +++ b/assets/script/battle/combat/TowerStatResolver.ts @@ -1,7 +1,8 @@ -import { heroNormalSkillId } from '../config/BattleHeroTable'; +import { heroNormalSkillId, isElementHero } from '../config/BattleHeroTable'; import { BattleMapSpec } from '../map/BattleMapSpec'; import { TableNames } from '../../game/ConfigTableData'; import type { TowerCombatStats } from './TowerQueryTypes'; +import { WeaponComposeConfigProvider } from '../bag/WeaponComposeConfigProvider'; /** 常量表「攻击力等级系数」id(对齐 ConstNumType.AtkLevelCoef) */ const CONST_ATK_LEVEL_COEF = 13; @@ -130,11 +131,18 @@ function rangeAddFromAtkBuff(raw: string | undefined): number { * @param battleWeaponId 战斗武器 id;AI/指定装载须传入,缺省才读本机 gg.equip */ export function deriveTowerSetupStats(w1: ITableHero, composeLevel: number, battleWeaponId?: number): TowerSetupStats { - if (!(w1.level_limit > 0)) { - console.log('[TowerStatResolver] Hero.level_limit 未配置', w1.id); + const compose = Math.max(1, Math.floor(composeLevel) || 1); + let effectiveLevel: number; + if (isElementHero(w1)) { + const cap = WeaponComposeConfigProvider.instance.getElementMaxLevel(Math.floor(Number(w1.herotype))); + effectiveLevel = Math.min(compose, cap); + } else { + if (!(w1.level_limit > 0)) { + console.log('[TowerStatResolver] Hero.level_limit 未配置', w1.id); + } + const levelLimit = w1.level_limit > 0 ? w1.level_limit : 1; + effectiveLevel = Math.min(compose, levelLimit); } - const levelLimit = w1.level_limit > 0 ? w1.level_limit : 1; - const effectiveLevel = Math.max(1, Math.min(composeLevel, levelLimit)); const weaponId = resolveSetupWeaponId(w1, battleWeaponId); const weaponRow = weaponId > 0 ? gg.data.table.getTableData(TableNames.Weapon, weaponId) diff --git a/assets/script/battle/config/BattleHeroTable.ts b/assets/script/battle/config/BattleHeroTable.ts index 993694c..850d602 100644 --- a/assets/script/battle/config/BattleHeroTable.ts +++ b/assets/script/battle/config/BattleHeroTable.ts @@ -54,6 +54,25 @@ export function isComboHero(hero: ITableHero): boolean { return Number(hero.herotype) === 2; } +/** 是否五行数字英雄(herotype 1–5) */ +export function isElementHero(hero: ITableHero | null | undefined): boolean { + if (!hero) return false; + const t = Math.floor(Number(hero.herotype)); + return t >= 1 && t <= 5; +} + +/** + * Hero.id 是否为五行战斗单位(有普攻)。 + * @param heroId Hero.id + */ +export function isElementCombatHeroId(heroId: number): boolean { + const id = Math.floor(Number(heroId) || 0); + if (!(id > 0)) return false; + const hero = gg.data.table.getTableData(TableNames.Hero, id); + if (!isElementHero(hero) || isNonCombatWeapon1(id)) return false; + return heroNormalSkillId(hero!, 1) > 0; +} + /** * 从塔实体解析 Hero.id(unitDefId / weapon1_ 标签)。 * @param world 战斗世界 diff --git a/assets/script/battle/config/LevelWaveParser.ts b/assets/script/battle/config/LevelWaveParser.ts index 7a5f0d9..2309a45 100644 --- a/assets/script/battle/config/LevelWaveParser.ts +++ b/assets/script/battle/config/LevelWaveParser.ts @@ -8,11 +8,11 @@ import { makeMonsterUnitDefId, } from './MonsterHpCalculator'; -/** 调试:双方出怪口不出小怪 */ -export const NO_SMALL_MONSTER = true; +/** 调试:双方出怪口不出小怪(正式出怪须为 false) */ +export const NO_SMALL_MONSTER = false; -/** 调试:双方出怪口不出 Boss */ -export const NO_BOSS = true; +/** 调试:双方出怪口不出 Boss(正式出怪须为 false) */ +export const NO_BOSS = false; /** Level.monster 单条:waveIndex,monsterId,count,spawnInterval */ export interface LevelMonsterWaveRow { diff --git a/assets/script/battle/heros/HeroActor.ts b/assets/script/battle/heros/HeroActor.ts index 4bbe4ea..add343d 100644 --- a/assets/script/battle/heros/HeroActor.ts +++ b/assets/script/battle/heros/HeroActor.ts @@ -1,6 +1,6 @@ import { _decorator, sp } from 'cc'; import type { EntityId } from 'db://assets/mx/module/ecs'; -import { isComboHero } from '../config/BattleHeroTable'; +import { isComboHero, isElementHero } from '../config/BattleHeroTable'; import { Skill } from '../skill/Skill'; import { HeroSkin } from '../view/HeroSkin'; import { TableNames } from '../../game/ConfigTableData'; @@ -71,7 +71,7 @@ export class HeroActor extends Skill { this._heroSkin?.playIdleAnim(); } - /** 绑定字形;组合英雄启用武器通道 */ + /** 绑定字形;五行 / 组合英雄启用武器通道 */ protected _bindChannel(): void { this._heroSkin = this.node.getComponent(HeroSkin); const data = this._heroSkin?.Data @@ -79,7 +79,7 @@ export class HeroActor extends Skill { ? gg.data.table.getTableData(TableNames.Hero, this._heroId) : null); this._heroId = Number(data?.id) || this._heroId; - const useWeapon = !!data && isComboHero(data); + const useWeapon = isElementHero(data) || (!!data && isComboHero(data)); this.visualChannel.bind(this._heroSkin, this.node, this._heroId, useWeapon); } diff --git a/assets/script/battle/map/legacy/MapAreaUnlock.ts b/assets/script/battle/map/legacy/MapAreaUnlock.ts index a2a682a..b230642 100644 --- a/assets/script/battle/map/legacy/MapAreaUnlock.ts +++ b/assets/script/battle/map/legacy/MapAreaUnlock.ts @@ -104,11 +104,31 @@ export class MapAreaUnlock { } /** - * 把英雄拖到当前解锁区域。类型 0 表示任意 herotype,等级须达到配置等级加段位加值。 + * 拖到当前解锁区域是否满足类型与等级(不改状态)。 + * 类型 0 表示任意 herotype,等级须达到配置等级加段位加值。 + */ + canDrag(grid: MapGrid, hero: AreaUnlockHero | null): boolean { + return this._probe(grid, hero) === 'unlocked'; + } + + /** + * 把英雄拖到当前解锁区域。条件与 canDrag 相同,成功则整区解锁。 * @param grid 落点格 * @param hero 拖动的英雄;没有对应英雄时传 null */ tryDrag(grid: MapGrid, hero: AreaUnlockHero | null): AreaUnlockDrag { + const hit = this._probe(grid, hero); + if (hit !== 'unlocked') return hit; + const index = this._indexOf(this.currentId()); + this._done[index] = true; + this._rollCurrent(); + return 'unlocked'; + } + + /** + * 解锁落点探测:skip 非解锁格;blocked 未轮到或类型/等级不符;unlocked 条件满足。 + */ + private _probe(grid: MapGrid, hero: AreaUnlockHero | null): AreaUnlockDrag { if (!grid?.isAreaUnlock) return 'skip'; const current = this.currentId(); if (current <= 0 || grid.unlockAreaId !== current) return 'blocked'; @@ -118,8 +138,6 @@ export class MapAreaUnlock { const typeOk = this._heroTypes[index] === 0 || hero.heroType === this._heroTypes[index]; const levelOk = hero.level >= this._needLevels[index]; if (!typeOk || !levelOk) return 'blocked'; - this._done[index] = true; - this._rollCurrent(); return 'unlocked'; } diff --git a/assets/script/battle/presentation/SkillVisualChannel.ts b/assets/script/battle/presentation/SkillVisualChannel.ts index 8ffb23f..c701aed 100644 --- a/assets/script/battle/presentation/SkillVisualChannel.ts +++ b/assets/script/battle/presentation/SkillVisualChannel.ts @@ -1,6 +1,6 @@ import type { EntityId } from 'db://assets/mx/module/ecs'; import { instantiate, Node, sp, UITransform, Vec3 } from 'cc'; -import { GBundle, GPath } from '../../game/ConfigRes'; +import { TableNames } from '../../game/ConfigTableData'; import { BattleMapSpec } from '../map/BattleMapSpec'; import { getTowerLoadoutService, resolveHeroBattleWeaponId } from '../combat/TowerLoadoutService'; import { SkillPresentationEnv } from '../skill/SkillPresentationEnv'; @@ -8,11 +8,12 @@ import { schedulePresentation } from '../skill/BattlePresentationClock'; import { SkillTransformDriver, computeAimAngleDeg } from '../skill/SkillTransformDriver'; import { worldPointAtAimAngle, computeArrowBowAimDeg, ARROW_BOW_OFFSET_DEG } from '../skill/SkillParentAim'; import { HeroSkin } from '../view/HeroSkin'; -import { HeroWeaponMount, WEAPON_REST_ANGLE, BOW_ATK_REST_ANGLE, BOW_RAIN_AIM_DEG } from '../view/HeroWeaponMount'; +import { HeroWeaponMount, WEAPON_REST_ANGLE, BOW_ATK_REST_ANGLE, BOW_RAIN_AIM_DEG, WEAPON_LEFT_OFFSET_PX } from '../view/HeroWeaponMount'; import { BattleSpinePlayback } from './BattleSpinePlayback'; import { glyphSpineHasSkin } from '../view/GlyphSpineSkin'; import { ensureSpineSkeletonDataRuntime } from 'db://assets/mx/module/lang/spineRuntimePatch'; import { BOW_ATK_ARROW_SPEED, SCATTER_RANGE_MUL, getBowAtkHost } from '../combat/BowAtkRuntime'; +import { GBundle, GPath } from '../../game/ConfigRes'; /** 默认命中相对攻击动画进度(@ timeScale=1) */ export const PRES_HIT_AT_BASE = 0.33; @@ -21,8 +22,6 @@ const BOW_RELEASE_AT_BASE = 0.4333; /** 拉弓表现上限(秒),与英雄弓一致 */ const BOW_ATTACK_MAX_SEC = 0.19; -/** 武器相对组合首字格中心再向左偏移(约 0.35 格) */ -const WEAPON_LEFT_OFFSET_PX = BattleMapSpec.CELL_SIZE * 0.35; /** 悟空主动武器动画:绕两字椭圆一圈 */ const WUKONG_SKILL_ANIM = '悟空技能'; /** 木吒主动武器动画 */ @@ -40,10 +39,16 @@ const JINGU_SKILL_HIT_AT = 0.8667; const WUKONG_ORBIT_RADIUS_Y = BattleMapSpec.CELL_SIZE * 0.5; /** 绕圈时长 = 动画时长减去该秒数 */ const WUKONG_ORBIT_TRIM_SEC = 0.3; -/** Weapon.type 刀 */ +/** Weapon.type 刀 / herotype 金 */ const WEAPON_TYPE_SWORD = 1; -/** Weapon.type 弓 */ +/** herotype 木 */ +const WEAPON_TYPE_WOOD = 2; +/** herotype 水 */ +const WEAPON_TYPE_STAFF = 3; +/** Weapon.type 弓 / herotype 火 */ const WEAPON_TYPE_BOW = 4; +/** herotype 土(老项目枪) */ +const WEAPON_TYPE_SPEAR = 5; /** 控制点沿出弓切线的路程比例(切线相对目标连线偏 ARROW_BOW_OFFSET_DEG) */ const BOW_ARROW_CTRL_T = 0.42; /** 连发固定三弹道,发次对 3 取余循环 */ @@ -60,6 +65,10 @@ const WEAPON_AIM_SEC = 0.2; const WEAPON_REST_HOLD_SEC = 1; /** @deprecated 保留别名;请用 WEAPON_AIM_SEC */ const BOW_AIM_SEC = WEAPON_AIM_SEC; +/** battleHero/prefab/skill/水弹 */ +const WATER_BALL_PREFAB = '水弹'; +/** 水弹飞行像素/秒(与弓箭同量级) */ +const WATER_BALL_SPEED = BOW_ATK_ARROW_SPEED; /** battleHero/prefab/skill/玉帝飞剑 */ const YUDI_FLY_SWORD_PREFAB = '玉帝飞剑'; /** 飞剑预制体默认动画(带光效) */ @@ -106,6 +115,39 @@ class VolleyFlyRecycle { } } +/** + * 水弹落地回池(类方法,避免函数内闭包)。 + */ +class WaterBallRecycle { + private static readonly _pool: WaterBallRecycle[] = []; + private _channel: SkillVisualChannel | null = null; + private _node: Node | null = null; + + /** 落地:回池水弹 */ + readonly onLand = (): void => { + const channel = this._channel; + const node = this._node; + this._channel = null; + this._node = null; + WaterBallRecycle._pool.push(this); + if (channel && node) channel.recycleWaterBall(node); + }; + + /** + * 取得绑定。 + * @param channel 表现通道 + * @param node 水弹 + */ + static obtain(channel: SkillVisualChannel, node: Node): WaterBallRecycle { + const rec = WaterBallRecycle._pool.length > 0 + ? WaterBallRecycle._pool.pop()! + : new WaterBallRecycle(); + rec._channel = channel; + rec._node = node; + return rec; + } +} + /** 待发射的弓箭 */ interface BowArrowLaunch { /** 代数,过期则丢弃 */ @@ -231,6 +273,27 @@ export class SkillVisualChannel { return this._lastThrowFlySec; } + /** 当前武器表现类型(Hero.herotype / Weapon.type) */ + private _visType(): number { + return this._weapon.weaponType; + } + + /** 金/木:只左右翻转 */ + private _isFlipWeapon(): boolean { + const t = this._visType(); + return t === WEAPON_TYPE_SWORD || t === WEAPON_TYPE_WOOD; + } + + /** 水:法杖不旋转 */ + private _isStaffWeapon(): boolean { + return this._visType() === WEAPON_TYPE_STAFF; + } + + /** 火:弓 */ + private _isBowWeapon(): boolean { + return this._visType() === WEAPON_TYPE_BOW; + } + /** * 释放动画倍速:hero/weapon/monster 固定 1;普攻跟攻速;显式 override 优先。 * @param caster 施法实体 @@ -258,9 +321,12 @@ export class SkillVisualChannel { if (!this._useWeapon) this._weapon.setVisible(false); } - /** 按塔 loadout / 归属玩家装备 / startweapon 挂载武器 */ + /** 按塔 loadout / 归属玩家装备 / startweapon 挂载武器;五行数字按 Hero.herotype */ ensureWeapon(): boolean { if (!this._useWeapon || !this._parent?.isValid || this._heroId <= 0) return false; + const hero = gg.data.table.getTableData(TableNames.Hero, this._heroId); + const ht = Math.floor(Number(hero?.herotype) || 0); + if (ht >= 1 && ht <= 5) return this._weapon.ensureByHeroType(this._parent, ht); let weaponId = 0; if (this._caster != null) { const loadout = getTowerLoadoutService().getLoadout(this._caster); @@ -310,11 +376,8 @@ export class SkillVisualChannel { this._weapon.setVisible(false); return false; } - // 刀立刻复位;枪/棍由回正插值到位,此处 resetAim 会打断插值 - const wt = this._weapon.weaponType; - if (wt === WEAPON_TYPE_SWORD || wt <= 0) { - this._weapon.resetAim(); - } + // 刀/木立刻复位左右;法杖保持预制体;枪回正走插值 + if (this._isFlipWeapon()) this._weapon.resetAim(); this._weapon.setVisible(this._weaponFlies.length === 0); this._weapon.playIdle(); return !!this._weapon.root?.active; @@ -380,7 +443,10 @@ export class SkillVisualChannel { this._castAnimParams = params; this._castAnimLeft = 0; this._lastThrowFlySec = 0; - const weaponAnim = String(params.animation ?? '').trim() || GLYPH_CAST_ANIM; + const weaponAnim = String(params.animation ?? '').trim(); + if (!weaponAnim) { + console.warn('[SkillVisualChannel] Skill.animation 为空', params.caster); + } const follow = params.followWeapon && this._useWeapon && this.ensureWeapon(); if (follow) { this._cancelRestHold(); @@ -389,21 +455,23 @@ export class SkillVisualChannel { this.syncWeaponPivot(params.caster); if (params.throwWeapon) { this._lastThrowFlySec = this._launchWeaponThrow(params.primaryTarget ?? 0); - } else if (this._weapon.weaponType === WEAPON_TYPE_BOW) { + } else if (this._isBowWeapon()) { this._weapon.showBowAtk(); } else if (this._weaponFlies.length === 0) { this._weapon.setVisible(true); } this._weaponCasting = true; - const bowAnimTs = this._weapon.weaponType === WEAPON_TYPE_BOW + const bowAnimTs = this._isBowWeapon() ? Math.max(animScale, BOW_RELEASE_AT_BASE / BOW_ATTACK_MAX_SEC) : animScale; const orbitStaff = this._isWukongSkillOrbit(params); if (params.keepRestAim || orbitStaff) { - this._weapon.resetAim(); - } else if (this._weapon.weaponType === WEAPON_TYPE_BOW) { + if (!this._isStaffWeapon()) this._weapon.resetAim(); + } else if (this._isBowWeapon()) { this._aimWeapon(params.primaryTarget, bowAnimTs, params.aimWorldX, params.aimWorldY, params.fixedAimDeg); if (!params.skipBowArrow) this._armBowArrow(params.primaryTarget, bowAnimTs); + } else if (this._isStaffWeapon()) { + /* 法杖不朝向 */ } else if (!params.throwWeapon) { this._aimWeapon(params.primaryTarget, animScale, params.aimWorldX, params.aimWorldY); } @@ -414,7 +482,7 @@ export class SkillVisualChannel { this._onFollowCastAllComplete(); return animScale; } - const held = this._weapon.weaponType === WEAPON_TYPE_BOW + const held = this._isBowWeapon() ? this._weapon.playBowDraw(bowAnimTs, this._onFollowCastAllComplete, weaponAnim) : this._weapon.playAttack(animScale, this._onFollowCastAllComplete, weaponAnim); if (!held) { @@ -432,7 +500,7 @@ export class SkillVisualChannel { return animScale; } this._castAnimLeft++; - const played = this._weapon.weaponType === WEAPON_TYPE_BOW + const played = this._isBowWeapon() ? this._weapon.playBowDraw(bowAnimTs, this._onCastAnimPartComplete, weaponAnim) : this._weapon.playAttack(animScale, this._onCastAnimPartComplete, weaponAnim); if (!played) { @@ -462,11 +530,10 @@ export class SkillVisualChannel { this.playIdle(); } - /** 弓/枪/棍等旋转武器回待机须插值;刀左右翻转立刻复位 */ + /** 弓/枪回待机须插值;刀/木立刻复位;法杖不转 */ private _shouldTweenRestAim(): boolean { - const t = this._weapon.weaponType; - if (t === WEAPON_TYPE_SWORD || t <= 0) return false; - return true; + const t = this._visType(); + return t === WEAPON_TYPE_BOW || t === WEAPON_TYPE_SPEAR; } /** 枪/棍:攻击2 定格末帧,1 秒内无下一刀再回待机(避免每刀闪回字形) */ @@ -536,7 +603,7 @@ export class SkillVisualChannel { this._weaponCasting = false; const aspd = Math.max(0.01, SkillPresentationEnv.getFinalAttackSpeed(params.caster)); const restScale = params.animTimeScale != null && params.animTimeScale > 0 ? params.animTimeScale : aspd; - if (this._weapon.weaponType === WEAPON_TYPE_BOW && this._weapon.bowAtkShowing) { + if (this._isBowWeapon() && this._weapon.bowAtkShowing) { this._weapon.freezeBowDraw(); this._restWeaponAim(restScale); } else if (this._shouldTweenRestAim()) { @@ -561,15 +628,20 @@ export class SkillVisualChannel { if (!root?.isValid || !parent?.isValid) return false; const id = caster ?? this._caster; const world = this._resolveFirstGlyphWorld(id, quiet); - if (!world) return false; + if (!world) { + if (this._weapon.weaponId <= 0) { + root.setPosition(-WEAPON_LEFT_OFFSET_PX, 0, 0); + return true; + } + return false; + } this._weaponWorld.set(world.x - WEAPON_LEFT_OFFSET_PX, world.y, world.z); parent.inverseTransformPoint(this._weaponWorld, this._weaponWorld); root.setPosition(this._weaponWorld); root.angle = 0; if (this._weapon.bowAtkShowing) this._weapon.syncBowAtkPivot(); // 仅刀在非施法时立刻复位;枪/棍回正走插值,此处 resetAim 会硬切 - if (!this._weaponCasting - && (this._weapon.weaponType === WEAPON_TYPE_SWORD || this._weapon.weaponType <= 0)) { + if (!this._weaponCasting && this._isFlipWeapon()) { this._weapon.resetAim(); } return true; @@ -583,7 +655,7 @@ export class SkillVisualChannel { if (String(params.skillKind ?? '') !== 'hero') return false; if (String(params.animation ?? '').trim() !== WUKONG_SKILL_ANIM) return false; if (params.throwWeapon) return false; - return this._weapon.weaponType !== WEAPON_TYPE_BOW; + return !this._isBowWeapon(); } /** @@ -686,7 +758,7 @@ export class SkillVisualChannel { landId: params?.projectileLandId ?? 0, onLand: params?.onProjectileLand ?? null, }); - const releaseAt = this._weapon.weaponType === WEAPON_TYPE_BOW ? BOW_RELEASE_AT_BASE : PRES_HIT_AT_BASE; + const releaseAt = this._isBowWeapon() ? BOW_RELEASE_AT_BASE : PRES_HIT_AT_BASE; schedulePresentation(releaseAt / Math.max(0.01, aspd), this._onBowLaunchDue); } @@ -716,7 +788,7 @@ export class SkillVisualChannel { if (job.onLand) job.onLand(job.target, job.landId); return; } - if (this._weapon.weaponType === WEAPON_TYPE_BOW) { + if (this._isBowWeapon()) { this._launchBowArrow(job.target, job.landId, job.onLand); } else { this._launchWeaponThrow(job.target); @@ -823,7 +895,15 @@ export class SkillVisualChannel { */ resolveBowShapeLaunchDelay(animScale: number): number { const scale = Math.max(0.01, animScale); - if (this._weapon.weaponType === WEAPON_TYPE_BOW) { + if (this._isStaffWeapon()) { + const name = String(this._castAnimParams?.animation ?? '').trim(); + const anim = this._weapon.skinAnim; + const dur = name && anim?.isValid ? BattleSpinePlayback.getAnimDuration(anim, name) : null; + if (dur != null && dur > 0) return dur / scale; + console.warn('[SkillVisualChannel] 水弹出手延迟无动画时长', name); + return PRES_HIT_AT_BASE / scale; + } + if (this._isBowWeapon()) { const bowTs = Math.max(scale, BOW_RELEASE_AT_BASE / BOW_ATTACK_MAX_SEC); return BOW_RELEASE_AT_BASE / bowTs; } @@ -843,7 +923,10 @@ export class SkillVisualChannel { * @returns 是否发出 */ launchVolleyShot(caster: EntityId, abilityId: string, target: EntityId, scale: number, buff1: string, buff2: string, shotIndex: number, aimWorld: Readonly): boolean { - if (this._weapon.weaponType === WEAPON_TYPE_BOW && !this._weapon.bowAtkShowing) { + if (this._isStaffWeapon()) { + return this._launchWaterBall(caster, abilityId, target, scale, buff1, buff2, aimWorld); + } + if (this._isBowWeapon() && !this._weapon.bowAtkShowing) { this._weapon.showBowAtk(); } this._weaponCasting = true; @@ -909,6 +992,14 @@ export class SkillVisualChannel { this._recycleBowArrow(node); } + /** + * 回收飞行水弹。 + * @param node 水弹根 + */ + recycleWaterBall(node: Node): void { + this._recycleWeaponFly(node); + } + /** * 克隆箭到飞行层。 * @param fromWorld 起点世界坐标 @@ -1028,6 +1119,92 @@ export class SkillVisualChannel { if (onLand) onLand(target, landId); } + /** + * 法杖普攻:实例化「水弹」直线飞向目标,落地结算。 + * @param caster 施法者 + * @param abilityId Ability id + * @param target 锁定目标 + * @param scale 伤害倍率 + * @param buff1 atk_buff1 + * @param buff2 atk_buff2 + * @param aimWorld 瞄准点 + * @returns 是否发出 + */ + private _launchWaterBall(caster: EntityId, abilityId: string, target: EntityId, scale: number, buff1: string, buff2: string, aimWorld: Readonly): boolean { + this._weaponCasting = true; + const fromNode = this._weapon.skinAnim?.node ?? this._weapon.aim ?? this._weapon.root; + if (!fromNode?.isValid) { + console.log('[SkillVisualChannel] 水弹无起点'); + return false; + } + const live = target > 0 ? SkillPresentationEnv.getTargetWorldPos(target) : null; + const to = live ?? aimWorld; + if (!to) { + console.log('[SkillVisualChannel] 水弹无目标坐标', target); + return false; + } + this._arrowFrom.set(fromNode.worldPosition); + this._arrowTo.set(to); + const dist = Vec3.distance(this._arrowFrom, this._arrowTo); + const duration = Math.max(0.12, dist / WATER_BALL_SPEED); + const node = this._spawnWaterBall(this._arrowFrom); + if (!node) return false; + SkillTransformDriver.animateParabola({ + node, + duration, + fromWorld: this._arrowFrom, + toWorld: this._arrowTo, + arcHeight: 0, + easing: SkillTransformDriver.easeLinear, + faceTangent: true, + }); + const land = WaterBallRecycle.obtain(this, node); + getBowAtkHost().spawnVolley({ + caster, + target, + abilityId, + wait: duration, + scale, + buff1, + buff2, + onLand: land.onLand, + }); + return true; + } + + /** + * 取出「水弹」挂到飞行层。 + * @param fromWorld 起点 + */ + private _spawnWaterBall(fromWorld: Readonly): Node | null { + const flyLayer = SkillPresentationEnv.flyLayer; + if (!flyLayer?.isValid) { + console.log('[SkillVisualChannel] 水弹无飞行层'); + return null; + } + let node: Node | null = null; + try { + node = gg.res.getNode(GPath.HeroSkillPrefab(), WATER_BALL_PREFAB, GBundle.BattleHero); + } catch (e) { + console.log('[SkillVisualChannel] 水弹加载异常', String(e)); + return null; + } + if (!node?.isValid) { + console.log('[SkillVisualChannel] 水弹预制体未加载'); + return null; + } + flyLayer.active = true; + node.parent = flyLayer; + node.active = true; + node.layer = flyLayer.layer; + const flyUt = flyLayer.getComponent(UITransform); + if (flyUt) node.setPosition(flyUt.convertToNodeSpaceAR(fromWorld)); + else node.setWorldPosition(fromWorld); + node.setSiblingIndex(flyLayer.children.length - 1); + this._weaponFlies.push(node); + return node; + } + /** * 取出玉帝飞剑,根节点沿抛物线切线飞向目标。 * @param target 主目标 @@ -1303,11 +1480,12 @@ export class SkillVisualChannel { * @param fixedAimDeg 固定朝向(优先) */ private _aimWeapon(primaryTarget: EntityId | null, aspd: number, aimWorldX?: number, aimWorldY?: number, fixedAimDeg?: number): void { - if (this._weapon.weaponType === WEAPON_TYPE_BOW && this._weapon.bowAtkShowing && fixedAimDeg != null && Number.isFinite(fixedAimDeg)) { + if (this._isStaffWeapon()) return; + if (this._isBowWeapon() && this._weapon.bowAtkShowing && fixedAimDeg != null && Number.isFinite(fixedAimDeg)) { this._tweenWeaponAim(fixedAimDeg, WEAPON_AIM_SEC / Math.max(0.01, aspd)); return; } - const aimNode = this._weapon.weaponType === WEAPON_TYPE_BOW && this._weapon.bowAtkShowing + const aimNode = this._isBowWeapon() && this._weapon.bowAtkShowing ? (this._weapon.bowAtkRoot ?? this._weapon.aim) : this._weapon.aim; if (!aimNode?.isValid) { @@ -1325,18 +1503,18 @@ export class SkillVisualChannel { if (!targetWorld) { targetWorld = worldPointAtAimAngle(pivotWorld, WEAPON_REST_ANGLE, 200); } - if (this._weapon.weaponType === WEAPON_TYPE_SWORD) { + if (this._isFlipWeapon()) { this._weapon.aimByTargetX(targetWorld.x); return; } - const aim = this._weapon.weaponType === WEAPON_TYPE_BOW && !this._aimDirect + const aim = this._isBowWeapon() && !this._aimDirect ? computeArrowBowAimDeg(pivotWorld, targetWorld) : computeAimAngleDeg(pivotWorld, targetWorld); if (aim == null) { console.log('[SkillVisualChannel] 武器朝向为零', this._weapon.weaponId); return; } - // 弓转攻效根;枪/棍等转 weapon 节点,均插值,禁止硬切 + // 弓转攻效根;枪转 weapon 节点,均插值,禁止硬切 this._tweenWeaponAim(aim, WEAPON_AIM_SEC / Math.max(0.01, aspd)); } @@ -1349,7 +1527,7 @@ export class SkillVisualChannel { */ private _restWeaponAim(aspd: number): void { const duration = WEAPON_AIM_SEC / Math.max(0.01, aspd); - if (this._weapon.weaponType === WEAPON_TYPE_BOW) { + if (this._isBowWeapon()) { if (this._weapon.bowAtkShowing) { const fromDeg = this._weapon.bowAtkRoot?.angle ?? BOW_ATK_REST_ANGLE; if (this._weapon.bowAtkRoot?.isValid) { @@ -1363,11 +1541,11 @@ export class SkillVisualChannel { this._tweenWeaponAim(WEAPON_REST_ANGLE, duration, this._onWeaponAimRestCompleteBound); return; } - if (this._weapon.weaponType === WEAPON_TYPE_SWORD) { + if (this._isFlipWeapon() || this._isStaffWeapon()) { this._weapon.resetAim(); return; } - // 枪/棍等:从当前瞄准角插值回待机角,到位后再播待机 + // 枪:从当前瞄准角插值回待机角,到位后再播待机 this._tweenWeaponAim(WEAPON_REST_ANGLE, duration, this._onWeaponAimRestCompleteBound); } diff --git a/assets/script/battle/res/BattleHeroResCollector.ts b/assets/script/battle/res/BattleHeroResCollector.ts index b6b359a..c416bfb 100644 --- a/assets/script/battle/res/BattleHeroResCollector.ts +++ b/assets/script/battle/res/BattleHeroResCollector.ts @@ -10,7 +10,7 @@ export const BATTLE_HERO_BODY_PATH = 'prefab/hero'; /** 攻效预制体目录(枪/棍/弓等独立攻击 prefab) */ export const BATTLE_HERO_SKILL_PATH = 'prefab/skill'; -/** 组合英雄武器类型预制体目录 */ +/** 武器类型预制体目录(weaponType1–5) */ export const BATTLE_HERO_WEAPON_PATH = 'prefab/weapon'; /** 局内 buff 预制体目录(缚仙网 / 乾坤袋 / 文昌笔等) */ @@ -19,7 +19,7 @@ export const BATTLE_HERO_BUFF_PATH = 'prefab/buff/'; /** battleGameMonster 怪物皮肤目录 */ export const BATTLE_MONSTER_SKIN_PATH = 'prefab/monster'; -/** 进战阻塞包:英雄体 + 攻效 + buff(武器目录进局后再静默补) */ +/** 进战阻塞包:英雄体 + 攻效 + buff + 武器类型预制体 */ export function appendBattleHeroDirLoads(resPkg: ResPakage): void { if (!resPkg.dirs) { resPkg.dirs = []; @@ -28,6 +28,7 @@ export function appendBattleHeroDirLoads(resPkg: ResPakage): void { { bundle: BATTLE_HERO_BUNDLE, path: BATTLE_HERO_BODY_PATH, type: Prefab }, { bundle: BATTLE_HERO_BUNDLE, path: BATTLE_HERO_SKILL_PATH, type: Prefab }, { bundle: BATTLE_HERO_BUNDLE, path: BATTLE_HERO_BUFF_PATH, type: Prefab }, + { bundle: BATTLE_HERO_BUNDLE, path: BATTLE_HERO_WEAPON_PATH, type: Prefab }, ]; for (const dir of dirs) { resPkg.dirs.push(dir); diff --git a/assets/script/battle/skill/SkillController.ts b/assets/script/battle/skill/SkillController.ts index ee1ac33..6f46fbb 100644 --- a/assets/script/battle/skill/SkillController.ts +++ b/assets/script/battle/skill/SkillController.ts @@ -22,6 +22,7 @@ import { BattleAudio } from '../audio/BattleAudio'; import { SkillNameFloater, ULT_SKILL_RELEASE_DELAY_SEC } from './SkillNameFloater'; import { HeroActorHost } from '../heros/HeroActorHost'; import { isHeroActorWeapon1 } from '../heros/HeroActorRes'; +import { isElementCombatHeroId } from '../config/BattleHeroTable'; import { ensureSpecialSkillPresenters } from '../presentation/SpecialSkillPresenters'; import { getNezhaChargeHost } from '../presentation/NezhaChargePresenter'; import { getPagodaSmashHost } from '../presentation/PagodaSmashPresenter'; @@ -394,13 +395,13 @@ export class SkillController extends Component { */ private _shouldRetrySkillBind(entityId: EntityId): boolean { const loadout = getTowerLoadoutService().getLoadout(entityId); - if (loadout && !isHeroActorWeapon1(loadout.weapon1Id)) return false; + if (loadout && !isHeroActorWeapon1(loadout.weapon1Id) && !isElementCombatHeroId(loadout.weapon1Id)) return false; const session = this._match?.session; const player = this._player; const map = this._map; if (!session || !player || !map) return true; const comp = findCompositionForEntity(entityId, player, session, map); - if (comp && !isHeroActorWeapon1(comp.weapon1Id)) return false; + if (comp && !isHeroActorWeapon1(comp.weapon1Id) && !isElementCombatHeroId(comp.weapon1Id)) return false; return true; } @@ -418,7 +419,16 @@ export class SkillController extends Component { if (!session || !player || !map) return null; const comp = findCompositionForEntity(entityId, player, session, map); - if (!comp || !isHeroActorWeapon1(comp.weapon1Id)) return null; + if (!comp) return null; + if (isElementCombatHeroId(comp.weapon1Id)) { + const gridIndex = this._resolveGridIndex(entityId); + const grid = gridIndex != null ? this._mapGrids?.get(gridIndex) : null; + const skill = grid?.ensureNumberSkill(comp.weapon1Id, entityId) ?? null; + if (!skill?.isValid) return null; + this.registerEntitySkill(entityId, skill.node); + return this._skills.get(entityId) ?? skill; + } + if (!isHeroActorWeapon1(comp.weapon1Id)) return null; HeroActorHost.instance.syncFromMap(entityId, comp, map, !player.isLocal); const created = HeroActorHost.instance.getActor(entityId); diff --git a/assets/script/battle/view/HeroWeaponMount.ts b/assets/script/battle/view/HeroWeaponMount.ts index 5218ea2..12408e6 100644 --- a/assets/script/battle/view/HeroWeaponMount.ts +++ b/assets/script/battle/view/HeroWeaponMount.ts @@ -3,15 +3,17 @@ import { ensureSpineSkeletonDataRuntime } from 'db://assets/mx/module/lang/spine import { GBundle } from '../../game/ConfigRes'; import { TableNames } from '../../game/ConfigTableData'; import { BattleSpinePlayback } from '../presentation/BattleSpinePlayback'; +import { BattleMapSpec } from '../map/BattleMapSpec'; import { applyWeaponSpineSkin, spineSkinName } from './GlyphSpineSkin'; -/** 武器类型 → 预制体名(Weapon.type:1 刀 / 2 枪 / 3 棍 / 4 弓) */ +/** 武器类型 → 预制体名(Hero.herotype / Weapon.type:1–5) */ const WEAPON_TYPE_PREFAB: ReadonlyArray = [ '', 'weaponType1', 'weaponType2', 'weaponType3', 'weaponType4', + 'weaponType5', ]; const WEAPON_PREFAB_PATH = 'prefab/weapon/'; @@ -24,25 +26,32 @@ const NODE_PROJECTILE_ANIM = 'anim'; /** weapon 节点:刀左右翻转,其余旋转朝向 */ const AIM_NODE = 'weapon'; const SKIN_NODE = 'skin'; +/** 技能动画节点(优先于 skin) */ +const ANIM_NODE = 'anim'; /** 弓投掷物节点(weaponType4 / weapon 下) */ const ARROW_NODE = '箭'; -/** Weapon.type 刀 */ +/** Weapon.type / herotype 刀、金 */ const WEAPON_TYPE_SWORD = 1; -/** Weapon.type 弓 */ +/** herotype 木:与刀相同只左右翻转 */ +const WEAPON_TYPE_WOOD = 2; +/** herotype 水:法杖不旋转 */ +const WEAPON_TYPE_STAFF = 3; +/** Weapon.type / herotype 弓、火 */ const WEAPON_TYPE_BOW = 4; const SPINE_ATTACK_DEFAULT = '攻击'; const SPINE_IDLE = '待机'; -/** 四套 weaponType* 的 weapon 节点待机角(预制体 euler.z) */ +/** weaponType* 的 weapon 节点待机角(预制体 euler.z) */ export const WEAPON_REST_ANGLE = 180; +/** 相对格心再向左(约 0.35 格,与老项目组合武器一致) */ +export const WEAPON_LEFT_OFFSET_PX = BattleMapSpec.CELL_SIZE * 0.35; /** 「武器弓-攻击」根节点待机角(预制体 euler.z,拉弓动画本地角不动) */ export const BOW_ATK_REST_ANGLE = 0; /** 万箭齐发:武器弓-攻击朝上 */ export const BOW_RAIN_AIM_DEG = 90; /** - * 组合英雄战斗武器挂载:按 Weapon.type 加载 weaponType*,按 Weapon.skin 切肤。 + * 战斗武器挂载:Weapon.type 或 Hero.herotype 对应 weaponType*。 * 弓攻击藏 weaponType4,改显「武器弓-攻击」;朝向只转该根节点,不改拉弓动画本地角。 - * 拉弓动画与投掷物/anim 套当前 Weapon.skin。 */ export class HeroWeaponMount { private _root: Node | null = null; @@ -94,11 +103,16 @@ export class HeroWeaponMount { return this._weaponId; } - /** 当前武器类型(1–4) */ + /** 当前武器类型(1–5);无武器表行时为 herotype */ get weaponType(): number { return this._type; } + /** Weapon 表类型;五行挂载(无 weaponId)为 0,避免当成刀/弓 */ + get tableWeaponType(): number { + return this._weaponId > 0 ? this._type : 0; + } + /** 当前 Weapon.skin */ get skinName(): string { return this._skinName; @@ -163,9 +177,9 @@ export class HeroWeaponMount { this.release(); return false; } - this._skinAnim = this._aim.getChildByName(SKIN_NODE)?.getComponent(sp.Skeleton) ?? null; + this._skinAnim = this._resolveAnimSpine(root); if (!this._skinAnim?.isValid) { - console.error('[HeroWeaponMount] 缺少 skin/Spine', prefabName); + console.error('[HeroWeaponMount] 缺少 anim/skin Spine', prefabName); this.release(); return false; } @@ -177,11 +191,69 @@ export class HeroWeaponMount { return true; } - /** 朝向节点转回预制体待机角;刀额外把 scale.x 复原为 1 */ + /** + * 按 Hero.herotype 挂 weaponType*(五行数字,不查 Weapon 表、不套装备皮)。 + * @param parent 挂点 + * @param herotype Hero.herotype(1–5) + */ + ensureByHeroType(parent: Node, herotype: number): boolean { + if (!parent?.isValid) { + console.error('[HeroWeaponMount] parent 无效'); + return false; + } + const type = Math.floor(Number(herotype) || 0); + const prefabName = WEAPON_TYPE_PREFAB[type] ?? ''; + if (!prefabName) { + console.error('[HeroWeaponMount] 不支持的 herotype', herotype); + return false; + } + if (this._root?.isValid && this._type === type && this._weaponId <= 0) { + if (this._root.parent !== parent) this._root.parent = parent; + this._root.setPosition(-WEAPON_LEFT_OFFSET_PX, 0, 0); + if (type === WEAPON_TYPE_BOW) { + if (!this._arrow?.isValid) this._bindArrow(); + this._ensureBowAtkPrefab(); + } + return !!this._skinAnim?.isValid; + } + this.release(); + const root = gg.res.getNode(WEAPON_PREFAB_PATH, prefabName, GBundle.BattleHero); + if (!root?.isValid) { + console.error('[HeroWeaponMount] 预制体未加载', prefabName); + return false; + } + root.parent = parent; + root.setPosition(-WEAPON_LEFT_OFFSET_PX, 0, 0); + root.active = false; + this._root = root; + this._type = type; + this._weaponId = 0; + this._aim = root.getChildByName(AIM_NODE); + if (!this._aim?.isValid) { + console.error('[HeroWeaponMount] 缺少 weapon 朝向节点', prefabName); + this.release(); + return false; + } + this._skinAnim = this._resolveAnimSpine(root); + if (!this._skinAnim?.isValid) { + console.error('[HeroWeaponMount] 缺少 anim/skin Spine', prefabName); + this.release(); + return false; + } + const sd = this._skinAnim.skeletonData; + if (sd?.isValid) ensureSpineSkeletonDataRuntime(sd); + this._bindArrow(); + if (type === WEAPON_TYPE_BOW) this._ensureBowAtkPrefab(); + if (type !== WEAPON_TYPE_STAFF) this.resetAim(); + return true; + } + + /** 朝向节点转回待机角;刀/木复位左右缩放。水弹法杖不改预制体角 */ resetAim(): void { if (!this._aim?.isValid) return; + if (this._type === WEAPON_TYPE_STAFF) return; this._aim.angle = WEAPON_REST_ANGLE; - if (this._type === WEAPON_TYPE_SWORD) this._setAimScaleX(1); + if (this._isFlipType()) this._setAimScaleX(1); } /** @@ -193,13 +265,13 @@ export class HeroWeaponMount { } /** - * 刀:保持待机角,按目标左右翻转 weapon.scale.x(左=1,右=-1)。 + * 刀/木:保持待机角,按目标左右翻转 weapon.scale.x(左=1,右=-1)。 * @param targetWorldX 目标世界 X */ aimByTargetX(targetWorldX: number): void { if (!this._aim?.isValid) return; - if (this._type !== WEAPON_TYPE_SWORD) { - console.log('[HeroWeaponMount] aimByTargetX 仅刀', this._type, 'weaponId=', this._weaponId); + if (!this._isFlipType()) { + console.log('[HeroWeaponMount] aimByTargetX 仅刀/木', this._type, 'weaponId=', this._weaponId); return; } this._aim.angle = WEAPON_REST_ANGLE; @@ -224,15 +296,21 @@ export class HeroWeaponMount { return this._playNamed(name, false, timeScale, onComplete); } - /** 播放武器待机(无则停在 setup) */ + /** 播放武器待机(无「待机」则播预制体 defaultAnimation) */ playIdle(timeScale: number = 1): void { this.hideBowAtk(true); this.setArrowVisible(false); const anim = this._skinAnim; if (!anim?.isValid) return; if (BattleSpinePlayback.play(anim, SPINE_IDLE, { loop: true, timeScale, optional: true })) return; - BattleSpinePlayback.clearPendingComplete(anim); - BattleSpinePlayback.resetTracks(anim); + const fallback = String(anim.animation ?? '').trim(); + if (fallback && BattleSpinePlayback.play(anim, fallback, { loop: true, timeScale, optional: true })) { + if (fallback !== SPINE_IDLE) { + console.warn('[HeroWeaponMount] 无待机,改播预制体默认动画', fallback, 'type=', this._type); + } + return; + } + console.warn('[HeroWeaponMount] 待机未起播', this._type, this._weaponId, fallback); } /** @@ -502,6 +580,23 @@ export class HeroWeaponMount { this._aim.setScale(x, this._aim.scale.y, this._aim.scale.z); } + /** 刀、木:只左右翻转,不旋转 */ + private _isFlipType(): boolean { + return this._type === WEAPON_TYPE_SWORD || this._type === WEAPON_TYPE_WOOD; + } + + /** + * 技能动画 Spine:优先 weapon/anim 或根 anim,否则 weapon/skin。 + * @param root 武器预制体根 + */ + private _resolveAnimSpine(root: Node): sp.Skeleton | null { + const aim = this._aim; + const node = (aim?.isValid ? aim.getChildByName(ANIM_NODE) : null) + ?? root.getChildByName(ANIM_NODE) + ?? (aim?.isValid ? aim.getChildByName(SKIN_NODE) : null); + return node?.getComponent(sp.Skeleton) ?? null; + } + private _playNamed( name: string, loop: boolean, diff --git a/assets/script/battle/view/MapDragGuideHelper.ts b/assets/script/battle/view/MapDragGuideHelper.ts index 32a4f7d..383c266 100644 --- a/assets/script/battle/view/MapDragGuideHelper.ts +++ b/assets/script/battle/view/MapDragGuideHelper.ts @@ -78,7 +78,7 @@ export class MapDragGuideHelper { } /** - * 引导加号语义:普通字仅空 Put 为 valid;蟠桃树空 Dig/Put 为 valid。 + * 引导加号语义:五行字空 Put 为 valid;待解锁格须类型(0 任意)与显示等级都达标。 * 已有字块的格不显示 +(升级目标由 isBagDropLineTarget / hover 单独放行)。 */ static getMapDragDropState( @@ -117,6 +117,9 @@ export class MapDragGuideHelper { } if (mg.waitingUnlock && !hasTile) { if (!session.validator.isAllowedCampForPlace(gridIndex)) return 'blocked'; + if (!source || !session.canUnlockArea(gridIndex, source.weapon2Id, source.level)) { + return 'none'; + } return 'valid'; } if (mg.isCanWalk || mg.isCanBeDig) return 'blocked'; diff --git a/assets/script/battle/view/TextGrid.ts b/assets/script/battle/view/TextGrid.ts index 6bf3a66..ffebdea 100644 --- a/assets/script/battle/view/TextGrid.ts +++ b/assets/script/battle/view/TextGrid.ts @@ -22,6 +22,7 @@ import { ensureSpineSkeletonDataRuntime } from 'db://assets/mx/module/lang/spine import { HERO_GLYPH_RESOURCES, isHeroActorWeapon1, YING_WEAPON1_ID } from '../heros/HeroActorRes'; import { aiPlaceCampForPlayer } from '../ai/runtime/AiCampArea'; import { HeroActorHost } from '../heros/HeroActorHost'; +import { HeroActor } from '../heros/HeroActor'; import { ClientErrorReporter } from '../../../mx/tools/ClientErrorReporter'; import { applyGlyphSpineSkin, @@ -157,6 +158,7 @@ export interface TextGridData extends TileEntitySnapshot { /** * 背包/地图字块视图(textGrid 预制体)。 * 五行字:不显示 lv;按 Hero(herotype=Text.type, level=当前显示等级).number 打开同名节点,并切金/木/水/火/土皮。 + * 地图激活后按当前 Hero.herotype 挂 weaponType*。 * 铲:显示「铲」节点;蟠桃树(102):显示「桃/桃树」Spine。 */ @ccclass('TextGrid') @@ -1105,6 +1107,7 @@ export class TextGrid extends Component { this._shovelDigScheduleGen++; this._shovelDigComplete = null; this._releaseYingCampDisplay(); + this.releaseNumberSkill(); this.clearPositiveBuffFx(); this.clearSleepFx(); this.clearConfusionFx(); @@ -1166,6 +1169,7 @@ export class TextGrid extends Component { } onDestroy(): void { + this.releaseNumberSkill(); this.clearPositiveBuffFx(); this.clearSleepFx(); this.clearConfusionFx(); @@ -2329,10 +2333,12 @@ export class TextGrid extends Component { this._hideLevelLabel(); if (!this._isElementNumberTile()) { this._hideNumberNodes(); + this._syncNumberSkill(); return; } const yingCover = !!this._yingCampDisplay?.isValid && this._yingCampDisplay.active; this._applyNumberGlyph(!this._shouldHideGridSkin() && !yingCover); + this._syncNumberSkill(); } /** 显示等级:以 setData 写入的 level 为准(与 tile / 组合数据同步) */ @@ -2510,6 +2516,7 @@ export class TextGrid extends Component { /** 地图字块已组合为攻击单位 → 激活;拆开或未组合 → 关闭;组合字切换 Spine 皮肤 */ private _syncSkillActiveState(): void { this._syncShadow(); + this._syncNumberSkill(); if (this._isPeachTreeTile()) return; if (this._isShovelTile() && !this._isElementNumberTile()) return; const composition = this._getComposition(); @@ -2689,6 +2696,59 @@ export class TextGrid extends Component { this._applySkinSpineIcon(this._skinIconName); } + /** + * 地图五行数字挂 HeroActor:普攻走 Skill 表,武器播 Skill.animation。 + * @param heroId Hero.id + * @param entityId 塔实体 + */ + ensureNumberSkill(heroId: number, entityId: EntityId): Skill | null { + if (!this._isElementNumberTile() || this.location?.kind !== 'map') return null; + const hid = Math.floor(Number(heroId) || 0); + if (!(hid > 0)) return null; + let actor = this.getComponent(HeroActor); + if (!actor) actor = this.addComponent(HeroActor); + actor.setHeroId(hid); + actor.bindEntity(entityId); + if (!actor.isActive) { + actor.isActive = true; + actor.onUpdateActive(true); + } else if (!actor.isPresentationBusy()) { + actor.onIdle(); + } + return actor; + } + + /** 收回背包或换非五行字时拆掉数字 HeroActor */ + releaseNumberSkill(): void { + const actor = this.getComponent(HeroActor); + if (!actor) return; + actor.isActive = false; + actor.onUpdateActive(false); + actor.visualChannel.release(); + actor.destroy(); + } + + /** 地图激活数字:对账 HeroActor 与武器 */ + private _syncNumberSkill(): void { + const onMap = this._isElementNumberTile() && this.location?.kind === 'map'; + if (!onMap) { + this.releaseNumberSkill(); + return; + } + const herotype = Math.floor(Number(this._entity?.tile?.type)); + const hero = this._heroByTypeLevel(herotype, this._resolveDisplayLevel()); + if (!hero) { + this.releaseNumberSkill(); + return; + } + const loc = this.location; + const entityId = loc?.kind === 'map' + ? TowerQueryService.instance.getRuntimeByGridIndex(loc.gridIndex)?.entityId ?? null + : null; + if (entityId == null) return; + this.ensureNumberSkill(hero.id, entityId); + } + /** 当前字块在地图上且属于有效组合(含单格 Weapon1) */ private _isMapComposedAttackUnit(): boolean { const loc = this.location; diff --git a/assets/script/game/ResPkgBuilder.ts b/assets/script/game/ResPkgBuilder.ts index 613dca3..30e88c3 100644 --- a/assets/script/game/ResPkgBuilder.ts +++ b/assets/script/game/ResPkgBuilder.ts @@ -5,8 +5,6 @@ import { ChapterLevelBuilder } from '../battle/config/ChapterLevelBuilder'; import { appendBattleHeroDirLoads, appendBattleMonsterDirLoad, - BATTLE_HERO_BUNDLE, - BATTLE_HERO_WEAPON_PATH, } from '../battle/res/BattleHeroResCollector'; /** 战斗分包名(与 GBundle 一致,避免 ConfigRes 循环依赖) */ @@ -92,7 +90,6 @@ export class ResPkgBuilder { { bundle: B.BattleGame, path: PrefabPath, name: '受击特效' }, { bundle: B.BattleGame, path: PrefabPath, name: '受击刀痕' }, { bundle: B.BattleGame, path: PrefabPath, name: '死亡' }, - { bundle: BATTLE_HERO_BUNDLE, path: BATTLE_HERO_WEAPON_PATH }, ]; } diff --git a/assets/script/ui/BattleGame/UIBattleGame.ts b/assets/script/ui/BattleGame/UIBattleGame.ts index 19240d6..3ca2047 100644 --- a/assets/script/ui/BattleGame/UIBattleGame.ts +++ b/assets/script/ui/BattleGame/UIBattleGame.ts @@ -69,6 +69,8 @@ import { BattleFirstGuidePresenter } from './BattleFirstGuidePresenter'; import { LangTxt } from 'db://assets/mx/module/lang/LangTxt'; import { ClientErrorReporter } from '../../../mx/tools/ClientErrorReporter'; import { PerfSampler } from '../../game/PerfSampler'; +import { isElementGlyphType, MergeEventType, type MergeEvent } from 'db://assets/mx/module/merge'; +import { WeaponComposeConfigProvider } from '../../battle/bag/WeaponComposeConfigProvider'; const { ccclass } = _decorator; @@ -419,15 +421,41 @@ export class UIBattleGame extends Auto_BattleGame { getBattleGameMonsterCrisisHintPresenter().bind(battle, map); this._firstGuide.bind(this.ui_guide, battle.bagSession); PerfSampler.beginBattle(); + this._listenFirstPlaceCombat(); + this._refreshWaveUi(); + } - if (!this._combatStarted) { - this._combatStarted = true; - gg.battle.startCombat(); - this._refreshWaveUi(); + /** 开局不立刻出怪:等本机玩家第一次把数字放到地图后再 startCombat */ + private _listenFirstPlaceCombat(): void { + this._unbindFirstPlaceCombat(); + const bag = this._battle?.bagSession; + if (!bag) { + console.error('[UIBattleGame] 无背包会话,无法按首次放字开怪'); + return; } - this._refreshWaveUi(); + bag.on(MergeEventType.TilePlaced, this._onFirstPlayerNumberPlaced); + } + + /** 卸掉首次放字开怪监听 */ + private _unbindFirstPlaceCombat(): void { + this._battle?.bagSession?.off(MergeEventType.TilePlaced, this._onFirstPlayerNumberPlaced); } + /** + * 本机首次放下五行数字后开波。 + * @param event 地图落子事件 + */ + private readonly _onFirstPlayerNumberPlaced = (event: MergeEvent): void => { + if (this._combatStarted) return; + if (event.type !== MergeEventType.TilePlaced) return; + const tileType = Math.floor(Number(WeaponComposeConfigProvider.instance.getWeapon2Type(event.weapon2Id))); + if (!isElementGlyphType(tileType)) return; + this._unbindFirstPlaceCombat(); + this._combatStarted = true; + gg.battle.startCombat(); + this._refreshWaveUi(); + }; + /** 绑定 HitAfter/Buff/死亡等战斗事件(须在 monsterPresenter 之后) */ private _bindBattleEvents(battle: ProjectBattleHandle): void { if (this._onBattleEventBound) { @@ -1139,6 +1167,7 @@ export class UIBattleGame extends Auto_BattleGame { this._passiveSkillView = null; this._otherSkillView = null; this._otherOwnedDesc = null; + this._unbindFirstPlaceCombat(); this._firstGuide.unbind(); this._bagView?.unbind(); this._bagView = null; diff --git a/docs/方案-出怪逻辑实现.md b/docs/方案-出怪逻辑实现.md index c36510b..ac7018e 100644 --- a/docs/方案-出怪逻辑实现.md +++ b/docs/方案-出怪逻辑实现.md @@ -103,7 +103,7 @@ UIPanelHome ← pickRandomBattleLevelId 进关 2. `GameController.enterBattle` → 预载 → `gg.battle.start` 3. `ChapterLevelBuilder.build` → `LevelWaveParser.toWaveDefs` 4. `UIBattleGame` → `loadMap` → `applyMapTopologyToSession(..., 'pvp')` -5. `CocosBattleMonsterPresenter.bind` + `startCombat` → 双口出怪 + 寻路表现 +5. `CocosBattleMonsterPresenter.bind`;**本机玩家第一次把数字放到地图后** `startCombat` → 双口出怪 + 寻路表现 ## 4. 默认参数 diff --git a/配置表/excelList/技能表.xlsx b/配置表/excelList/技能表.xlsx index 0bb93d11c921319d0d25be9d623e8372670b7efd..24855d4c2f8cecd80684e536cd185b10d3f41839 100644 GIT binary patch delta 17765 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

Xp9}sA}pI!8OlO{-ASbQ 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 V^M3qw{R9~wsX_}~FZ<`K{|A~+Q_BDV