4 Commits

Author SHA1 Message Date
pan
6c2f1defa9 refactor(monster): 重构波次怪物管理逻辑,优化配置与流程
1.  更新怪物配置注释,修正近战/远程怪物的描述与分类
2.  移除MissionComp中过时的自适应刷怪逻辑
3.  重构MissionMonComp:删除插队刷怪队列、简化波次流程、统一怪物生成逻辑
4.  移除冗余日志与注释,优化代码可读性
5.  调整波次准备阶段的怪物生成时机与数据处理
2026-06-23 17:05:07 +08:00
pan
46fa481607 feat(skill): add movement acceleration support for skills
1. 新增SMoveComp的isAccelerate字段控制加速逻辑
2. 添加技能配置is_accel字段启用加速效果
3. 实现二次方缓入加速曲线,兼顾起步速度与最终加速度
4. 为6001号技能默认开启加速效果并调整其移动类型为直线运动
2026-06-23 11:07:57 +08:00
pan
72cdf32a75 refactor(TalentItemComp): 优化天赋卡牌UI显示逻辑
1.  复用CardConfig中的pool_lv统一卡牌背景色,与技能卡保持一致
2.  新增对驻场天赋卡的图标显示支持,使用FieldSkillSet获取图标
3.  重构图标获取逻辑,与SCardComp保持对齐避免显示异常
4.  移除冗余的wave映射背景色代码
2026-06-22 16:24:23 +08:00
pan
a8642cb788 chore: 批量更新UI预制体资源配置
1.  更新引导文案文本内容
2.  调整卡牌控件的位置、尺寸、字体样式与布局参数
3.  更新轻量卡牌控件的激活状态与精灵帧引用
4.  调整方块控件的尺寸、缩放比例与填充参数
5.  移除废弃的精灵帧元数据配置
2026-06-22 15:08:01 +08:00
15 changed files with 651 additions and 2146 deletions

View File

@@ -2602,8 +2602,8 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": -1.378, "x": 2.438,
"y": 1.378, "y": 0,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -2643,8 +2643,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 17.90380859375, "width": 34.748356206795606,
"height": 35.5 "height": 67
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -2682,16 +2682,16 @@
"_string": "3", "_string": "3",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 25, "_actualFontSize": 40,
"_fontSize": 25, "_fontSize": 40,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 25, "_lineHeight": 50,
"_overflow": 0, "_overflow": 0,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
"_isSystemFontUsed": true, "_isSystemFontUsed": true,
"_spacingX": 0, "_spacingX": 0,
"_isItalic": false, "_isItalic": true,
"_isBold": true, "_isBold": true,
"_isUnderline": false, "_isUnderline": false,
"_underlineHeight": 2, "_underlineHeight": 2,

View File

@@ -1928,7 +1928,7 @@
"__id__": 129 "__id__": 129
} }
], ],
"_active": false, "_active": true,
"_components": [ "_components": [
{ {
"__id__": 135 "__id__": 135
@@ -1945,7 +1945,7 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 69.648, "x": 64.648,
"y": 75.307, "y": 75.307,
"z": 0 "z": 0
}, },
@@ -2073,7 +2073,7 @@
"a": 255 "a": 255
}, },
"_spriteFrame": { "_spriteFrame": {
"__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@4b5bf", "__uuid__": "cb93c900-b440-4571-91d1-7da1636e3d73@23e64",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
"_type": 0, "_type": 0,
@@ -2134,8 +2134,8 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": -1.378, "x": 0,
"y": 1.378, "y": 0,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -2175,8 +2175,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 17.90380859375, "width": 34.748356206795606,
"height": 35.5 "height": 67
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -2214,16 +2214,16 @@
"_string": "3", "_string": "3",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 25, "_actualFontSize": 40,
"_fontSize": 25, "_fontSize": 40,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 25, "_lineHeight": 50,
"_overflow": 0, "_overflow": 0,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
"_isSystemFontUsed": true, "_isSystemFontUsed": true,
"_spacingX": 0, "_spacingX": 0,
"_isItalic": false, "_isItalic": true,
"_isBold": true, "_isBold": true,
"_isUnderline": false, "_isUnderline": false,
"_underlineHeight": 2, "_underlineHeight": 2,

View File

@@ -747,7 +747,7 @@
"b": 255, "b": 255,
"a": 255 "a": 255
}, },
"_string": "选择一个战斗技能", "_string": "选择一个战斗「天赋」",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 46, "_actualFontSize": 46,

View File

