Compare commits
4 Commits
e2f5b05bc3
...
4d6f1493b2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d6f1493b2 | ||
|
|
2e09455f3e | ||
|
|
772d9af131 | ||
|
|
7187f36c03 |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -23,25 +23,28 @@
|
||||
},
|
||||
{
|
||||
"__id__": 38
|
||||
},
|
||||
{
|
||||
"__id__": 46
|
||||
}
|
||||
],
|
||||
"_active": true,
|
||||
"_components": [
|
||||
{
|
||||
"__id__": 44
|
||||
"__id__": 52
|
||||
},
|
||||
{
|
||||
"__id__": 46
|
||||
"__id__": 54
|
||||
},
|
||||
{
|
||||
"__id__": 48
|
||||
"__id__": 56
|
||||
},
|
||||
{
|
||||
"__id__": 50
|
||||
"__id__": 58
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 52
|
||||
"__id__": 60
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
@@ -88,7 +91,7 @@
|
||||
"__id__": 19
|
||||
}
|
||||
],
|
||||
"_active": true,
|
||||
"_active": false,
|
||||
"_components": [
|
||||
{
|
||||
"__id__": 31
|
||||
@@ -759,7 +762,7 @@
|
||||
},
|
||||
{
|
||||
"__type__": "cc.Node",
|
||||
"_name": "RichText",
|
||||
"_name": "Toggle_Check_01_Off",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"_parent": {
|
||||
@@ -773,14 +776,17 @@
|
||||
},
|
||||
{
|
||||
"__id__": 41
|
||||
},
|
||||
{
|
||||
"__id__": 43
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 43
|
||||
"__id__": 45
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 0,
|
||||
"x": 2.5,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
@@ -819,6 +825,178 @@
|
||||
"__prefab": {
|
||||
"__id__": 40
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 715,
|
||||
"height": 120
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
},
|
||||
"_id": ""
|
||||
},
|
||||
{
|
||||
"__type__": "cc.CompPrefabInfo",
|
||||
"fileId": "b8MCmHMq5A1q3NRlL90DLh"
|
||||
},
|
||||
{
|
||||
"__type__": "cc.Sprite",
|
||||
"_name": "",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 38
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 42
|
||||
},
|
||||
"_customMaterial": null,
|
||||
"_srcBlendFactor": 2,
|
||||
"_dstBlendFactor": 4,
|
||||
"_color": {
|
||||
"__type__": "cc.Color",
|
||||
"r": 54,
|
||||
"g": 151,
|
||||
"b": 255,
|
||||
"a": 156
|
||||
},
|
||||
"_spriteFrame": {
|
||||
"__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@f5d5c",
|
||||
"__expectedType__": "cc.SpriteFrame"
|
||||
},
|
||||
"_type": 1,
|
||||
"_fillType": 0,
|
||||
"_sizeMode": 0,
|
||||
"_fillCenter": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"_fillStart": 0,
|
||||
"_fillRange": 0,
|
||||
"_isTrimmedMode": true,
|
||||
"_useGrayscale": false,
|
||||
"_atlas": null,
|
||||
"_id": ""
|
||||
},
|
||||
{
|
||||
"__type__": "cc.CompPrefabInfo",
|
||||
"fileId": "4311l14b1DvJVpJKdqMvF3"
|
||||
},
|
||||
{
|
||||
"__type__": "cc.Widget",
|
||||
"_name": "",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 38
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 44
|
||||
},
|
||||
"_alignFlags": 45,
|
||||
"_target": null,
|
||||
"_left": 5,
|
||||
"_right": 0,
|
||||
"_top": 0,
|
||||
"_bottom": 0,
|
||||
"_horizontalCenter": 0,
|
||||
"_verticalCenter": 0,
|
||||
"_isAbsLeft": true,
|
||||
"_isAbsRight": true,
|
||||
"_isAbsTop": true,
|
||||
"_isAbsBottom": true,
|
||||
"_isAbsHorizontalCenter": true,
|
||||
"_isAbsVerticalCenter": true,
|
||||
"_originalWidth": 40,
|
||||
"_originalHeight": 40,
|
||||
"_alignMode": 2,
|
||||
"_lockFlags": 0,
|
||||
"_id": ""
|
||||
},
|
||||
{
|
||||
"__type__": "cc.CompPrefabInfo",
|
||||
"fileId": "0dQJIxbaBKwofpTM9AD0z1"
|
||||
},
|
||||
{
|
||||
"__type__": "cc.PrefabInfo",
|
||||
"root": {
|
||||
"__id__": 1
|
||||
},
|
||||
"asset": {
|
||||
"__id__": 0
|
||||
},
|
||||
"fileId": "cf0Pbjyg1HU74pnxq7zQ2O",
|
||||
"instance": null,
|
||||
"targetOverrides": null,
|
||||
"nestedPrefabInstanceRoots": null
|
||||
},
|
||||
{
|
||||
"__type__": "cc.Node",
|
||||
"_name": "RichText",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"_parent": {
|
||||
"__id__": 1
|
||||
},
|
||||
"_children": [],
|
||||
"_active": true,
|
||||
"_components": [
|
||||
{
|
||||
"__id__": 47
|
||||
},
|
||||
{
|
||||
"__id__": 49
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 51
|
||||
},
|
||||
"_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": 1073741824,
|
||||
"_euler": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"_id": ""
|
||||
},
|
||||
{
|
||||
"__type__": "cc.UITransform",
|
||||
"_name": "",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 46
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 48
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 680,
|
||||
@@ -841,11 +1019,11 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 38
|
||||
"__id__": 46
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 42
|
||||
"__id__": 50
|
||||
},
|
||||
"_lineHeight": 21,
|
||||
"_string": "ewrwerwer",
|
||||
@@ -854,9 +1032,9 @@
|
||||
"_fontSize": 20,
|
||||
"_fontColor": {
|
||||
"__type__": "cc.Color",
|
||||
"r": 48,
|
||||
"g": 48,
|
||||
"b": 48,
|
||||
"r": 255,
|
||||
"g": 255,
|
||||
"b": 255,
|
||||
"a": 255
|
||||
},
|
||||
"_maxWidth": 680,
|
||||
@@ -896,7 +1074,7 @@
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 45
|
||||
"__id__": 53
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
@@ -924,7 +1102,7 @@
|
||||
},
|
||||
"_enabled": false,
|
||||
"__prefab": {
|
||||
"__id__": 47
|
||||
"__id__": 55
|
||||
},
|
||||
"_alignFlags": 45,
|
||||
"_target": null,
|
||||
@@ -960,10 +1138,10 @@
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 49
|
||||
"__id__": 57
|
||||
},
|
||||
"massage_node": {
|
||||
"__id__": 41
|
||||
"__id__": 49
|
||||
},
|
||||
"_id": ""
|
||||
},
|
||||
@@ -981,7 +1159,7 @@
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 51
|
||||
"__id__": 59
|
||||
},
|
||||
"_id": ""
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -7384,10 +7384,10 @@
|
||||
"height": 40,
|
||||
"rawWidth": 40,
|
||||
"rawHeight": 40,
|
||||
"borderTop": 0,
|
||||
"borderBottom": 0,
|
||||
"borderLeft": 0,
|
||||
"borderRight": 0,
|
||||
"borderTop": 20,
|
||||
"borderBottom": 20,
|
||||
"borderLeft": 20,
|
||||
"borderRight": 20,
|
||||
"packable": true,
|
||||
"pixelsToUnit": 100,
|
||||
"pivotX": 0.5,
|
||||
@@ -8212,10 +8212,10 @@
|
||||
"height": 63,
|
||||
"rawWidth": 250,
|
||||
"rawHeight": 63,
|
||||
"borderTop": 0,
|
||||
"borderBottom": 0,
|
||||
"borderLeft": 0,
|
||||
"borderRight": 0,
|
||||
"borderTop": 27,
|
||||
"borderBottom": 29,
|
||||
"borderLeft": 114,
|
||||
"borderRight": 113,
|
||||
"packable": true,
|
||||
"pixelsToUnit": 100,
|
||||
"pivotX": 0.5,
|
||||
|
||||
@@ -250,20 +250,17 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5011: {
|
||||
uuid: 5011, name: "小铁卫", path: "hk1", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Melee, hp: 300, ap: 28,
|
||||
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow3].cd, ccd: 0 } },
|
||||
// 成长主线:护盾层数 4→5→6(等效减伤 57%→67%),6 级追加治疗形成“盾挡+回血”双循环
|
||||
// 成长主线:护盾层数 4→5→6(等效减伤 57%→67%)
|
||||
atked: {
|
||||
6301: [
|
||||
{ lv: 1, t_num: 3, overrides: { TGroup: TGroup.Self, ap: 4 } },
|
||||
{ lv: 2, t_num: 3, overrides: { TGroup: TGroup.Self, ap: 5 } },
|
||||
{ lv: 4, t_num: 3, overrides: { TGroup: TGroup.Self, ap: 6 } },
|
||||
],
|
||||
6302: [
|
||||
{ lv: 6, t_num: 5, overrides: { TGroup: TGroup.All, ap: 250 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 150 }, { lv: 5, value: 150 }],
|
||||
ap_bonus: [{ lv: 5, value: 10 }],
|
||||
info: "<color=#27AE60>✧</color>受伤获得护盾\n<color=#9B59B6>✦</color>受伤全队恢复生命",
|
||||
info: "<color=#27AE60>✧</color>受伤获得护盾",
|
||||
},
|
||||
5012: {
|
||||
uuid: 5012, name: "不死小强", path: "hk2", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Melee, hp: 600, ap: 57,
|
||||
@@ -278,12 +275,9 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
6402: [
|
||||
{ lv: 1, t_num: 5, overrides: { TGroup: TGroup.Self, ap: 2 } },
|
||||
],
|
||||
6301: [
|
||||
{ lv: 6, t_num: 5, overrides: { TGroup: TGroup.All, ap: 4 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 150 }],
|
||||
info: "<color=#27AE60>✧</color>受伤恢复生命\n<color=#9B59B6>✦</color>受伤全体获得护盾",
|
||||
info: "<color=#27AE60>✧</color>受伤恢复生命",
|
||||
},
|
||||
5013: {
|
||||
uuid: 5013, name: "铁骨头", path: "hk4", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Melee, hp: 600, ap: 57,
|
||||
@@ -294,14 +288,13 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 2, t_num: 3, overrides: { TGroup: TGroup.Self, ap: 4 } },
|
||||
{ lv: 4, t_num: 3, overrides: { TGroup: TGroup.Self, ap: 5 } },
|
||||
{ lv: 5, t_num: 2, overrides: { TGroup: TGroup.Self, ap: 5 } },
|
||||
{ lv: 6, t_num: 5, overrides: { TGroup: TGroup.Team, ap: 2 } },
|
||||
],
|
||||
6402: [
|
||||
{ lv: 1, t_num: 5, overrides: { TGroup: TGroup.Self, ap: 2 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 150 }],
|
||||
info: "<color=#27AE60>✧</color>受伤获得护盾与生命\n<color=#9B59B6>✦</color>受伤全队获得护盾",
|
||||
info: "<color=#27AE60>✧</color>受伤获得护盾与生命",
|
||||
},
|
||||
5014: {
|
||||
uuid: 5014, name: "怒火武者", path: "hk5", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, hp: 900, ap: 85,
|
||||
@@ -316,12 +309,9 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 2, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7012, buff_value: 7, buff_duration: 5 } },
|
||||
{ lv: 4, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7012, buff_value: 10, buff_duration: 6 } },
|
||||
],
|
||||
6404: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Self, timed_buff_id: 7020, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 150 }],
|
||||
info: "<color=#27AE60>✧</color>受伤提升攻击与暴击\n<color=#9B59B6>✦</color>受伤限时提升暴伤",
|
||||
info: "<color=#27AE60>✧</color>受伤提升攻击与暴击",
|
||||
},
|
||||
5015: {
|
||||
uuid: 5015, name: "血刃武者", path: "hc3", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Melee, hp: 1200, ap: 113,
|
||||
@@ -332,19 +322,15 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 2, t_num: 3, overrides: { TGroup: TGroup.Self, ap: 4 } },
|
||||
{ lv: 4, t_num: 3, overrides: { TGroup: TGroup.Self, ap: 5 } },
|
||||
{ lv: 5, t_num: 2, overrides: { TGroup: TGroup.Self, ap: 5 } },
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Team, ap: 2 } },
|
||||
],
|
||||
6404: [
|
||||
{ lv: 1, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7020, buff_value: 5, buff_duration: 5 } },
|
||||
{ lv: 2, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7020, buff_value: 7, buff_duration: 5 } },
|
||||
{ lv: 4, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7020, buff_value: 10, buff_duration: 6 } },
|
||||
],
|
||||
6403: [
|
||||
{ lv: 6, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7012, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 200 }],
|
||||
info: "<color=#27AE60>✧</color>受伤获得护盾与暴伤\n<color=#9B59B6>✦</color>受伤追加暴击并给全队护盾",
|
||||
info: "<color=#27AE60>✧</color>受伤获得护盾与暴伤",
|
||||
},
|
||||
5016: {
|
||||
uuid: 5016, name: "狂血战士", path: "hc4", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Melee, hp: 1500, ap: 142,
|
||||
@@ -359,16 +345,10 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 2, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7017, buff_value: 7, buff_duration: 5 } },
|
||||
{ lv: 4, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7017, buff_value: 10, buff_duration: 6 } },
|
||||
],
|
||||
6403: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Self, timed_buff_id: 7012, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
6404: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Self, timed_buff_id: 7020, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
ap_bonus: [{ lv: 3, value: 20 }],
|
||||
hp_bonus: [{ lv: 3, value: 150 }],
|
||||
info: "<color=#27AE60>✧</color>受伤提升攻击与击晕\n<color=#9B59B6>✦</color>受伤追加暴击与暴伤",
|
||||
info: "<color=#27AE60>✧</color>受伤提升攻击与击晕",
|
||||
},
|
||||
// 以下英雄暂时注释,保留待后续扩展
|
||||
// 5012:{uuid:5012,name:"不死小强",path:"hk2", fac:FacSet.HERO,card_lv:2,lv:1,type:HType.Melee,hp:600,ap:57,
|
||||
@@ -402,19 +382,16 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5021: {
|
||||
uuid: 5021, name: "小刺客", path: "hc1", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Melee, hp: 300, ap: 28,
|
||||
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0 } },
|
||||
// 成长主线:滚雪球(AP增量固定1,5级阈值5→4刀);6级追加暴伤强化(永久叠加无100%上限,与高AP叠乘)
|
||||
// 成长主线:滚雪球(AP增量固定1,5级阈值5→4刀)
|
||||
atking: {
|
||||
6401: [
|
||||
{ lv: 1, t_num: 5, overrides: { TGroup: TGroup.Self, ap: 1 } },
|
||||
{ lv: 5, t_num: 4, overrides: { TGroup: TGroup.Self, ap: 1 } },
|
||||
],
|
||||
6404: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Self, timed_buff_id: 7020, buff_value: 20, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
ap_bonus: [{ lv: 3, value: 20 }],
|
||||
hp_bonus: [{ lv: 3, value: 80 }],
|
||||
info: "<color=#27AE60>✧</color>攻击永久提升攻击\n<color=#9B59B6>✦</color>攻击限时提升暴伤",
|
||||
info: "<color=#27AE60>✧</color>攻击永久提升攻击",
|
||||
},
|
||||
5022: {
|
||||
uuid: 5022, name: "嗜血剑客", path: "hc2", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, hp: 900, ap: 85,
|
||||
@@ -429,13 +406,10 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
6401: [
|
||||
{ lv: 1, t_num: 7, overrides: { TGroup: TGroup.Self, ap: 1 } },
|
||||
],
|
||||
6404: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Self, timed_buff_id: 7020, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
ap_bonus: [{ lv: 3, value: 20 }],
|
||||
hp_bonus: [{ lv: 3, value: 80 }],
|
||||
info: "<color=#27AE60>✧</color>攻击限时提升暴击\n<color=#9B59B6>✦</color>攻击限时提升暴伤",
|
||||
info: "<color=#27AE60>✧</color>攻击限时提升暴击",
|
||||
},
|
||||
5023: {
|
||||
uuid: 5023, name: "暗影杀手", path: "hc5", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Melee, hp: 1200, ap: 113,
|
||||
@@ -450,15 +424,9 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 2, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7012, buff_value: 7, buff_duration: 5 } },
|
||||
{ lv: 4, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7012, buff_value: 10, buff_duration: 6 } },
|
||||
],
|
||||
6404: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Self, timed_buff_id: 7020, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
6409: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Self, timed_buff_id: 7016, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 100 }],
|
||||
info: "<color=#27AE60>✧</color>攻击提升攻击与暴击\n<color=#9B59B6>✦</color>攻击追加暴伤与风怒",
|
||||
info: "<color=#27AE60>✧</color>攻击提升攻击与暴击",
|
||||
},
|
||||
// 5022: {
|
||||
// uuid: 5022, name: "嗜血剑客", path: "hc2", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, hp: 900, ap: 85,
|
||||
@@ -483,7 +451,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5031: {
|
||||
uuid: 5031, name: "援护弓手", path: "ha1", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Long, hp: 143, ap: 40,
|
||||
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal2].cd, ccd: 0 } },
|
||||
// 成长主线:AP增益固定1,5级 hit_count 1→2(2英雄环境=全队);6级追加全队攻速光环
|
||||
// 成长主线:AP增益固定1,5级 hit_count 1→2(2英雄环境=全队)
|
||||
atking: {
|
||||
6401: [
|
||||
{ lv: 1, t_num: 5, overrides: { TGroup: TGroup.Team, hit_count: 1, ap: 1 } },
|
||||
@@ -491,8 +459,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 60 }],
|
||||
field: [{ lv: 6, uuids: [7006] }],
|
||||
info: "<color=#27AE60>✧</color>攻击提升队友攻击\n<color=#9B59B6>✦</color>光环全队提升攻速",
|
||||
info: "<color=#27AE60>✧</color>攻击提升队友攻击",
|
||||
},
|
||||
5032: {
|
||||
uuid: 5032, name: "战术弓手", path: "ha2", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Long, hp: 430, ap: 120,
|
||||
@@ -508,12 +475,9 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 1, t_num: 7, overrides: { TGroup: TGroup.Team, hit_count: 3, ap: 1 } },
|
||||
{ lv: 4, t_num: 7, overrides: { TGroup: TGroup.Team, hit_count: 4, ap: 1 } },
|
||||
],
|
||||
6404: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Team, hit_count: 3, timed_buff_id: 7020, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 80 }],
|
||||
info: "<color=#27AE60>✧</color>攻击限时提升队友暴击\n<color=#9B59B6>✦</color>攻击限时提升队友暴伤",
|
||||
info: "<color=#27AE60>✧</color>攻击限时提升队友暴击",
|
||||
},
|
||||
// 5032: {
|
||||
// uuid: 5032, name: "战术弓手", path: "ha2", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Long, hp: 430, ap: 120,
|
||||
@@ -535,15 +499,9 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 2, t_num: 7, overrides: { TGroup: TGroup.Team, hit_count: 3, timed_buff_id: 7020, buff_value: 7, buff_duration: 5 } },
|
||||
{ lv: 4, t_num: 7, overrides: { TGroup: TGroup.Team, hit_count: 4, timed_buff_id: 7020, buff_value: 10, buff_duration: 6 } },
|
||||
],
|
||||
6403: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Team, hit_count: 3, timed_buff_id: 7012, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
6405: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Team, hit_count: 3, timed_buff_id: 7017, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 100 }],
|
||||
info: "<color=#27AE60>✧</color>攻击提升队友攻击与暴伤\n<color=#9B59B6>✦</color>攻击追加队友暴击与击晕",
|
||||
info: "<color=#27AE60>✧</color>攻击提升队友攻击与暴伤",
|
||||
},
|
||||
// 5033: {
|
||||
// uuid: 5033, name: "鹰眼弓将", path: "ha3", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Long, hp: 717, ap: 200,
|
||||
@@ -608,12 +566,9 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 4, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 5 } },
|
||||
{ lv: 5, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 6 } },
|
||||
],
|
||||
6401: [
|
||||
{ lv: 6, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 5 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 100 }],
|
||||
info: "<color=#27AE60>✧</color>死亡全队获得护盾\n<color=#9B59B6>✦</color>死亡全队提升攻击",
|
||||
info: "<color=#27AE60>✧</color>死亡全队获得护盾",
|
||||
},
|
||||
5042: {
|
||||
uuid: 5042, name: "遗志将军", path: "hk2", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Melee, hp: 600, ap: 57,
|
||||
@@ -627,17 +582,13 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 2, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 12 } },
|
||||
{ lv: 4, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 15 } },
|
||||
],
|
||||
6301: [
|
||||
{ lv: 6, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 3 } },
|
||||
],
|
||||
},
|
||||
revive: [
|
||||
{ lv: 1, s_uuid: 6501, r_num: 1, upr: 0.5 },
|
||||
{ lv: 3, s_uuid: 6501, r_num: 1, upr: 0.6 },
|
||||
{ lv: 5, s_uuid: 6501, r_num: 1, upr: 0.7 },
|
||||
{ lv: 6, s_uuid: 6501, r_num: 1, upr: 0.8 },
|
||||
],
|
||||
info: "<color=#27AE60>✧</color>死亡全队攻血提升\n<color=#9B59B6>✦</color>死亡全队护盾并复活",
|
||||
info: "<color=#27AE60>✧</color>死亡全队攻血提升\n<color=#9B59B6>✦</color>死亡后原地复活",
|
||||
},
|
||||
5043: {
|
||||
uuid: 5043, name: "亡魂刺客", path: "hc1", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, hp: 900, ap: 85,
|
||||
@@ -653,12 +604,9 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 4, t_num: 1, overrides: { TGroup: TGroup.Team, timed_buff_id: 7012, buff_value: 7, buff_duration: 6 } },
|
||||
{ lv: 5, t_num: 1, overrides: { TGroup: TGroup.Team, timed_buff_id: 7012, buff_value: 10, buff_duration: 6 } },
|
||||
],
|
||||
6401: [
|
||||
{ lv: 6, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 5 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 100 }],
|
||||
info: "<color=#27AE60>✧</color>死亡全队击晕与暴击\n<color=#9B59B6>✦</color>死亡全队提升攻击",
|
||||
info: "<color=#27AE60>✧</color>死亡全队击晕与暴击",
|
||||
},
|
||||
5044: {
|
||||
uuid: 5044, name: "血誓剑客", path: "hc2", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Melee, hp: 1200, ap: 113,
|
||||
@@ -674,24 +622,18 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 4, t_num: 1, overrides: { TGroup: TGroup.Team, timed_buff_id: 7020, buff_value: 7, buff_duration: 6 } },
|
||||
{ lv: 5, t_num: 1, overrides: { TGroup: TGroup.Team, timed_buff_id: 7020, buff_value: 10, buff_duration: 6 } },
|
||||
],
|
||||
6401: [
|
||||
{ lv: 6, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 5 } },
|
||||
],
|
||||
6402: [
|
||||
{ lv: 6, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 10 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 150 }],
|
||||
info: "<color=#27AE60>✧</color>死亡全队暴击与暴伤\n<color=#9B59B6>✦</color>死亡全队攻击与生命",
|
||||
info: "<color=#27AE60>✧</color>死亡全队暴击与暴伤",
|
||||
},
|
||||
|
||||
// ===== 5045 不灭战魂(已启用)=====
|
||||
// 遗志双核心:死亡一次释放【盾+HP】双遗产;6级追加【AP+暴击】,并解锁第2次复活
|
||||
// 数值节奏:盾 5→6→7→8,HP 10→12→15→15,6级追加 AP+5 / 暴击计时 5% 且复活次数 1→2
|
||||
// 遗志双核心:死亡一次释放【盾+HP】双遗产
|
||||
// 数值节奏:盾 5→6→7→8,HP 10→12→15
|
||||
5045: {
|
||||
uuid: 5045, name: "不灭战魂", path: "hk3", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Melee, hp: 1500, ap: 60,
|
||||
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow3].cd, ccd: 0 } },
|
||||
// 死亡释放:5 层护盾 + 全队 +10 HP;复活 1 次血量 50%。6级终极遗志追加 AP+5 / 暴击 5%,复活 2 次 70%
|
||||
// 死亡释放:5 层护盾 + 全队 +10 HP;复活 1 次血量 50%
|
||||
dead: {
|
||||
6301: [
|
||||
{ lv: 1, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 5 } },
|
||||
@@ -704,26 +646,19 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 2, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 12 } },
|
||||
{ lv: 4, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 15 } },
|
||||
],
|
||||
6401: [
|
||||
{ lv: 6, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 5 } },
|
||||
],
|
||||
6403: [
|
||||
{ lv: 6, t_num: 1, overrides: { TGroup: TGroup.Team, timed_buff_id: 7012, buff_value: 5, buff_duration: 5 } },
|
||||
],
|
||||
},
|
||||
revive: [
|
||||
{ lv: 1, s_uuid: 6501, r_num: 1, upr: 0.5 },
|
||||
{ lv: 3, s_uuid: 6501, r_num: 1, upr: 0.6 },
|
||||
{ lv: 6, s_uuid: 6501, r_num: 2, upr: 0.7 },
|
||||
],
|
||||
info: "<color=#27AE60>✧</color>死亡全队加护盾\n<color=#27AE60>✧</color>复活1:50%血量\n<color=#9B59B6>✦</color>死亡加攻击\n<color=#9B59B6>✦</color>复活2:70%血量",
|
||||
info: "<color=#27AE60>✧</color>死亡全队加护盾\n<color=#27AE60>✧</color>复活1:50%血量",
|
||||
},
|
||||
|
||||
// ========== fstart 类(法师 · 战前增益) ==========
|
||||
5051: {
|
||||
uuid: 5051, name: "占卜师", path: "hm1", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Long, hp: 143, ap: 40,
|
||||
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid3].cd, ccd: 0 } },
|
||||
// 战前计时 buff:每波开始全队 AP 限时提升(+30/5s → +60/7s → +90/10s),6级追加暴击驻场光环
|
||||
// 战前计时 buff:每波开始全队 AP 限时提升(+30/5s → +60/7s → +90/10s)
|
||||
// 统一复用 7111 基础配置,通过 buff_value/buff_duration 覆写实现三档成长
|
||||
fstart: {
|
||||
6401: [
|
||||
@@ -733,8 +668,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 2, value: 80 }, { lv: 4, value: 80 }],
|
||||
field: [{ lv: 6, uuids: [7204] }],
|
||||
info: "<color=#27AE60>✧</color>开局全队提升攻击\n<color=#9B59B6>✦</color>光环全队提升暴击",
|
||||
info: "<color=#27AE60>✧</color>开局全队提升攻击",
|
||||
},
|
||||
5052: {
|
||||
uuid: 5052, name: "护盾牧师", path: "hm2", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Long, hp: 287, ap: 80,
|
||||
@@ -751,8 +685,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 80 }],
|
||||
field: [{ lv: 6, uuids: [7007] }],
|
||||
info: "<color=#27AE60>✧</color>开局全队获得护盾\n<color=#9B59B6>✦</color>光环全队提升生命",
|
||||
info: "<color=#27AE60>✧</color>开局全队获得护盾",
|
||||
},
|
||||
// 5052: {
|
||||
// uuid: 5052, name: "护盾牧师", path: "hm2", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Long, hp: 287, ap: 80,
|
||||
@@ -806,17 +739,16 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 1, uuids: [7002, 7006] },
|
||||
{ lv: 2, uuids: [7202, 7006] },
|
||||
{ lv: 4, uuids: [7202, 7206] },
|
||||
{ lv: 6, uuids: [7202, 7206, 7007] },
|
||||
],
|
||||
hp_bonus: [{ lv: 3, value: 80 }],
|
||||
info: "<color=#27AE60>✧</color>光环全队提升攻击\n<color=#9B59B6>✦</color>追加提升攻速生命",
|
||||
info: "<color=#27AE60>✧</color>光环全队提升攻击\n<color=#9B59B6>✦</color>追加提升攻速",
|
||||
},
|
||||
|
||||
// ========== fend + atking 类(辅助 · 治疗续航 + 波次增益) ==========
|
||||
5071: {
|
||||
uuid: 5071, name: "治愈牧师", path: "hh1", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Long, hp: 143, ap: 40,
|
||||
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal3].cd, ccd: 0 } },
|
||||
// 成长主线:治疗量 200→250→300%,5级 hit_count 1→2(全队);6级追加护盾 atking,攻防一体
|
||||
// 成长主线:治疗量 200→250→300%,5级 hit_count 1→2(全队)
|
||||
atking: {
|
||||
6302: [
|
||||
{ lv: 1, t_num: 5, overrides: { TGroup: TGroup.Team, ap: 200 } },
|
||||
@@ -824,12 +756,9 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
{ lv: 4, t_num: 5, overrides: { TGroup: TGroup.Team, ap: 300 } },
|
||||
{ lv: 5, t_num: 5, overrides: { TGroup: TGroup.Team, hit_count: 2, ap: 300 } },
|
||||
],
|
||||
6301: [
|
||||
{ lv: 6, t_num: 7, overrides: { TGroup: TGroup.Team, ap: 3 } },
|
||||
],
|
||||
},
|
||||
hp_bonus: [{ lv: 3, value: 80 }],
|
||||
info: "<color=#27AE60>✧</color>攻击治疗低血队友\n<color=#9B59B6>✦</color>攻击全队获得护盾",
|
||||
info: "<color=#27AE60>✧</color>攻击治疗低血队友",
|
||||
},
|
||||
// 5072: {
|
||||
// uuid: 5072, name: "小金库", path: "hh2", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Long, hp: 287, ap: 80,
|
||||
|
||||
@@ -25,10 +25,6 @@ import { oops } from "db://oops-framework/core/Oops";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { smc } from "../common/SingletonModuleComp";
|
||||
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
||||
import { FieldSkillType } from "../common/config/SkillSet";
|
||||
import { FieldSkillHelper } from "../hero/FieldSkillHelper";
|
||||
import { MissionEconomy } from "./MissionEconomy";
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
/**
|
||||
@@ -538,10 +534,11 @@ export class CHeroComp extends CCComp {
|
||||
* 购买点击处理:
|
||||
* 1. 播放按钮点击回弹动画。
|
||||
* 2. 英雄卡先通过 UseHeroCard 事件做数量上限校验(guard 模式,可被取消)。
|
||||
* 3. 扣除金币(失败则提示并中止)。
|
||||
* 4. 按卡牌类型分发效果:英雄卡 → CallHero 召唤英雄;特殊卡 → UseSpecialCard。
|
||||
* 5. 派发 CardUsed 通知 MissionCardComp 刷新英雄卡池。
|
||||
* 6. 标记已购买,隐藏购买按钮。
|
||||
* 3. 按卡牌类型分发效果:英雄卡 → CallHero 召唤英雄;特殊卡 → UseSpecialCard。
|
||||
* 4. 派发 CardUsed 通知 MissionCardComp 刷新英雄卡池。
|
||||
* 5. 标记已购买,隐藏购买按钮。
|
||||
*
|
||||
* 注:购买不花费金币(免费获取),原扣费逻辑已移除。
|
||||
*/
|
||||
private onBuyClick() {
|
||||
if (!this.cardData || this.isPurchased) return;
|
||||
@@ -564,22 +561,6 @@ export class CHeroComp extends CCComp {
|
||||
if (guard.cancel) return;
|
||||
}
|
||||
|
||||
// 扣费(英雄卡享受驻场"购买优惠"折扣)
|
||||
let cost = this.cardData.cost ?? 0;
|
||||
if (this.cardData.type === CardType.Hero) {
|
||||
const discount = FieldSkillHelper.getFieldSkillTotalValue(FieldSkillType.BuyDiscount);
|
||||
cost = Math.max(0, cost - discount);
|
||||
}
|
||||
const success = MissionEconomy.spendCoin(Math.floor(cost));
|
||||
if (!success) {
|
||||
oops.message.dispatchEvent(GameEvent.ShowSmallTip, "buy_coin");
|
||||
mLogger.log(this.debugMode, "CHeroComp", "purchase failed: not enough coin", {
|
||||
uuid: this.cardData.uuid,
|
||||
cost
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
smc.vmdata.scores.refresh_hit_count++;
|
||||
|
||||
const used = this.cardData;
|
||||
@@ -609,8 +590,7 @@ export class CHeroComp extends CCComp {
|
||||
|
||||
mLogger.log(this.debugMode, "CHeroComp", "hero card purchased", {
|
||||
uuid: used.uuid,
|
||||
type: used.type,
|
||||
cost
|
||||
type: used.type
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ import { buildEquipRich } from "../common/config/HeroSkillDesc";
|
||||
import { oops } from "db://oops-framework/core/Oops";
|
||||
import { getCardIconId, setSpriteFrame } from "../common/CardIconHelper";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { MissionEconomy } from "./MissionEconomy";
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@@ -327,19 +326,7 @@ export class EquipListComp extends CCComp {
|
||||
|
||||
oops.audio.playEffect("music/button");
|
||||
|
||||
// 扣费
|
||||
const cost = this.cardData.cost ?? 0;
|
||||
const success = MissionEconomy.spendCoin(cost);
|
||||
if (!success) {
|
||||
oops.message.dispatchEvent(GameEvent.ShowSmallTip, "buy_coin");
|
||||
mLogger.log(this.debugMode, "EquipListComp", "purchase failed: not enough coin", {
|
||||
uuid: this.cardData.uuid,
|
||||
cost
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 派发 UseEquipCard,装备生效流程由 MissEquipComp 接收处理
|
||||
// 购买不花费金币(免费获取),直接派发装备生效事件
|
||||
oops.message.dispatchEvent(GameEvent.UseEquipCard, this.cardData);
|
||||
|
||||
// 播放购买动画(卡牌放大 + 淡出)
|
||||
@@ -350,8 +337,7 @@ export class EquipListComp extends CCComp {
|
||||
oops.message.dispatchEvent(GameEvent.CardUsed, this);
|
||||
|
||||
mLogger.log(this.debugMode, "EquipListComp", "equipment purchased", {
|
||||
uuid: this.cardData.uuid,
|
||||
cost
|
||||
uuid: this.cardData.uuid
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ import { buildCardDescRich, buildEquipRich } from "../common/config/HeroSkillDes
|
||||
import { oops } from "db://oops-framework/core/Oops";
|
||||
import { getCardIconId, setSpriteFrame } from "../common/CardIconHelper";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { MissionEconomy } from "./MissionEconomy";
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@@ -340,19 +339,7 @@ export class ItemListComp extends CCComp {
|
||||
|
||||
oops.audio.playEffect("music/button");
|
||||
|
||||
// 扣费
|
||||
const cost = this.cardData.cost ?? 0;
|
||||
const success = MissionEconomy.spendCoin(cost);
|
||||
if (!success) {
|
||||
oops.message.dispatchEvent(GameEvent.ShowSmallTip, "buy_coin");
|
||||
mLogger.log(this.debugMode, "ItemListComp", "purchase failed: not enough coin", {
|
||||
uuid: this.cardData.uuid,
|
||||
cost
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 根据类型派发对应事件
|
||||
// 购买不花费金币(免费获取),直接根据类型派发对应事件
|
||||
const isEquip = this.cardData.trigger_type === CardTriggerType.Field;
|
||||
const isPotion = this.cardData.kind === CKind.Potion;
|
||||
|
||||
@@ -360,23 +347,20 @@ export class ItemListComp extends CCComp {
|
||||
// 装备:被动驻场,由 MissEquipComp 处理
|
||||
oops.message.dispatchEvent(GameEvent.UseEquipCard, this.cardData);
|
||||
mLogger.log(this.debugMode, "ItemListComp", "equipment purchased", {
|
||||
uuid: this.cardData.uuid,
|
||||
cost
|
||||
uuid: this.cardData.uuid
|
||||
});
|
||||
} else if (isPotion) {
|
||||
// 商品/药品:一次性 buff 技能,由 MissSkillsComp 处理
|
||||
oops.message.dispatchEvent(GameEvent.UseItemCard, this.cardData);
|
||||
mLogger.log(this.debugMode, "ItemListComp", "item purchased", {
|
||||
uuid: this.cardData.uuid,
|
||||
skill: this.cardData.skill,
|
||||
cost
|
||||
skill: this.cardData.skill
|
||||
});
|
||||
} else {
|
||||
// 默认走技能卡流程
|
||||
oops.message.dispatchEvent(GameEvent.UseSkillCard, this.cardData);
|
||||
mLogger.log(this.debugMode, "ItemListComp", "card purchased", {
|
||||
uuid: this.cardData.uuid,
|
||||
cost
|
||||
uuid: this.cardData.uuid
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -183,10 +183,12 @@ export class MissionCardComp extends CCComp {
|
||||
|
||||
/** 当前激活的面板索引:0=英雄, 1=装备, 2=技能, 3=药品 */
|
||||
private currentPanelIndex: number = 0;
|
||||
/** 面板显示位置(英雄面板基准位置,运行时从场景读取) */
|
||||
private panelShowPos: Vec3 = new Vec3();
|
||||
/** 各覆盖面板(装备/技能/药品)的隐藏 Y 坐标(屏幕外底部,从场景初始位置读取) */
|
||||
private panelHideYs: number[] = [];
|
||||
/** 覆盖面板(卡牌/装备/技能/药品)显示位置:面板铺满屏幕,显示时固定位于 (0,0) */
|
||||
private readonly panelShowPos: Vec3 = new Vec3(0, 0, 0);
|
||||
/** 覆盖面板显示态缩放 (1,1) */
|
||||
private readonly panelShowScale: Vec3 = new Vec3(1, 1, 1);
|
||||
/** 覆盖面板隐藏态缩放 (0,0) */
|
||||
private readonly panelHideScale: Vec3 = new Vec3(0, 0, 1);
|
||||
/** 是否已初始化面板布局 */
|
||||
private hasInitPanelLayout: boolean = false;
|
||||
/** 是否已缓存卡牌面板基准缩放 */
|
||||
@@ -197,9 +199,7 @@ export class MissionCardComp extends CCComp {
|
||||
private cardsShowScale: Vec3 = new Vec3(1, 1, 1);
|
||||
/** 卡牌面板收起态缩放(scale=0 隐藏) */
|
||||
private cardsHideScale: Vec3 = new Vec3(0, 0, 1);
|
||||
/** 卡牌面板隐藏 Y 坐标(场景初始位置,屏幕外底部,由 initPanelLayout 缓存) */
|
||||
private cardsPanHideY: number = 0;
|
||||
/** 卡牌面板显示/隐藏动画时长 */
|
||||
/** 覆盖面板显示/隐藏动画时长 */
|
||||
private readonly cardPanelAnimDuration: number = 0.25;
|
||||
|
||||
// ======================== 生命周期 ========================
|
||||
@@ -215,6 +215,7 @@ export class MissionCardComp extends CCComp {
|
||||
onLoad() {
|
||||
this.bindEvents();
|
||||
this.cacheCardComps();
|
||||
this.hideAllHeroBoxSlots();
|
||||
this.initCardsPanelPos();
|
||||
this.initPanelLayout();
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "onLoad init", {
|
||||
@@ -557,11 +558,6 @@ export class MissionCardComp extends CCComp {
|
||||
// 三等分水平布局
|
||||
this.layoutSlotsHorizontal(this.itemCardComps);
|
||||
|
||||
// 默认显示商店面板
|
||||
if (this.shopPanNode) {
|
||||
this.shopPanNode.active = true;
|
||||
}
|
||||
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "populate shop items", {
|
||||
count: items.length,
|
||||
slotCount: this.itemCardComps.length
|
||||
@@ -800,7 +796,7 @@ export class MissionCardComp extends CCComp {
|
||||
if (heroIdx >= 0) {
|
||||
const cards = this.buildDrawCards();
|
||||
this.dispatchCardsToSlots(cards);
|
||||
// 召唤成功后收起英雄卡池面板
|
||||
// 抽 1 张后关闭英雄卡池面板
|
||||
this.hideCardsPanel();
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "refresh hero pool after buy", {
|
||||
triggerSlot: heroIdx
|
||||
@@ -811,6 +807,8 @@ export class MissionCardComp extends CCComp {
|
||||
const equipIdx = this.equipCardComps.findIndex(c => c === source);
|
||||
if (equipIdx >= 0) {
|
||||
this.populateEquipments();
|
||||
// 抽 1 张后关闭装备面板
|
||||
this.hideOverlayPanel(1);
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "refresh equip pool after buy", {
|
||||
triggerSlot: equipIdx
|
||||
});
|
||||
@@ -820,6 +818,8 @@ export class MissionCardComp extends CCComp {
|
||||
const skillIdx = this.skillCardComps.findIndex(c => c === source);
|
||||
if (skillIdx >= 0) {
|
||||
this.populateSkillCards();
|
||||
// 抽 1 张后关闭技能面板
|
||||
this.hideOverlayPanel(2);
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "refresh skill pool after buy", {
|
||||
triggerSlot: skillIdx
|
||||
});
|
||||
@@ -829,6 +829,8 @@ export class MissionCardComp extends CCComp {
|
||||
const itemIdx = this.itemCardComps.findIndex(c => c === source);
|
||||
if (itemIdx >= 0) {
|
||||
this.populateShopItems();
|
||||
// 抽 1 张后关闭药品面板
|
||||
this.hideOverlayPanel(3);
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "refresh item pool after buy", {
|
||||
triggerSlot: itemIdx
|
||||
});
|
||||
@@ -866,50 +868,75 @@ export class MissionCardComp extends CCComp {
|
||||
|
||||
/**
|
||||
* 初始化面板布局:
|
||||
* 1. 以英雄面板位置为基准显示位置(英雄面板固定不动)。
|
||||
* 2. 缓存各覆盖面板(装备/技能/药品)的初始位置作为隐藏位置(屏幕外底部)。
|
||||
* 3. 将覆盖面板归位到隐藏位置,初始显示英雄面板(index=0)。
|
||||
* 1. 英雄面板(index=0)为常驻基准面板,始终显示。
|
||||
* 2. 覆盖面板(卡牌/装备/技能/药品)铺满屏幕、位置固定 (0,0),
|
||||
* 通过缩放 0↔1 控制显示/隐藏,初始缩放置 0 并停用。
|
||||
*/
|
||||
private initPanelLayout() {
|
||||
if (this.hasInitPanelLayout) return;
|
||||
const panels = this.getPanelNodes();
|
||||
this.panelHideYs = [];
|
||||
|
||||
const heroNode = panels[0];
|
||||
if (heroNode && heroNode.isValid) {
|
||||
heroNode.active = true;
|
||||
this.panelShowPos.set(heroNode.getPosition());
|
||||
}
|
||||
|
||||
// 覆盖面板:缓存场景初始位置(屏幕外底部)作为隐藏位置,X 对齐显示位置
|
||||
// 覆盖面板从 index 1 开始:位置由代码接管,禁用 Widget 避免其在 lateUpdate 对齐覆盖 position
|
||||
for (let i = 1; i < panels.length; i++) {
|
||||
const node = panels[i];
|
||||
if (!node || !node.isValid) {
|
||||
this.panelHideYs.push(this.panelShowPos.y);
|
||||
continue;
|
||||
}
|
||||
node.active = true;
|
||||
const pos = node.getPosition();
|
||||
this.panelHideYs.push(pos.y);
|
||||
// index 0 为英雄面板,隐藏列表从 index 1 起
|
||||
node.setPosition(this.panelShowPos.x, pos.y, pos.z);
|
||||
this.initOverlayPanel(panels[i]);
|
||||
}
|
||||
|
||||
// 卡牌面板与其他覆盖面板同级:缓存场景初始位置(屏幕外底部)作为隐藏位置,X 对齐显示位置
|
||||
if (this.cardPanNode && this.cardPanNode.isValid) {
|
||||
const pos = this.cardPanNode.getPosition();
|
||||
this.cardsPanHideY = pos.y;
|
||||
this.cardPanNode.setPosition(this.panelShowPos.x, pos.y, pos.z);
|
||||
}
|
||||
// 卡牌面板与其他覆盖面板同级,同上处理
|
||||
this.initOverlayPanel(this.cardPanNode);
|
||||
|
||||
this.hasInitPanelLayout = true;
|
||||
this.updatePanelButtonStates();
|
||||
}
|
||||
|
||||
/** 单个覆盖面板初始化:禁用 Widget、定位到显示位置、缩放置 0 并隐藏 */
|
||||
private initOverlayPanel(node: Node | null) {
|
||||
if (!node || !node.isValid) return;
|
||||
const widget = node.getComponent(Widget);
|
||||
if (widget) widget.enabled = false;
|
||||
node.setPosition(this.panelShowPos);
|
||||
node.setScale(this.panelHideScale);
|
||||
node.active = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示覆盖面板:缩放从 0 动画放大到 1。
|
||||
* @param node 覆盖面板节点(卡牌/装备/技能/药品)
|
||||
*/
|
||||
private showOverlayPanel(node: Node | null) {
|
||||
if (!node || !node.isValid) return;
|
||||
node.setPosition(this.panelShowPos);
|
||||
node.setScale(this.panelHideScale);
|
||||
node.active = true;
|
||||
Tween.stopAllByTarget(node);
|
||||
tween(node)
|
||||
.to(this.cardPanelAnimDuration, { scale: this.panelShowScale }, { easing: 'quadOut' })
|
||||
.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* 隐藏覆盖面板:缩放从当前值动画缩小到 0,结束后停用节点。
|
||||
* @param node 覆盖面板节点(卡牌/装备/技能/药品)
|
||||
*/
|
||||
private hideOverlayPanelNode(node: Node | null) {
|
||||
if (!node || !node.isValid) return;
|
||||
Tween.stopAllByTarget(node);
|
||||
tween(node)
|
||||
.to(this.cardPanelAnimDuration, { scale: this.panelHideScale }, { easing: 'quadIn' })
|
||||
.call(() => {
|
||||
if (node.isValid) node.active = false;
|
||||
})
|
||||
.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换到指定面板:
|
||||
* 英雄面板(index=0)固定不动;
|
||||
* 选中的覆盖面板从底部划入到显示位置,其余覆盖面板划出回底部隐藏位置。
|
||||
* 英雄面板(index=0)为常驻基准面板;
|
||||
* 选中的覆盖面板缩放放大到 1 显示,其余覆盖面板缩放缩小到 0 隐藏。
|
||||
* @param index 0=英雄, 1=装备, 2=技能, 3=药品
|
||||
*/
|
||||
private slideToPanel(index: number) {
|
||||
@@ -917,17 +944,16 @@ export class MissionCardComp extends CCComp {
|
||||
if (index < 0 || index >= panels.length) return;
|
||||
|
||||
this.currentPanelIndex = index;
|
||||
const duration = 0.25;
|
||||
|
||||
// 覆盖面板从 index 1 开始(index 0 英雄面板固定不动)
|
||||
// 覆盖面板从 index 1 开始(index 0 英雄面板常驻不动)
|
||||
for (let i = 1; i < panels.length; i++) {
|
||||
const node = panels[i];
|
||||
if (!node || !node.isValid) continue;
|
||||
const targetY = i === index ? this.panelShowPos.y : (this.panelHideYs[i - 1] ?? node.getPosition().y);
|
||||
Tween.stopAllByTarget(node);
|
||||
tween(node)
|
||||
.to(duration, { position: new Vec3(this.panelShowPos.x, targetY, 0) }, { easing: 'quadOut' })
|
||||
.start();
|
||||
if (i === index) {
|
||||
this.showOverlayPanel(node);
|
||||
} else {
|
||||
this.hideOverlayPanelNode(node);
|
||||
}
|
||||
}
|
||||
|
||||
this.updatePanelButtonStates();
|
||||
@@ -975,8 +1001,8 @@ export class MissionCardComp extends CCComp {
|
||||
/**
|
||||
* 同步英雄信息盒槽位与场上英雄:
|
||||
* 1. 刷新 herosBoxNode 下 HeroBoxComp 槽位缓存(编辑器已预放 3 个)。
|
||||
* 2. 查询当前存活英雄列表,按序绑定到槽位。
|
||||
* 3. 多余槽位显示空英雄信息。
|
||||
* 2. 查询当前存活英雄列表,按序绑定到槽位(bindHero 内部激活节点)。
|
||||
* 3. 多余槽位清空数据并隐藏(默认全部隐藏,召唤一个激活一个)。
|
||||
*
|
||||
* Why: 英雄召唤 / 死亡 / 卖出 / 升级后调用,保证面板与场上一一对应。
|
||||
*/
|
||||
@@ -1003,11 +1029,14 @@ export class MissionCardComp extends CCComp {
|
||||
if (actor) {
|
||||
comp.bindHero(actor.eid, actor.model);
|
||||
} else {
|
||||
// 空槽位默认隐藏:召唤一个英雄才激活一个槽位
|
||||
comp.applyEmpty();
|
||||
comp.node.active = false;
|
||||
}
|
||||
}
|
||||
|
||||
this.resizeListBox(this.herosBoxNode, Math.max(actors.length, 1));
|
||||
// 列表高度只按可见槽位(存活英雄数)计算,空槽位已隐藏不再占位
|
||||
this.resizeListBox(this.herosBoxNode, actors.length);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1022,39 +1051,51 @@ export class MissionCardComp extends CCComp {
|
||||
.filter((comp): comp is HeroBoxComp => !!comp);
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示卡牌面板:从底部向上滑入到面板显示位置(panelShowPos)
|
||||
*/
|
||||
private onShowCardsClick() {
|
||||
oops.audio.playEffect("music/button");
|
||||
if (!this.cardPanNode || !this.cardPanNode.isValid) return;
|
||||
this.cardPanNode.active = true;
|
||||
Tween.stopAllByTarget(this.cardPanNode);
|
||||
tween(this.cardPanNode)
|
||||
.to(this.cardPanelAnimDuration, { position: new Vec3(this.panelShowPos.x, this.panelShowPos.y, 0) }, { easing: 'quadOut' })
|
||||
.start();
|
||||
/** 英雄信息盒槽位默认全部隐藏,召唤一个英雄再激活一个 */
|
||||
private hideAllHeroBoxSlots() {
|
||||
this.ensureHeroBoxSlots();
|
||||
for (const comp of this.heroBoxComps) {
|
||||
if (comp && comp.node && comp.node.isValid) {
|
||||
comp.node.active = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 隐藏卡牌面板:向下滑出到其隐藏位置(cardsPanHideY,屏幕外底部)
|
||||
* 显示卡牌面板:缩放从 0 动画放大到 1
|
||||
*/
|
||||
private onShowCardsClick() {
|
||||
oops.audio.playEffect("music/button");
|
||||
this.showOverlayPanel(this.cardPanNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 隐藏卡牌面板:缩放动画缩小到 0
|
||||
*/
|
||||
private onCloseCardsClick() {
|
||||
oops.audio.playEffect("music/button");
|
||||
this.hideCardsPanel();
|
||||
}
|
||||
|
||||
/** 隐藏卡牌面板:向下滑出到隐藏位置(不含按钮音效,供系统逻辑复用) */
|
||||
/** 隐藏卡牌面板:缩放缩小到 0(不含按钮音效,供系统逻辑复用) */
|
||||
private hideCardsPanel() {
|
||||
if (!this.cardPanNode || !this.cardPanNode.isValid) return;
|
||||
Tween.stopAllByTarget(this.cardPanNode);
|
||||
tween(this.cardPanNode)
|
||||
.to(this.cardPanelAnimDuration, { position: new Vec3(this.panelShowPos.x, this.cardsPanHideY, 0) }, { easing: 'quadIn' })
|
||||
.call(() => {
|
||||
if (this.cardPanNode && this.cardPanNode.isValid) {
|
||||
this.cardPanNode.active = false;
|
||||
this.hideOverlayPanelNode(this.cardPanNode);
|
||||
}
|
||||
})
|
||||
.start();
|
||||
|
||||
/**
|
||||
* 隐藏指定覆盖面板(缩放缩小到 0 并停用):
|
||||
* 用于抽 1 张卡成功后自动收起对应卡池面板,露出下层英雄面板。
|
||||
* @param index 面板索引:1=装备, 2=技能, 3=药品(0 为英雄基准面板,不可隐藏)
|
||||
*/
|
||||
private hideOverlayPanel(index: number) {
|
||||
const panels = this.getPanelNodes();
|
||||
if (index < 1 || index >= panels.length) return;
|
||||
const node = panels[index];
|
||||
if (!node || !node.isValid) return;
|
||||
this.hideOverlayPanelNode(node);
|
||||
// 面板收起后 tab 高亮回归英雄面板
|
||||
this.currentPanelIndex = 0;
|
||||
this.updatePanelButtonStates();
|
||||
}
|
||||
|
||||
// ======================== 装备商店面板 ========================
|
||||
@@ -1118,11 +1159,6 @@ export class MissionCardComp extends CCComp {
|
||||
// 三等分水平布局
|
||||
this.layoutSlotsHorizontal(this.equipCardComps);
|
||||
|
||||
// 默认显示装备面板
|
||||
if (this.equipsPanNode) {
|
||||
this.equipsPanNode.active = true;
|
||||
}
|
||||
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "populate equipments", {
|
||||
count: equips.length,
|
||||
slotCount: this.equipCardComps.length
|
||||
@@ -1196,11 +1232,6 @@ export class MissionCardComp extends CCComp {
|
||||
// 三等分水平布局
|
||||
this.layoutSlotsHorizontal(this.skillCardComps);
|
||||
|
||||
// 默认显示技能面板
|
||||
if (this.skillPanNode) {
|
||||
this.skillPanNode.active = true;
|
||||
}
|
||||
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "populate skill cards", {
|
||||
count: skills.length,
|
||||
slotCount: this.skillCardComps.length
|
||||
@@ -1472,10 +1503,9 @@ export class MissionCardComp extends CCComp {
|
||||
}
|
||||
// 刷新所有刷新按钮的费用显示(含刷新石/金币切换与置灰状态)
|
||||
this.updateDrawCostUI();
|
||||
// 显示卡牌面板(默认进入准备阶段时展开,位置与其他面板保持一致)
|
||||
// 显示卡牌面板(默认进入准备阶段时展开,缩放放大到 1)
|
||||
if (this.cardPanNode && this.cardPanNode.isValid) {
|
||||
this.cardPanNode.active = true;
|
||||
this.cardPanNode.setPosition(this.panelShowPos.x, this.panelShowPos.y, 0);
|
||||
this.showOverlayPanel(this.cardPanNode);
|
||||
mLogger.log(this.debugMode, "MissionCardComp", "enterPreparePhase cardPanNode", {
|
||||
active: this.cardPanNode.active,
|
||||
position: this.cardPanNode.position,
|
||||
|
||||
@@ -22,7 +22,6 @@ import { oops } from "db://oops-framework/core/Oops";
|
||||
import { getCardIconId, setSpriteFrame } from "../common/CardIconHelper";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { smc } from "../common/SingletonModuleComp";
|
||||
import { MissionEconomy } from "./MissionEconomy";
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@@ -352,9 +351,10 @@ export class SCardComp extends CCComp {
|
||||
|
||||
/**
|
||||
* 购买点击处理:
|
||||
* 1. 扣除金币(失败则提示并中止)。
|
||||
* 2. 派发 UseSkillCard 事件,触发技能生效流程。
|
||||
* 3. 播放购买动画,购买后可继续购买(购买按钮保持可见)。
|
||||
* 1. 派发 UseSkillCard 事件,触发技能生效流程。
|
||||
* 2. 播放购买动画,购买后可继续购买(购买按钮保持可见)。
|
||||
*
|
||||
* 注:购买不花费金币(免费获取),原扣费逻辑已移除。
|
||||
*/
|
||||
private onBuyClick() {
|
||||
if (!this.cardData) return;
|
||||
@@ -364,18 +364,6 @@ export class SCardComp extends CCComp {
|
||||
|
||||
oops.audio.playEffect("music/button");
|
||||
|
||||
// 扣费
|
||||
const cost = this.cardData.cost ?? 0;
|
||||
const success = MissionEconomy.spendCoin(cost);
|
||||
if (!success) {
|
||||
oops.message.dispatchEvent(GameEvent.ShowSmallTip, "buy_coin");
|
||||
mLogger.log(this.debugMode, "SCardComp", "purchase failed: not enough coin", {
|
||||
uuid: this.cardData.uuid,
|
||||
cost
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
smc.vmdata.scores.refresh_hit_count++;
|
||||
|
||||
// 派发 UseSkillCard,技能生效流程由 MissSkillsComp 接收处理
|
||||
@@ -389,8 +377,7 @@ export class SCardComp extends CCComp {
|
||||
oops.message.dispatchEvent(GameEvent.CardUsed, this);
|
||||
|
||||
mLogger.log(this.debugMode, "SCardComp", "skill card purchased", {
|
||||
uuid: this.cardData.uuid,
|
||||
cost
|
||||
uuid: this.cardData.uuid
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user