Merge branch 'new0602' of https://e.coding.net/walker_pan/heros/heros into new0602

This commit is contained in:
2025-07-23 00:38:46 +08:00
34 changed files with 719 additions and 2470 deletions

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 95
},
{
"__id__": 97
}
],
"_prefab": {
"__id__": 97
"__id__": 99
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1498,6 +1501,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "12/JRUQxNOb4XyRugfdK75"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 98
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "0eI7xnuipJJJ8/kJ+t51l4"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 95
},
{
"__id__": 97
}
],
"_prefab": {
"__id__": 97
"__id__": 99
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1498,6 +1501,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "a2jPQ8TNhPj67IyZiPimbD"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 98
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "a0ZuO8pcZBVLCGR/YlgT1g"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 95
},
{
"__id__": 97
}
],
"_prefab": {
"__id__": 97
"__id__": 99
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1498,6 +1501,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "bcLqUE0OFGNrOQ237vM07E"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 98
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "67tfoudqpBOa0qtG74B8C1"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 96
},
{
"__id__": 98
}
],
"_prefab": {
"__id__": 98
"__id__": 100
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1511,6 +1514,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "73tF4dlnxPwrg/FRKx1Opn"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 99
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "e04gcKnRVFqIEPoK8xjNF5"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 96
},
{
"__id__": 98
}
],
"_prefab": {
"__id__": 98
"__id__": 100
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1511,6 +1514,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "01hrg2GRpPOIe0UPL1K3+9"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 99
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "49gQPhPXRGGIE6FPJixjy0"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -65,10 +65,13 @@
},
{
"__id__": 87
},
{
"__id__": 89
}
],
"_prefab": {
"__id__": 89
"__id__": 91
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1383,6 +1386,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "4cocBoZPBGhph8DyWbZwSS"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 90
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "08J9V80+JMALiSGlvM4eOE"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 95
},
{
"__id__": 97
}
],
"_prefab": {
"__id__": 97
"__id__": 99
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1498,6 +1501,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "22rQh8lkpINoemMMMjGXPA"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 98
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "d7mGZQWT5Ke7Pn6FHiBfvi"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 95
},
{
"__id__": 97
}
],
"_prefab": {
"__id__": 97
"__id__": 99
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1498,6 +1501,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "22rQh8lkpINoemMMMjGXPA"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 98
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "5bxB76k5BGoLoztZDZc06R"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 95
},
{
"__id__": 97
}
],
"_prefab": {
"__id__": 97
"__id__": 99
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1498,6 +1501,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "22rQh8lkpINoemMMMjGXPA"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 98
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "dflWZRVv9BhIkcpqreLeRl"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 98
},
{
"__id__": 100
}
],
"_prefab": {
"__id__": 100
"__id__": 102
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1530,6 +1533,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "f2f7ZpftZN5ats6jdhFfCm"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 101
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "f2GtSvgCtHAYJc+VDNYBt4"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 98
},
{
"__id__": 100
}
],
"_prefab": {
"__id__": 100
"__id__": 102
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1530,6 +1533,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "24NMIe4OBIpbwx1nh6NYWa"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 101
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "c0QpxHu2ZIF4SuX4gcAwdM"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -68,10 +68,13 @@
},
{
"__id__": 98
},
{
"__id__": 100
}
],
"_prefab": {
"__id__": 100
"__id__": 102
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -1530,6 +1533,24 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "beDt1ByHNB564mmZr4kD3H"
},
{
"__type__": "846e0MH5V5Lw6nbs4fImtZx",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 101
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "92KbMRroFOB79gD+ep0wHK"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -439,4 +439,7 @@ mermaid图片代码merm复制graph TD
远征10波 送一张免广告券,最多1张,仅远征中使用
普通小怪冲锋或暂停的微小随机行为(不影响总路线时间和击杀策略)。避免视觉单调
普通小怪冲锋或暂停的微小随机行为(不影响总路线时间和击杀策略)。避免视觉单调
### 装备改成

View File

@@ -4,7 +4,7 @@
import { getHeroList, HeroList } from "./heroSet"
import { getSkills, HeroSkillList, SkillSet } from "./SkillSet"
import { equip_list, weapons, armors, accessorys, getEquipUUIDsByTypeAndLevel } from "./Equips"
import { equip_list, weapons, armors, accessorys, getEquipUUIDsByType } from "./Equips"
import { getEnhancement } from "./LevelUp"
//1:伙伴 2:技能 3:装备的出现概率配置
@@ -116,7 +116,7 @@ export function getRandomCardsByType(
break;
case cardType.EQUIP:
// 根据装备子类型筛选
cardList=getEquipUUIDsByTypeAndLevel(data,level) //装备时 data是装备子类型 1:武器 2:防具 3:饰品 0或undefined:全部
cardList=getEquipUUIDsByType(data) //装备时 data是装备子类型 1:武器 2:防具 3:饰品 0或undefined:全部
break;
case cardType.SPECIAL:
cardList = SuperCardsList;

File diff suppressed because it is too large Load Diff

View File

@@ -54,8 +54,7 @@ export enum GameEvent {
UpdateHP = "UpdateHP",
APChange = "APChange",
EXPUP = "EXPUP",
EQUIP_STONE_UP = "EQUIP_STONE_UP",
SKILL_STONE_UP = "SKILL_STONE_UP",
ShopOpen = "ShopOpen",
RestOpen = "RestOpen",
HeroLvUp = "HeroLvUp",

View File

@@ -60,6 +60,10 @@ export enum FightSet {
ORANGE_GOLD=4,//橙色金币
BURN_COUNT=5,//默认易伤次数
STUN_TIME=0.5,//默认晕时间
WEAPON_LV=2,//武器等级
SHIELD_LV=3,//护盾等级
ARMOR_LV=4,//防具等级
ACCESSORY_LV=5,//饰品等级
// ATK_TO_ATK_RATIO=0.1,
// ATK_TO_HP_RATIO=0.2,
// ATK_TO_SHIELD_RATIO=2,

View File

@@ -91,10 +91,11 @@ export enum DebuffAttr {
//buff类型
export enum BuffAttr {
ATK = 1, // 攻击力
AP = 0, //攻击力 数值
ATK = 1, // 攻击力百分比
WFUNY = 2, // 风怒
ATK_CD = 3, // 攻击速度
HP = 4, // 生命值
HP = 4, // 生命值比例
DEF = 5, // 免伤
SKILL_DMG = 6, // 技能效果
SKILL_CD = 7, // 技能冷却缩减
@@ -119,6 +120,7 @@ export enum BuffAttr {
STUN_TIME = 25, //击晕额外时间
STUN_RATTO = 26, //击晕概率
FROST_TIME = 27, //冰冻时间
HP_MAX = 28, //最大生命值数值
}
export const geDebuffNum=()=>{
@@ -140,10 +142,11 @@ export const geDebuffNum=()=>{
export const getBuffNum=()=>{
return {
AP:0, //攻击力 数值
ATK:0, // 攻击力
WFUNY:0, // 风怒概率
ATK_CD:0, // 攻击速度
HP:0, // 生命值
HP:0, // 生命值 比例
DEF:0, // 免伤
SKILL_DMG:0, // 技能效果
SKILL_CD:0, // 技能冷却缩减
@@ -168,6 +171,7 @@ export const getBuffNum=()=>{
STUN_TIME:0,
STUN_RATTO:0,
FROST_TIME:0,
HP_MAX:0,//最大生命值数值
}
}

View File

@@ -54,28 +54,22 @@ export const HQuality = {
}
export const MonSet = {
0:{pos:v3(390,0,0)},
1:{pos:v3(420,0,0)},
2:{pos:v3(450,0,0)},
3:{pos:v3(480,0,0)},
4:{pos:v3(510,0,0)},
5:{pos:v3(540,0,0)},
6:{pos:v3(570,0,0)},
7:{pos:v3(600,0,0)},
8:{pos:v3(630,0,0)},
9:{pos:v3(660,0,0)},
10:{pos:v3(690,0,0)},
11:{pos:v3(720,0,0)},
12:{pos:v3(750,0,0)},
13:{pos:v3(780,0,0)},
14:{pos:v3(810,0,0)},
15:{pos:v3(840,0,0)},
16:{pos:v3(870,0,0)},
17:{pos:v3(900,0,0)},
18:{pos:v3(930,0,0)},
19:{pos:v3(960,0,0)},
20:{pos:v3(990,0,0)},
21:{pos:v3(1020,0,0)},
22:{pos:v3(1050,0,0)},
1:{pos:v3(430,0,0)},
2:{pos:v3(470,0,0)},
3:{pos:v3(510,0,0)},
4:{pos:v3(550,0,0)},
5:{pos:v3(590,0,0)},
6:{pos:v3(630,0,0)},
7:{pos:v3(670,0,0)},
8:{pos:v3(710,0,0)},
9:{pos:v3(750,0,0)},
10:{pos:v3(790,0,0)},
11:{pos:v3(830,0,0)},
12:{pos:v3(870,0,0)},
13:{pos:v3(910,0,0)},
14:{pos:v3(950,0,0)},
15:{pos:v3(990,0,0)},
16:{pos:v3(1030,0,0)},
}
// 经验值计算函数 - 复杂递增规律

View File

@@ -4,12 +4,8 @@ import { ecs } from 'db://oops-framework/libs/ecs/ECS';
import { Tooltip } from '../skills/Tooltip';
import { timedCom } from '../skills/timedCom';
import { smc } from '../common/SingletonModuleComp';
import { BuffGet } from '../skills/BuffGet';
import { HeroViewComp } from './HeroViewComp';
import { FightConComp } from '../map/FightConComp';
import { BuffAttr, DebuffAttr } from '../common/config/SkillSet';
import { GameEvent } from '../common/config/GameEvent';
import { FacSet } from '../common/config/BoxSet';
const { ccclass, property } = _decorator;
@ccclass('BuffComp')
@@ -36,7 +32,6 @@ export class BuffComp extends Component {
wind_cd:number=0;
speek_time:number=0;
HeroView:HeroViewComp=null!
FIGHTCON:FightConComp=null!
hp_bar:any=null
protected onLoad(): void {
oops.message.on(GameEvent.UpdateVMData,this.to_update_vmdata,this)
@@ -47,7 +42,6 @@ export class BuffComp extends Component {
info_init(){
this.HeroView=this.node.getComponent(HeroViewComp)
this.FIGHTCON=this.node.parent.getComponent(FightConComp)
this.top_node = this.node.getChildByName("top");
let hp_y=this.node.getComponent(UITransform).height+20
this.top_node.setPosition(0,hp_y,0)
@@ -91,26 +85,20 @@ export class BuffComp extends Component {
vmdata_update(is_hp:boolean=false){
// console.log("[BuffComp]:to_update_vmdata:"+this.HeroView.hero_name)
let buff=null
let info= null
if(!this.HeroView) return
if(!this.HeroView.is_master) return
if(this.HeroView.fac==FacSet.HERO) {info=smc.vmdata.hero;buff=this.FIGHTCON.hero_buff}
if(this.HeroView.is_boss) {info=smc.vmdata.boss;buff=this.FIGHTCON.enemy_buff}
//if(this.HeroView.is_kalami) {target_key="enemy";buff_key="enemy"} 不显示小怪
info=smc.vmdata.hero
if(info==null) return
let view_atk = 0 //临时buff
let view_deatk = 0 //临时debuff
if(is_hp){
info.hp=this.HeroView.hp
info.hp_buff=buff.HP
info.hp_max=this.HeroView.hp_max*(100+buff.HP)/100
// info.exp=this.HeroView.exp
// info.next_exp=this.HeroView.next_exp
info.hp_max=this.HeroView.hp_max
}else{
info.hp=this.HeroView.hp
info.hp_buff=buff.HP
info.hp_max=this.HeroView.hp_max*(100+buff.HP)/100
info.hp_max=this.HeroView.hp_max
for(let i=0;i<this.HeroView.BUFF_ATKS.length;i++){
view_atk += this.HeroView.BUFF_ATKS[i].value
}
@@ -118,20 +106,20 @@ export class BuffComp extends Component {
for(let i=0;i<this.HeroView.DEBUFF_DEATKS.length;i++){
view_deatk += this.HeroView.DEBUFF_DEATKS[i].value
}
info.ap=this.HeroView.ap
// info.lv=this.HeroView.lv
info.cd=Number((this.HeroView.cd*(100-buff.ATK_CD)/100).toFixed(2))
console.log("info.buff.ATK_CD",buff.ATK_CD)
info.equip_ap=buff.ATK
info.cd=Number(this.HeroView.cd.toFixed(2))
info.equip_ap=this.HeroView.ap_base*this.HeroView.buff_ap
info.buff_ap=view_atk
info.debuff_ap=view_deatk
info.damage=this.HeroView.ap*(100+buff.ATK)/100*(100+view_atk-view_deatk)/100
info.crit=this.HeroView.crit+buff.CRITICAL
info.crit_d=this.HeroView.crit_d+buff.CRITICAL_DMG
info.dod=this.HeroView.dod+buff.DODGE
info.def=this.HeroView.def+buff.DEF
info.wind=buff.WFUNY
info.skill_cd_buff=buff.SKILL_CD
info.damage=this.HeroView.ap*(100+view_atk-view_deatk)/100
info.crit=this.HeroView.crit
info.crit_d=this.HeroView.crit_d
info.dod=this.HeroView.dod
info.def=this.HeroView.def
info.wind=this.HeroView.wfuny
}
}

View File

@@ -89,8 +89,9 @@ export class Hero extends ecs.Entity {
hv.speed =hv.ospeed = hero.speed;
hv.dis = hero.dis;
hv.cd = hero.cd
hv.hp= hv.hp_max =hero.hp+info.hp
hv.hp= hv.hp_max = hv.hp_base=hero.hp+info.hp
hv.ap = hero.ap+info.ap;
hv.ap_base=hero.ap+info.ap;
hero.buff.forEach((buff:any)=>{
switch(buff.buff_type){
case BuffAttr.CRITICAL:

View File

@@ -0,0 +1,83 @@
import { _decorator } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { oops } from "db://oops-framework/core/Oops";
import { GameEvent } from "../common/config/GameEvent";
import { EquipAttrTarget, EquipInfo } from "../common/config/Equips";
import { HeroViewComp } from "./HeroViewComp";
import { BuffAttr } from "../common/config/SkillSet";
const { ccclass, property } = _decorator;
/** 视图层对象 */
@ccclass('HeroConCompComp')
@ecs.register('HeroConComp', false)
export class HeroConCompComp extends CCComp {
/** 视图层逻辑代码分离演示 */
heroView:HeroViewComp=null
protected onLoad(): void {
oops.message.on(GameEvent.EquipAdd,this.equip_add,this)
oops.message.on(GameEvent.EquipChange,this.equip_change,this)
oops.message.on(GameEvent.FightReady,this.fight_ready,this)
oops.message.on(GameEvent.UseSpecialCard,this.use_special_card,this)
}
start() {
this.heroView=this.node.getComponent(HeroViewComp)
// var entity = this.ent as ecs.Entity; // ecs.Entity 可转为当前模块的具体实体对象
// this.on(ModuleEvent.Cmd, this.onHandler, this);
}
equip_add(e:GameEvent,data:any){
console.log("[HeroConCompComp]:equip_add",data)
let equip=EquipInfo[data.uuid]
let buffs=equip.buff
let special_attr=equip.special_attr
console.log("[HeroConCompComp]:equip_add",buffs)
for(let i=0;i<buffs.length;i++){
let buff=buffs[i]
if(buff.target==EquipAttrTarget.HERO){
switch(buff.type){
case BuffAttr.AP:
this.heroView.add_ap(buff.value,true)
break
case BuffAttr.ATK:
this.heroView.add_ap(buff.value,false)
break
case BuffAttr.ATK_CD:
this.heroView.add_speed(buff.value)
break
case BuffAttr.DEF:
this.heroView.add_def(buff.value)
break
case BuffAttr.HP:
this.heroView.add_hp_max(buff.value,false)
break
case BuffAttr.HP_MAX:
this.heroView.add_hp_max(buff.value,true)
break
}
}
}
}
equip_change(e:GameEvent,data:any){
console.log("[HeroConCompComp]:equip_change",data)
}
fight_ready(e:GameEvent,data:any){
console.log("[HeroConCompComp]:fight_ready",data)
}
use_special_card(e:GameEvent,data:any){
console.log("[HeroConCompComp]:use_special_card",data)
}
/** 全局消息逻辑处理 */
// private onHandler(event: string, args: any) {
// switch (event) {
// case ModuleEvent.Cmd:
// break;
// }
// }
/** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */
reset() {
this.node.destroy();
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "846e0307-e55e-4bc3-a9db-b387c89ad671",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -9,7 +9,6 @@ import { BuffAttr, DebuffAttr, SkillSet, TGroup, TType } from "../common/config/
import { BuffComp } from "./BuffComp";
import { oops } from "db://oops-framework/core/Oops";
import { GameEvent } from "../common/config/GameEvent";
import { FightConComp } from "../map/FightConComp";
import { EquipSpecialAttr } from "../common/config/Equips";
import { FightSet, getExpDrops, getStoneDrops, TooltipTypes } from "../common/config/Mission";
import { getApIncrease, getHpIncrease, getUpExp, HeroInfo, HeroPos } from "../common/config/heroSet";
@@ -24,7 +23,6 @@ const { ccclass, property } = _decorator;
@ccclass('HeroViewComp') // 定义为 Cocos Creator 组件
@ecs.register('HeroView', false) // 定义为 ECS 组件
export class HeroViewComp extends CCComp {
FIGHTCON:FightConComp=null!
BUFFCOMP:BuffComp=null!
as: HeroSpine = null!
status:String = "idle"
@@ -53,10 +51,12 @@ export class HeroViewComp extends CCComp {
hp: number = 100; /** 血量 */
hp_max: number = 100; /** 最大血量 */
buff_hp:number=0;
hp_base:number=0;
pwt:Timer = new Timer(1); //计时器
ap: number = 10; /**攻击力 */
buff_ap:number=0;
ap_base:number=0;
// atk_speed: number = 1;
cd: number = 1.3; /**攻击速度 攻击间隔 */
dis: number = 80;
@@ -90,6 +90,10 @@ export class HeroViewComp extends CCComp {
speek_time:number = 0;
is_stop_temp:boolean = false
double_atked:boolean=false
atk_add_master_atk:number=0
atk_add_master_hp:number=0
buff_debuff_down:number=0
skill_dmg:number=0
BUFF_DEFS: Array<{value: number, count: number}> = [] //防御提升
BUFF_ATKS: Array<{value: number, count: number}> = [] //攻击提升
@@ -103,6 +107,11 @@ export class HeroViewComp extends CCComp {
DEBUFF_FROST: number = 0; //冰冻
DEBUFF_STUN: number = 0; //眩晕
DEBUFF_VALUE:number=0; //debuff 增益值
DEBUFF_COUNT:number=0; //debuff 持续次数
DEBUFF_UP:number=0; //debuff 概率提升
private damageQueue: Array<{
damage: number,
isCrit: boolean,
@@ -115,10 +124,8 @@ export class HeroViewComp extends CCComp {
onLoad() {
this.as = this.getComponent(HeroSpine);
this.FIGHTCON=this.node.parent.getComponent(FightConComp);
//console.log("[HeroViewComp]:hero view comp ",this.FIGHTCON)
this.on(GameEvent.ChangeATK_EQUIP_SPECIAL_ATTR,this.change_atk,this)
this.on(GameEvent.UpdateHP,this.update_hp,this)
this.on(GameEvent.EXPUP,this.exp_up,this)
this.on(GameEvent.UseEnhancement,this.use_enhancement,this)
const collider = this.node.getComponent(BoxCollider2D);
@@ -216,13 +223,16 @@ export class HeroViewComp extends CCComp {
// this.BUFFCOMP.tooltip(TooltipTypes.speedup,speed.toFixed(0));
}
add_ap(ap: number,is_num:boolean=true){
//console.log("[HeroViewComp]:add_ap add:",ap,this.ap)
console.log("[HeroViewComp]:add_ap add:",ap,this.ap)
if(is_num){
this.ap += Math.floor(ap);
this.ap_base += Math.floor(ap);
}else{
this.ap += Math.floor(ap/100*this.ap);
this.buff_ap += Math.floor(ap);
}
this.BUFFCOMP.tooltip(TooltipTypes.apup,ap.toFixed(0));
let diff=Math.floor(this.ap_base*(100+this.buff_ap)/100)-this.ap
this.ap = Math.floor(this.ap_base*(100+this.buff_ap)/100)
this.BUFFCOMP.tooltip(TooltipTypes.apup,diff.toFixed(0));
if(this.is_master) {
this.BUFFCOMP.vmdata_update();
@@ -233,35 +243,38 @@ export class HeroViewComp extends CCComp {
de_ap(ap: number,is_num:boolean=true){
//console.log("[HeroViewComp]:de_ap de:",ap,this.ap)
if(is_num){
this.ap -= Math.floor(ap);
this.ap_base -= Math.floor(ap);
}else{
this.ap -= Math.floor(ap/100*this.ap);
this.buff_ap -= Math.floor(ap/100*this.ap);
}
let diff=Math.floor(this.ap_base*(100+this.buff_ap)/100)-this.ap
this.ap = Math.floor(this.ap_base*(100+this.buff_ap)/100)
this.BUFFCOMP.tooltip(TooltipTypes.apup,diff.toFixed(0));
if(this.is_master) this.BUFFCOMP.vmdata_update()
}
update_hp(e:GameEvent,data:any){
//console.log("[HeroViewComp]:update_hp",data)
if(this.is_master===data.is_master&&this.fac===FacSet.HERO){
this.buff_hp += data.hp
if(data.hp > 0){
this.hp += this.hp_max*data.hp/100
if(this.hp > this.hp_max*(100+this.buff_hp)/100){
this.hp=this.hp_max*(100+this.buff_hp)/100
}
}
}
}
add_hp_max(hp: number=0,is_num:boolean=true){
this.hp_max += Math.floor(hp) ;
this.hp += Math.floor(hp*(100+this.buff_hp)/100) ;
if(this.is_master) this.BUFFCOMP.vmdata_update(true)
this.BUFFCOMP.tooltip(TooltipTypes.hpup,hp.toFixed(0));
add_hp_max(hp: number=0,is_num:boolean=false){
console.log("[HeroViewComp]:add_hp_max add:",hp,this.hp_max)
if(is_num){
this.hp_base += Math.floor(hp) ;
}else{
this.buff_hp+=hp
}
let diff=Math.floor(this.hp_base*(100+this.buff_hp)/100)-this.hp_max
this.hp_max =Math.floor(this.hp_base*(100+this.buff_hp)/100)
this.hp+=diff
if(this.is_master) this.BUFFCOMP.vmdata_update(true)
this.BUFFCOMP.tooltip(TooltipTypes.hpup,diff.toFixed(0));
}
de_hp_max(hp: number=0,is_num:boolean=true){ //最大值 只存在数值添加, 比例通过buff_hp处理
//console.log("[HeroViewComp]:de_hp_max de:",hp,this.hp_max)
this.hp_max -= Math.floor(hp) ;
this.hp_base -= Math.floor(hp) ;
let diff=Math.floor(this.hp_base*(100+this.buff_hp)/100)-this.hp_max
this.hp_max =Math.floor(this.hp_base*(100+this.buff_hp)/100)
this.hp+=diff
if(this.is_master) this.BUFFCOMP.vmdata_update(true)
}
@@ -305,17 +318,16 @@ export class HeroViewComp extends CCComp {
if(!this.is_master) return
this.atk_count+=1
if(this.atk_count< FightSet.ATK_ADD_COUNT) return
if(this.FIGHTCON.atk_add_glod >0) smc.vmdata.mission_data.gold+=this.FIGHTCON.atk_add_glod
let master=ecs.query(ecs.allOf(MasterModelComp))
master.forEach(master=>{
let master_view=master.get(HeroViewComp)
if(this.FIGHTCON.atk_add_master_atk>0) {
master_view.add_ap(this.FIGHTCON.atk_add_master_atk)
if(this.atk_add_master_atk>0) {
master_view.add_ap(this.atk_add_master_atk,true)
}
if(this.FIGHTCON.atk_add_master_hp>0) {
master_view.add_hp_max(this.FIGHTCON.atk_add_master_hp)
if(this.atk_add_master_hp>0) {
master_view.add_hp_max(this.atk_add_master_hp,true)
}
})
@@ -332,13 +344,8 @@ export class HeroViewComp extends CCComp {
if(this.fac==FacSet.MON){
let exp=getExpDrops(HeroInfo[this.hero_uuid].quality,this.lv)
let stone=getStoneDrops(HeroInfo[this.hero_uuid].quality,this.lv)
oops.message.dispatchEvent(GameEvent.EXPUP,{exp:exp})
if(stone.type=="equip"){
oops.message.dispatchEvent(GameEvent.EQUIP_STONE_UP,stone.count)
}else{
oops.message.dispatchEvent(GameEvent.SKILL_STONE_UP,stone.count)
}
}
if(this.fac==FacSet.HERO){
@@ -348,22 +355,13 @@ export class HeroViewComp extends CCComp {
}
get_buff(){
let buff=null
if(this.fac==FacSet.HERO) buff=this.FIGHTCON.hero_buff
if(this.is_boss) buff=this.FIGHTCON.enemy_buff
if(this.is_kalami) buff=this.FIGHTCON.enemy_buff
if(buff==null) return
return buff
}
get_debuff(){
}
add_debuff(type:number,deV:number,deC:number,deR:number){
let DEBUFF_DOWN=0
let buff_debuff_down=0
let buff=this.get_buff()
if(buff!==null) buff_debuff_down=buff.DEBUFF_DOWN
for(let i=0;i<this.BUFF_DEDOWN.length;i++){
DEBUFF_DOWN+=this.BUFF_DEDOWN[i].value
this.BUFF_DEDOWN[i].count-=1
@@ -371,7 +369,7 @@ export class HeroViewComp extends CCComp {
this.BUFF_DEDOWN.splice(i,1)
}
}
let n_deR=deR-DEBUFF_DOWN-buff_debuff_down // 触发概率
let n_deR=deR-DEBUFF_DOWN-this.buff_debuff_down // 触发概率
let r=RandomManager.instance.getRandomInt(0,100) // 随机数
//console.log("[HeroViewComp]:类型,值,次数,技能概率,实际概率,随机数",type,deV,deC,deR,n_deR,r)
if(r < n_deR) {
@@ -503,11 +501,8 @@ export class HeroViewComp extends CCComp {
}
}
// buff 防御 即免伤
let buff_def=0
let buff=this.get_buff()
if(buff!==null) buff_def=buff.DEF
damage=remainingDamage*(100-(buff_def+def)+Burn)/100
damage=remainingDamage*(100-def-this.def+Burn)/100
////console.log("[HeroViewComp]:最终伤害,敌人伤害值,免伤,防御,易伤",damage,remainingDamage,buff_def,def,Burn)
return Math.floor(damage)
}
@@ -649,7 +644,7 @@ export class HeroViewComp extends CCComp {
this.add_speed(data.value)
break
case EnhancementType.HEALTH:
this.add_hp_max(data.value)
this.add_hp_max(data.value,true)
break
case EnhancementType.DEF:
this.add_def(data.value)
@@ -659,12 +654,12 @@ export class HeroViewComp extends CCComp {
}
to_update(){
if(!this.is_master) return
// oops.message.dispatchEvent(GameEvent.HeroLvUp,{lv:this.lv})
smc.vmdata.hero.exp = smc.vmdata.hero.exp-smc.vmdata.hero.next_exp
smc.vmdata.hero.lv = smc.vmdata.hero.lv+1
smc.vmdata.hero.next_exp=getUpExp(smc.vmdata.hero.lv)
oops.message.dispatchEvent(GameEvent.HeroLvUp,{lv:smc.vmdata.hero.lv})
this.BUFFCOMP.lv_up()
this.BUFFCOMP.tooltip(TooltipTypes.lvup)
//@todo 需要添加 升级动画

View File

@@ -82,7 +82,7 @@ export class Monster extends ecs.Entity {
hv.hp = hv.hp_max = levelHp;
hv.ap = levelAp;
hv.ap_base=levelAp
console.log(`[Monster]: 怪物${hero.name}(等级${lv}) - 基础HP:${baseHp}->等级HP:${levelHp}, 基础AP:${baseAp}->等级AP:${levelAp}`);
hv.cd = hero.cd

View File

@@ -8,7 +8,6 @@ import { GameEvent } from '../common/config/GameEvent';
import { BoxSet, FacSet } from '../common/config/BoxSet';
import { smc } from '../common/SingletonModuleComp';
import { CCComp } from 'db://oops-framework/module/common/CCComp';
import { FightConComp } from '../map/FightConComp';
import { MonModelComp } from './MonModelComp';
import { HeroModelComp } from './HeroModelComp';
import { FightSet } from '../common/config/Mission';
@@ -18,7 +17,6 @@ const { ccclass, property } = _decorator;
@ccclass('SkillCon')
@ecs.register('SkillCon')
export class SkillConComp extends CCComp {
FIGHTCON:FightConComp=null!
HeroView:any=null;
HeroEntity:any=null;
private _timers: { [key: string]: number } = {};
@@ -36,7 +34,6 @@ export class SkillConComp extends CCComp {
}
onLoad(){
this.HeroView=this.node.getComponent(HeroViewComp)
this.FIGHTCON=this.node.parent.getComponent(FightConComp)
// //console.log(this.HeroView.uuid+"=>"+this.HeroView.hero_name+"=> SkillConComp onLoad")
this.on(GameEvent.CastHeroSkill,this.cast_master_skill,this)
oops.message.on(GameEvent.MaxSkill,this.use_max_skill,this)
@@ -51,7 +48,7 @@ export class SkillConComp extends CCComp {
if(!smc.mission.play||smc.mission.pause) return
if(this.HeroView.DEBUFF_STUN <= 0&&this.HeroView.DEBUFF_FROST <= 0) this.HeroView.at += dt;
let cd = this.get_cd(this.HeroView.cd,this.HeroView)
let cd = this.count_cd(this.HeroView.cd,this.HeroView)
if (this.HeroView.is_atking &&(this.HeroView.at > cd)) {
if(this.HeroView.is_dead) return
const config = SkillSet[this.HeroView.atk_skill];
@@ -95,7 +92,7 @@ export class SkillConComp extends CCComp {
if(!this.HeroView.is_master) return
//console.log("hart cast_skill",uuid ,e)
const config = SkillSet[uuid];
this.castSkill(config,false,this.FIGHTCON.hero_buff.SKILL_DMG)
this.castSkill(config,false,this.HeroView.skill_dmg)
}
/** 施放技能 */
castSkill(config: typeof SkillSet[keyof typeof SkillSet],is_wfuny:boolean=false,dmg:number=0) {
@@ -176,10 +173,8 @@ export class SkillConComp extends CCComp {
}
check_wfuny(){
let buff=this.get_buff(this.HeroView)
if(buff==null) return false
let random = Math.random()*100
if(random < buff.WFUNY){
if(random < this.HeroView.wfuny){
return true
}
return false
@@ -287,11 +282,7 @@ export class SkillConComp extends CCComp {
// //console.log("clear_timer");
Object.values(this._timers).forEach(clearTimeout);
}
get_cd(cd:number,view:HeroViewComp){
let buff=this.get_buff(view)
let buff_cd=0
if(buff!=null) buff_cd=buff.ATK_CD
count_cd(cd:number,view:HeroViewComp){
// 汇总DEBUFF_DECD并处理count值
let decd = 0;
@@ -311,21 +302,15 @@ export class SkillConComp extends CCComp {
view.BUFF_CDS.splice(i, 1);
}
}
return cd*(100-bcd-buff_cd+decd)/100
return cd*(100-bcd+decd)/100
}
get_count(count:number,view:HeroViewComp){
let buff=this.get_buff(view)
if(buff==null) return count
let re=count+(buff.WFUNY)
let re=count+view.wfuny
if(re<1) re=1
return re
}
get_buff(view:HeroViewComp){
if(view.is_master) return this.FIGHTCON.hero_buff
if(view.is_boss||view.is_kalami) return this.FIGHTCON.enemy_buff
return null
}
reset() {
this.clear_timer();
this.aoe_queues = [] // 清空技能队列

View File

@@ -226,23 +226,7 @@ export class CardComp extends CCComp {
console.log("[cardcomp]:装备卡 饰品")
break
}
switch(EquipInfo[this.c_uuid].lv){
case 1:
show.getChildByName("mask").getChildByName("lv1").active=true
break
case 2:
show.getChildByName("mask").getChildByName("lv2").active=true
break
case 3:
show.getChildByName("mask").getChildByName("lv3").active=true
break
case 4:
show.getChildByName("mask").getChildByName("lv4").active=true
break
case 5:
show.getChildByName("mask").getChildByName("lv5").active=true
break
}
show.getChildByName("type").getChildByName("name").getComponent(Label).string="装备"
break
case cardType.SPECIAL:

View File

@@ -24,7 +24,6 @@ export class EquipSkillComp extends CCComp {
onLoad() {
this.on(GameEvent.UseSkillCard, this.get_skill, this);
this.on(GameEvent.FightReady,this.fight_ready,this)
this.on(GameEvent.SKILL_STONE_UP,this.skill_stone_up,this)
this.boxs=this.node.getChildByName("boxs")
this.skill1_cd_bar_progress=this.boxs.getChildByName("skill1").getChildByName("icon").getChildByName("cd").getComponent(ProgressBar)
this.skill2_cd_bar_progress=this.boxs.getChildByName("skill2").getChildByName("icon").getChildByName("cd").getComponent(ProgressBar)

View File

@@ -24,69 +24,36 @@ export class EquipsComp extends Component {
oops.message.on(GameEvent.EquipAdd,this.equip_add,this)
oops.message.on(GameEvent.EquipRemove,this.equip_remove,this)
this.boxs=this.node.getChildByName("boxs")
oops.message.on(GameEvent.EQUIP_STONE_UP,this.equip_stone_up,this)
oops.message.on(GameEvent.HeroLvUp,this.hero_lv_up,this)
}
hero_lv_up(e:GameEvent,data:any){
switch(data.lv){
case FightSet.WEAPON_LV:
this.show_equip_get("weapon")
break
case FightSet.ARMOR_LV:
this.show_equip_get("armor")
break
case FightSet.SHIELD_LV:
this.show_equip_get("shield")
break
case FightSet.ACCESSORY_LV:
this.show_equip_get("accessory")
break
}
}
equip_stone_up(e:GameEvent,data:any){
console.log("[EquipsComp]:equip_stone_up",data)
smc.vmdata.mission_data.equip_stone+=data
if(smc.vmdata.mission_data.equip_stone >= smc.vmdata.mission_data.equip_stone_max){
this.show_equip_get("weapon")
this.show_equip_get("armor")
this.show_equip_get("accessory")
}
}
call_equip_card(e:any,data:any){
let mission_data=smc.vmdata.mission_data
if(mission_data.equip_stone < mission_data.equip_stone_max){
oops.gui.toast("装备石不足", false);
return
}
let lv=this.check_lv(data)
oops.message.dispatchEvent(GameEvent.EquipSelect,{slot:data,lv:lv})
mission_data.equip_stone-=mission_data.equip_stone_max
mission_data.equip_stone_max=mission_data.equip_stone_max*2
call_equip_card(e:any,data:any){
oops.message.dispatchEvent(GameEvent.EquipSelect,{slot:data})
}
up_equip_card(e:any,data:any){
let mission_data=smc.vmdata.mission_data
if(mission_data.equip_stone < mission_data.equip_stone_max){
oops.gui.toast("装备石不足", false);
return
}
let lv=this.check_lv(data)
oops.message.dispatchEvent(GameEvent.EquipSelect,{slot:data,lv:lv})
mission_data.equip_stone-=mission_data.equip_stone_max
mission_data.equip_stone_max=mission_data.equip_stone_max*2
}
check_lv(data:any){
let lv=0
switch(data){
case "weapon":
if(this.weapon.uuid==0) return 1
lv=EquipInfo[this.weapon.uuid].lv+1
if(lv>5){
lv=5
}
break
case "armor":
if(this.armor.uuid==0) return 1
lv=EquipInfo[this.armor.uuid].lv+1
if(lv>5){
lv=5
}
break
case "accessory":
if(this.accessory.uuid==0) return 4
lv=EquipInfo[this.accessory.uuid].lv+1
if(lv>5){
lv=5
}
break
}
return lv
oops.message.dispatchEvent(GameEvent.EquipSelect,{slot:data})
}
start(){
this.fight_ready()
@@ -141,7 +108,7 @@ export class EquipsComp extends Component {
this.accessory.level=data.level
this.show_accessory(data.uuid)
}
this.count_attrs()
// this.count_attrs()
}
show_weapon(uuid:number){
let icon = this.boxs.getChildByName("weapon").getChildByName("icon")
@@ -151,11 +118,6 @@ export class EquipsComp extends Component {
const sprite = icon.getChildByName("icon").getComponent(Sprite);
sprite.spriteFrame = atlas.getSpriteFrame(EquipInfo[uuid].path);
});
icon.getChildByName("lv1").active=EquipInfo[uuid].lv==1
icon.getChildByName("lv2").active=EquipInfo[uuid].lv==2
icon.getChildByName("lv3").active=EquipInfo[uuid].lv==3
icon.getChildByName("lv4").active=EquipInfo[uuid].lv==4
icon.getChildByName("lv5").active=EquipInfo[uuid].lv==5
icon.getChildByName("q1").active=EquipInfo[uuid].quality==Quality.WHITE
icon.getChildByName("q2").active=EquipInfo[uuid].quality==Quality.GREEN
icon.getChildByName("q3").active=EquipInfo[uuid].quality==Quality.BLUE
@@ -171,11 +133,7 @@ export class EquipsComp extends Component {
const sprite = icon.getChildByName("icon").getComponent(Sprite);
sprite.spriteFrame = atlas.getSpriteFrame(EquipInfo[uuid].path);
});
icon.getChildByName("lv1").active=EquipInfo[uuid].lv==1
icon.getChildByName("lv2").active=EquipInfo[uuid].lv==2
icon.getChildByName("lv3").active=EquipInfo[uuid].lv==3
icon.getChildByName("lv4").active=EquipInfo[uuid].lv==4
icon.getChildByName("lv5").active=EquipInfo[uuid].lv==5
icon.getChildByName("q1").active=EquipInfo[uuid].quality==Quality.WHITE
icon.getChildByName("q2").active=EquipInfo[uuid].quality==Quality.GREEN
@@ -191,11 +149,7 @@ export class EquipsComp extends Component {
const sprite = icon.getChildByName("icon").getComponent(Sprite);
sprite.spriteFrame = atlas.getSpriteFrame(EquipInfo[uuid].path);
});
icon.getChildByName("lv1").active=EquipInfo[uuid].lv==1
icon.getChildByName("lv2").active=EquipInfo[uuid].lv==2
icon.getChildByName("lv3").active=EquipInfo[uuid].lv==3
icon.getChildByName("lv4").active=EquipInfo[uuid].lv==4
icon.getChildByName("lv5").active=EquipInfo[uuid].lv==5
icon.getChildByName("q1").active=EquipInfo[uuid].quality==Quality.WHITE
icon.getChildByName("q2").active=EquipInfo[uuid].quality==Quality.GREEN
@@ -309,41 +263,25 @@ export class EquipsComp extends Component {
}
private show_equip_get(e:string){
if(this.weapon.uuid==0){
this.boxs.getChildByName("weapon").getChildByName("get").active =true
this.boxs.getChildByName("weapon").getChildByName("light").active=true
this.boxs.getChildByName("weapon").getChildByName("tip").active=true
this.boxs.getChildByName("weapon").getChildByName("tip").getComponent(Label).string="购买"
}else{
if(EquipInfo[this.weapon.uuid].lv>=5) return
this.boxs.getChildByName("weapon").getChildByName("change").active =true
this.boxs.getChildByName("weapon").getChildByName("light").active=true
this.boxs.getChildByName("weapon").getChildByName("tip").active=true
this.boxs.getChildByName("weapon").getChildByName("tip").getComponent(Label).string="升级"
}
if(this.armor.uuid==0){
this.boxs.getChildByName("armor").getChildByName("get").active =true
this.boxs.getChildByName("armor").getChildByName("light").active=true
this.boxs.getChildByName("armor").getChildByName("tip").active=true
this.boxs.getChildByName("armor").getChildByName("tip").getComponent(Label).string="购买"
}else{
if(EquipInfo[this.armor.uuid].lv>=5) return
this.boxs.getChildByName("armor").getChildByName("change").active =true
this.boxs.getChildByName("armor").getChildByName("light").active=true
this.boxs.getChildByName("armor").getChildByName("tip").active=true
this.boxs.getChildByName("armor").getChildByName("tip").getComponent(Label).string="升级"
}
if(this.accessory.uuid==0 ){
this.boxs.getChildByName("accessory").getChildByName("get").active =true
this.boxs.getChildByName("accessory").getChildByName("light").active=true
this.boxs.getChildByName("accessory").getChildByName("tip").active=true
this.boxs.getChildByName("accessory").getChildByName("tip").getComponent(Label).string="购买"
}else{
if(EquipInfo[this.accessory.uuid].lv>=5) return
this.boxs.getChildByName("accessory").getChildByName("change").active =true
this.boxs.getChildByName("accessory").getChildByName("light").active=true
this.boxs.getChildByName("accessory").getChildByName("tip").active=true
this.boxs.getChildByName("accessory").getChildByName("tip").getComponent(Label).string="升级"
switch(e){
case "weapon":
this.boxs.getChildByName("weapon").getChildByName("get").active =true
this.boxs.getChildByName("weapon").getChildByName("light").active=true
this.boxs.getChildByName("weapon").getChildByName("tip").active=true
this.boxs.getChildByName("weapon").getChildByName("tip").getComponent(Label).string="获取"
break
case "armor":
this.boxs.getChildByName("armor").getChildByName("get").active =true
this.boxs.getChildByName("armor").getChildByName("light").active=true
this.boxs.getChildByName("armor").getChildByName("tip").active=true
this.boxs.getChildByName("armor").getChildByName("tip").getComponent(Label).string="获取"
break
case "accessory":
this.boxs.getChildByName("accessory").getChildByName("get").active =true
this.boxs.getChildByName("accessory").getChildByName("light").active=true
this.boxs.getChildByName("accessory").getChildByName("tip").active=true
this.boxs.getChildByName("accessory").getChildByName("tip").getComponent(Label).string="获取"
break
}
}

View File

@@ -65,22 +65,7 @@ export class FightConComp extends Component {
private equip_change(e:GameEvent,equip:any){
let old_hero_hp=JSON.parse(JSON.stringify(this.hero_buff.HP))
let new_hero_hp=JSON.parse(JSON.stringify(equip.hero_buff.HP))
this.hero_buff=equip.hero_buff
this.enemy_buff=equip.enemy_buff
let hero_hp_add=new_hero_hp-old_hero_hp
console.log("[FightConComp]:old_hero_hp:"+old_hero_hp+" new_hero_hp:"+new_hero_hp+" hero_hp_add:"+hero_hp_add)
if(hero_hp_add!==0){
oops.message.dispatchEvent(GameEvent.UpdateHP,{hp:hero_hp_add,is_master:true})
}
this.scheduleOnce(()=>{
oops.message.dispatchEvent(GameEvent.UpdateVMData)
},0.1)
}
private fight_ready(e:GameEvent){

View File

@@ -212,8 +212,8 @@ export class RogueConfig {
static generateNormalWave(waveNumber: number) {
const series = getRandomSeries();
const seriesConfig = MonsterSeriesConfig[series];
// 数量提升为原来的3倍最大数量也提升
const baseCount = Math.min((3 + Math.floor(waveNumber / 5)) * 3, 24);
// 数量减少为原来的三分之一
const baseCount = Math.min(3 + Math.floor(waveNumber / 5), 8);
const monsters = [];
// 选择怪物类型
@@ -273,8 +273,8 @@ export class RogueConfig {
if (eliteMonsters.length > 0) {
const eliteMonster = eliteMonsters[Math.floor(Math.random() * eliteMonsters.length)];
// 数量提升为原来的3倍
const count = Math.max(1, Math.floor((2 + waveNumber / 8) * 3));
// 数量减少为原来的三分之一
const count = Math.max(1, Math.floor(2 + waveNumber / 8));
const monsterInfo = HeroInfo[eliteMonster];
// 生成精英词条
@@ -332,10 +332,10 @@ export class RogueConfig {
const enhancedBoss = this.applyAffixesToMonster(bossAffixes, bossInfo);
// Boss数量提升为3倍一般Boss只刷1只这里最多刷3只
// Boss数量减少为原来的三分之一一般Boss只刷1只
const monsters = [{
uuid: bossMonster,
count: 3,
count: 1,
type: "boss",
series: series,
isBoss: true,

View File

@@ -4,14 +4,12 @@ import { BoxSet, FacSet } from "../common/config/BoxSet";
import { SkillSet } from "../common/config/SkillSet";
import { smc } from "../common/SingletonModuleComp";
import { HeroViewComp } from "../hero/HeroViewComp";
import { FightConComp } from "../map/FightConComp";
import { SkillCom } from "./SkillCom";
import { instantiate, Node, Prefab, Vec3 ,tween, v3,animation,Label,resources,SpriteFrame,Sprite} from "cc";
/** Skill 模块 */
@ecs.register(`Skill`)
export class Skill extends ecs.Entity {
FIGHTCON:FightConComp=null!
SkillView!: SkillCom;
/** 实始添加的数据层组件 */
protected init() {
@@ -33,7 +31,6 @@ export class Skill extends ecs.Entity {
dmg:number=0
) {
let FIGHTCON=parent.getComponent(FightConComp);
const config = SkillSet[uuid];
if (!config) {
console.error("[Skill] 技能配置不存在:", uuid);
@@ -82,7 +79,7 @@ export class Skill extends ecs.Entity {
return;
}
let ap_data = this.get_ap(caster,dmg,uuid,FIGHTCON)
let ap_data = this.get_ap(caster,dmg,uuid)
SComp.ap = ap_data.ap
SComp.caster_crit = ap_data.crit
SComp.caster_crit_d = ap_data.crit_d
@@ -115,12 +112,11 @@ export class Skill extends ecs.Entity {
this.add(SComp);
}
get_ap(view:HeroViewComp,dmg:number=0,uuid:number=0,FIGHTCON:FightConComp=null!){
get_ap(view:HeroViewComp,dmg:number=0,uuid:number=0){
let ap=0
let crit=0
let crit_d=0
let buffap=1
let buff=null
let puncture=0
let puncture_damage=0
let burn_count=0
@@ -129,12 +125,6 @@ export class Skill extends ecs.Entity {
let stun_ratto=0
let frost_time=0
let frost_ratto=0
if(view.is_master) buff=FIGHTCON.hero_buff
if(view.is_boss) buff=FIGHTCON.enemy_buff
if(view.is_kalami) buff=FIGHTCON.enemy_buff
if(buff!==null) {
buffap=(100+buff.ATK)/100 //装备区 总加成
}
// 汇总DEBUFF_DECD并处理count值
let BUFF_ATK = 0
let DEBUFF_DEATK = 0
@@ -158,17 +148,17 @@ export class Skill extends ecs.Entity {
}
let BUFF_AP=(100-DEBUFF_DEATK+BUFF_ATK+dmg)/100 //buff区 总加成
puncture =buff.PUNCTURE+view.puncture
puncture_damage=buff.PUNCTURE_DMG+view.puncture_damage
puncture =view.puncture
puncture_damage=view.puncture_damage
ap=view.ap*buffap*BUFF_AP*SkillSet[uuid].ap/100
crit=view.crit+buff.CRITICAL
crit_d=view.crit_d+buff.CRITICAL_DMG
burn_count=buff.BURN_COUNT+view.burn_count
burn_value=buff.BURN_VALUE+view.burn_value
stun_time=buff.STUN_TIME+view.stun_time
stun_ratto=buff.STUN_RATTO+view.stun_ratto
frost_time=buff.FROST_TIME+view.frost_time
frost_ratto=buff.FROST_RATTO+view.frost_ratto
crit=view.crit
crit_d=view.crit_d
burn_count=view.burn_count
burn_value=view.burn_value
stun_time=view.stun_time
stun_ratto=view.stun_ratto
frost_time=view.frost_time
frost_ratto=view.frost_ratto
return {ap,crit,crit_d,puncture,puncture_damage,burn_count,burn_value,stun_time,stun_ratto,frost_time,frost_ratto}
}
}

View File

@@ -8,7 +8,6 @@ import { AType, DTType, EType, RType, SkillSet, SType, TGroup } from "../common/
import { BoxSet, FacSet } from "../common/config/BoxSet";
import { HeroViewComp } from "../hero/HeroViewComp";
import { BezierMove } from "../BezierMove/BezierMove";
import { FightConComp } from "../map/FightConComp";
import { MonModelComp } from "../hero/MonModelComp";
import { FightSet } from "../common/config/Mission";
import { HeroModelComp } from "../hero/HeroModelComp";
@@ -49,7 +48,6 @@ export class SkillCom extends CCComp {
stun_ratto:number=0;
frost_ratto:number=0;
frost_time:number=0;
FIGHTCON:FightConComp=null;
run_time:number=0;
hited_time:number=0;
hit_count:number=0;
@@ -65,7 +63,6 @@ export class SkillCom extends CCComp {
private moveDirection: Vec3 | null = null; // 添加一个属性来存储移动方向
protected onLoad(): void {
this.FIGHTCON=this.node.parent.getComponent(FightConComp)
}
@@ -183,22 +180,21 @@ export class SkillCom extends CCComp {
this.frost_time,this.frost_ratto) // ap 及暴击 属性已经在skill.ts 处理
// console.log("[SkillCom]:single_damage t:tp:rtp",this.node.position,this.targetPos,target.node.position)
if(SkillSet[this.s_uuid].debuff>0){
let deUP =this.get_debuff() // 因为不是每个技能都需要,debuff的增益在这里处理, ap 及暴击 属性已经在skill.ts 处理
let debuff=SkillSet[this.s_uuid]
let dev=debuff.deV*(100+deUP.deV)/100
let deR=debuff.deR+deUP.deR
let dev=debuff.deV*(100+this.caster.DEBUFF_VALUE)/100
let deR=debuff.deR+this.caster.DEBUFF_UP
dev=Math.round(dev*100)/100
let deC=debuff.deC+deUP.deC //dec只作为次数叠加
let deC=debuff.deC+this.caster.DEBUFF_COUNT //dec只作为次数叠加
// //console.log("[SkillCom]:debuff",SkillSet[this.s_uuid].name,debuff.debuff,deUP.deV,deUP.deC)
target.add_debuff(debuff.debuff,dev,deC,deR)
}
this.hit_count++
console.log("[SkillCom]:碰撞次数:技能次数:穿刺次数",this.hit_count,SkillSet[this.s_uuid].hit,this.puncture)
// console.log("[SkillCom]:碰撞次数:技能次数:穿刺次数",this.hit_count,SkillSet[this.s_uuid].hit,this.puncture)
if(this.hit_count>=(SkillSet[this.s_uuid].hit+this.puncture)&&(SkillSet[this.s_uuid].DTType!=DTType.range)) this.is_destroy=true // 技能命中次数
}
onBeginContact (seCol: Collider2D, oCol: Collider2D) {
console.log(this.scale+"碰撞开始 ",seCol,oCol);
// console.log(this.scale+"碰撞开始 ",seCol,oCol);
if(seCol.node.position.x-oCol.node.position.x > 100 ) return
let target = oCol.getComponent(HeroViewComp)
if(oCol.group!=this.group){
@@ -208,18 +204,8 @@ export class SkillCom extends CCComp {
// this.ent.destroy()
}
}
get_debuff(){ //debuff 加成
let debuff = {deV:0,deC:0,deR:0}
let buff=null
if(this.caster.is_master) buff = this.FIGHTCON.hero_buff
if(this.caster.is_boss||this.caster.is_kalami) buff = this.FIGHTCON.enemy_buff
if(buff==null) return debuff
debuff.deV=buff.DEBUFF_VALUE
debuff.deC=buff.DEBUFF_COUNT
debuff.deR=buff.DEBUFF_UP
return debuff
}
/**
* 执行2段位移先升高然后移到目的地
*/

View File

@@ -3,7 +3,7 @@
## ⚔️ 武器系统设计规范
**命名规则**
- 同品质武器全等级使用相同名称
- 名称后标注等级如:`(Lv1)`
- 名称后不再标注等级
- 品质分级:绿(基础)→ 蓝(强化)→ 紫(终极)
- CD修正固定同类型武器全等级相同
@@ -14,27 +14,12 @@
- 剑类核心机制:默认穿刺伤害是上一次伤害的50%
### 📋 剑类武器数据表
| 等级 | 品质 | 名称 | **CD修正** | 实际CD | 攻击加成 | 核心特性 | 穿透伤害比率(进化) |
|------|------|------------------|-----------|--------|----------|----------------------|------------------|
| 1 | 绿 | 穿刺短剑(Lv1) | -20% | 1.20s | +50% | 穿透1目标 | - |
| | 蓝 | 寒锋长剑(Lv1) | -20% | 1.20s | +70% | 穿透2目标 | 10% |
| | 紫 | 龙鳞穿刺者(Lv1) | -20% | 1.20s | +95% | 穿透3目标 | 20% |
| 2 | 绿 | 穿刺短剑(Lv2) | -20% | 1.20s | +80% | 穿透1目标 | - |
| | 蓝 | 寒锋长剑(Lv2) | -20% | 1.20s | +110% | 穿透2目标 | 15% |
| | 紫 | 龙鳞穿刺者(Lv2) | -20% | 1.20s | +140% | 穿透3目标 | 25% |
| 3 | 绿 | 穿刺短剑(Lv3) | -20% | 1.20s | +110% | 穿透1目标 | - |
| | 蓝 | 寒锋长剑(Lv3) | -20% | 1.20s | +150% | 穿透2目标 | 20% |
| | 紫 | 龙鳞穿刺者(Lv3) | -20% | 1.20s | +185% | 穿透3目标 | 30% |
| 4 | 绿 | 穿刺短剑(Lv4) | -20% | 1.20s | +140% | 穿透1目标 | - |
| | 蓝 | 寒锋长剑(Lv4) | -20% | 1.20s | +190% | 穿透2目标 | 25% |
| | 紫 | 龙鳞穿刺者(Lv4) | -20% | 1.20s | +240% | 穿透3目标 | 35% |
| | 紫 | 冰霜穿刺者(Lv4) | -20% | 1.20s | +240% | 穿透3目标 | 冰冻概率+20% |
| 5 | 绿 | 穿刺短剑(Lv5) | -20% | 1.20s | +170% | 穿透1目标 | - |
| | 蓝 | 寒锋长剑(Lv5) | -20% | 1.20s | +230% | 穿透2目标 | 30% |
| | 紫 | 龙鳞穿刺者(Lv5) | -20% | 1.20s | +290% | 穿透3目标 | 40% |
| | 紫 | 冰霜穿刺者(Lv5) | -20% | 1.20s | +290% | 穿透3目标 | 冰冻概率+25% |
| 品质 | 名称 | **CD修正** | 实际CD | 攻击加成 | 攻击加成百分比 | 核心特性 | 穿透伤害比率(进化) |
|------|--------------|-----------|--------|----------|----------------|------------|------------------|
| 绿 | 穿刺短剑 | -20% | 1.20s | +50 | 25% | 穿透1目标 | - |
| 蓝 | 寒锋长剑 | -20% | 1.20s | +100 | 50% | 穿透2目标 | 30% |
| 紫 | 龙鳞穿刺者 | -20% | 1.20s | +200 | 100% | 穿透3目标 | 40% |
| 紫 | 冰霜穿刺者 | -20% | 1.20s | +200 | 100% | 穿透3目标 | 冰冻概率+25% |
## ⚔️ 斧类武器核心设计
@@ -45,29 +30,15 @@
**进化规则**
- 品质提升风怒概率和击退概率
- 等级提升攻击加成和特殊属性
- 斧类核心机制:风怒默认伤害额外一次攻击 伤害100%
## 📋 斧类武器完整数据表
| 等级 | 品质 | 名称 | CD | 攻击加成 | 风怒概率 | 击退概率 |
|------ |------|------------------|------|----------|----------|----------|
| **Lv1** | 绿 | 风暴战斧(Lv1) | 1.50s | +100% | 20% | - |
| | 蓝 | 寒锋巨斧(Lv1) | 1.50s | +130% | 30% | - |
| | 紫 | 龙鳞撕裂者(Lv1) | 1.50s | +160% | 40% | |
| **Lv2** | 绿 | 风暴战斧(Lv2) | 1.50s | +130% | 25% | - |
| | 蓝 | 寒锋巨斧(Lv2) | 1.50s | +170% | 35% | - |
| | 紫 | 龙鳞撕裂者(Lv2) | 1.50s | +200% | 45% | |
| **Lv3** | 绿 | 风暴战斧(Lv3) | 1.50s | +160% | 30% | - |
| | 蓝 | 寒锋巨斧(Lv3) | 1.50s | +210% | 40% | - |
| | 紫 | 龙鳞撕裂者(Lv3) | 1.50s | +240% | 50% | |
| **Lv4** | 绿 | 风暴战斧(Lv4) | 1.50s | +190% | 35% | - |
| | 蓝 | 寒锋巨斧(Lv4) | 1.50s | +250% | 45% | - |
| | 紫 | 龙鳞撕裂者(Lv4) | 1.50s | +280% | 75% | |
| | 紫 | 泰坦撕裂者(Lv4) | 1.50s | +200% | 75% | 击晕概率+10% |
| **Lv5** | 绿 | 风暴战斧(Lv5) | 1.50s | +220% | 40% | 20% |
| | 蓝 | 寒锋巨斧(Lv5) | 1.50s | +280% | 50% | - |
| | 紫 | 龙鳞撕裂者(Lv5) | 1.50s | +340% | 60% | 27% |
| | 紫 | 泰坦撕裂者(Lv5) | 1.50s | +300% | 60% | 击晕概率+12.5% |
| 品质 | 名称 | CD | 攻击加成 | 攻击加成百分比 | 风怒概率 | 击退概率 |
|------|--------------|------|----------|----------------|----------|----------|
| 绿 | 风暴战斧 | 1.50s | +50 | 25% | 40% | 20% |
| 蓝 | 寒锋巨斧 | 1.50s | +100 | 50% | 50% | - |
| 紫 | 龙鳞撕裂者 | 1.50s | +200 | 100% | 60% | 27% |
| 紫 | 泰坦撕裂者 | 1.50s | +200 | 100% | 60% | 击晕概率+12.5% |
# 🔨 锤类武器完整配置表含CD修正
@@ -76,83 +47,34 @@
- **CD修正**+6.7%(全等级固定)
- **实际CD**1.5 × (1 + 0.067) ≈ **1.60s**
- 暴击机制基础暴击伤害150%,装备提供额外暴击伤害加成
- 击晕效果:Lv5蓝色/紫色品质攻击时概率击晕目标使目标无法行动1秒并重置CD
- 击晕效果:蓝色/紫色品质攻击时概率击晕目标使目标无法行动1秒并重置CD
## 📊 完整数据表Lv1-Lv5
## 📊 完整数据表
| 等级 | 品质 | 名称 | CD修正 | 实际CD | 攻击加成 | 暴击率 | 暴击伤害加成 | 特殊属性 |
|------|------|--------------------|--------|--------|----------|--------|--------------|----------|
| Lv1 | 绿 | 碎骨战锤(Lv1) | +6.7% | 1.60s | +120% | 10% | +25% | - |
| | 蓝 | 雷霆重锤(Lv1) | +6.7% | 1.60s | +150% | 15% | +35% | - |
| | 紫 | 龙鳞粉碎者(Lv1) | +6.7% | 1.60s | +180% | 20% | +50% | - |
| Lv2 | 绿 | 碎骨战锤(Lv2) | +6.7% | 1.60s | +150% | 10% | +30% | - |
| | 蓝 | 雷霆重锤(Lv2) | +6.7% | 1.60s | +190% | 20% | +40% | - |
| | 紫 | 龙鳞粉碎者(Lv2) | +6.7% | 1.60s | +220% | 25% | +55% | - |
| Lv3 | 绿 | 碎骨战锤(Lv3) | +6.7% | 1.60s | +180% | 15% | +30% | - |
| | 蓝 | 雷霆重锤(Lv3) | +6.7% | 1.60s | +230% | 20% | +40% | - |
| | 紫 | 龙鳞粉碎者(Lv3) | +6.7% | 1.60s | +260% | 25% | +60% | - |
| Lv4 | 绿 | 碎骨战锤(Lv4) | +6.7% | 1.60s | +210% | 15% | +35% | - |
| | 蓝 | 雷霆重锤(Lv4) | +6.7% | 1.60s | +270% | 25% | +45% | - |
| | 紫 | 龙鳞粉碎者(Lv4) | +6.7% | 1.60s | +300% | 30% | +65% | 击晕概率+10% |
| | 紫 | 泰坦粉碎者(Lv4) | +6.7% | 1.60s | +300% | 30% | - | 击晕概率+25% |
| Lv5 | 绿 | 碎骨战锤(Lv5) | +6.7% | 1.60s | +240% | 20% | +35% | - |
| | 蓝 | 雷霆重锤(Lv5) | +6.7% | 1.60s | +310% | 25% | +45% | - |
| | 紫 | 龙鳞粉碎者(Lv5) | +6.7% | 1.60s | +360% | 30% | +70% | 击晕概率+15% |
| | 紫 | 泰坦粉碎者(Lv5) | +6.7% | 1.60s | +360% | 30% | - | 击晕概率+30% |
| 品质 | 名称 | CD修正 | 实际CD | 攻击加成 | 攻击加成百分比 | 暴击率 | 暴击伤害加成 | 特殊属性 |
|------|--------------|--------|--------|----------|----------------|--------|--------------|----------|
| 绿 | 碎骨战锤 | +6.7% | 1.60s | +50 | 25% | 20% | +35% | - |
| 蓝 | 雷霆重锤 | +6.7% | 1.60s | +100 | 50% | 25% | +45% | - |
| 紫 | 龙鳞粉碎者 | +6.7% | 1.60s | +200 | 100% | 30% | +70% | 击晕概率+15% |
| 紫 | 泰坦粉碎者 | +6.7% | 1.60s | +200 | 100% | 30% | - | 击晕概率+30% |
## 系统兼容性说明
1. **CD修正统一性**
- 所有锤类武器固定+6.7%修正
- 实际CD四舍五入保留两位小数
2. **暴击机制说明**
- 基础暴击伤害150%
- 装备提供额外暴击伤害加成
- 实际暴击伤害 = 基础150% + 装备加成
3. **击晕机制说明**
- 仅Lv5蓝色和紫色品质拥有击晕概率
- 击晕效果目标无法行动1秒并重置攻击CD
- 击晕不可叠加,但可打断敌人技能读条
- 泰坦粉碎者去掉暴击伤害加成大幅提升击晕概率Lv4:25%, Lv5:30%
4. **双人协同参数**
```math
\text{理论攻击频率} = \frac{2}{1.60} \approx 1.25 \text{次/秒}
\text{暴击期望} = \text{暴击率} \times \text{暴击伤害加成}
```
# ⚔️ 刀类武器完整配置表含CD修正
## 刀类武器完整配置表含CD修正
## 📜 核心机制说明
- **基准CD**1.5秒
- **CD修正**-26.7%(全等级固定)
- **实际CD**1.5 × (1 - 0.267) ≈ **1.10s**
- 易伤效果:攻击时施加易伤状态,增加后续伤害
- 特殊属性:Lv4/Lv5紫色品质易伤持续次数+1
- 特殊属性:紫色品质易伤持续次数+1
## 📊 完整数据表Lv1-Lv5
## 📊 完整数据表
| 等级 | 品质 | 名称 | CD修正 | 实际CD | 攻击加成 | 易伤加成 | 特殊属性 |
|------|------|--------------------|--------|--------|----------|----------|----------|
| Lv1 | 绿 | 影刃(Lv1) | -26.7% | 1.10s | +60% | +15% | - |
| | 蓝 | 寒月双刃(Lv1) | -26.7% | 1.10s | +85% | +20% | - |
| | 紫 | 龙鳞切割者(Lv1) | -26.7% | 1.10s | +115% | +25% | - |
| Lv2 | 绿 | 影刃(Lv2) | -26.7% | 1.10s | +90% | +15% | - |
| | 蓝 | 寒月双刃(Lv2) | -26.7% | 1.10s | +125% | +25% | - |
| | 紫 | 龙鳞切割者(Lv2) | -26.7% | 1.10s | +160% | +30% | - |
| Lv3 | 绿 | 影刃(Lv3) | -26.7% | 1.10s | +120% | +20% | - |
| | 蓝 | 寒月双刃(Lv3) | -26.7% | 1.10s | +165% | +25% | - |
| | 紫 | 龙鳞切割者(Lv3) | -26.7% | 1.10s | +205% | +35% | - |
| Lv4 | 绿 | 影刃(Lv4) | -26.7% | 1.10s | +150% | +20% | - |
| | 蓝 | 寒月双刃(Lv4) | -26.7% | 1.10s | +205% | +30% | - |
| | 紫 | 龙鳞切割者(Lv4) | -26.7% | 1.10s | +250% | +35% | 易伤持续次数+1 |
| | 紫 | 冰霜切割者(Lv4) | -26.7% | 1.10s | +250% | +35% | 冰冻概率+20% |
| Lv5 | 绿 | 影刃(Lv5) | -26.7% | 1.10s | +180% | +25% | - |
| | 蓝 | 寒月双刃(Lv5) | -26.7% | 1.10s | +245% | +35% | - |
| | 紫 | 龙鳞切割者(Lv5) | -26.7% | 1.10s | +300% | +45% | 易伤持续次数+1 |
| | 紫 | 冰霜切割者(Lv5) | -26.7% | 1.10s | +300% | +45% | 冰冻概率+25% |
| 品质 | 名称 | CD修正 | 实际CD | 攻击加成 | 攻击加成百分比 | 易伤加成 | 特殊属性 |
|------|--------------|--------|--------|----------|----------------|----------|----------|
| 绿 | 影刃 | -26.7% | 1.10s | +50 | 25% | +25% | - |
| 蓝 | 寒月双刃 | -26.7% | 1.10s | +100 | 50% | +35% | - |
| 紫 | 龙鳞切割者 | -26.7% | 1.10s | +200 | 100% | +45% | 易伤持续次数+1 |
| 紫 | 冰霜切割者 | -26.7% | 1.10s | +200 | 100% | +45% | 冰冻概率+25% |
## ⚙️ 系统兼容性说明
1. **CD修正统一性**
@@ -162,19 +84,13 @@
2. **易伤机制说明**
- 攻击时对目标施加易伤状态
- 易伤状态增加后续攻击伤害
- Lv4/Lv5紫色品质易伤持续次数+1延长易伤效果
- 紫色品质易伤持续次数+1延长易伤效果
3. **双人协同参数**
```math
\text{理论攻击频率} = \frac{2}{1.10} \approx 1.82 \text{次/秒}
\text{易伤覆盖率} = \frac{5}{1.82} \approx 2.75 \text{秒持续效果}
```
## 🛡️ 盾牌系统设计规范(属性互斥)
**核心规则**
@@ -183,113 +99,55 @@
3. HP最大值改为百分比提升
4. 紫装专属被攻击5次获得1技能点
| 品质 | 完整名称 | HP加成 | 闪避比率 | 附加属性 | 特殊属性 |
|------|--------------|--------|----------|------------------|----------|
| 绿 | 风影圆盾 | +40% | 40% | - | - |
| 蓝 | 流光护盾 | +45% | 40% | Debuff减免15% | - |
| 紫 | 量子闪避者 | +50% | 45% | 免伤15% |- |
| 等级 | 品质 | 完整名称 | HP加成 | 闪避比率 | 附加属性 | 特殊属性 |
|------|------|----------------------|--------|----------|------------------|----------|
| 1 | 绿 | 风影圆盾(Lv1) | +20% | 25% | - | - |
| 1 | 蓝 | 流光护盾(Lv1) | +25% | 30% | Debuff减免10% | - |
| 1 | 紫 | 量子闪避者(Lv1) | +30% | 30% | 免伤5% | - |
| 2 | 绿 | 风影圆盾(Lv2) | +25% | 30% | - | - |
| 2 | 蓝 | 流光护盾(Lv2) | +30% | 35% | Debuff减免10% | - |
| 2 | 紫 | 量子闪避者(Lv2) | +35% | 35% | 免伤5% |- |
| 3 | 绿 | 风影圆盾(Lv3) | +30% | 35% | - | - |
| 3 | 蓝 | 流光护盾(Lv3) | +35% | 35% | Debuff减免10% | - |
| 3 | 紫 | 量子闪避者(Lv3) | +40% | 40% | 免伤10% | - |
| 4 | 绿 | 风影圆盾(Lv4) | +35% | 35% | - | - |
| 4 | 蓝 | 流光护盾(Lv4) | +40% | 40% | Debuff减免15% | - |
| 4 | 紫 | 量子闪避者(Lv4) | +45% | 40% | 免伤10% |- |
| 5 | 绿 | 风影圆盾(Lv5) | +40% | 40% | - | - |
| 5 | 蓝 | 流光护盾(Lv5) | +45% | 40% | Debuff减免15% | - |
| 5 | 紫 | 量子闪避者(Lv5) | +50% | 45% | 免伤15% |- |
| 等级 | 品质 | 完整名称 | HP加成 | 反伤比率 | 附加属性 | 特殊属性 |
|------|------|----------------------|--------|----------|------------------|----------|
| 1 | 绿 | 荆棘木盾(Lv1) | +60% | 15% | - | - |
| 1 | 蓝 | 钢铁尖刺(Lv1) | +70% | 20% | Debuff减免10% | - |
| 1 | 紫 | 龙鳞反伤者(Lv1) | +75% | 25% | 免伤5% | - |
| 2 | 绿 | 荆棘木盾(Lv2) | +70% | 20% | - | - |
| 2 | 蓝 | 钢铁尖刺(Lv2) | +75% | 25% | Debuff减免10% | - |
| 2 | 紫 | 龙鳞反伤者(Lv2) | +80% | 25% | 免伤10% | - |
| 3 | 绿 | 荆棘木盾(Lv3) | +75% | 25% | - | - |
| 3 | 蓝 | 钢铁尖刺(Lv3) | +80% | 25% | Debuff减免15% | - |
| 3 | 紫 | 龙鳞反伤者(Lv3) | +85% | 30% | 免伤10% |- |
| 4 | 绿 | 荆棘木盾(Lv4) | +80% | 25% | - | - |
| 4 | 蓝 | 钢铁尖刺(Lv4) | +85% | 30% | Debuff减免15% | - |
| 4 | 紫 | 龙鳞反伤者(Lv4) | +90% | 30% | 免伤15% | - |
| 5 | 绿 | 荆棘木盾(Lv5) | +85% | 30% | - | - |
| 5 | 蓝 | 钢铁尖刺(Lv5) | +90% | 30% | Debuff减免15% | - |
| 5 | 紫 | 龙鳞反伤者(Lv5) | +110% | 35% | 免伤15% |- |
| 等级 | 品质 | 完整名称 | HP加成 | 免伤比例 | 附加属性 | 特殊属性 |
|------|------|----------------------|--------|----------|------------------|----------|
| 1 | 绿 | 守护圆盾(Lv1) | +40% | 10% | - | - |
| 1 | 蓝 | 圣光壁垒(Lv1) | +50% | 10% | Debuff减免10% | - |
| 1 | 紫 | 永恒守护者(Lv1) | +55% | 15% | 闪避5% |- |
| 2 | 绿 | 守护圆盾(Lv2) | +50% | 10% | - | - |
| 2 | 蓝 | 圣光壁垒(Lv2) | +55% | 15% | Debuff减免10% | - |
| 2 | 紫 | 永恒守护者(Lv2) | +60% | 15% | 闪避10% | - |
| 3 | 绿 | 守护圆盾(Lv3) | +55% | 15% | - | - |
| 3 | 蓝 | 圣光壁垒(Lv3) | +60% | 15% | Debuff减免15% | - |
| 3 | 紫 | 永恒守护者(Lv3) | +65% | 20% | 闪避10% | - |
| 4 | 绿 | 守护圆盾(Lv4) | +60% | 15% | - | - |
| 4 | 蓝 | 圣光壁垒(Lv4) | +65% | 20% | Debuff减免15% | - |
| 4 | 紫 | 永恒守护者(Lv4) | +70% | 20% | 闪避15% |- |
| 5 | 绿 | 守护圆盾(Lv5) | +65% | 20% | - | - |
| 5 | 蓝 | 圣光壁垒(Lv5) | +70% | 20% | Debuff减免15% | - |
| 5 | 紫 | 永恒守护者(Lv5) | +75% | 25% | 闪避15% | - |
| 品质 | 完整名称 | HP加成 | 反伤比率 | 附加属性 | 特殊属性 |
|------|--------------|--------|----------|------------------|----------|
| 绿 | 荆棘木盾 | +85% | 30% | - | - |
| 蓝 | 钢铁尖刺 | +90% | 30% | Debuff减免15% | - |
| 紫 | 龙鳞反伤者 | +110% | 35% | 免伤15% |- |
| 品质 | 完整名称 | HP加成 | 免伤比例 | 附加属性 | 特殊属性 |
|------|--------------|--------|----------|------------------|----------|
| 绿 | 守护圆盾 | +65% | 20% | - | - |
| 蓝 | 圣光壁垒 | +70% | 20% | Debuff减免15% | - |
| 紫 | 永恒守护者 | +75% | 25% | 闪避15% | - |
## 🟢 绿色品质饰品(自然元素系列)
| 品质 | 名称 | 等级 | 属性类型 | 属性值 | 属性类型2 | 属性值2 | 核心属性 | 核心值 |
|------|------------|------|----------|--------|-----------|---------|----------|--------|
| 绿 | 磐石徽章 | 4 | HP加成 | +55% | - | - | - | - |
| 绿 | 磐石徽章 | 5 | HP加成 | +60% | - | - | - | - |
| 绿 | 刚玉戒指 | 4 | 免伤 | +20% | - | - | - | - |
| 绿 | 刚玉戒指 | 5 | 免伤 | +25% | - | - | - | - |
| 绿 | 烈阳吊坠 | 4 | 攻击 | +50% | - | - | - | - |
| 绿 | 烈阳吊坠 | 5 | 攻击 | +55% | - | - | - | - |
| 绿 | 雷暴耳饰 | 4 | 暴伤 | +35% | - | - | - | - |
| 极 | 雷暴耳饰 | 5 | 暴伤 | +40% | - | - | - | - |
| 绿 | 迷雾指环 | 4 | 闪避 | +10% | - | - | - | - |
| 绿 | 迷雾指环 | 5 | 闪避 | +15% | - | - | - | - |
| 绿 | 荆棘挂饰 | 4 | 反伤 | +15% | - | - | - | - |
| 绿 | 荆棘挂饰 | 5 | 反伤 | +20% | - | - | - | - |
| 品质 | 名称 | 属性类型 | 属性值 | 属性类型2 | 属性值2 | 核心属性 | 核心值 |
|------|------------|----------|--------|-----------|---------|----------|--------|
| 绿 | 磐石徽章 | HP加成 | +60% | - | - | - | - |
| 绿 | 刚玉戒指 | 免伤 | +25% | - | - | - | - |
| 绿 | 烈阳吊坠 | 攻击 | +55% | - | - | - | - |
| | 雷暴耳饰 | 伤 | +40% | - | - | - | - |
| 绿 | 迷雾指环 | 闪避 | +15% | - | - | - | - |
| 绿 | 荆棘挂饰 | 反伤 | +20% | - | - | - | - |
## 🔵 蓝色品质饰品(天文现象系列)
| 品质 | 名称 | 等级 | 属性类型1 | 属性值1 | 属性类型2 | 属性值2 | 核心属性 | 核心值 |
|------|------------|------|-----------|---------|-----------|---------|----------|--------|
| 蓝 | 星辉徽章 | 4 | HP加成 | +35% | 免伤 | +15% | - | - |
| 蓝 | 星辉徽章 | 5 | HP加成 | +40% | 伤 | +20% | - | - |
| 蓝 | 霜晶戒指 | 4 | 攻击 | +35% | 暴伤 | +25% | - | - |
| 蓝 | 霜晶戒指 | 5 | 攻击 | +40% | 伤 | +30% | - | - |
| 蓝 | 流光吊坠 | 4 | HP加成 | +30% | 闪避 | +10% | - | - |
| 蓝 | 流光吊坠 | 5 | HP加成 | +35% | 闪避 | +15% | - | - |
| 蓝 | 地脉指环 | 4 | 免伤 | +15% | 反伤 | +10% | - | - |
| 蓝 | 地脉指环 | 5 | 免伤 | +20% | 反伤 | +15% | - | - |
| 蓝 | 炎阳耳饰 | 4 | 攻击 | +40% | 闪避 | +5% | - | - |
| 蓝 | 炎阳耳饰 | 5 | 攻击 | +45% | 闪避 | +10% | - | - |
| 蓝 | 潮汐挂饰 | 4 | 暴伤 | +30% | 反伤 | +10% | - | - |
| 蓝 | 潮汐挂饰 | 5 | 暴伤 | +35% | 反伤 | +15% | - | - |
| 品质 | 名称 | 属性类型1 | 属性值1 | 属性类型2 | 属性值2 | 核心属性 | 核心值 |
|------|------------|-----------|---------|-----------|---------|----------|--------|
| 蓝 | 星辉徽章 | HP加成 | +40% | 免伤 | +20% | - | - |
| 蓝 | 霜晶戒指 | 攻击 | +40% | 伤 | +30% | - | - |
| 蓝 | 流光吊坠 | HP加成 | +35% | 闪避 | +15% | - | - |
| 蓝 | 地脉指环 | 免伤 | +20% | 伤 | +15% | - | - |
| 蓝 | 炎阳耳饰 | 攻击 | +45% | 闪避 | +10% | - | - |
| 蓝 | 潮汐挂饰 | 暴伤 | +35% | 反伤 | +15% | - | - |
## 🟣 紫色品质饰品(神话概念系列)
| 品质 | 名称 | 等级 | 属性类型1 | 属性值1 | 属性类型2 | 属性值2 | 核心属性 | 核心值 |
|------|------------|------|-----------|---------|-----------|---------|------------------|--------|
| 紫 | 天穹徽章 | 4 | HP加成 | +40% | 免伤 | +15% | 攻击触发属性增加的值额外加值 | 1 |
| 紫 | 天穹徽章 | 5 | HP加成 | +45% | 伤 | +20% | 攻击触发属性增加的值额外加值 | 2 |
| 紫 | 神木戒指 | 4 | 攻击 | +45% | 暴伤 | +30% | 改成暴击 | 5% |
| 紫 | 神木戒指 | 5 | 攻击 | +50% | 暴伤 | +35% | 改成暴击 | 10% |
| 紫 | 日曜吊坠 | 4 | HP加成 | +35% | 攻击 | +40% | 攻击n次后增加主将攻击力 | 1 |
| 紫 | 日曜吊坠 | 5 | HP加成 | +40% | 攻击 | +45% | 攻击n次后增加主将攻击力 | 2|
| 紫 | 月影指环 | 4 | 免伤 | +15% | 暴伤 | +30% | 攻击n次后增加主将生命值 | 5 |
| 紫 | 月影指环 | 5 | 免伤 | +20% | 暴伤 | +35% | 攻击n次后增加主将生命值 | 10 |
| 紫 | 星尘耳饰 | 4 | 闪避 | +10% | 攻击 | +45% | 改成技能cd减少 | -10% |
| 紫 | 星尘耳饰 | 5 | 闪避 | +15% | 攻击 | +50% | 改成技能cd减少 | -20% |
| 紫 | 深渊挂饰 | 4 | 反伤 | +10% | HP加成 | +45% | 穿刺 | 1 |
| 紫 | 深渊挂饰 | 5 | 反伤 | +15% | HP加成 | +50% | 穿刺 | 2 |
| 紫 | 永夜徽章 | 4 | 免伤 | +20% | 暴伤 | +30% | 双倍受击触发 | 1 |
| 紫 | 永夜徽章 | 5 | 免伤 | +25% | 暴伤 | +35% | 双倍受击触发 | 2 |
| 品质 | 名称 | 属性类型1 | 属性值1 | 属性类型2 | 属性值2 | 核心属性 | 核心值 |
|------|------------|-----------|---------|-----------|---------|------------------|--------|
| 紫 | 天穹徽章 | HP加成 | +45% | 免伤 | +20% | 攻击触发属性增加的值额外加值 | 2 |
| 紫 | 神木戒指 | 攻击 | +50% | 伤 | +35% | 改成暴击 | 10% |
| 紫 | 日曜吊坠 | HP加成 | +40% | 攻击 | +45% | 攻击n次后增加主将攻击力 | 2|
| 紫 | 月影指环 | 免伤 | +20% | 暴伤 | +35% | 攻击n次后增加主将生命值 | 10 |
| 紫 | 星尘耳饰 | 闪避 | +15% | 攻击 | +50% | 改成技能cd减少 | -20% |
| 紫 | 深渊挂饰 | 反伤 | +15% | HP加成 | +50% | 穿刺 | 2 |
| 紫 | 永夜徽章 | 免伤 | +25% | 暴伤 | +35% | 双倍受击触发 | 2 |