squidGame/tgx-games-client/assets/module_arean/scripts/GameScene/GameItem/DetailView.ts

627 lines
24 KiB
TypeScript

import { _decorator, Button, Color, Component, director, instantiate, Label, Node, Animation, Prefab, ProgressBar, sp, Sprite, SpriteFrame, Toggle, Vec3, RichText } from "cc";
import { areanMgr } from "../../AreanManager";
import { resLoader } from "db://assets/core_tgx/base/utils/ResLoader";
import { ModuleDef } from "db://assets/scripts/ModuleDef";
import { SectType as SectType, heroAttributeType, IBasicAttribute, IAreanPlayer } from "db://assets/module_basic/shared/protocols/public/arean/AreanTypeDef";
import { CommonFun } from "db://assets/module_arean/scripts/CommonFun";
import { iAttribute } from "../../../../module_basic/shared/protocols/public/arean/MsgAreanBattleReportPush";
import { AreanEvent, AreanNetMgr } from "../../AreanNetMgr";
import { MsgAreanAttrUpdatePush } from "../../../../module_basic/shared/protocols/public/arean/MsgAreanAttrUpdatePush";
import { commonFunction } from "../../../../core_tgx/base/utils/commonFunction";
const { ccclass, property } = _decorator;
@ccclass('DetailView')
export class DetailView extends Component {
@property(Node)
content_1_1: Node;
@property(Node)
heroBg: Node;
@property(Node)
content_1_2: Node;
@property(Node)
content_1_3: Node;
@property(Label)
attr_attack: Label;
@property(Label)
attr_attackSpeed: Label;
@property(Label)
attr_crit: Label;
@property(Label)
attr_spAttack: Label;
@property(Label)
attr_skillSpeed: Label;
@property(Label)
attr_buffAdd: Label;
@property(Label)
attr_defend: Label;
@property(Label)
attr_dodge: Label;
@property(Label)
attr_anger: Label;
@property(Label)
attr_spDefend: Label;
@property(Label)
attr_reflect: Label;
@property(Label)
attr_healAdd: Label;
@property(Node)
hpBar: Node;
@property(Node)
mpBar: Node;
@property(Node)
shieldBar: Node;
@property(Node)
spineNode: Node;
@property(Prefab)
attrTxt: Prefab;
@property(Sprite)
mainSkillIcon: Sprite;
@property(Label)
mainSkillName: Label;
@property(RichText)
mainSkillDesc: RichText;
@property(Sprite)
jobSkillIcon: Sprite;
@property(Label)
jobSkillName: Label;
@property(RichText)
jobSkillDesc: RichText;
@property(Button)
btnCardList: Button;
@property(Node)
equipList: Node;
@property(Node)
treasureList: Node;
curData: IBasicAttribute = null;
private _curSect: SectType = SectType.;
start() {
director.on(AreanEvent.AttrUpdate, this.updataAttrPush, this);
try {
let node = this.node.getChildByName("ToggleGroup");
let toggle: Toggle = node.getChildByName(`Toggle${3}`).getComponent(Toggle);
toggle.node.on('toggle', (target: Toggle) => {
this.updateSect();
}, this);
this._initSectBtn();
} catch (error) {
console.warn("An error occurred:", error);
}
}
public updateAttrForReport(data: iAttribute): void {
let attrId: heroAttributeType = data.type;
let value: number = data.value;
switch (attrId) {
case heroAttributeType.shields: {
this.curData.shields = value;
this.shieldBar.getComponent(ProgressBar).progress = value;
this.shieldBar.getChildByName("value").getComponent(Label).string = `${value}`;
break;
}
case heroAttributeType.hp: {
this.curData.hp = value;
this.hpBar.getComponent(ProgressBar).progress = value / this.curData.maxHp;
this.hpBar.getChildByName("value").getComponent(Label).string = `${value}/${this.curData.maxHp}`;
break;
}
case heroAttributeType.mp: {
this.curData.mp = value;
this.mpBar.getComponent(ProgressBar).progress = value / this.curData.maxMp;
this.mpBar.getChildByName("value").getComponent(Label).string = `${value}/${this.curData.maxMp}`;
break;
}
case heroAttributeType.maxHp: {
this.curData.maxHp = value;
this.hpBar.getComponent(ProgressBar).progress = this.curData.hp / value;
this.hpBar.getChildByName("value").getComponent(Label).string = `${this.curData.hp}/${value}`;
break;
}
case heroAttributeType.maxMp: {
this.curData.maxMp = value;
this.mpBar.getComponent(ProgressBar).progress = this.curData.mp / value;
this.mpBar.getChildByName("value").getComponent(Label).string = `${this.curData.mp}/${value}`;
break;
}
case heroAttributeType.attack: {
this.curData.attack = value;
this.attr_attack.string = value + "";
break;
}
case heroAttributeType.spAttack: {
this.curData.spAttack = value;
this.attr_spAttack.string = value + "";
break;
}
case heroAttributeType.skillSpeed: {
this.curData.skillSpeed = value;
this.attr_skillSpeed.string = value + "";
break;
}
case heroAttributeType.buffAdd: {
this.curData.buffAdd = value;
this.attr_buffAdd.string = value + "";
break;
}
case heroAttributeType.attackSpeed: {
this.curData.attackSpeed = value;
this.attr_attackSpeed.string = value + "";
break;
}
case heroAttributeType.dodge: {
this.curData.dodge = value;
this.attr_dodge.string = value + "";
break;
}
case heroAttributeType.anger: {
this.curData.anger = value;
this.attr_anger.string = value + "";
break;
}
case heroAttributeType.reflect: {
this.curData.reflect = value;
this.attr_reflect.string = value + "";
break;
}
case heroAttributeType.critical: {
this.curData.critical = value;
this.attr_crit.string = value + "";
break;
}
case heroAttributeType.defend: {
this.curData.defend = value;
this.attr_defend.string = value + "";
break;
}
case heroAttributeType.spDefend: {
this.curData.spDefend = value;
this.attr_spDefend.string = value + "";
break;
}
case heroAttributeType.healAdd: {
this.curData.healAdd = value;
this.attr_healAdd.string = value + "";
break;
}
default:
break;
}
this.updateAddAttr();
}
updataAttrPush(attr: IBasicAttribute) {
this.curData = AreanNetMgr.inst.playerMap[areanMgr.BattleView.getLocalPlayerData().playerId].attr;
this.updateAttr(attr);
this.updateAddAttr();
}
init(id: number) {
console.log("init id", id);
let heroData = areanMgr.cfgMgr.HeroDatas.getData(id);
let skin = areanMgr.cfgMgr.SkinData.getData(heroData.skinRes[0]).icon;
let imagePath = 'res/Spine/' + skin;
let spAsset: sp.SkeletonData = resLoader.get(imagePath, sp.SkeletonData, ModuleDef.Arean);
let ske = this.spineNode.getComponent(sp.Skeleton);
ske.skeletonData = spAsset;
//ske.setAnimation(0, "idle", true);
let skillID = heroData.mainSkill[0];
let skillData = areanMgr.cfgMgr.SkillPerformanceDatas.getData(skillID);
this.mainSkillDesc.string = CommonFun.getInstance().HighlightNumbers(skillData.effectDescribe);
this.mainSkillName.string = skillData.skillname;
this.mainSkillIcon.spriteFrame = resLoader.getSpriteFrame("res/Image/icon/" + skillData.icon, ModuleDef.Arean);
this.updataAttrPush(areanMgr.BattleView.getLocalPlayerData().attr);
}
updateCardNum() {
let cardData = AreanNetMgr.inst.playerMap[areanMgr.BattleView.getLocalPlayerId()].cardList
for (let i = 1; i <= 3; i++) {
let countNode = this.btnCardList.node.getChildByPath("cardNode_" + i + "/count");
countNode.getComponent(Label).string = CommonFun.getInstance().CalCardCount(i, cardData).toString();
}
}
// 属性面板
async updateAttr(attr: IBasicAttribute) {
if (attr) {
let attrData = AreanNetMgr.inst.playerMap[areanMgr.BattleView.getLocalPlayerData().playerId].attr;
// // 创建一个新的字典来存储差值
// let data: { [key: string]: number } = {};
// // 遍历data字典
// for (let key in attrData) {
// if (attrData.hasOwnProperty(key) && changeAdd.hasOwnProperty(key)) {
// // 计算差值并存储到新的字典中
// data[key] = attrData[key] - changeAdd[key];
// }
// }
this.attr_attack.string = attrData.attack + "";
this.attr_attackSpeed.string = attrData.attackSpeed + "";
this.attr_crit.string = attrData.critical + "";
this.attr_spAttack.string = attrData.spAttack + "";
this.attr_skillSpeed.string = attrData.skillSpeed + "";
this.attr_buffAdd.string = attrData.buffAdd + "";
this.attr_defend.string = attrData.defend + "";
this.attr_dodge.string = attrData.dodge + "";
this.attr_anger.string = attrData.anger + "";
this.attr_spDefend.string = attrData.spDefend + "";
this.attr_reflect.string = attrData.reflect + "";
this.attr_healAdd.string = attrData.healAdd + "";
this.shieldBar.getComponent(ProgressBar).progress = attrData.shields;
this.hpBar.getComponent(ProgressBar).progress = attrData.hp / attrData.maxHp;
this.mpBar.getComponent(ProgressBar).progress = attrData.mp / attrData.maxMp;
this.shieldBar.getChildByName("value").getComponent(Label).string = `${attrData.shields}`;
this.hpBar.getChildByName("value").getComponent(Label).string = `${attrData.hp}/${attrData.maxHp}`;
this.mpBar.getChildByName("value").getComponent(Label).string = `${attrData.mp}/${attrData.maxMp}`;
console.log(attr);
for (let a in attr) {
if (attr[a] != 0) {
this.AddBuff(heroAttributeType[a], attr[a], this.spineNode);
this.AddBuff(heroAttributeType[a], attr[a], areanMgr.BattleView.headIcon);
await new Promise(resolve => setTimeout(resolve, 200));
}
}
}
}
// 属性面板
updateAddAttr() {
let data = this.curData;
this.attr_attack.node.parent.getChildByName("valueAdd").getComponent(Label).string = "+" + data.attack;
this.attr_attack.node.parent.getChildByName("valueAdd").active = false;
this.attr_attackSpeed.node.parent.getChildByName("valueAdd").getComponent(Label).string = "(" + data.attackSpeed + "%)";
this.attr_attackSpeed.node.parent.getChildByName("valueAdd").active = data.attackSpeed > 0;
this.attr_crit.node.parent.getChildByName("valueAdd").getComponent(Label).string = "(" + data.critical + "%)";
this.attr_crit.node.parent.getChildByName("valueAdd").active = data.critical > 0;
this.attr_spAttack.node.parent.getChildByName("valueAdd").getComponent(Label).string = "+" + data.spAttack;
this.attr_spAttack.node.parent.getChildByName("valueAdd").active = false;
this.attr_skillSpeed.node.parent.getChildByName("valueAdd").getComponent(Label).string = "(" + data.skillSpeed + "%)";
this.attr_skillSpeed.node.parent.getChildByName("valueAdd").active = data.skillSpeed > 0;
this.attr_buffAdd.node.parent.getChildByName("valueAdd").getComponent(Label).string = "(" + data.buffAdd + "%)";
this.attr_buffAdd.node.parent.getChildByName("valueAdd").active = data.buffAdd > 0;
this.attr_defend.node.parent.getChildByName("valueAdd").getComponent(Label).string = "(" + data.defend + "%)";
this.attr_defend.node.parent.getChildByName("valueAdd").active = false;
this.attr_dodge.node.parent.getChildByName("valueAdd").getComponent(Label).string = "(" + data.dodge + "%)";
this.attr_dodge.node.parent.getChildByName("valueAdd").active = data.dodge > 0;
this.attr_anger.node.parent.getChildByName("valueAdd").getComponent(Label).string = "+" + data.anger;
this.attr_anger.node.parent.getChildByName("valueAdd").active = false;
this.attr_spDefend.node.parent.getChildByName("valueAdd").getComponent(Label).string = "(" + data.spDefend + "%)";
this.attr_spDefend.node.parent.getChildByName("valueAdd").active = false;
this.attr_reflect.node.parent.getChildByName("valueAdd").getComponent(Label).string = "(" + data.reflect * 3 + "%)";
this.attr_reflect.node.parent.getChildByName("valueAdd").active = data.reflect > 0;
this.attr_healAdd.node.parent.getChildByName("valueAdd").getComponent(Label).string = "+" + data.healAdd;
this.attr_healAdd.node.parent.getChildByName("valueAdd").active = false;
}
AddBuff(attr: heroAttributeType, value: number, spine: Node) {
if (this.attrTxt) {
let damageNode = instantiate(this.attrTxt);
spine.addChild(damageNode);
damageNode.setPosition(new Vec3(0, 40, 0));
damageNode.setScale(spine.getScale());
let duffData = areanMgr.cfgMgr.BuffDatas.getData(attr);
let text = duffData.name;
if (value > 0) {
damageNode.getComponent(Animation)?.play("buff");
damageNode.getChildByName("buff")!.getComponent(Label)!.string = text + "+" + value;
}
else if (value < 0) {
damageNode.getComponent(Animation)?.play("debuff");
damageNode.getChildByName("debuff")!.getComponent(Label)!.string = text + "-" + Math.abs(value);
}
setTimeout(() => {
damageNode.removeFromParent();
}
, 2000);
}
}
/***************************************************************** 技能部分 ***********************************************/
// 更新技能内容
updateJobDetail(careerId: number): void {
let careerData = areanMgr.cfgMgr.JobDatas.getData(careerId);
if (careerData)
this.jobSkillName.string = careerData.occupationName;
this.jobSkillDesc.string = careerData.occupationDescribe;
this.jobSkillIcon.spriteFrame = resLoader.getSpriteFrame(`res/Image/Job/${careerData.occupationIcon}`, ModuleDef.Arean)
}
/*********************** 羁绊*************************************/
private _initSectBtn(): void {
for (let i: number = 1; i <= 12; i++) {
let toggle: Toggle = this.content_1_3.getChildByPath("ScrollView/ToggleGroup").getChildByName(`Toggle${i}`).getComponent(Toggle);
let attr: { tag: SectType } = {
tag: i
}
toggle.node.attr(attr);
toggle.node.on('toggle', (target: Toggle) => {
//@ts-ignore
this._curSect = target.node.tag;
this.updateSect();
}, this);
}
}
public updateSect(): void {
const playerId = areanMgr.BattleView.getLocalPlayerId();
const sectList = AreanNetMgr.inst.playerMap[playerId].sect;
const count = CommonFun.getInstance().getSectCount(this._curSect, sectList);
const curData = CommonFun.getInstance().getSectData(this._curSect);
const node = this.content_1_3.getChildByName("descLayout");
const targetCounts = [5, 10, 20]; // 定义目标数量常量
for (let i = 0; i < curData.length; i++) {
const _node = node.getChildByName(`desc-00${i + 1}`);
const lab_1 = _node.getChildByName("Label-003").getComponent(Label);
const lab_2 = _node.getChildByName("Label-001").getComponent(Label);
lab_1.string = `${count}/${targetCounts[i]}`;
lab_2.string = curData[i].desc;
}
// 设置未达到目标数量的文本颜色为灰色
for (let i = 1; i <= 3; i++) {
const _node = node.getChildByName(`desc-00${i}`);
const lab_1 = _node.getChildByName("Label-003").getComponent(Label);
const lab_2 = _node.getChildByName("Label-001").getComponent(Label);
if (count < targetCounts[i - 1]) {
lab_1.color = new Color(150, 150, 150, 255);
lab_2.color = new Color(150, 150, 150, 255);
} else {
lab_1.color = new Color(255, 255, 255, 255);
lab_2.color = new Color(255, 255, 255, 255);
break;
}
}
}
updateEquipAndTreasure(data: IAreanPlayer) {
// 装备
let equipNode = this.equipList;
let equipData = data.equipList;
for (let i = 0; i < 4; i++) {
let node = equipNode.getChildByName(`item_${i + 1}`);
let equipId = equipData[i];
if (equipId) {
let equipLocalData = areanMgr.cfgMgr.EquipmentData.getData(equipId);
let sp: SpriteFrame = resLoader.getSpriteFrame(`res/Image/Equip/${equipLocalData.icon}`, ModuleDef.Arean);
if (sp) node.getComponent(Sprite).spriteFrame = sp;
let count = node.getChildByName("count");
count.getComponent(Label).string = "";
}
}
// 圣物
let relicNode = this.treasureList;
let relicData = data.treasureList;
for (let i = 0; i < 2; i++) {
let node = relicNode.getChildByName(`item_${i + 1}`);
let d = relicData[i];
if (d) {
let localData = areanMgr.cfgMgr.TreasureDatas.getData(d.id);
let sp: SpriteFrame = resLoader.getSpriteFrame(`res/Image/Treasure/${localData.icon}`, ModuleDef.Arean);
if (sp) node.getComponent(Sprite).spriteFrame = sp;
let count = node.getChildByName("count");
count.getComponent(Label).string = "";
}
}
}
showCardList() {
const path = 'res/Prefebs/cardList';
let sp: Prefab = resLoader.get(path, Prefab, ModuleDef.Arean);
let node = instantiate(sp);
areanMgr.BattleView.node.addChild(node);
let list = node.getChildByPath("ScrollView/view/content");
let item = list.children[0];
let cardList = AreanNetMgr.inst.playerMap[areanMgr.BattleView.getLocalPlayerId()].cardList;
const sortedCardList = cardList
.filter(card => {
const data = areanMgr.cfgMgr.CardDatas.getData(card.id);
return data.show !== 1;
})
.sort((a, b) => {
let dataA = areanMgr.cfgMgr.CardDatas.getData(a.id);
let dataB = areanMgr.cfgMgr.CardDatas.getData(b.id);
return dataB.cardRare - dataA.cardRare;
});
let cardMap = {}; // 用于跟踪已经实例化的卡牌
for (let i = 0; i < sortedCardList.length; i++) {
let cardId = sortedCardList[i];
let data = areanMgr.cfgMgr.CardDatas.getData(cardId.id);
if (data) {
if (cardMap[cardId.id]) {
// 如果已经实例化了该卡牌,更新 count 组件
let countLabel = cardMap[cardId.id].getChildByName("count").getComponent(Label);
countLabel.string = parseInt(countLabel.string) + 1;
} else {
// 如果没有实例化该卡牌,实例化一个新的卡牌
let cardItem = instantiate(item);
list.addChild(cardItem);
let sp: SpriteFrame = resLoader.getSpriteFrame("res/Image/cardRare/rare" + data.cardRare, ModuleDef.Arean);
if (sp) cardItem.getChildByName("rareBg").getComponent(Sprite).spriteFrame = sp;
sp = resLoader.getSpriteFrame("res/Image/skill/" + data.icon, ModuleDef.Arean);
if (sp) cardItem.getChildByPath("cardBg/mask/cardIcon").getComponent(Sprite).spriteFrame = sp;
cardItem.getChildByName("name").getComponent(Label).string = data.mainName;
cardItem.getChildByName("cardDesc").getComponent(RichText).string = CommonFun.getInstance().HighlightNumbers(data.skillDescribe);
cardItem.getChildByPath("types/type2").active = data.Sect.length == 2;
for (let i = 0; i < data.Sect.length; i++) {
let sp: SpriteFrame = resLoader.getSpriteFrame("res/Image/sect/sect" + data.Sect[i], ModuleDef.Arean);
if (sp) cardItem.getChildByPath("types").children[i].getChildByName("icon").getComponent(Sprite).spriteFrame = sp;
}
cardMap[cardId.id] = cardItem; // 将新实例化的卡牌添加到 cardMap 中
}
}
}
list.removeChild(item);
node.getChildByName("btnClose").on("click", () => {
node.removeFromParent();
})
}
showEquipAndTreasureList() {
const path = 'res/Prefebs/equipAndTreasureList';
let sp: Prefab = resLoader.get(path, Prefab, ModuleDef.Arean);
let node = instantiate(sp);
areanMgr.BattleView.node.addChild(node);
let list = node.getChildByPath("ScrollView/view/content");
let item = list.children[0];
let equipList = AreanNetMgr.inst.playerMap[areanMgr.BattleView.getLocalPlayerId()].equipList;
for (let i = 0; i < equipList.length; i++) {
let equipmentId = equipList[i];
let data = areanMgr.cfgMgr.EquipmentData.getData(equipmentId);
if (data) {
let equipItem = instantiate(item);
list.addChild(equipItem);
let sp: SpriteFrame = resLoader.getSpriteFrame("res/Image/Equip/" + data.icon, ModuleDef.Arean);
if (sp) equipItem.getChildByName("cardIcon").getComponent(Sprite).spriteFrame = sp;
equipItem.getChildByName("name").getComponent(Label).string = data.name;
equipItem.getChildByName("cardDesc").getComponent(RichText).string = CommonFun.getInstance().HighlightNumbers(data.describe);
}
}
let treasureList = AreanNetMgr.inst.playerMap[areanMgr.BattleView.getLocalPlayerId()].treasureList;
for (let i = 0; i < treasureList.length; i++) {
let d = treasureList[i];
let data = areanMgr.cfgMgr.TreasureDatas.getData(d.id);
if (data) {
let treasureItem = instantiate(item);
list.addChild(treasureItem);
let sp: SpriteFrame = resLoader.getSpriteFrame("res/Image/Treasure/" + data.icon, ModuleDef.Arean);
if (sp) treasureItem.getChildByName("cardIcon").getComponent(Sprite).spriteFrame = sp;
treasureItem.getChildByName("name").getComponent(Label).string = data.name;
treasureItem.getChildByName("cardDesc").getComponent(RichText).string = CommonFun.getInstance().HighlightNumbers(data.describe);
}
}
list.removeChild(item);
node.getChildByName("btnClose").on("click", () => {
node.removeFromParent();
})
}
}