@@ -7263,8 +7263,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 40, "width": 30,
"height": 40 "height": 30
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -7365,8 +7365,8 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": -2.313, "x": 0,
"y": 2.149, "y": 0,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -7604,7 +7604,7 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 20.6845703125, "width": 27.0612671550967,
"height": 54.4 "height": 54.4
}, },
"_anchorPoint": { "_anchorPoint": {
@@ -7652,7 +7652,7 @@
"_font": null, "_font": null,
"_isSystemFontUsed": true, "_isSystemFontUsed": true,
"_spacingX": 0, "_spacingX": 0,
"_isItalic": false, "_isItalic": true,
"_isBold": true, "_isBold": true,
"_isUnderline": false, "_isUnderline": false,
"_underlineHeight": 2, "_underlineHeight": 2,
@@ -16834,8 +16834,8 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": -1.378, "x": 2.438,
"y": 1.378, "y": 0,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -16875,8 +16875,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 17.90380859375, "width": 34.748356206795606,
"height": 35.5 "height": 67
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -16914,16 +16914,16 @@
"_string": "3", "_string": "3",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 25, "_actualFontSize": 40,
"_fontSize": 25, "_fontSize": 40,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 25, "_lineHeight": 50,
"_overflow": 0, "_overflow": 0,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
"_isSystemFontUsed": true, "_isSystemFontUsed": true,
"_spacingX": 0, "_spacingX": 0,
"_isItalic": false, "_isItalic": true,
"_isBold": true, "_isBold": true,
"_isUnderline": false, "_isUnderline": false,
"_underlineHeight": 2, "_underlineHeight": 2,
@@ -20788,8 +20788,8 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": -1.378, "x": 2.438,
"y": 1.378, "y": 0,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -20829,8 +20829,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 17.90380859375, "width": 34.748356206795606,
"height": 35.5 "height": 67
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -20868,16 +20868,16 @@
"_string": "3", "_string": "3",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 25, "_actualFontSize": 40,
"_fontSize": 25, "_fontSize": 40,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 25, "_lineHeight": 50,
"_overflow": 0, "_overflow": 0,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
"_isSystemFontUsed": true, "_isSystemFontUsed": true,
"_spacingX": 0, "_spacingX": 0,
"_isItalic": false, "_isItalic": true,
"_isBold": true, "_isBold": true,
"_isUnderline": false, "_isUnderline": false,
"_underlineHeight": 2, "_underlineHeight": 2,
@@ -24742,8 +24742,8 @@
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": -1.378, "x": 2.438,
"y": 1.378, "y": 0,
"z": 0 "z": 0
}, },
"_lrot": { "_lrot": {
@@ -24783,8 +24783,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 17.90380859375, "width": 34.748356206795606,
"height": 35.5 "height": 67
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -24822,16 +24822,16 @@
"_string": "3", "_string": "3",
"_horizontalAlign": 1, "_horizontalAlign": 1,
"_verticalAlign": 1, "_verticalAlign": 1,
"_actualFontSize": 25, "_actualFontSize": 40,
"_fontSize": 25, "_fontSize": 40,
"_fontFamily": "Arial", "_fontFamily": "Arial",
"_lineHeight": 25, "_lineHeight": 50,
"_overflow": 0, "_overflow": 0,
"_enableWrapText": true, "_enableWrapText": true,
"_font": null, "_font": null,
"_isSystemFontUsed": true, "_isSystemFontUsed": true,
"_spacingX": 0, "_spacingX": 0,
"_isItalic": false, "_isItalic": true,
"_isBold": true, "_isBold": true,
"_isUnderline": false, "_isUnderline": false,
"_underlineHeight": 2, "_underlineHeight": 2,

View File

@@ -22,32 +22,32 @@
"__id__": 2 "__id__": 2
}, },
{ {
"__id__": 35 "__id__": 63
}, },
{ {
"__id__": 41 "__id__": 69
}, },
{ {
"__id__": 47 "__id__": 75
}, },
{ {
"__id__": 53 "__id__": 81
} }
], ],
"_active": true, "_active": true,
"_components": [ "_components": [
{ {
"__id__": 59 "__id__": 87
}, },
{ {
"__id__": 61 "__id__": 89
}, },
{ {
"__id__": 63 "__id__": 91
} }
], ],
"_prefab": { "_prefab": {
"__id__": 65 "__id__": 93
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -169,6 +169,48 @@
}, },
{ {
"__id__": 34 "__id__": 34
},
{
"__id__": 35
},
{
"__id__": 37
},
{
"__id__": 39
},
{
"__id__": 41
},
{
"__id__": 43
},
{
"__id__": 45
},
{
"__id__": 47
},
{
"__id__": 49
},
{
"__id__": 51
},
{
"__id__": 53
},
{
"__id__": 55
},
{
"__id__": 57
},
{
"__id__": 59
},
{
"__id__": 61
} }
], ],
"removedComponents": [] "removedComponents": []
@@ -474,6 +516,280 @@
], ],
"value": 0 "value": 0
}, },
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 36
},
"propertyPath": [
"_active"
],
"value": true
},
{
"__type__": "cc.TargetInfo",
"localID": [
"4aTybcwdBL1IFgubnxRuUh"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 38
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 220,
"height": 270
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"eedc9qvxRPQpepecxrSorR"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 40
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 440,
"height": 540
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"deY6hTveBKBIzSn0k9oD+7"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 42
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 432,
"height": 528
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"b7HYchf9tMK7WtemLDPjlE"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 44
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 190,
"height": 140
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"25j0n7apFBratTNBweGTa7"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 46
},
"propertyPath": [
"_lpos"
],
"value": {
"__type__": "cc.Vec3",
"x": 0,
"y": 50,
"z": 0
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"93O2t0s3dBQYpkATdTKBPZ"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 48
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 380,
"height": 280
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"1fWMnHXs1IPZv24wLXcOc2"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 50
},
"propertyPath": [
"_active"
],
"value": true
},
{
"__type__": "cc.TargetInfo",
"localID": [
"34+q4uHrVMer4aH0jqs5JM"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 52
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 220,
"height": 270
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"2bJbEaLWxKYIZXGRHTBM1m"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 54
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 440,
"height": 540
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"8b8xEuZsBB+KDupKZRRki9"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 56
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 432,
"height": 528
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"30uXpT+kpFI5rT0dm/gN9k"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 58
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 190,
"height": 140
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"c6lDSuSgFMJaDP3gZWwz54"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 60
},
"propertyPath": [
"_lpos"
],
"value": {
"__type__": "cc.Vec3",
"x": 0,
"y": 50,
"z": 0
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"24Xd/896JIz4KMqBZHi94n"
]
},
{
"__type__": "CCPropertyOverrideInfo",
"targetInfo": {
"__id__": 62
},
"propertyPath": [
"_contentSize"
],
"value": {
"__type__": "cc.Size",
"width": 380,
"height": 280
}
},
{
"__type__": "cc.TargetInfo",
"localID": [
"1dy2U4eNdI6KgBqcoGyOOb"
]
},
{ {
"__type__": "cc.Node", "__type__": "cc.Node",
"_name": "icon", "_name": "icon",
@@ -486,14 +802,14 @@
"_active": true, "_active": true,
"_components": [ "_components": [
{ {
"__id__": 36 "__id__": 64
}, },
{ {
"__id__": 38 "__id__": 66
} }
], ],
"_prefab": { "_prefab": {
"__id__": 40 "__id__": 68
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -530,11 +846,11 @@
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"node": { "node": {
"__id__": 35 "__id__": 63
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 37 "__id__": 65
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
@@ -558,11 +874,11 @@
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"node": { "node": {
"__id__": 35 "__id__": 63
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 39 "__id__": 67
}, },
"_customMaterial": null, "_customMaterial": null,
"_srcBlendFactor": 2, "_srcBlendFactor": 2,
@@ -625,14 +941,14 @@
"_active": true, "_active": true,
"_components": [ "_components": [
{ {
"__id__": 42 "__id__": 70
}, },
{ {
"__id__": 44 "__id__": 72
} }
], ],
"_prefab": { "_prefab": {
"__id__": 46 "__id__": 74
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -669,11 +985,11 @@
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"node": { "node": {
"__id__": 41 "__id__": 69
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 43 "__id__": 71
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
@@ -697,11 +1013,11 @@
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"node": { "node": {
"__id__": 41 "__id__": 69
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 45 "__id__": 73
}, },
"_customMaterial": null, "_customMaterial": null,
"_srcBlendFactor": 2, "_srcBlendFactor": 2,
@@ -784,14 +1100,14 @@
"_active": true, "_active": true,
"_components": [ "_components": [
{ {
"__id__": 48 "__id__": 76
}, },
{ {
"__id__": 50 "__id__": 78
} }
], ],
"_prefab": { "_prefab": {
"__id__": 52 "__id__": 80
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -828,11 +1144,11 @@
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"node": { "node": {
"__id__": 47 "__id__": 75
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 49 "__id__": 77
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
@@ -856,11 +1172,11 @@
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"node": { "node": {
"__id__": 47 "__id__": 75
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 51 "__id__": 79
}, },
"_customMaterial": null, "_customMaterial": null,
"_srcBlendFactor": 2, "_srcBlendFactor": 2,
@@ -943,14 +1259,14 @@
"_active": false, "_active": false,
"_components": [ "_components": [
{ {
"__id__": 54 "__id__": 82
}, },
{ {
"__id__": 56 "__id__": 84
} }
], ],
"_prefab": { "_prefab": {
"__id__": 58 "__id__": 86
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -987,11 +1303,11 @@
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"node": { "node": {
"__id__": 53 "__id__": 81
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 55 "__id__": 83
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
@@ -1015,11 +1331,11 @@
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"node": { "node": {
"__id__": 53 "__id__": 81
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 57 "__id__": 85
}, },
"_customMaterial": null, "_customMaterial": null,
"_srcBlendFactor": 2, "_srcBlendFactor": 2,
@@ -1100,7 +1416,7 @@
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 60 "__id__": 88
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
@@ -1128,7 +1444,7 @@
}, },
"_enabled": false, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 90
}, },
"_alignFlags": 40, "_alignFlags": 40,
"_target": null, "_target": null,
@@ -1164,16 +1480,16 @@
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 64 "__id__": 92
}, },
"lbl_name": { "lbl_name": {
"__id__": 44 "__id__": 72
}, },
"lbl_info": { "lbl_info": {
"__id__": 50 "__id__": 78
}, },
"icon": { "icon": {
"__id__": 38 "__id__": 66
}, },
"bg": null, "bg": null,
"_id": "" "_id": ""
@@ -1194,7 +1510,7 @@
"instance": null, "instance": null,
"targetOverrides": [ "targetOverrides": [
{ {
"__id__": 66 "__id__": 94
} }
], ],
"nestedPrefabInstanceRoots": [ "nestedPrefabInstanceRoots": [
@@ -1206,7 +1522,7 @@
{ {
"__type__": "cc.TargetOverrideInfo", "__type__": "cc.TargetOverrideInfo",
"source": { "source": {
"__id__": 63 "__id__": 91
}, },
"sourceInfo": null, "sourceInfo": null,
"propertyPath": [ "propertyPath": [
@@ -1216,7 +1532,7 @@
"__id__": 2 "__id__": 2
}, },
"targetInfo": { "targetInfo": {
"__id__": 67 "__id__": 95
} }
}, },
{ {

View File

@@ -271,8 +271,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 218, "width": 168,
"height": 218 "height": 168
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -396,8 +396,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 420, "width": 320,
"height": 420 "height": 320
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -1958,8 +1958,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 100, "width": 80,
"height": 100 "height": 80
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -2892,8 +2892,8 @@
}, },
"_lscale": { "_lscale": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
"x": 0.9, "x": 0.6,
"y": 0.9, "y": 0.6,
"z": 1 "z": 1
}, },
"_mobility": 0, "_mobility": 0,
@@ -3062,8 +3062,8 @@
}, },
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 74, "width": 55,
"height": 74 "height": 55
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@@ -3111,7 +3111,7 @@
"y": 0.5 "y": 0.5
}, },
"_fillStart": 0, "_fillStart": 0,
"_fillRange": 0, "_fillRange": 1,
"_isTrimmedMode": true, "_isTrimmedMode": true,
"_useGrayscale": false, "_useGrayscale": false,
"_atlas": { "_atlas": {
@@ -3138,10 +3138,10 @@
}, },
"_alignFlags": 45, "_alignFlags": 45,
"_target": null, "_target": null,
"_left": 3, "_left": 12.5,
"_right": 3, "_right": 12.5,
"_top": 3, "_top": 12.5,
"_bottom": 3, "_bottom": 12.5,
"_horizontalCenter": 0, "_horizontalCenter": 0,
"_verticalCenter": 0, "_verticalCenter": 0,
"_isAbsLeft": true, "_isAbsLeft": true,

View File

@@ -1111,788 +1111,6 @@
], ],
"subMetas": {} "subMetas": {}
}, },
"536b9": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@536b9",
"displayName": "",
"id": "536b9",
"name": "CardFrame_Rectangle_01_Blue_Bg",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 65,
"trimY": 1861,
"width": 180,
"height": 221,
"rawWidth": 180,
"rawHeight": 221,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"cb195": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@cb195",
"displayName": "",
"id": "cb195",
"name": "CardFrame_Rectangle_01_Blue_Border",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 895,
"trimY": 673,
"width": 204,
"height": 253,
"rawWidth": 204,
"rawHeight": 253,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"4cf00": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@4cf00",
"displayName": "",
"id": "4cf00",
"name": "CardFrame_Rectangle_01_Blue_BorderGem",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 1314,
"trimY": 439,
"width": 204,
"height": 258,
"rawWidth": 204,
"rawHeight": 258,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"1ed54": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@1ed54",
"displayName": "",
"id": "1ed54",
"name": "CardFrame_Rectangle_01_Green_Bg",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 1670,
"trimY": 645,
"width": 180,
"height": 221,
"rawWidth": 180,
"rawHeight": 221,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"d5c11": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@d5c11",
"displayName": "",
"id": "d5c11",
"name": "CardFrame_Rectangle_01_Green_Border",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 1574,
"trimY": 439,
"width": 204,
"height": 253,
"rawWidth": 204,
"rawHeight": 253,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"df52c": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@df52c",
"displayName": "",
"id": "df52c",
"name": "CardFrame_Rectangle_01_Green_BorderGem",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 468,
"trimY": 933,
"width": 204,
"height": 258,
"rawWidth": 204,
"rawHeight": 258,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"19b1d": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@19b1d",
"displayName": "",
"id": "19b1d",
"name": "CardFrame_Rectangle_01_Purple_Bg",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 1660,
"trimY": 868,
"width": 180,
"height": 221,
"rawWidth": 180,
"rawHeight": 221,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"8de73": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@8de73",
"displayName": "",
"id": "8de73",
"name": "CardFrame_Rectangle_01_Purple_Border",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 454,
"trimY": 1524,
"width": 204,
"height": 253,
"rawWidth": 204,
"rawHeight": 253,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"e19cf": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@e19cf",
"displayName": "",
"id": "e19cf",
"name": "CardFrame_Rectangle_01_Purple_BorderGem",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 454,
"trimY": 1264,
"width": 204,
"height": 258,
"rawWidth": 204,
"rawHeight": 258,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"487ca": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@487ca",
"displayName": "",
"id": "487ca",
"name": "CardFrame_Rectangle_01_Red_Bg",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 728,
"trimY": 933,
"width": 180,
"height": 221,
"rawWidth": 180,
"rawHeight": 221,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"fc735": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@fc735",
"displayName": "",
"id": "fc735",
"name": "CardFrame_Rectangle_01_Red_Border",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 1150,
"trimY": 851,
"width": 204,
"height": 253,
"rawWidth": 204,
"rawHeight": 253,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"d5f55": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@d5f55",
"displayName": "",
"id": "d5f55",
"name": "CardFrame_Rectangle_01_Red_BorderGem",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 1150,
"trimY": 645,
"width": 204,
"height": 258,
"rawWidth": 204,
"rawHeight": 258,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"9d4d9": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@9d4d9",
"displayName": "",
"id": "9d4d9",
"name": "CardFrame_Rectangle_01_Yellow_Bg",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 910,
"trimY": 879,
"width": 180,
"height": 221,
"rawWidth": 180,
"rawHeight": 221,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"4fde0": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@4fde0",
"displayName": "",
"id": "4fde0",
"name": "CardFrame_Rectangle_01_Yellow_Border",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 1405,
"trimY": 851,
"width": 204,
"height": 253,
"rawWidth": 204,
"rawHeight": 253,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"e9809": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@e9809",
"displayName": "",
"id": "e9809",
"name": "CardFrame_Rectangle_01_Yellow_BorderGem",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 1410,
"trimY": 645,
"width": 204,
"height": 258,
"rawWidth": 204,
"rawHeight": 258,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"3c27d": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@3c27d",
"displayName": "",
"id": "3c27d",
"name": "Reward",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 65,
"trimY": 1319,
"width": 540,
"height": 108,
"rawWidth": 540,
"rawHeight": 108,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"abb23": {
"importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@abb23",
"displayName": "",
"id": "abb23",
"name": "btn_yellow2",
"userData": {
"trimThreshold": 1,
"rotated": true,
"offsetX": 0,
"offsetY": 0,
"trimX": 913,
"trimY": 214,
"width": 457,
"height": 196,
"rawWidth": 457,
"rawHeight": 196,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [],
"indexes": [],
"uv": [],
"nuv": [],
"minPos": [],
"maxPos": []
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0c35d8c7-1528-42ce-b7c4-20fbb1baab11@6c48a",
"atlasUuid": "cb93c900-b440-4571-91d1-7da1636e3d73",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"b9538": { "b9538": {
"importer": "sprite-frame", "importer": "sprite-frame",
"uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@b9538", "uuid": "cb93c900-b440-4571-91d1-7da1636e3d73@b9538",

View File

@@ -155,6 +155,7 @@ export interface SkillConfig {
bck?: number, // 额外击退概率 bck?: number, // 额外击退概率
buff_type?: Attrs, // Buff 类型 (单一职责) buff_type?: Attrs, // Buff 类型 (单一职责)
call_hero?: number, // 召唤技能召唤英雄id(可选) call_hero?: number, // 召唤技能召唤英雄id(可选)
is_accel?: boolean, // 是否逐渐加速飞行
info: string, // 技能描述 info: string, // 技能描述
} }
@@ -170,6 +171,7 @@ export interface SkillOverrides {
bck?: number; bck?: number;
buff_type?: Attrs; buff_type?: Attrs;
call_hero?: number; call_hero?: number;
is_accel?: boolean;
} }
/** /**
@@ -209,18 +211,18 @@ export const SkillSet: Record<number, SkillConfig> = {
**/ **/
6001: { 6001: {
uuid: 6001, name: "火球", sp_name: "atk_1", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6001, name: "火球", sp_name: "atk_1", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee,is_accel:true,
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害", RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
}, },
6002: { 6002: {
uuid: 6002, name: "紫烟", sp_name: "atk_2", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6002, name: "紫烟", sp_name: "atk_2", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.bezier, EType: EType.collision, info: "近战普通攻击技能", RType: RType.linear, EType: EType.collision, info: "近战普通攻击技能",
}, },
6003: { 6003: {
uuid: 6003, name: "白球", sp_name: "atk_3", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk", uuid: 6003, name: "白球", sp_name: "atk_3", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote, DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.bezier, EType: EType.collision, info: "一定几率暴击", RType: RType.linear, EType: EType.collision, info: "一定几率暴击",
}, },
6008: { 6008: {

View File

@@ -381,40 +381,40 @@ export const HeroInfo: Record<number, heroInfo> = {
*/ */
// 基础怪物 (全部远程攻击HType仅决定站位) // 基础怪物 (全部固定点位站桩攻击HType仅决定是前排还是后排)
// 近战位怪物 (站在前排,承受更多伤害) — v5: TD节奏CD多而弱爽感设计 // 前排怪物 (站在前排,承受更多伤害) — v5: TD节奏CD多而弱爽感设计
6001:{uuid:6001,name:"兽人战士",path:"m1", fac:FacSet.MON,lv:1,type:HType.Melee,hp:220,ap:10,speed:70, 6001:{uuid:6001,name:"兽人战士",path:"m1", fac:FacSet.MON,lv:1,type:HType.Melee,hp:220,ap:10,speed:70,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"基础近战位怪"}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"基础前排怪"},
6002:{uuid:6002,name:"兽人精锐战士",path:"m2", fac:FacSet.MON,lv:1,type:HType.Melee,hp:300,ap:14,speed:110, 6002:{uuid:6002,name:"兽人精锐战士",path:"m2", fac:FacSet.MON,lv:1,type:HType.Melee,hp:300,ap:14,speed:110,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"进阶近战位怪,更快更痛"}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"进阶前排怪,更快更痛"},
6003:{uuid:6003,name:"兽人重装兵",path:"m3", fac:FacSet.MON,lv:1,type:HType.Melee,hp:850,ap:20,speed:50, 6003:{uuid:6003,name:"兽人重装兵",path:"m3", fac:FacSet.MON,lv:1,type:HType.Melee,hp:850,ap:20,speed:50,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"重型坦克怪高HP慢攻"}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"重型坦克怪高HP慢攻"},
// 远程位怪物 (站在后排,输出更高) // 后排怪物 (站在后排,输出更高)
6004:{uuid:6004,name:"兽人射手",path:"m4", fac:FacSet.MON,lv:1,type:HType.Long,hp:190,ap:35,speed:70, 6004:{uuid:6004,name:"兽人射手",path:"m4", fac:FacSet.MON,lv:1,type:HType.Long,hp:190,ap:35,speed:70,
skills:{6008:{uuid:6008,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"远程高DPS怪"}, skills:{6008:{uuid:6008,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"后排高DPS怪"},
6005:{uuid:6005,name:"兽人刺客",path:"m5", fac:FacSet.MON,lv:1,type:HType.Long,hp:210,ap:38,speed:130, 6005:{uuid:6005,name:"兽人刺客",path:"m5", fac:FacSet.MON,lv:1,type:HType.Long,hp:210,ap:38,speed:130,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"高AP快速攻击刺客"}, skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"高AP快速攻击刺客"},
// 特殊位怪物 // 特殊位怪物
6006:{uuid:6006,name:"骷髅领主",path:"m6", fac:FacSet.MON,lv:1,type:HType.Melee,hp:5000,ap:20,speed:60, 6006:{uuid:6006,name:"骷髅领主",path:"m6", fac:FacSet.MON,lv:1,type:HType.Melee,hp:5000,ap:20,speed:60,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"MiniBoss级坦克"}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"前排MiniBoss级坦克"},
6007:{uuid:6007,name:"兽人术士",path:"m7", fac:FacSet.MON,lv:1,type:HType.Melee,hp:300,ap:24,speed:70, 6007:{uuid:6007,name:"兽人术士",path:"m7", fac:FacSet.MON,lv:1,type:HType.Long,hp:300,ap:24,speed:70,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"法师怪,远程魔法攻击"}, skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"后排法师怪,魔法攻击"},
6008:{uuid:6008,name:"兽人火法",path:"m8", fac:FacSet.MON,lv:1,type:HType.Melee,hp:270,ap:32,speed:70, 6008:{uuid:6008,name:"兽人火法",path:"m8", fac:FacSet.MON,lv:1,type:HType.Long,hp:270,ap:32,speed:70,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"高输出法师怪"}, skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"后排高输出法师怪"},
// BOSS怪物 — Boss节奏1.2-1.5s删除不存在的6206技能 // BOSS怪物 — Boss节奏1.2-1.5s删除不存在的6206技能
6101:{uuid:6101,name:"兽人首领-双刀战士",path:"mb1", fac:FacSet.MON,lv:6,type:HType.Long,hp:1900,ap:30,speed:120, 6101:{uuid:6101,name:"兽人首领-双刀战士",path:"mb1", fac:FacSet.MON,lv:6,type:HType.Melee,hp:1900,ap:30,speed:120,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"远程Boss高攻速"}, skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"前排Boss高攻速"},
6102:{uuid:6102,name:"兽人首领-斧头战士",path:"mb2", fac:FacSet.MON,lv:6,type:HType.Melee,hp:7500,ap:26,speed:60, 6102:{uuid:6102,name:"兽人首领-斧头战士",path:"mb2", fac:FacSet.MON,lv:6,type:HType.Melee,hp:7500,ap:26,speed:60,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"近战Boss超高HP"}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"前排Boss超高HP"},
6103:{uuid:6103,name:"兽人首领-魔法师",path:"mb3", fac:FacSet.MON,lv:6,type:HType.Long,hp:2250,ap:38,speed:110, 6103:{uuid:6103,name:"兽人首领-魔法师",path:"mb3", fac:FacSet.MON,lv:6,type:HType.Long,hp:2250,ap:38,speed:110,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"远程法系Boss高AP"}, skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow2].cd,ccd:0}},info:"后排法系Boss高AP"},
6104:{uuid:6104,name:"兽人首领-射手",path:"mb4", fac:FacSet.MON,lv:6,type:HType.Melee,hp:6800,ap:30,speed:70, 6104:{uuid:6104,name:"兽人首领-射手",path:"mb4", fac:FacSet.MON,lv:6,type:HType.Long,hp:6800,ap:30,speed:70,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"近战位Boss均衡型"}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"后排位Boss均衡型"},
6105:{uuid:6105,name:"亡灵首领-法师",path:"mb5", fac:FacSet.MON,lv:6,type:HType.Long,hp:2600,ap:42,speed:110, 6105:{uuid:6105,name:"亡灵首领-法师",path:"mb5", fac:FacSet.MON,lv:6,type:HType.Long,hp:2600,ap:42,speed:110,
skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"远程高AP Boss"}, skills:{6103:{uuid:6103,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},info:"后排高AP Boss"},
6106:{uuid:6106,name:"亡灵首领-骑马战士",path:"mb6", fac:FacSet.MON,lv:6,type:HType.Melee,hp:9000,ap:26,speed:130, 6106:{uuid:6106,name:"亡灵首领-骑马战士",path:"mb6", fac:FacSet.MON,lv:6,type:HType.Melee,hp:9000,ap:26,speed:130,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"终极Boss最高HP+高速"}, skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow3].cd,ccd:0}},info:"前排终极Boss最高HP+高速"},
}; };

View File

@@ -856,11 +856,6 @@ export class MissionComp extends CCComp {
// 怪物全灭检测:如果战斗阶段场上没有任何活着的怪物,且待刷新的怪物队列也为空,直接结束战斗进入下一波的准备阶段 // 怪物全灭检测:如果战斗阶段场上没有任何活着的怪物,且待刷新的怪物队列也为空,直接结束战斗进入下一波的准备阶段
const pendingCount = smc.vmdata.mission_data.pending_mon_num || 0; const pendingCount = smc.vmdata.mission_data.pending_mon_num || 0;
if (monsterCount === 0 && pendingCount === 0 && smc.mission.play && !smc.mission.pause && this.currentPhase === MissionPhase.Battle) { if (monsterCount === 0 && pendingCount === 0 && smc.mission.play && !smc.mission.pause && this.currentPhase === MissionPhase.Battle) {
let heroesAliveRatio = heroCount / 6.0; // 假设最大 6 个站位,或者直接基于存活数算比例
// 如果能获取当前已部署英雄数最好,这里简化处理,大于 4 个就算高存活
heroesAliveRatio = Math.min(1.0, heroCount / 4.0);
spawningEngine.updateAdaptive(heroesAliveRatio, this.clearTime);
if (this.currentWave >= 15) { if (this.currentWave >= 15) {
// 15 波通关 // 15 波通关
this.open_Victory(null, false); this.open_Victory(null, false);

View File

@@ -3,27 +3,13 @@
* @description 怪物Monster波次刷新管理组件逻辑层 * @description 怪物Monster波次刷新管理组件逻辑层
* *
* 职责: * 职责:
* 1. 管理每一波怪物的 **生成计划**:根据 WaveSlotConfig 生成怪物。 * 1. 管理每一波怪物的生成计划:根据 RogueConfig 生成怪物。
* 2. 处理特殊插队刷怪请求MonQueue优先于常规刷新 * 2. 自动推进波次在准备阶段结束时PhasePrepareEnd统一刷出怪物
* 3. 自动推进波次:当前波所有怪物被清除后自动进入下一波。
* *
* 关键设计: * 关键设计:
* - 突破 5 槽限制,怪物按刷怪顺序依次从 X=280 开始向右(每隔 50排布。 * - 采用 12 个硬编码的网格位置点 (MON_POSITIONS3行x4列)
* - 6 条刷怪线:在三路 Y 轴范围内随机偏移,实现 6 路进军 * - 每次生成最多 12 个怪物,固定在位置点
* - resetSlotSpawnData(wave) 在每波开始时读取配置,分配并立即生成所有怪物 * - 上一波残留怪在波次结束/开始时统一清理
* - 去除跨波 HP 继承,上一波残留怪在波次结束/开始时销毁。
*
* 怪物属性计算公式:
* ap = floor((base_ap + stage × grow_ap) × SpawnPowerBias)
* hp = floor((base_hp + stage × grow_hp) × SpawnPowerBias)
* 其中 stage = currentWave - 1
*
* 依赖:
* - RogueConfig —— 怪物类型、成长值、波次配置
* - Monsterhero/Mon.ts—— 怪物 ECS 实体类
* - HeroInfoheroSet—— 怪物基础属性配置(与英雄共用配置)
* - HeroAttrsComp / MonMoveComp —— 怪物属性和移动组件
* - BoxSet.GAME_LINE —— 地面基准 Y 坐标
*/ */
import { _decorator, v3, Vec3 } from "cc"; import { _decorator, v3, Vec3 } from "cc";
import { mLogger } from "../common/Logger"; import { mLogger } from "../common/Logger";
@@ -31,21 +17,15 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ec
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
import { Monster } from "../hero/Mon"; import { Monster } from "../hero/Mon";
import { HeroInfo, HType } from "../common/config/heroSet";
import { smc } from "../common/SingletonModuleComp"; import { smc } from "../common/SingletonModuleComp";
import { GameEvent } from "../common/config/GameEvent"; import { GameEvent } from "../common/config/GameEvent";
import {BoxSet, FacSet } from "../common/config/GameSet"; import { BoxSet, FacSet } from "../common/config/GameSet";
import { spawningEngine, GeneratedMonster, AffixType, MonType, MonList, TestModeConfig } from "./RogueConfig"; import { spawningEngine, GeneratedMonster, TestModeConfig } from "./RogueConfig";
import { HeroAttrsComp } from "../hero/HeroAttrsComp"; import { HeroAttrsComp } from "../hero/HeroAttrsComp";
import { MonMoveComp } from "../hero/MonMoveComp"; import { MonMoveComp } from "../hero/MonMoveComp";
const { ccclass, property } = _decorator; const { ccclass, property } = _decorator;
/**
* MissionMonCompComp —— 怪物波次刷新管理器
*
* 每波开始时根据 WaveSlotConfig 配置生成怪物,
* 战斗中监控数量,所有怪物消灭后自动推进到下一波。
*/
@ccclass('MissionMonCompComp') @ccclass('MissionMonCompComp')
@ecs.register('MissionMonComp', false) @ecs.register('MissionMonComp', false)
export class MissionMonCompComp extends CCComp { export class MissionMonCompComp extends CCComp {
@@ -81,83 +61,32 @@ export class MissionMonCompComp extends CCComp {
@property({ tooltip: "是否启用调试日志" }) @property({ tooltip: "是否启用调试日志" })
private debugMode: boolean = false; private debugMode: boolean = false;
// ======================== 插队刷怪队列 ========================
/**
* 刷怪队列(优先于常规配置处理):
* 用于插队生成(如运营活动怪、技能召唤怪、剧情强制怪)。
*/
private MonQueue: Array<{
/** 怪物 UUID */
uuid: number,
/** 怪物等级 */
level: number,
/** 飞行层 */
flyLane: number,
}> = [];
// ======================== 运行时状态 ======================== // ======================== 运行时状态 ========================
/** 全局生成顺序计数器(用于渲染层级排序) */ /** 全局生成顺序计数器(用于渲染层级排序) */
private globalSpawnOrder: number = 0; private globalSpawnOrder: number = 0;
/** 插队刷怪处理计时器 */
private queueTimer: number = 0;
/** 当前波数 */ /** 当前波数 */
private currentWave: number = 0; private currentWave: number = 0;
/** 当前波的目标怪物总数 */ /** 当前波的目标怪物总数 */
private waveTargetCount: number = 0; private waveTargetCount: number = 0;
/** 当前波已生成的怪物数量 */ /** 当前波已生成的怪物数量 */
private waveSpawnedCount: number = 0; private waveSpawnedCount: number = 0;
/** 等待生成的怪物队列(由新肉鸽引擎提供) */ /** 等待生成的怪物队列 */
private pendingMonsters: GeneratedMonster[] = []; private pendingMonsters: GeneratedMonster[] = [];
// ======================== 生命周期 ======================== // ======================== 生命周期 ========================
onLoad(){ onLoad() {
this.on(GameEvent.FightReady,this.fight_ready,this) this.on(GameEvent.FightReady, this.fight_ready, this);
this.on("SpawnSpecialMonster", this.onSpawnSpecialMonster, this);
this.on("PhasePrepareEnd", this.onPhasePrepareEnd, this); this.on("PhasePrepareEnd", this.onPhasePrepareEnd, this);
this.on("TimeUpAdvanceWave", this.onTimeUpAdvanceWave, this); this.on("TimeUpAdvanceWave", this.onTimeUpAdvanceWave, this);
} }
/**
* 帧更新:
* 1. 检查游戏是否运行中。
* 2. 处理插队刷怪队列。
* 3. 逐步从 pendingMonsters 队列中生成怪物(受 stop_spawn_mon 限制)。
*/
protected update(dt: number): void { protected update(dt: number): void {
smc.vmdata.mission_data.pending_mon_num = this.pendingMonsters.length; smc.vmdata.mission_data.pending_mon_num = this.pendingMonsters.length;
if(!smc.mission.play) return
if(smc.mission.pause) return
if(smc.mission.stop_mon_action) return;
if(!smc.mission.in_fight) return;
this.updateSpecialQueue(dt);
} }
// ======================== 事件处理 ======================== start() {}
/**
* 接收特殊刷怪事件并入队。
* @param event 事件名
* @param args { uuid: number, level: number, flyLane?: number }
*/
private onSpawnSpecialMonster(event: string, args: any) {
if (!args) return;
mLogger.log(this.debugMode, 'MissionMonComp', `[MissionMonComp] 收到特殊刷怪指令:`, args);
this.MonQueue.push({
uuid: args.uuid,
level: args.level,
flyLane: args.flyLane || 0
});
// 加速队列消费
this.queueTimer = 1.0;
}
start() {
}
private setupWaveData(monsters: GeneratedMonster[]) { private setupWaveData(monsters: GeneratedMonster[]) {
this.pendingMonsters = monsters.slice(0, MissionMonCompComp.MAX_MONSTERS); this.pendingMonsters = monsters.slice(0, MissionMonCompComp.MAX_MONSTERS);
@@ -166,9 +95,7 @@ export class MissionMonCompComp extends CCComp {
let hasBoss = monsters.some(m => m.isBoss); let hasBoss = monsters.some(m => m.isBoss);
console.log(`[MissionMonComp] 波次 ${this.currentWave} 生成怪物总数: ${this.waveTargetCount}`); mLogger.log(this.debugMode, 'MissionMonComp', `[MissionMonComp] 波次 ${this.currentWave} 生成怪物总数: ${this.waveTargetCount}`);
const uuids = monsters.map(m => m.uuid);
console.log(`[MissionMonComp] 波次 ${this.currentWave} 怪物 UUID 列表:`, uuids);
oops.message.dispatchEvent(GameEvent.NewWave, { oops.message.dispatchEvent(GameEvent.NewWave, {
wave: this.currentWave, wave: this.currentWave,
@@ -180,81 +107,41 @@ export class MissionMonCompComp extends CCComp {
/** /**
* 战斗准备:重置所有运行时状态并开始第一波。 * 战斗准备:重置所有运行时状态并开始第一波。
*/ */
fight_ready(){ fight_ready() {
smc.vmdata.mission_data.mon_num=0 smc.vmdata.mission_data.mon_num = 0;
smc.mission.stop_spawn_mon = false smc.mission.stop_spawn_mon = false;
this.globalSpawnOrder = 0 this.globalSpawnOrder = 0;
this.queueTimer = 0 this.currentWave = 1;
this.currentWave = 1 this.waveTargetCount = 0;
this.waveTargetCount = 0 this.waveSpawnedCount = 0;
this.waveSpawnedCount = 0 this.pendingMonsters = [];
this.MonQueue = []
this.pendingMonsters = []
// 预生成第一波数据以获取数量和 Boss 信息 // 预生成第一波数据以获取数量和 Boss 信息
const monsters = spawningEngine.generateWave(this.currentWave); const monsters = spawningEngine.generateWave(this.currentWave);
this.setupWaveData(monsters); this.setupWaveData(monsters);
// 如果处于测试模式,英雄也需要限制为只产出一个,这部分通知可以配合使用
if (TestModeConfig.enable) { if (TestModeConfig.enable) {
mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] 测试模式已开启每波仅生成1只基准怪物"); mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] 测试模式已开启");
} }
mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] Starting Wave System"); mLogger.log(this.debugMode, 'MissionMonComp', "[MissionMonComp] Starting Wave System");
} }
// ======================== 插队刷怪 ========================
/**
* 处理插队刷怪队列(每 0.15 秒尝试消费一个):
* 1. 找到后从队列中移除并生成怪物。
*/
private updateSpecialQueue(dt: number) {
if (this.MonQueue.length <= 0) return;
this.queueTimer += dt;
if (this.queueTimer < 0.15) return;
const item = this.MonQueue.shift()!;
this.queueTimer = 0;
const isBoss = MonList[MonType.MeleeBoss].includes(item.uuid) ||
MonList[MonType.LongBoss].includes(item.uuid);
const spawnIndex = this.waveSpawnedCount++;
const targetPosIndex = spawnIndex % MissionMonCompComp.MAX_MONSTERS;
// 构造一个模拟的 GeneratedMonster 数据传递给 addMonsterAtGrid
const base = HeroInfo[item.uuid];
const monData: GeneratedMonster = {
uuid: item.uuid,
type: MonType.Melee, // 简化的兜底,真实逻辑依赖 heroSet 配置
hp: base ? base.hp : 100,
ap: base ? base.ap : 10,
affixes: [],
isBoss: isBoss,
spawnIndex: 0
};
this.addMonsterAtGrid(targetPosIndex, monData, item.level);
}
// ======================== 波次管理 ======================== // ======================== 波次管理 ========================
/** /**
* 开始下一波: * 开始下一波:波数 +1 并预生成数据
* 1. 波数 +1 并更新全局数据。
* 2. 分发 NewWave 事件(实际的生成在 resetSlotSpawnData 中触发)。
*/ */
private onTimeUpAdvanceWave() { private onTimeUpAdvanceWave() {
this.currentWave += 1; this.currentWave += 1;
smc.vmdata.mission_data.level = this.currentWave; smc.vmdata.mission_data.level = this.currentWave;
// 预生成新一波数据以获取数量和 Boss 信息
const monsters = spawningEngine.generateWave(this.currentWave); const monsters = spawningEngine.generateWave(this.currentWave);
this.setupWaveData(monsters); this.setupWaveData(monsters);
} }
private onPhasePrepareEnd() { private onPhasePrepareEnd() {
this.resetSlotSpawnData(this.currentWave); this.resetSlotSpawnData();
// 准备结束阶段,立即刷出本波所有怪物 // 准备结束阶段,立即刷出本波所有怪物
if (this.pendingMonsters.length > 0) { if (this.pendingMonsters.length > 0) {
@@ -262,11 +149,9 @@ export class MissionMonCompComp extends CCComp {
for (let i = 0; i < count; i++) { for (let i = 0; i < count; i++) {
const monData = this.pendingMonsters.shift()!; const monData = this.pendingMonsters.shift()!;
const targetPosIndex = this.waveSpawnedCount % MissionMonCompComp.MAX_MONSTERS; const targetPosIndex = this.waveSpawnedCount % MissionMonCompComp.MAX_MONSTERS;
console.log(`[MissionMonComp] [PhasePrepareEnd] 准备生成怪物 UUID=${monData.uuid}, 当前已生成数量=${this.waveSpawnedCount}`); this.addMonsterAtGrid(targetPosIndex, monData, this.currentWave);
this.addMonsterAtGrid(targetPosIndex, monData);
this.waveSpawnedCount++; this.waveSpawnedCount++;
} }
// 生成完毕后清空 pendingMonsters
this.pendingMonsters = []; this.pendingMonsters = [];
} }
} }
@@ -274,14 +159,9 @@ export class MissionMonCompComp extends CCComp {
// ======================== 槽位管理 ======================== // ======================== 槽位管理 ========================
/** /**
* 重新分配本波所有怪物状态: * 清理上一波残留怪物,并重置生成计数
* 1. 清理上一波残留怪物。
* 2. pendingMonsters 已在 onTimeUpAdvanceWave / fight_ready 中准备好。
*
* @param wave 当前波数
*/ */
private resetSlotSpawnData(wave: number = 1) { private resetSlotSpawnData() {
// 1. 清理上一波残留怪物
ecs.query(ecs.allOf(HeroAttrsComp)).forEach(e => { ecs.query(ecs.allOf(HeroAttrsComp)).forEach(e => {
const attrs = e.get(HeroAttrsComp); const attrs = e.get(HeroAttrsComp);
if (attrs && attrs.fac === FacSet.MON && !attrs.is_dead) { if (attrs && attrs.fac === FacSet.MON && !attrs.is_dead) {
@@ -289,18 +169,13 @@ export class MissionMonCompComp extends CCComp {
} }
}); });
// 2. 重置排号索引
this.waveSpawnedCount = 0; this.waveSpawnedCount = 0;
} }
// ======================== 怪物生成 ======================== // ======================== 怪物生成 ========================
/** /**
* 在指定位置索引处生成一个怪物 * 在指定位置索引处生成一个怪物
*
* @param posIndex 位置索引 (0-11)
* @param monData 新引擎生成的怪物数据 (含 uuid, hp, ap, affixes 等)
* @param monLv 怪物等级 (仅对旧有的 level 参数做兼容,实际属性由 monData 决定)
*/ */
private addMonsterAtGrid( private addMonsterAtGrid(
posIndex: number, posIndex: number,
@@ -310,51 +185,32 @@ export class MissionMonCompComp extends CCComp {
let mon = ecs.getEntity<Monster>(Monster); let mon = ecs.getEntity<Monster>(Monster);
let scale = -1; let scale = -1;
// 获取硬编码的占位点坐标,不再使用随机偏移
const basePos = MissionMonCompComp.MON_POSITIONS[posIndex % MissionMonCompComp.MON_POSITIONS.length]; const basePos = MissionMonCompComp.MON_POSITIONS[posIndex % MissionMonCompComp.MON_POSITIONS.length];
const spawnX = basePos.x; const spawnX = basePos.x;
const landingY = basePos.y + (monData.isBoss ? 6 : 0); const landingY = basePos.y + (monData.isBoss ? 6 : 0);
const spawnPos: Vec3 = v3(spawnX, landingY + MissionMonCompComp.MON_DROP_HEIGHT, 0); const spawnPos: Vec3 = v3(spawnX, landingY + MissionMonCompComp.MON_DROP_HEIGHT, 0);
this.globalSpawnOrder = (this.globalSpawnOrder + 1) % 999; this.globalSpawnOrder = (this.globalSpawnOrder + 1) % 999;
// 如果存在测试技能覆盖,则传递下去(修改 mon.load 逻辑或者通过预存) if (monData.testSkills) {
// 为了避免侵入 Mon.ts 的原有逻辑,我们先预存 (mon as any)._testSkills = monData.testSkills;
(mon as any)._testSkills = monData.testSkills; }
mon.load(spawnPos, scale, monData.uuid, monData.isBoss, landingY, monLv, posIndex); mon.load(spawnPos, scale, monData.uuid, monData.isBoss, landingY, monLv, posIndex);
// 设置渲染排序
const move = mon.get(MonMoveComp); const move = mon.get(MonMoveComp);
if (move) { if (move) {
move.spawnOrder = this.globalSpawnOrder; move.spawnOrder = this.globalSpawnOrder;
} }
// 应用新引擎计算好的最终属性和词缀 // 应用新引擎计算好的最终属性
const model = mon.get(HeroAttrsComp); const model = mon.get(HeroAttrsComp);
if (!model) return; if (model) {
model.ap = monData.ap; model.ap = monData.ap;
model.hp_max = monData.hp; model.hp_max = monData.hp;
model.hp = model.hp_max; model.hp = model.hp_max;
// 将词缀记录到属性组件上,供战斗层使用
(model as any).affixes = monData.affixes || [];
// 解析特定的抗性词缀
if (monData.affixes) {
if (monData.affixes.includes(AffixType.CritRes)) {
model.critical_res = 50;
}
if (monData.affixes.includes(AffixType.FreezeRes)) {
model.freeze_res = 50;
}
if (monData.affixes.includes(AffixType.KnockbackRes)) {
model.knockback_res = 50;
}
} }
} }
/** ECS 组件移除时触发(当前不销毁节点) */ /** ECS 组件移除时触发 */
reset() { reset() {}
// this.node.destroy();
}
} }

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,7 @@ import { _decorator, Label, Sprite, SpriteFrame } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { CardConfig } from "../common/config/CardSet"; import { CardConfig } from "../common/config/CardSet";
import { SkillSet } from "../common/config/SkillSet"; import { FieldSkillSet, SkillSet } from "../common/config/SkillSet";
import { CardBgComp } from "./CardBgComp"; import { CardBgComp } from "./CardBgComp";
import { smc } from "../common/SingletonModuleComp"; import { smc } from "../common/SingletonModuleComp";
import { oops } from "db://oops-framework/core/Oops"; import { oops } from "db://oops-framework/core/Oops";
@@ -45,38 +45,35 @@ export class TalentItemComp extends CCComp {
*/ */
public updateItem(config: CardConfig): void { public updateItem(config: CardConfig): void {
if (!config) return; if (!config) return;
if (this.lbl_name) this.lbl_name.string = config.name ?? ""; if (this.lbl_name) this.lbl_name.string = config.name ?? "";
if (this.lbl_info) this.lbl_info.string = config.info ?? ""; if (this.lbl_info) this.lbl_info.string = config.info ?? "";
// 根据 wave 映射背景颜色 // 直接复用 CardSet 中已映射好的 pool_lv保证与技能卡牌背景一致
// 1=绿色(poolLv=1) 5=蓝色(poolLv=2) 10=紫色(poolLv=3) 15=黄色(poolLv=4) 20=红色(poolLv=5) // CardSet 通过 waveToPoolLv[wave] 由 SKILL_CARD_WAVES 索引推导wave 1→1, 5→2, 8→3
if (this.bg) { if (this.bg) {
let poolLv = 1; this.bg.apply(config.pool_lv || 1);
const wave = config.wave || 1;
if (wave >= 20) poolLv = 5;
else if (wave >= 15) poolLv = 4;
else if (wave >= 10) poolLv = 3;
else if (wave >= 5) poolLv = 2;
else poolLv = 1;
this.bg.apply(poolLv);
} }
// 设置图标 // 设置图标:驻场卡(skill=undefined 但有 field)走 FieldSkillSet否则走 SkillSet
if (this.icon && config.skill) { // 与 SCardComp 保持一致,避免驻场卡无 icon 显示
const skillData = SkillSet[config.skill]; if (this.icon) {
if (skillData && skillData.icon) { let iconId: string | undefined;
if (!config.skill && config.field && config.field.length > 0) {
// 驻场卡:用 FieldSkillSet[field[0]].icon
const fieldUuid = config.field[0];
iconId = FieldSkillSet[fieldUuid]?.icon || `${fieldUuid}`;
} else if (config.skill) {
// 技能卡:用 SkillSet[skill].icon
iconId = SkillSet[config.skill]?.icon;
}
if (iconId) {
if (smc.uiconsAtlas) { if (smc.uiconsAtlas) {
const frame = smc.uiconsAtlas.getSpriteFrame(skillData.icon); const frame = smc.uiconsAtlas.getSpriteFrame(iconId);
if (frame) { if (frame) this.icon.spriteFrame = frame;
this.icon.spriteFrame = frame;
}
} else { } else {
const sf = oops.res.get("game/heros/cards/" + skillData.icon, SpriteFrame) as SpriteFrame; const sf = oops.res.get("game/heros/cards/" + iconId, SpriteFrame) as SpriteFrame;
if (sf) { if (sf) this.icon.spriteFrame = sf;
this.icon.spriteFrame = sf;
}
} }
} }
} }

View File

@@ -69,6 +69,9 @@ export class SMoveDataComp extends ecs.Comp {
bezierMidHeight: number = 200; bezierMidHeight: number = 200;
bezierArc: number = 1; bezierArc: number = 1;
/** 是否逐渐加速 (ease-in) */
isAccelerate: boolean = false;
/** 是否自动销毁(到达目标后) */ /** 是否自动销毁(到达目标后) */
autoDestroy: boolean = true; autoDestroy: boolean = true;
@@ -80,6 +83,7 @@ export class SMoveDataComp extends ecs.Comp {
this.bezierStartHeight = 30; this.bezierStartHeight = 30;
this.bezierMidHeight = 200; this.bezierMidHeight = 200;
this.bezierArc = 1; this.bezierArc = 1;
this.isAccelerate = false;
this.speed = 500; this.speed = 500;
this.progress = 0; this.progress = 0;
this.scale = 1; this.scale = 1;
@@ -181,14 +185,20 @@ export class SMoveDataComp extends ecs.Comp {
* 根据移动类型计算当前位置 * 根据移动类型计算当前位置
*/ */
private calculateCurrentPosition() { private calculateCurrentPosition() {
// 如果开启了逐渐加速,混合线性与二次方曲线 (如 0.7 * t^2 + 0.3 * t)
// 这样起步拥有 30% 的基础速度,不会显得完全静止,随后逐渐加速
const t = this.isAccelerate ?
(this.progress * this.progress * 0.7 + this.progress * 0.3) :
this.progress;
switch (this.runType) { switch (this.runType) {
case RType.linear: case RType.linear:
// 直线运动 // 直线运动
Vec3.lerp(this.currentPos, this.startPos, this.targetPos, this.progress); Vec3.lerp(this.currentPos, this.startPos, this.targetPos, t);
break; break;
case RType.bezier: case RType.bezier:
this.calculateBezierPosition(this.progress); this.calculateBezierPosition(t);
break; break;
case RType.fixed: case RType.fixed:
@@ -198,7 +208,7 @@ export class SMoveDataComp extends ecs.Comp {
break; break;
default: default:
Vec3.lerp(this.currentPos, this.startPos, this.targetPos, this.progress); Vec3.lerp(this.currentPos, this.startPos, this.targetPos, t);
break; break;
} }
} }

View File

@@ -40,10 +40,13 @@ export class SMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
return; return;
} }
// 根据配置设置移动速度 // 根据配置设置移动速度与加速度
if (skillConfig.speed > 0) { if (skillConfig.speed > 0) {
moveComp.speed = skillConfig.speed; moveComp.speed = skillConfig.speed;
} }
if (skillConfig.is_accel) {
moveComp.isAccelerate = true;
}
// 根据runType设置初始位置 // 根据runType设置初始位置
this.initializePosition(moveComp, skillView); this.initializePosition(moveComp, skillView);
@@ -190,10 +193,12 @@ export class SMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
if (moveComp.progress < 1) { if (moveComp.progress < 1) {
// 计算下一帧的位置来确定方向 // 计算下一帧的位置来确定方向
const nextProgress = Math.min(moveComp.progress + 0.01, 1); const nextProgress = Math.min(moveComp.progress + 0.01, 1);
const t = moveComp.isAccelerate ?
(nextProgress * nextProgress * 0.7 + nextProgress * 0.3) :
nextProgress;
const nextPos = v3(0, 0, 0); const nextPos = v3(0, 0, 0);
// 计算下一个位置 // 计算下一个位置
const t = nextProgress;
const oneMinusT = 1 - t; const oneMinusT = 1 - t;
const oneMinusTSquared = oneMinusT * oneMinusT; const oneMinusTSquared = oneMinusT * oneMinusT;
const tSquared = t * t; const tSquared = t * t;
@@ -245,6 +250,7 @@ export class SMoveHelper {
if (skillConfig) { if (skillConfig) {
moveComp.runType = skillConfig.RType || RType.linear; moveComp.runType = skillConfig.RType || RType.linear;
moveComp.speed = skillConfig.speed || 500; moveComp.speed = skillConfig.speed || 500;
if (skillConfig.is_accel) moveComp.isAccelerate = true;
} }
} }