Files
ZYZ/game-server/app/services/role/calCe.ts
2022-05-13 11:21:03 +08:00

1289 lines
51 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { ABI_STAGE, ABI_STAGE_TO_TYPE, ABI_TYPE_MAIN, LINEUP_NUM, SEID_TYPE, TALENT_RELATION_TYPE } from "../../consts";
import { Connect, EPlace, HeroSkin, HeroType, HeroUpdate, Stone, Talent } from "../../db/Hero";
import { JewelType } from "../../db/Jewel";
import { RoleUpdate, Teraph } from "../../db/Role";
import { AttrCell, Attribute, EquipAttr, HeroAttr, RoleCeType, SchoolAttr, ScrollAttr } from "../../db/RoleCe";
import { TopHero } from "../../domain/dbGeneral";
import { AttributeCal } from "../../domain/roleField/attribute";
import { gameData, getEquipQualityIdByEquipIdAndPoint, getEquipStarAttrByStage, getEquipStrenthenAttr, getEquipSuitByHero, getFriendShipById, getHeroStarByQuality, getHeroWakeByQuality, getJewelConditionByLvAndSeId, getJobByGradeAndClass, getSchoolRateByStar, getScollByStar, getTeraph } from "../../pubUtils/data";
import { DicRandomEffectPool } from "../../pubUtils/dictionary/DicRandomEffectPool";
import { DicSe } from "../../pubUtils/dictionary/DicSe";
import { addToMap, deepCopy } from "../../pubUtils/util";
export class CalCe {
roleId: string;
originCes: Map<number, number> = new Map(); // hid => ce
resultCes: Map<number, number> = new Map(); // hid => ce
data: CalCeData;
attrsByHid: Map<number, { id: number, val: number, str: string }[]> = new Map();
constructor(roleId: string) {
this.roleId = roleId;
}
public setRoleCe(roleCe: RoleCeType) {
this.data = new CalCeData(roleCe)
this.originCes = this.calHeroCe();
}
public getRoleCeTable() {
let attributes: Attribute[] = [];
for(let [hid, attrs] of this.attrsByHid) {
attributes.push({ hid, attrs })
}
return this.data.getRoleCeTable(this.roleId, attributes);
}
public calHeroCe() {
let attrs = new Map<number, { id: number, val: number, str: string }[]>(); // hid => [{attrId, val}]
for(let [hid, keys] of this.data.heroAttrsByHid) {
let lv = this.data.heroLv.get(hid)||1;
for(let key of keys) {
let { attrId, mainBase = 0, subBase = 0, job = 0, starUp = 0, connect = 0, favour = 0, talent = 0, equipQuality = 0, equipStrength = 0, equipStar = 0, equipSuit = 0, jewel = 0, stone = 0 } = this.data.heroAttrs.get(key);
let { school = 0, teraph = 0, title = 0, scroll = 0, skin = 0 } = this.data.getGlobalAttrById(attrId);
let val = 0, str = '';
if(ABI_TYPE_MAIN.indexOf(attrId) != -1) {
// {[hp1 + lv * hp2 + hp3 * ( 1 + hp4 )] * (1 + hp5 ) + [( hp6 + hp7 ) * ( 1 + hp8 )] } * ( 1 + hp9 ) + hp10 + hp11
val = ((mainBase + job + lv * starUp + connect * ( 1 + favour/100 )) * ( 1 + school + talent/100 ) + (( equipQuality + equipStrength ) * ( 1 + ( equipStar/100 + equipSuit/100 ))) ) * ( 1 + jewel/100 ) + stone + teraph + title + scroll + skin;
str += `{[${mainBase}+${job}+${lv}*${starUp}+${connect}*(1+${favour}/100)]*(1+${school}+${talent}/100)+[(${equipQuality}+${equipStrength})*(1+${equipStar}/100+${equipSuit}/100)]}*(1+${jewel}/100)+${stone}+${teraph}+${title}+${scroll}+${skin}`;
} else {
// attr1 + attr2 + attr3 + attr4 + attr5 + attr6 + attr7 + attr8 + attr9
val = subBase + job + talent + teraph + school + title + jewel + skin + equipStar;
str += `${subBase}+${job}+${talent}+${teraph}+${school}+${title}+${jewel}+${skin}+${equipStar}`;
}
if(!attrs.has(hid)) attrs.set(hid, []);
attrs.get(hid).push({ id: attrId, val, str });
}
}
let result = new Map<number, number>();
for(let [hid, arr] of attrs) {
let lv = this.data.heroLv.get(hid)||1;
let obj = new AttributeCal();
obj.setLv(lv);
obj.setByWarJson(arr);
let ce = obj.calCe();
this.resultCes.set(hid, ce);
result.set(hid, ce);
this.attrsByHid.set(hid, arr);
}
return result;
}
public getCeInc() {
let ceResult = this.calHeroCe();
console.log('##### ceResult', ceResult, 'originCes', this.originCes)
let heroCe = new Map<number, { inc: number, origin: number, ce: number }>();
let roleInc = 0;
for(let [hid, ce] of ceResult) {
let originCe = this.originCes.get(hid)||0;
if(ce != originCe) {
heroCe.set(hid, { inc: ce - originCe, origin: originCe, ce });
roleInc += ce - originCe;
this.data.setHistoryCe(hid, ce);
}
}
return { heroCe, roleInc }
}
public setResultHero(hero: HeroType) {
this.data.setResultHero(hero);
}
public getResultCeArr() {
let arr: { hid: number, ce: number }[] = [];
for(let [ hid, ce ] of this.resultCes) {
arr.push({ hid, ce });
}
arr.sort((a, b) => b.ce - a.ce);
return arr;
}
public getTopLineup() {
let topLineup: TopHero[] = [], topLineupCe = 0;
let arr = this.getResultCeArr();
for(let i = 0; i < LINEUP_NUM; i++) {
if(arr[i]) {
let { hid, ce } = arr[i];
topLineup.push({
hid, ce, hero: this.data.heroObjectId.get(hid)
});
topLineupCe += ce;
}
}
return { topLineup, topLineupCe };
}
// 玩家等级
public setRoleLv(lv: number) {
this.data.roleLv = lv;
}
// 武将基础&成长
public setHeroBase(hid: number, skinId: number) {
this.data.clearHeroAttrByHid(hid, 'mainBase');
let dicHero = gameData.hero.get(skinId);
for(let [attrId, value] of dicHero.baseAbilityArr) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
heroAttr.mainBase = value;
}
}
// 武将等级
public setHeroLv(hid: number, lv: number) {
this.data.heroLv.set(hid, lv);
}
// 星级相关
public setHeroStar(hid: number, job: number, quality: number, star: number, starStage: number, colorStar: number, colorStarStage: number) {
this.data.clearHeroAttrByHid(hid, 'starUp');
let dicHero = gameData.hero.get(hid);
let dicJob = gameData.job.get(job);
let jobClass = dicJob.job_class;
const isWake = colorStar > 0; // 是否觉醒,只要激活了觉醒,彩星就会 > 1
const dicStar = isWake ? getHeroWakeByQuality(jobClass, dicHero.quality, colorStar) : getHeroStarByQuality(jobClass, quality, star); // 星级表
const dicPreStar = isWake? getHeroWakeByQuality(jobClass, dicHero.quality, colorStar - 1): getHeroStarByQuality(jobClass, quality, star - 1);
let curStage = isWake? colorStarStage: starStage;
for (let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) {
let attrId = ABI_STAGE_TO_TYPE.get(stage);
let value = 0; // 星级成长
if(curStage >= stage) {
value = dicStar?.ceAttr.get(stage)||0;
} else {
value = dicPreStar?.ceAttr.get(stage)||0;
}
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
heroAttr.starUp = value;
};
}
// 职业基础
public setJob(hid: number, job: number, jobStage: number) {
this.data.clearHeroAttrByHid(hid, 'job');
this.data.clearHeroAttrByHid(hid, 'subBase');
const dicJob = gameData.job.get(job);
let lastJob = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1);
let dicLastJob = lastJob? gameData.job.get(lastJob.jobid): null;
for(let i = 1; i <= (dicJob.maxStage||dicLastJob.maxStage); i++) {
if(jobStage >= i) {
let { id, attr } = dicJob.ceAttr.get(i);
let heroAttr = this.data.getHeroAttrByHidAndId(hid, id);
heroAttr.job = attr;
} else {
if(dicLastJob) {
let { id, attr } = dicLastJob.ceAttr.get(i);
let heroAttr = this.data.getHeroAttrByHidAndId(hid, id);
heroAttr.job = attr;
}
}
}
for(let { id, val } of dicJob.baseSubAttr) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, id);
heroAttr.subBase = val;
}
}
// 好感度
public setFavour(hid: number, favourLv: number, connections: Connect[]) {
this.data.clearHeroAttrByHid(hid, 'favour');
let currentFiendShipLevel = gameData.friendShipLevelMap.get(favourLv);
let add = currentFiendShipLevel.add;
for (let {shipId, level} of connections) {
let dicHeroFriendShip = getFriendShipById(shipId, level);
for (let { id } of dicHeroFriendShip.attributes) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, id);
heroAttr.favour = add;
}
}
}
// 羁绊
public setConnection(hid: number, connections: Connect[]) {
this.data.clearHeroAttrByHid(hid, 'connect');
let map = new Map<number, number>(); // attrId => val;
for(let { shipId, level = 0 } of connections) {
let currentShip = getFriendShipById(shipId, level);
if (currentShip) {
for (let { id, number: val } of currentShip.attributes) {
if(!map.has(id)) {
map.set(id, val);
} else {
map.set(id, map.get(id) + val);
}
}
}
}
for(let [id, val] of map) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, id);
heroAttr.connect = val;
}
}
// 第一次获得皮肤
public setAddSkin(skinId: number) {
let addSkin = gameData.fashion.get(skinId);
for (let { id, number: val } of addSkin.globalAttr) {
let globalAttr = this.data.getGlobalAttrById(id);
globalAttr.skin += val;
}
}
// 天赋
public setTalent(hid: number, skins: HeroSkin[]) {
this.data.clearHeroAttrByHid(hid, 'talent');
let skin = skins.find(cur => cur.enable);
let seids = this.getTalentSeid(skin.talent);
let { ratioUp } = this.addSeidEffect(seids);
for(let [attrId, val] of ratioUp) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
heroAttr.talent = val;
}
}
public getTalentSeid(talent: Talent[]) {
let seids = new Map<number, number[]>(); // id, seids
for(let { id, level } of talent) {
let dicHeroTalent = gameData.heroTalent.get(id);
for(let { type, ids} of dicHeroTalent.relation) {
if(type == TALENT_RELATION_TYPE.REPLACE) {
for(let id of ids) {
seids.delete(id);
}
}
}
for(let { lv, seid } of dicHeroTalent.level) {
if(level >= lv) {
if(!seids.has(id)) seids.set(id, []);
seids.get(id).push(seid, 0);
}
}
}
let result: number[] = [];
for(let [_, ids] of seids) {
result.push(...ids);
}
return result;
}
// 装备升品
public setEquipQuality(hid: number, eplaceId: number, equipId: number, quality: number, qualityStage: number) {
this.data.clearHeroAttrByHid(hid, 'equipQuality');
this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipQuality');
let dicEquipQuality = getEquipQualityIdByEquipIdAndPoint(equipId, quality, qualityStage);
let map = new Map<number, number>(); // attrId => val
for(let { id, num } of dicEquipQuality.attribute) {
if(!map.has(id)) {
map.set(id, num);
} else {
map.set(id, map.get(id) + num);
}
}
for(let [id, val] of map) {
let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id);
equipAttr.equipQuality = val;
}
let equips = this.data.getEquipAttrsByHid(hid);
for(let { hid, attrId, equipQuality } of equips) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
heroAttr.equipQuality = equipQuality;
}
}
// 装备强化
public setEquipStrength(hid: number, eplaceId: number, equipId: number, lv: number) {
this.data.clearHeroAttrByHid(hid, 'equipStrengthen');
this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipStrengthen');
let dicEquipStrenth = getEquipStrenthenAttr(equipId, lv);
let map = new Map<number, number>(); // attrId => val
for(let { id, num } of dicEquipStrenth.attr) {
if(!map.has(id)) {
map.set(id, num);
} else {
map.set(id, map.get(id) + num);
}
}
for(let [id, val] of map) {
let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id);
equipAttr.equipStrengthen = val;
}
let equips = this.data.getEquipAttrsByHid(hid);
for(let { hid, attrId, equipStrengthen } of equips) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
heroAttr.equipStrength = equipStrengthen;
}
}
// 装备精炼(升星)
public setEquipStar(hid: number, eplaceId: number, equipId: number, star: number, starStage: number) {
this.data.clearHeroAttrByHid(hid, 'equipStar');
this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipStar');
let dicEquipStar = getEquipStarAttrByStage(equipId, star, starStage);
if(dicEquipStar) {
let { mainAttr, subAttr } = dicEquipStar;
let map = new Map<number, number>(); // attrId => val
for(let { id, num } of [...mainAttr, ...subAttr]) {
if(!map.has(id)) {
map.set(id, num);
} else {
map.set(id, map.get(id) + num);
}
}
for(let [id, val] of map) {
let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id);
equipAttr.equipStar = val;
}
let equips = this.data.getEquipAttrsByHid(hid);
for(let { hid, attrId, equipStar } of equips) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
heroAttr.equipStar = equipStar;
}
}
}
// 装备套装
public setEquipSuit(hid: number, ePlace: EPlace[]) {
this.data.clearHeroAttrByHid(hid, 'equipSuit');
let dicEquipSuit = getEquipSuitByHero(hid);
let suitStars: number[] = [];
for(let equipId of dicEquipSuit.equips) {
let equip = ePlace.find(cur => cur.equipId == equipId);
suitStars.push(equip? equip.star: 0);
}
let minStar = Math.min(...suitStars);
for(let { star, id, val } of dicEquipSuit.effect) {
if(minStar >= star) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, id);
heroAttr.equipSuit = val;
}
}
}
// 天晶
public setJewel(hid: number, eplaceId: number, stones: Stone[], jewel: JewelType) {
this.data.clearHeroAttrByHid(hid, 'jewel');
this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'jewel');
let seids: number[] = [];
if(jewel) {
for(let { id, seid, rand } of jewel.randSe) {
if(this.isRandSeUnLock(jewel.id, id, stones)) {
seids.push(seid, rand);
}
}
}
let { ratioUp } = this.addSeidEffect(seids);
let map = new Map<number, number>(); // attrId => val
for(let [id, num] of ratioUp) {
if(!map.has(id)) {
map.set(id, num);
} else {
map.set(id, map.get(id) + num);
}
}
for(let [id, val] of map) {
let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id);
equipAttr.jewel = val;
}
let equips = this.data.getEquipAttrsByHid(hid);
for(let { hid, attrId, jewel } of equips) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
heroAttr.jewel = jewel;
}
}
public isRandSeUnLock(jewelId: number, randSeId: number, stones: Stone[]) {
let dicJewel = gameData.jewel.get(jewelId);
let dicJewelCondition = getJewelConditionByLvAndSeId(dicJewel.lv, randSeId);
let stoneCnt = 0, stoneLv = 0;
for(let { stone } of stones) {
let dicStone = gameData.stone.get(stone);
if(dicStone) {
stoneCnt++;
stoneLv += dicStone.lv;
}
}
return stoneCnt >= dicJewelCondition.stoneCnt && stoneLv >= dicJewelCondition.stoneLv;
}
// 地玉
public setStone(hid: number, eplaceId: number, stones: Stone[]) {
this.data.clearHeroAttrByHid(hid, 'stone');
this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'stone');
let map = new Map<number, number>(); // attrId => val
for(let { stone } of stones) {
let dicStone = gameData.stone.get(stone);
if(dicStone) {
for(let { id, num } of dicStone.attribute) {
if(!map.has(id)) {
map.set(id, num);
} else {
map.set(id, map.get(id) + num);
}
}
}
}
for(let [id, val] of map) {
let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id);
equipAttr.stone = val;
}
let equips = this.data.getEquipAttrsByHid(hid);
for(let { hid, attrId, stone } of equips) {
let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId);
heroAttr.stone = stone;
}
}
// 爵位
public setTitle(title: number) {
this.data.clearRoleAttr('title');
let dicTitle = gameData.title.get(title)||{ mainAttrValue: new Map(), assiAttrValue: new Map() };
for(let [attrId, value] of dicTitle.mainAttrValue) {
let globalAttr = this.data.getGlobalAttrById(attrId);
globalAttr.title = value;
}
for(let [attrId, value] of dicTitle.assiAttrValue) {
let globalAttr = this.data.getGlobalAttrById(attrId);
globalAttr.title = value;
}
}
// 神像相关
public setTeraph(teraphs: Teraph[]) {
this.data.clearRoleAttr('teraph');
let teraphOfAttrId = new Map<number, number>();
for(let teraph of teraphs) {
let dicTeraph = getTeraph(teraph.id, teraph.grade);
for(let [attrId, value] of teraph.attr) { // 主属性
let basic = dicTeraph.basicAttrValue.get(attrId)||0;
addToMap(teraphOfAttrId, attrId, value + basic);
}
for(let [attrId, value] of dicTeraph.assiAttrValue) { // 次属性
addToMap(teraphOfAttrId, attrId, value);
}
}
for(let [attrId, value] of teraphOfAttrId) {
let globalAttr = this.data.getGlobalAttrById(attrId);
globalAttr.teraph = value;
}
}
// 名将谱
public setScroll(hid: number, scrollStar: number, scrollQuality: number, scrollColorStar: number) {
this.data.clearScrollAttr(hid);
let dicHero =gameData.hero.get(hid);
let dicHeroScroll = getScollByStar(dicHero.quality, scrollStar, scrollQuality, scrollColorStar);
if(dicHeroScroll) {
for(let [attrId, value] of dicHeroScroll.ceAttr) {
this.data.setScrollAttrs(hid, attrId, value);
this.data.calScrollAttrsToGlobal(attrId);
}
}
}
// 百家学宫
public setSchool(isPutOn: boolean, hid: number, schoolId: number, star: number, colorStar: number, quality: number) {
this.data.clearSchoolAttr(hid);
let dicSchool = gameData.school.get(schoolId);
let dicSchoolRate = getSchoolRateByStar(star, colorStar, quality);
for (let attrId of dicSchool.upAttribute) {
if(ABI_TYPE_MAIN.includes(attrId)) { // 主属性
this.data.setSchoolAttrs(hid, attrId, isPutOn?dicSchoolRate.mainAttrAPerent: 0);
} else {
this.data.setSchoolAttrs(hid, attrId, isPutOn?dicSchoolRate.assiAttrAddValue: 0);
}
this.data.calSchoolAttrsToGlobal(attrId);
}
}
// 添加技能增加的被动属性
private addSeidEffect(seidList: number[]) {
let fixUp = new Map<number, number>(), ratioUp = new Map<number, number>();
let effectList: DicSe[] = []; // any: dic_zyz_se表内容
for (let ii = 0; ii < seidList.length; ii += 2) {
let seid = seidList[ii];
let rand = seidList[ii + 1] || 0;
let dicSeid: DicSe | DicRandomEffectPool = gameData.se.get(seid);
if (!dicSeid) dicSeid = gameData.randomEffectPool.get(seid);
if (dicSeid && dicSeid.id > 0) {
this.addSeid(effectList, dicSeid.id, rand, dicSeid.gainValueArr)
}
}
// console.log('effectList', JSON.stringify(effectList));
for (let { type, id, gainValueArr: [ability, value] } of effectList) {
// console.log('##### addToMap type', type, 'id', id, 'ability', ability, 'value', value)
if (type == SEID_TYPE.FIX) { // 加值
addToMap(fixUp, ability, value);
} else if (type == SEID_TYPE.MAIN_RATIO||type == SEID_TYPE.MAIN_RATIO_2) { // 主属性加百分比
if(ABI_TYPE_MAIN.includes(ability)) {
addToMap(ratioUp, ability, value);
}
} else if (type == SEID_TYPE.SUB_RATIO||type == SEID_TYPE.SUB_RATIO_2) { // 次级属性加百分比
if(!ABI_TYPE_MAIN.includes(ability)) {
addToMap(ratioUp, ability, value);
}
}
}
return { fixUp, ratioUp };
}
// 获取dic_zyz_se内容
private addSeid(effectList: (DicSe | DicRandomEffectPool)[], seidId: number, rand: number, seidValue: number[] = []) {
let curSeid: DicSe | DicRandomEffectPool = gameData.se.get(seidId);
if (!curSeid) curSeid = gameData.randomEffectPool.get(seidId);
if (!curSeid) { console.log("seidId not found:" + seidId); return; }
if (!seidValue) seidValue = curSeid.gainValueArr;
if (curSeid.type === SEID_TYPE.MIX) {
for (let i = 0; i < seidValue.length; i++) {
this.addSeid(effectList, seidValue[i], rand);
}
return;
}
let seid: DicSe | DicRandomEffectPool = deepCopy(curSeid);
if (curSeid.index > 0) {
seid.gainValueArr[curSeid.index - 1] = rand;
}
effectList.push(seid);
}
}
class CalCeData {
roleLv: number = 1; // 玩家等级
// 全局
globalAttrs: Map<number, GlobalMainAttr|GlobalSubAttr> = new Map(); // attrId => GlobalAttr
// 武将
heroAttrs: Map<string, HeroMainAttr|HeroSubAttr> = new Map(); // hid+attrId => HeroAttr
heroAttrsByHid: Map<number, string[]> = new Map(); // hid => [hid+attrId]
heroLv: Map<number, number> = new Map();
heroHistoryCe: Map<number, number> = new Map();
heroObjectId: Map<number, string> = new Map();
// 装备
equipAttrs: Map<string, EquipMainAttr|EquipSubAttr> = new Map(); // hid+eplaceId+attrId => EquipAttr
equipAttrsByHid: Map<number, string[]> = new Map(); // hid => [hid+eplaceId+attrId]
equipAttrsByHidAndEplace: Map<string, { hid: number, eplaceId: number, keys: string[]}> = new Map(); // hid+eplaceId =>[hid+eplaceId+attrId]
equipAttrsByHidAndAttrId: Map<string, { hid: number, attrId: number, keys: string[]}> = new Map(); // hid+attrId =>[hid+eplaceId+attrId]
equipLv: Map<string, number> = new Map(); // hid+eplaceId => lv
// 百家学宫
schoolAttrs: Map<string, { hid: number, attrId: number, ce: number }> = new Map(); // hid + attr => ratio
schoolAttrsByAttrId: Map<number, string[]> = new Map(); // attrId => hid + attr
schoolAttrsByHid: Map<number, string[]> = new Map(); // hid => hid + attr
// 名将谱
scrollAttrs: Map<string, { hid: number, attrId: number, ce: number }> = new Map(); // hid + attr => ratio
scrollAttrsByAttrId: Map<number, string[]> = new Map(); // attrId => hid + attr
scrollAttrsByHid: Map<number, string[]> = new Map(); // hid => hid + attr
constructor(roleCe: RoleCeType) {
if(roleCe) {
this.roleLv = roleCe.roleLv;
for(let globalAttr of roleCe.globalAttrs) {
let obj = this.getGlobalAttrById(globalAttr.attrId);
obj.setByRoleCe(globalAttr);
}
for(let {hid, lv, attrs, historyCe, objectId } of roleCe.heroAttrs) {
this.heroLv.set(hid, lv);
this.heroHistoryCe.set(hid, historyCe);
this.heroObjectId.set(hid, objectId);
for(let cell of attrs) {
let obj = this.getHeroAttrByHidAndId(hid, cell.attrId);
obj.setByRoleCe(cell);
}
}
for(let { hid, eplaceId, lv, attrs } of roleCe.equipAttrs) {
this.equipLv.set(`${hid}_${eplaceId}`, lv);
for(let cell of attrs) {
let obj = this.getEquipAttrByHidAndId(hid, eplaceId, cell.attrId);
obj.setByRoleCe(cell);
}
}
for(let { hid, attrId, value } of roleCe.schoolAttrs) {
this.setSchoolAttrs(hid, attrId, value);
}
for(let { hid, attrId, value } of roleCe.scrollAttrs) {
this.setScrollAttrs(hid, attrId, value);
}
}
}
public getGlobalAttrById(attrId: number) {
if(!this.globalAttrs.has(attrId)) {
if(ABI_TYPE_MAIN.indexOf(attrId) != -1) {
let obj = new GlobalMainAttr(attrId);
this.globalAttrs.set(attrId, obj);
} else {
let obj = new GlobalSubAttr(attrId);
this.globalAttrs.set(attrId, obj);
}
}
return this.globalAttrs.get(attrId);
}
public clearRoleAttr(field: string) {
for(let globalAttr of this.globalAttrs) {
globalAttr[field] = 0;
}
}
public getHeroAttrsByHid(hid: number) {
let keys = this.heroAttrsByHid.get(hid)||[];
return keys.map(key => this.heroAttrs.get(key));
}
public getHeroAttrByHidAndId(hid: number, attrId: number) {
let key = `${hid}_${attrId}`;
if(!this.heroAttrs.has(key)) {
if(ABI_TYPE_MAIN.indexOf(attrId) != -1) {
let obj = new HeroMainAttr(hid, attrId);
this.heroAttrs.set(key, obj);
} else {
let obj = new HeroSubAttr(hid, attrId);
this.heroAttrs.set(key, obj);
}
if(!this.heroAttrsByHid.has(hid)) {
this.heroAttrsByHid.set(hid, []);
}
this.heroAttrsByHid.get(hid).push(key);
}
return this.heroAttrs.get(key);
}
public clearHeroAttrByHid(hid: number, field: string) {
let heroAttrs = this.getHeroAttrsByHid(hid)||[];
for(let heroAttr of heroAttrs) {
heroAttr[field] = 0;
}
}
public getEquipAttrByHidAndId(hid: number, eplaceId: number, attrId: number) {
let key = `${hid}_${eplaceId}_${attrId}`;
if(!this.equipAttrs.has(key)) {
if(ABI_TYPE_MAIN.indexOf(attrId) != -1) {
let obj = new EquipMainAttr(hid, attrId);
this.equipAttrs.set(key, obj);
} else {
let obj = new EquipSubAttr(hid, attrId);
this.equipAttrs.set(key, obj);
}
if(!this.equipAttrsByHid.has(hid)) {
this.equipAttrsByHid.set(hid, []);
}
this.equipAttrsByHid.get(hid).push(key);
let key2 = `${hid}_${eplaceId}`;
if(!this.equipAttrsByHidAndEplace.has(key2)) {
this.equipAttrsByHidAndEplace.set(key2, { hid, eplaceId, keys: []});
}
this.equipAttrsByHidAndEplace.get(key2).keys.push(key);
}
return this.equipAttrs.get(key);
}
public getEquipAttrsByHid(hid: number) {
let keys = this.equipAttrsByHid.get(hid);
return keys.map(key => this.equipAttrs.get(key));
}
public getEquipAttrsByHidAndEplace(hid: number, eplaceId: number) {
let key2 = `${hid}_${eplaceId}`;
if(!this.equipAttrsByHidAndEplace.has(key2)) return []
let { keys } = this.equipAttrsByHidAndEplace.get(key2);
return keys.map(key => this.equipAttrs.get(key));
}
public clearEquipAttrByHidAndEplace(hid: number, eplaceId: number, field: string) {
let equipAttrs = this.getEquipAttrsByHidAndEplace(hid, eplaceId);
for(let equipAttr of equipAttrs) {
let originNum = equipAttr[field]||0;
let heroAttr = this.getHeroAttrByHidAndId(hid, equipAttr.attrId);
if(heroAttr && heroAttr[field]) {
heroAttr[field] -= originNum;
}
equipAttr[field] = 0;
}
}
public setSchoolAttrs(hid: number, attrId: number, value: number) {
let key = `${hid}_${attrId}`;
if(!this.schoolAttrs.has(key)) {
this.schoolAttrs.set(key, { hid, attrId, ce: value });
if(!this.schoolAttrsByAttrId.has(attrId)) {
this.schoolAttrsByAttrId.set(attrId, []);
}
this.schoolAttrsByAttrId.get(attrId).push(key);
if(!this.schoolAttrsByHid.has(hid)) {
this.schoolAttrsByHid.set(hid, []);
}
this.schoolAttrsByHid.get(hid).push(key);
} else {
this.schoolAttrs.get(key).ce = value;
}
}
public getSchoolAttrsByHid(hid: number) {
let keys = this.schoolAttrsByHid.get(hid)||[];
return keys.map(key => this.schoolAttrs.get(key));
}
public calSchoolAttrsToGlobal(attrId: number) {
let keys = this.schoolAttrsByAttrId.get(attrId)||[];
let schoolResult = 0;
for(let key of keys) {
let { ce } = this.schoolAttrs.get(key);
schoolResult += ce;
}
let globalAttr = this.getGlobalAttrById(attrId);
globalAttr.school = schoolResult;
}
public clearSchoolAttr(hid: number) {
let schoolAttrs = this.getSchoolAttrsByHid(hid)||[];
for(let schoolAttr of schoolAttrs) {
schoolAttr.ce = 0;
this.calSchoolAttrsToGlobal(schoolAttr.attrId);
}
}
public setScrollAttrs(hid: number, attrId: number, value: number) {
let key = `${hid}_${attrId}`;
if(!this.scrollAttrs.has(key)) {
this.scrollAttrs.set(key, { hid, attrId, ce: value });
if(!this.scrollAttrsByAttrId.has(attrId)) {
this.scrollAttrsByAttrId.set(attrId, []);
}
this.scrollAttrsByAttrId.get(attrId).push(key);
if(!this.scrollAttrsByHid.has(hid)) {
this.scrollAttrsByHid.set(hid, []);
}
this.scrollAttrsByHid.get(hid).push(key);
} else {
this.scrollAttrs.get(key).ce = value;
}
}
public calScrollAttrsToGlobal(attrId: number) {
let keys = this.scrollAttrsByAttrId.get(attrId)||[];
let result = 0;
for(let key of keys) {
let { ce } = this.scrollAttrs.get(key);
result += ce;
}
let globalAttr = this.getGlobalAttrById(attrId);
globalAttr.scroll = result;
}
public clearScrollAttr(hid: number) {
let scrollAttrs = this.getScrollAttrsByHid(hid);
for(let scrollAttr of scrollAttrs) {
scrollAttr.ce = 0;
this.calScrollAttrsToGlobal(scrollAttr.attrId);
}
}
public getScrollAttrsByHid(hid: number) {
let keys = this.scrollAttrsByHid.get(hid)||[];
return keys.map(key => this.scrollAttrs.get(key));
}
public setHistoryCe(hid: number, ce: number) {
let historyCe = this.heroHistoryCe.get(hid)||0;
if(ce > historyCe) {
this.heroHistoryCe.set(hid, ce);
}
}
public setResultHero(hero: HeroType) {
this.heroObjectId.set(hero.hid, hero._id);
}
public getRoleCeTable(roleId: string, attributes: Attribute[]) {
let globalAttrs: AttrCell[] = [];
for(let [_, globalAttr] of this.globalAttrs) {
globalAttrs.push(globalAttr.getGlobalAttr());
}
let heroAttrs: HeroAttr[] = [];
for(let [hid, keys] of this.heroAttrsByHid) {
let lv = this.heroLv.get(hid);
let historyCe = this.heroHistoryCe.get(hid)||0;
let objectId = this.heroObjectId.get(hid);
let attrs: AttrCell[] = [];
for(let key of keys) {
let heroAttr = this.heroAttrs.get(key);
attrs.push(heroAttr.getHeroAttrCell());
}
heroAttrs.push({
hid, lv, attrs, historyCe, objectId
});
}
let equipAttrs: EquipAttr[] = [];
for(let [key2, { hid, eplaceId, keys }] of this.equipAttrsByHidAndEplace) {
let lv = this.equipLv.get(key2);
let attrs: AttrCell[] = [];
for(let key of keys) {
let equipAttr = this.equipAttrs.get(key);
attrs.push(equipAttr.getEquipAttrCell());
}
equipAttrs.push({
hid, eplaceId, lv, attrs
});
}
let schoolAttrs: SchoolAttr[] = [];
for(let [_, { hid, attrId, ce }] of this.schoolAttrs) {
schoolAttrs.push({ hid, attrId, value: ce });
}
let scrollAttrs: ScrollAttr[] = [];
for(let [_, { hid, attrId, ce }] of this.scrollAttrs) {
scrollAttrs.push({ hid, attrId, value: ce });
}
return {
roleLv: this.roleLv, roleId, globalAttrs, heroAttrs, equipAttrs, schoolAttrs, scrollAttrs, attributes
}
}
}
abstract class GlobalAllAttr {
attrId: number;
school: number = 0;
teraph: number = 0;
title: number = 0;
scroll: number = 0;
skin: number = 0;
constructor(attrId: number) {
this.attrId = attrId;
}
abstract setByRoleCe(data: AttrCell): void;
abstract getValues(): number[];
public getGlobalAttr() {
let values = this.getValues().map(cur => (cur||0));
return {
attrId: this.attrId,
values
}
}
}
class GlobalMainAttr extends GlobalAllAttr {
public setByRoleCe(globalAttr: AttrCell) {
for(let i = 0; i < globalAttr.values.length; i++) {
let value = globalAttr.values[i];
if(value != undefined) {
switch(i) {
case GLOBAL_MAIN_ATTR_INDEX.SCHOOL:
this.school = value; break;
case GLOBAL_MAIN_ATTR_INDEX.TERAPH:
this.teraph = value; break;
case GLOBAL_MAIN_ATTR_INDEX.TITLE:
this.title = value; break;
case GLOBAL_MAIN_ATTR_INDEX.SCROLL:
this.scroll = value; break;
case GLOBAL_MAIN_ATTR_INDEX.SKIN:
this.skin = value; break;
}
}
}
}
public getValues() {
let values: number[] = [];
for(let i = GLOBAL_MAIN_ATTR_INDEX.START; i < GLOBAL_MAIN_ATTR_INDEX.END; i++) {
switch(i) {
case GLOBAL_MAIN_ATTR_INDEX.SCHOOL:
values.push(this.school);
break;
case GLOBAL_MAIN_ATTR_INDEX.TERAPH:
values.push(this.teraph);
break;
case GLOBAL_MAIN_ATTR_INDEX.TITLE:
values.push(this.title);
break;
case GLOBAL_MAIN_ATTR_INDEX.SCROLL:
values.push(this.scroll);
break;
case GLOBAL_MAIN_ATTR_INDEX.SKIN:
values.push(this.skin);
break;
}
}
return values;
}
}
class GlobalSubAttr extends GlobalAllAttr {
public setByRoleCe(globalAttr: AttrCell) {
for(let i = 0; i < globalAttr.values.length; i++) {
let value = globalAttr.values[i];
if(value != undefined) {
switch(i) {
case GLOBAL_SUB_ATTR_INDEX.SCHOOL:
this.school = value; break;
case GLOBAL_MAIN_ATTR_INDEX.TERAPH:
this.teraph = value; break;
case GLOBAL_MAIN_ATTR_INDEX.TITLE:
this.title = value; break;
case GLOBAL_MAIN_ATTR_INDEX.SKIN:
this.skin = value; break;
}
}
}
}
public getValues() {
let values: number[] = [];
for(let i = GLOBAL_MAIN_ATTR_INDEX.START; i < GLOBAL_MAIN_ATTR_INDEX.END; i++) {
switch(i) {
case GLOBAL_MAIN_ATTR_INDEX.SCHOOL:
values.push(this.school);
break;
case GLOBAL_MAIN_ATTR_INDEX.TERAPH:
values.push(this.teraph);
break;
case GLOBAL_MAIN_ATTR_INDEX.TITLE:
values.push(this.title);
break;
case GLOBAL_MAIN_ATTR_INDEX.SKIN:
values.push(this.skin);
break;
}
}
return values;
}
}
abstract class HeroAllAttr {
hid: number;
attrId: number;
mainBase: number = 0; // hp1武将基础属性dic_zyz_hero的hp
subBase: number = 0; // attr1职业基础dic_zyz_job的baseSubAttr字段
job: number = 0; // hp1 & attr2, 职业属性(dic_zyz_job的attr)
starUp: number = 0; // hp2, 角色升星成长(dic_zyz_hero_star的hp或dic_zyz_hero_wake的hp)
connect: number = 0; // hp3, 角色羁绊固定值(dic_zyz_friend_ship的attribute)
favour: number = 0; // hp4, 声望加成(dic_zyz_friend_ship_level的add)
talent: number = 0; // hp5 & attr3, 天赋树百分比加成(dic_zyz_hero_talent的levelSeid然后对应到dic_zyz_se)
equipQuality: number = 0; // hp6, 装备品质基础值(dic_zyz_equipQuality的attribute)
equipStrength: number = 0; // hp7, 装备强化值(dic_zyz_equipStrenthAttr的attr)
equipStar: number = 0; // hp8 & attr9装备升星(dic_zyz_equipStar的mainAttr和subAttr)
equipSuit: number = 0; // hp8套装(dic_zyz_equipSuit的effect然后对应dic_zyz_se)
jewel: number = 0; // hp9 & attr7天晶随机属性值(jewel的ranSe对应dic_zyz_randomEffectPool)
stone: number = 0; // hp10, 地玉增加的固定值(dic_zyz_stone的attribute)
constructor(hid: number, attrId: number, ) {
this.hid = hid;
this.attrId = attrId;
}
abstract setByRoleCe(data: AttrCell): void;
abstract getValues(): number[];
public getHeroAttrCell() {
return {
attrId: this.attrId,
values: this.getValues()
}
}
}
class HeroMainAttr extends HeroAllAttr {
public setByRoleCe(heroAttr: AttrCell) {
for(let i = 0; i < heroAttr.values.length; i++) {
let value = heroAttr.values[i];
if(value != undefined) {
switch(i) {
case HERO_MAIN_ATTR_INDEX.BASE:
this.mainBase = value; break;
case HERO_MAIN_ATTR_INDEX.JOB:
this.job = value; break;
case HERO_MAIN_ATTR_INDEX.STAR_UP:
this.starUp = value; break;
case HERO_MAIN_ATTR_INDEX.CONNECT:
this.connect = value; break;
case HERO_MAIN_ATTR_INDEX.FAVOUR:
this.favour = value; break;
case HERO_MAIN_ATTR_INDEX.TALENT:
this.talent = value; break;
case HERO_MAIN_ATTR_INDEX.EQUIP_QUALITY:
this.equipQuality = value; break;
case HERO_MAIN_ATTR_INDEX.EQUIP_STRENGTH:
this.equipStrength = value; break;
case HERO_MAIN_ATTR_INDEX.EQUIP_STAR:
this.equipStar = value; break;
case HERO_MAIN_ATTR_INDEX.EQUIP_SUIT:
this.equipSuit = value; break;
case HERO_MAIN_ATTR_INDEX.JEWEL:
this.jewel = value; break;
case HERO_MAIN_ATTR_INDEX.STONE:
this.stone = value; break;
}
}
}
}
public getValues() {
let values: number[] = [];
for(let i = HERO_MAIN_ATTR_INDEX.START; i < HERO_MAIN_ATTR_INDEX.END; i++) {
switch(i) {
case HERO_MAIN_ATTR_INDEX.BASE:
values.push(this.mainBase);
break;
case HERO_MAIN_ATTR_INDEX.JOB:
values.push(this.job);
break;
case HERO_MAIN_ATTR_INDEX.STAR_UP:
values.push(this.starUp);
break;
case HERO_MAIN_ATTR_INDEX.CONNECT:
values.push(this.connect);
break;
case HERO_MAIN_ATTR_INDEX.FAVOUR:
values.push(this.favour);
break;
case HERO_MAIN_ATTR_INDEX.TALENT:
values.push(this.talent);
break;
case HERO_MAIN_ATTR_INDEX.EQUIP_QUALITY:
values.push(this.equipQuality);
break;
case HERO_MAIN_ATTR_INDEX.EQUIP_STRENGTH:
values.push(this.equipStrength);
break;
case HERO_MAIN_ATTR_INDEX.EQUIP_STAR:
values.push(this.equipStar);
break;
case HERO_MAIN_ATTR_INDEX.EQUIP_SUIT:
values.push(this.equipSuit);
break;
case HERO_MAIN_ATTR_INDEX.JEWEL:
values.push(this.jewel);
break;
case HERO_MAIN_ATTR_INDEX.STONE:
values.push(this.stone);
break;
}
}
return values;
}
}
class HeroSubAttr extends HeroAllAttr {
public setByRoleCe(heroAttr: AttrCell) {
for(let i = 0; i < heroAttr.values.length; i++) {
let value = heroAttr.values[i];
if(value != undefined) {
switch(i) {
case HERO_SUB_ATTR_INDEX.BASE:
this.subBase = value; break;
case HERO_SUB_ATTR_INDEX.JOB:
this.job = value; break;
case HERO_SUB_ATTR_INDEX.TALENT:
this.talent = value; break;
case HERO_SUB_ATTR_INDEX.JEWEL:
this.jewel = value; break;
case HERO_SUB_ATTR_INDEX.EQUIP_STAR:
this.equipStar = value; break;
}
}
}
}
public getValues() {
let values: number[] = [];
for(let i = HERO_SUB_ATTR_INDEX.START; i < HERO_SUB_ATTR_INDEX.END; i++) {
switch(i) {
case HERO_SUB_ATTR_INDEX.BASE:
values.push(this.subBase);
break;
case HERO_SUB_ATTR_INDEX.JOB:
values.push(this.job);
break;
case HERO_SUB_ATTR_INDEX.TALENT:
values.push(this.talent);
break;
case HERO_SUB_ATTR_INDEX.JEWEL:
values.push(this.jewel);
break;
case HERO_SUB_ATTR_INDEX.EQUIP_STAR:
values.push(this.equipStar);
break;
}
}
return values;
}
}
abstract class EquipAllAttr {
hid: number;
eplaceId: number;
attrId: number;
equipQuality: number = 0;
equipStrengthen: number = 0;
equipStar: number = 0;
jewel: number = 0;
stone: number = 0;
constructor(hid: number, attrId: number) {
this.hid = hid;
this.attrId = attrId;
}
abstract setByRoleCe(data: AttrCell): void;
abstract getValues(): number[];
public getEquipAttrCell() {
return {
attrId: this.attrId,
values: this.getValues()
}
}
}
class EquipMainAttr extends EquipAllAttr {
public setByRoleCe(equipAttr: AttrCell) {
for(let i = 0; i < equipAttr.values.length; i++) {
let value = equipAttr.values[i];
if(value != undefined) {
switch(i) {
case EQUIP_MAIN_ATTR_INDEX.EQUIP_QUALITY:
this.equipQuality = value; break;
case EQUIP_MAIN_ATTR_INDEX.EQUIP_STRENGTH:
this.equipStrengthen = value; break;
case EQUIP_MAIN_ATTR_INDEX.EQUIP_STAR:
this.equipStar = value; break;
case EQUIP_MAIN_ATTR_INDEX.JEWEL:
this.jewel = value; break;
case EQUIP_MAIN_ATTR_INDEX.STONE:
this.stone = value; break;
}
}
}
}
public getValues() {
let values: number[] = [];
for(let i = EQUIP_MAIN_ATTR_INDEX.START; i < EQUIP_MAIN_ATTR_INDEX.END; i++) {
switch(i) {
case EQUIP_MAIN_ATTR_INDEX.EQUIP_QUALITY:
values.push(this.equipQuality);
break;
case EQUIP_MAIN_ATTR_INDEX.EQUIP_STRENGTH:
values.push(this.equipStrengthen);
break;
case EQUIP_MAIN_ATTR_INDEX.EQUIP_STAR:
values.push(this.equipStar);
break;
case EQUIP_MAIN_ATTR_INDEX.JEWEL:
values.push(this.jewel);
break;
case EQUIP_MAIN_ATTR_INDEX.STONE:
values.push(this.stone);
break;
}
}
return values;
}
}
class EquipSubAttr extends EquipAllAttr {
public setByRoleCe(equipAttr: AttrCell) {
for(let i = 0; i < equipAttr.values.length; i++) {
let value = equipAttr.values[i];
if(value != undefined) {
switch(i) {
case EQUIP_SUB_ATTR_INDEX.EQUIP_STAR:
this.equipStar = value; break;
case EQUIP_SUB_ATTR_INDEX.JEWEL:
this.jewel = value; break;
}
}
}
}
public getValues() {
let values: number[] = [];
for(let i = EQUIP_SUB_ATTR_INDEX.START; i < EQUIP_SUB_ATTR_INDEX.END; i++) {
switch(i) {
case EQUIP_SUB_ATTR_INDEX.EQUIP_STAR:
values.push(this.equipStar);
break;
case EQUIP_SUB_ATTR_INDEX.JEWEL:
values.push(this.jewel);
break;
}
}
return values;
}
}
enum GLOBAL_MAIN_ATTR_INDEX {
START,
SCHOOL = 0, // hp5百家学宫百分比加成dic_zyz_schoolRate的mainAttrApercent
TERAPH = 1, // hp11, 神像加成(直接读数据库teraph字段的值)
TITLE = 2, // hp11, 爵位加成(dic_zyz_title的hp)
SCROLL = 3, // hp11名将谱加成(dic_zyz_heroScroll的hp)
SKIN = 4, // hp12, 皮肤加成(dic_zyz_fashion的actorAttr)
END
}
enum GLOBAL_SUB_ATTR_INDEX {
START,
SCHOOL = 0, // attr5, 百家学宫(根据dic_zyz_school中的upAttribute决定书院加的是那些次级属性具体值读取dic_zyz_schoolRate中的assiAttrAddValue一列)
TERAPH = 1, // attr4, 神像加成(dic_zyz_teraph中的assistAttrValue)
TITLE = 2, // attr6, 爵位dic_zyz_title中的pdi、mdi
SKIN = 3, // attr8, 皮肤
END
}
enum HERO_MAIN_ATTR_INDEX {
START,
BASE = 0, // hp1, 角色基础属性(dic_zyz_hero的hp)
JOB = 1, // hp1, 职业属性(dic_zyz_job的attr)
STAR_UP = 2, // hp2, 角色升星成长(dic_zyz_hero_star的hp或dic_zyz_hero_wake的hp)
CONNECT = 3, // hp3, 角色羁绊固定值(dic_zyz_friend_ship的attribute)
FAVOUR = 4, // hp4, 声望加成(dic_zyz_friend_ship_level的add)
TALENT = 5, // hp5, 天赋树百分比加成(dic_zyz_hero_talent的levelSeid然后对应到dic_zyz_se)
EQUIP_QUALITY = 6, // hp6, 装备品质基础值(dic_zyz_equipQuality的attribute)
EQUIP_STRENGTH = 7, // hp7, 装备强化值(dic_zyz_equipStrenthAttr的attr)
EQUIP_STAR = 8, // hp8装备升星(dic_zyz_equipStar的mainAttr)
EQUIP_SUIT = 9, // hp8套装(dic_zyz_equipSuit的effect然后对应dic_zyz_se)
JEWEL = 10, // hp9天晶随机属性值(jewel的ranSe对应dic_zyz_randomEffectPool)
STONE = 11, // hp10, 地玉增加的固定值(dic_zyz_stone的attribute)
END
}
enum HERO_SUB_ATTR_INDEX {
START,
BASE = 0, // attr1系统参数表中所有人
JOB = 1, // attr2, 职业的attr
TALENT = 2, // attr3, 天赋树百分比加成 (dic_zyz_hero_talent的levelSeid然后对应到dic_zyz_se)
JEWEL = 3, // attr7, 天晶随机属性(随机出来的值在dic_zyz_randomEffectPool中读最终值)
EQUIP_STAR = 4, // attr9, 精炼次级属性(dic_zyz_equipStar的subAttr)
END
}
enum EQUIP_MAIN_ATTR_INDEX {
START,
EQUIP_QUALITY = 0, // hp6, 装备升品基础值加成(dic_zyz_equipQuality)
EQUIP_STRENGTH = 1,// hp7, 装备强化值(需改表,改为键值对)
EQUIP_STAR = 2, // hp8, 装备(dic_zyz_equipStar)
JEWEL = 3, // hp9, 天晶洗练出的主属性百分比加成equipAttr加起来
STONE = 4, // hp10地玉石增加的固定值equipAttr加起来
END
}
enum EQUIP_SUB_ATTR_INDEX {
START,
JEWEL = 0, // attr7, 天晶随机属性(随机出来的值在dic_zyz_randomEffectPool中读最终值)
EQUIP_STAR = 1, // attr9, 精炼次级属性(dic_zyz_equipStar的subAttr)
END
}