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 } oops.message.dispatchEvent(GameEvent.EquipSelect,{slot:data}) mission_data.equip_stone-=mission_data.equip_stone_max mission_data.equip_stone_max=mission_data.equip_stone_max*2 } 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.hide_equip_change(null,"weapon") this.hide_equip_change(null,"armor") this.hide_equip_change(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) 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) }); 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={ ice:false, fire:false, wind:false, friend_live_cd_less:0, atk_add_friend_atk:0, atk_add_friend_hp:0, atk_add_glod:0, atk_add_master_atk:0, atk_add_master_hp:0, } console.log("[EquipsComp]:all_special_attr",all_special_attr) all_special_attr.forEach(special_attr=>{ if(special_attr){ switch(special_attr.special_attr){ case EquipSpecialAttr.ICE: equip_special_attr.ice=true break case EquipSpecialAttr.FIRE: equip_special_attr.fire=true break case EquipSpecialAttr.WIND: equip_special_attr.wind=true break case EquipSpecialAttr.FRIEND_LIVE_CD: equip_special_attr.friend_live_cd_less+=special_attr.special_attr_value break case EquipSpecialAttr.ATK_ADD_FRIEND_ATK: equip_special_attr.atk_add_friend_atk+=special_attr.special_attr_value break case EquipSpecialAttr.ATK_ADD_FRIEND_HP: equip_special_attr.atk_add_friend_hp+=special_attr.special_attr_value break case EquipSpecialAttr.ATK_ADD_GLOD: equip_special_attr.atk_add_glod+=special_attr.special_attr_value break case EquipSpecialAttr.ATK_ADD_MASTER_ATK: equip_special_attr.atk_add_master_atk+=special_attr.special_attr_value break case EquipSpecialAttr.ATK_ADD_MASTER_HP: equip_special_attr.atk_add_master_hp+=special_attr.special_attr_value break } } }) 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="购买" } 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="购买" } 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="购买" } } private hide_equip_get(e:any,data:string){ this.boxs.getChildByName("weapon").getChildByName("get").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("light").active=false this.boxs.getChildByName("armor").getChildByName("tip").active=false this.boxs.getChildByName("accessory").getChildByName("get").active =false this.boxs.getChildByName("accessory").getChildByName("light").active=false this.boxs.getChildByName("accessory").getChildByName("tip").active=false } private show_equip_change(e:string){ if(this.weapon.uuid!=0){ this.boxs.getChildByName("weapon").getChildByName("change").active =true } if(this.armor.uuid!=0){ this.boxs.getChildByName("armor").getChildByName("change").active =true } if(this.accessory.uuid!=0){ this.boxs.getChildByName("accessory").getChildByName("change").active =true } } private hide_equip_change(e:any,data:any){ 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("change").active =false this.boxs.getChildByName("armor").getChildByName("light").active=false this.boxs.getChildByName("armor").getChildByName("tip").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 } }