import { _decorator, Component, Label, Node, resources, Sprite, SpriteAtlas } from 'cc'; import { oops } from 'db://oops-framework/core/Oops'; import { GameEvent } from '../common/config/GameEvent'; import { smc } from '../common/SingletonModuleComp'; import { EquipInfo, EquipType, EquipAttrTarget, EquipSpecialAttr} from '../common/config/Equips'; import { BuffAttr, DebuffAttr, geDebuffNum, getBuffNum } from '../common/config/SkillSet'; import { FightSet } from '../common/config/Mission'; import { Quality } from '../common/config/CardSet'; const { ccclass, property } = _decorator; @ccclass('EquipsComp') export class EquipsComp extends Component { weapon:any=null armor:any=null accessory:any=null boxs:Node=null attrs:any={ hero_buff:getBuffNum(), friend_buff:getBuffNum(), enemy_buff:getBuffNum(), } /** 视图层逻辑代码分离演示 */ onLoad() { oops.message.on(GameEvent.FightReady,this.fight_ready,this) 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) } 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 } 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 } start(){ this.fight_ready() } fight_ready(){ this.hide_equip_get(null,"weapon") this.hide_equip_get(null,"armor") this.hide_equip_get(null,"accessory") this.boxs.getChildByName("weapon").getChildByName("icon").active=false this.boxs.getChildByName("armor").getChildByName("icon").active=false this.boxs.getChildByName("accessory").getChildByName("icon").active=false this.weapon={ uuid:0, name:"weapon", type:"weapon", level:0, } this.armor={ uuid:0, name:"armor", type:"armor", level:0, } this.accessory={ uuid:0, name:"accessory", type:"accessory", level:0, } this.count_attrs() } equip_add(e:GameEvent,data:any){ console.log("equip_add",data) if(data.type==EquipType.WEAPON){ this.weapon.uuid=data.uuid this.weapon.name=data.name this.weapon.type=data.type this.weapon.level=data.level this.show_weapon(data.uuid) } if(data.type==EquipType.ARMOR){ this.armor.uuid=data.uuid this.armor.name=data.name this.armor.type=data.type this.armor.level=data.level this.show_armor(data.uuid) } if(data.type==EquipType.ACCESSORY){ this.accessory.uuid=data.uuid this.accessory.name=data.name this.accessory.type=data.type this.accessory.level=data.level this.show_accessory(data.uuid) } this.count_attrs() } show_weapon(uuid:number){ let icon = this.boxs.getChildByName("weapon").getChildByName("icon") icon.active=true var icon_path = "game/heros/equips2" resources.load(icon_path, SpriteAtlas, (err: any, atlas) => { 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 icon.getChildByName("q4").active=EquipInfo[uuid].quality==Quality.PURPLE icon.getChildByName("q5").active=EquipInfo[uuid].quality==Quality.ORANGE } show_armor(uuid:number){ let icon = this.boxs.getChildByName("armor").getChildByName("icon") icon.active=true var icon_path = "game/heros/equips2" resources.load(icon_path, SpriteAtlas, (err: any, atlas) => { 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 icon.getChildByName("q4").active=EquipInfo[uuid].quality==Quality.PURPLE icon.getChildByName("q5").active=EquipInfo[uuid].quality==Quality.ORANGE } show_accessory(uuid:number){ let icon = this.boxs.getChildByName("accessory").getChildByName("icon") icon.active=true var icon_path = "game/heros/equips2" resources.load(icon_path, SpriteAtlas, (err: any, atlas) => { 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 icon.getChildByName("q4").active=EquipInfo[uuid].quality==Quality.PURPLE icon.getChildByName("q5").active=EquipInfo[uuid].quality==Quality.ORANGE } count_attrs(){ // 重置所有属性 this.reset_attrs(); console.log("[EquipsComp]:重置后的属性", this.attrs); // 获取所有装备的属性 let weapon_buffs = this.weapon.uuid ? EquipInfo[this.weapon.uuid]?.buff || [] : []; let armor_buffs = this.armor.uuid ? EquipInfo[this.armor.uuid]?.buff || [] : []; let accessory_buffs = this.accessory.uuid ? EquipInfo[this.accessory.uuid]?.buff || [] : []; let weapon_special_attr = this.weapon.uuid ? EquipInfo[this.weapon.uuid]?.special_attr : []; let armor_special_attr = this.armor.uuid ? EquipInfo[this.armor.uuid]?.special_attr : []; let accessory_special_attr = this.accessory.uuid ? EquipInfo[this.accessory.uuid]?.special_attr : []; console.log("[EquipsComp]:weapon_special_attr", weapon_special_attr); console.log("[EquipsComp]:armor_special_attr", armor_special_attr); console.log("[EquipsComp]:accessory_special_attr", accessory_special_attr); console.log("[EquipsComp]:weapon_buffs", weapon_buffs); console.log("[EquipsComp]:防具属性", armor_buffs); console.log("[EquipsComp]:饰品属性", accessory_buffs); const all_special_attr=[...weapon_special_attr,...armor_special_attr,...accessory_special_attr] let equip_special_attr=this.count_equip_special_attr(all_special_attr) let friend_get_master_equip=equip_special_attr[EquipSpecialAttr.FRIEND_GET_MASTER_EQUIP] oops.message.dispatchEvent(GameEvent.ChangeATK_EQUIP_SPECIAL_ATTR,equip_special_attr) // 合并所有装备属性 const allBuff = [...weapon_buffs, ...armor_buffs, ...accessory_buffs]; console.log("[EquipsComp]:合并后的所有属性", allBuff); // 计算每个目标的属性加成 allBuff.forEach(attr => { const target = attr.target || EquipAttrTarget.HERO; let targetKey = null; // 根据目标类型获取对应的key switch (target) { case EquipAttrTarget.HERO: targetKey = 'hero_buff'; break; case EquipAttrTarget.FRIEND: targetKey = 'friend_buff'; break; } this.add_attr(targetKey,attr) }); // 伙伴获取英雄装备属性加成 this.attrs.friend_buff.ATK+=this.attrs.hero_buff.ATK*friend_get_master_equip this.attrs.friend_buff.HP+=this.attrs.hero_buff.HP*friend_get_master_equip console.log("[EquipsComp]:debuff buff attrs ", this.attrs); oops.message.dispatchEvent(GameEvent.EquipChange, this.attrs); } count_equip_special_attr(all_special_attr:any[]){ //特殊属性附加 - 直接使用枚举值作为属性名 let equip_special_attr = { [EquipSpecialAttr.ICE]: 0, [EquipSpecialAttr.FIRE]: 0, [EquipSpecialAttr.WIND]: 0, [EquipSpecialAttr.FRIEND_LIVE_CD]: 0, [EquipSpecialAttr.ATK_ADD_FRIEND_ATK]: 0, [EquipSpecialAttr.ATK_ADD_FRIEND_HP]: 0, [EquipSpecialAttr.ATK_ADD_GLOD]: 0, [EquipSpecialAttr.ATK_ADD_MASTER_ATK]: 0, [EquipSpecialAttr.ATK_ADD_MASTER_HP]: 0, [EquipSpecialAttr.DOUBLE_DEAD]: 0, [EquipSpecialAttr.DOUBLE_ATKED]: 0, [EquipSpecialAttr.FRIEND_ATKED_ADD_SKILL_STONE]: 0, [EquipSpecialAttr.ATK_ADD_VALUE]: 0, [EquipSpecialAttr.FRIEND_GET_MASTER_EQUIP]: 0, }; console.log("[EquipsComp]:all_special_attr",all_special_attr) // 直接使用枚举值累加属性 all_special_attr.forEach(special_attr => { if (special_attr && equip_special_attr.hasOwnProperty(special_attr.special_attr)) { equip_special_attr[special_attr.special_attr] += special_attr.special_attr_value; } }); console.log("[EquipsComp]:equip_special_attr",equip_special_attr) return equip_special_attr } add_attr(targetKey:string,attr:any){ if(targetKey){ this.attrs[targetKey][BuffAttr[attr.type]] += attr.value; } } // 重置所有属性为0 private reset_attrs() { // 创建新的属性对象 const newAttrs = { hero_buff: getBuffNum(), friend_buff: getBuffNum(), enemy_buff: getBuffNum(), }; // 替换整个 attrs 对象 this.attrs = newAttrs; console.log("重置属性", { hero_buff: this.attrs.hero_buff, friend_buff: this.attrs.friend_buff, enemy_buff: this.attrs.enemy_buff, }); } equip_remove(e:GameEvent,data:any){ console.log("equip_remove",data) } update(dt: number): void { if(!smc.mission.play||smc.mission.pause) return } 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="升级" } } private hide_equip_get(e:any,data:string){ this.scheduleOnce(()=>{ if(smc.vmdata.mission_data.equip_stone > smc.vmdata.mission_data.equip_stone_max) return this.boxs.getChildByName("weapon").getChildByName("get").active =false this.boxs.getChildByName("weapon").getChildByName("change").active =false this.boxs.getChildByName("weapon").getChildByName("light").active=false this.boxs.getChildByName("weapon").getChildByName("tip").active=false this.boxs.getChildByName("armor").getChildByName("get").active =false this.boxs.getChildByName("armor").getChildByName("change").active =false this.boxs.getChildByName("armor").getChildByName("light").active=false this.boxs.getChildByName("armor").getChildByName("tip").active=false this.boxs.getChildByName("accessory").getChildByName("get").active =false this.boxs.getChildByName("accessory").getChildByName("change").active =false this.boxs.getChildByName("accessory").getChildByName("light").active=false this.boxs.getChildByName("accessory").getChildByName("tip").active=false },0.5) } }