战力:补充数据结构
This commit is contained in:
@@ -222,8 +222,6 @@ export function getVipRegretCnt(vipStartTime: number) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function vipCanSkipTower(recommendCeSum: number, heroesCeSum: number, vipStartTime: number) {
|
export function vipCanSkipTower(recommendCeSum: number, heroesCeSum: number, vipStartTime: number) {
|
||||||
console.log('####', recommendCeSum, heroesCeSum, vipStartTime, );
|
|
||||||
let ratio = vipStartTime > 0? VIP.VIP_TOWER_SKIP_CE_RATIO_WITH_VIP: VIP.VIP_TOWER_SKIP_CE_RATIO_WITHOUT_VIP;
|
let ratio = vipStartTime > 0? VIP.VIP_TOWER_SKIP_CE_RATIO_WITH_VIP: VIP.VIP_TOWER_SKIP_CE_RATIO_WITHOUT_VIP;
|
||||||
console.log('#####', VIP.VIP_TOWER_SKIP_CE_RATIO_WITH_VIP, VIP.VIP_TOWER_SKIP_CE_RATIO_WITHOUT_VIP, ratio)
|
|
||||||
return heroesCeSum > recommendCeSum * ratio;
|
return heroesCeSum > recommendCeSum * ratio;
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ABI_STAGE, ABI_STAGE_TO_TYPE, ABI_TYPE_MAIN, SEID_TYPE } from "../../consts";
|
import { ABI_STAGE, ABI_STAGE_TO_TYPE, ABI_TYPE_MAIN, SEID_TYPE } from "../../consts";
|
||||||
import { HeroUpdate } from "../../db/Hero";
|
import { HeroUpdate } from "../../db/Hero";
|
||||||
import { RoleUpdate, Teraph } from "../../db/Role";
|
import { RoleUpdate, Teraph } from "../../db/Role";
|
||||||
import { GlobalAttr, HeroAttr, HeroAttrCell, RoleCeType } from "../../db/RoleCe";
|
import { AttrCell, EquipAttr, HeroAttr, RoleCeType } from "../../db/RoleCe";
|
||||||
import { AttributeCal } from "../../domain/roleField/attribute";
|
import { AttributeCal } from "../../domain/roleField/attribute";
|
||||||
import { gameData, getHeroStarByQuality, getHeroWakeByQuality, getTeraph } from "../../pubUtils/data";
|
import { gameData, getHeroStarByQuality, getHeroWakeByQuality, getTeraph } from "../../pubUtils/data";
|
||||||
import { DicRandomEffectPool } from "../../pubUtils/dictionary/DicRandomEffectPool";
|
import { DicRandomEffectPool } from "../../pubUtils/dictionary/DicRandomEffectPool";
|
||||||
@@ -10,10 +10,14 @@ import { addToMap, deepCopy } from "../../pubUtils/util";
|
|||||||
|
|
||||||
class RoleCe {
|
class RoleCe {
|
||||||
roleId: string;
|
roleId: string;
|
||||||
globalAttrs: Map<number, GlobalMainAttr|GlobalSubAttr> = new Map(); // attrId => GlobalCe
|
globalAttrs: Map<number, GlobalMainAttr|GlobalSubAttr> = new Map(); // attrId => GlobalAttr
|
||||||
heroAttrs: Map<string, HeroMainAttr|HeroSubAttr> = new Map(); // hid+attrId => HeroCe
|
heroAttrs: Map<string, HeroMainAttr|HeroSubAttr> = new Map(); // hid+attrId => HeroAttr
|
||||||
heroAttrsByHid: Map<number, string[]> = new Map(); // hid => [hid+attrId]
|
heroAttrsByHid: Map<number, string[]> = new Map(); // hid => [hid+attrId]
|
||||||
|
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 =>+eplaceId+attrId]
|
||||||
heroLv: Map<number, number> = new Map();
|
heroLv: Map<number, number> = new Map();
|
||||||
|
equipLv: Map<string, number> = new Map(); // hid+eplaceId => lv
|
||||||
|
|
||||||
setRoleCe(roleCe: RoleCeType) {
|
setRoleCe(roleCe: RoleCeType) {
|
||||||
this.roleId = roleCe.roleId;
|
this.roleId = roleCe.roleId;
|
||||||
@@ -28,6 +32,13 @@ class RoleCe {
|
|||||||
obj.setByRoleCe(cell);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public getGlobalAttrById(attrId: number) {
|
public getGlobalAttrById(attrId: number) {
|
||||||
@@ -62,14 +73,44 @@ class RoleCe {
|
|||||||
return this.heroAttrs.get(key);
|
return this.heroAttrs.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 calHeroCe() {
|
public calHeroCe() {
|
||||||
let ces = new Map<number, { id: number, val: number }[]>(); // hid => [{attrId, val}]
|
let ces = new Map<number, { id: number, val: number }[]>(); // hid => [{attrId, val}]
|
||||||
for(let [hid, keys] of this.heroAttrsByHid) {
|
for(let [hid, keys] of this.heroAttrsByHid) {
|
||||||
let lv = this.heroLv.get(hid)||1;
|
let lv = this.heroLv.get(hid)||1;
|
||||||
for(let key of keys) {
|
for(let key of keys) {
|
||||||
let { attrId, base, baseUp, starUp, skillRatio, skill, job } = this.heroAttrs.get(key);
|
let { attrId, base = 0, job = 0, starUp = 0, connect = 0, favour = 0, talent = 0, equip = 0, equipUp = 0, equipStone = 0 } = this.heroAttrs.get(key);
|
||||||
let { schoolRatio, title, teraph } = this.getGlobalAttrById(attrId);
|
let { school = 0, teraph = 0, title = 0, scroll = 0, skin = 0 } = this.getGlobalAttrById(attrId);
|
||||||
let val = ( base + lv * ( baseUp + starUp ) + skill + job) * (1 + skillRatio + schoolRatio ) + teraph + title;
|
let val = 0;
|
||||||
|
if(ABI_TYPE_MAIN.indexOf(attrId)) {
|
||||||
|
// {[hp1 + lv * hp2 + hp3 * ( 1 + hp4 )] * (1 + hp5 ) + [( hp6+hp7)*(1+hp8)] } * ( 1 + hp9 ) + hp10 + hp11
|
||||||
|
val = ((base + job + lv * starUp + connect * ( 1 + favour )) * ( 1 + school + talent ) + equip ) * ( 1 + equipUp ) + equipStone + teraph + title + scroll + skin;
|
||||||
|
} else {
|
||||||
|
val = base + job + talent + teraph + school + title + equip + skin;
|
||||||
|
}
|
||||||
if(!ces.has(hid)) ces.set(hid, []);
|
if(!ces.has(hid)) ces.set(hid, []);
|
||||||
ces.get(hid).push({ id: attrId, val });
|
ces.get(hid).push({ id: attrId, val });
|
||||||
}
|
}
|
||||||
@@ -84,14 +125,14 @@ class RoleCe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public getRoleCeTable() {
|
public getRoleCeTable() {
|
||||||
let globalAttrs: GlobalAttr[] = [];
|
let globalAttrs: AttrCell[] = [];
|
||||||
for(let [_, globalAttr] of this.globalAttrs) {
|
for(let [_, globalAttr] of this.globalAttrs) {
|
||||||
globalAttrs.push(globalAttr.getGlobalAttr());
|
globalAttrs.push(globalAttr.getGlobalAttr());
|
||||||
}
|
}
|
||||||
let heroAttrs: HeroAttr[] = [];
|
let heroAttrs: HeroAttr[] = [];
|
||||||
for(let [hid, keys] of this.heroAttrsByHid) {
|
for(let [hid, keys] of this.heroAttrsByHid) {
|
||||||
let lv = this.heroLv.get(hid);
|
let lv = this.heroLv.get(hid);
|
||||||
let attrs: HeroAttrCell[] = [];
|
let attrs: AttrCell[] = [];
|
||||||
for(let key of keys) {
|
for(let key of keys) {
|
||||||
let heroAttr = this.heroAttrs.get(key);
|
let heroAttr = this.heroAttrs.get(key);
|
||||||
attrs.push(heroAttr.getHeroAttrCell());
|
attrs.push(heroAttr.getHeroAttrCell());
|
||||||
@@ -100,8 +141,20 @@ class RoleCe {
|
|||||||
hid, lv, attrs
|
hid, lv, attrs
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
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
|
||||||
|
});
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
roleId: this.roleId, globalAttrs, heroAttrs
|
roleId: this.roleId, globalAttrs, heroAttrs, equipAttrs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,11 +162,11 @@ class RoleCe {
|
|||||||
// 计算函数
|
// 计算函数
|
||||||
export class CalCe extends RoleCe {
|
export class CalCe extends RoleCe {
|
||||||
public setInitHero(role: RoleUpdate, heroes: HeroUpdate[]) {
|
public setInitHero(role: RoleUpdate, heroes: HeroUpdate[]) {
|
||||||
|
this.roleId = role.roleId;
|
||||||
for(let { hid, skinId, lv, quality, star, starStage, colorStar, colorStarStage, job, jobStage, } of heroes) {
|
for(let { hid, skinId, lv, quality, star, starStage, colorStar, colorStarStage, job, jobStage, } of heroes) {
|
||||||
this.setHeroBase(hid, skinId);
|
this.setHeroBase(hid, skinId);
|
||||||
this.setHeroLv(hid, lv);
|
this.setHeroLv(hid, lv);
|
||||||
this.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage);
|
this.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage);
|
||||||
this.setSkill(hid, skinId, star, colorStar);
|
|
||||||
this.setJob(hid, job, jobStage);
|
this.setJob(hid, job, jobStage);
|
||||||
}
|
}
|
||||||
this.setTitle(role.title);
|
this.setTitle(role.title);
|
||||||
@@ -127,10 +180,6 @@ export class CalCe extends RoleCe {
|
|||||||
let heroAttr = this.getHeroAttrByHidAndId(hid, attrId);
|
let heroAttr = this.getHeroAttrByHidAndId(hid, attrId);
|
||||||
heroAttr.base = value;
|
heroAttr.base = value;
|
||||||
}
|
}
|
||||||
for(let [attrId, value] of dicHero.baseAbilityUpArr) {
|
|
||||||
let heroAttr = this.getHeroAttrByHidAndId(hid, attrId);
|
|
||||||
heroAttr.baseUp = value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 武将等级
|
// 武将等级
|
||||||
@@ -161,30 +210,6 @@ export class CalCe extends RoleCe {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 武将星级解锁被动技能计算
|
|
||||||
public setSkill(hid: number, skinId: number, _star: number, _colorStar: number) {
|
|
||||||
let seidList = new Map<number, number>(); // type => seid
|
|
||||||
let dicHero = gameData.hero.get(skinId);
|
|
||||||
let { starSeidArr, colorStarSeidArr } = gameData.heroSkill.get(dicHero.skill);
|
|
||||||
for (let { star, value, type } of starSeidArr) {
|
|
||||||
if (_star >= star) seidList.set(type, value);
|
|
||||||
}
|
|
||||||
for (let { star, value, type } of colorStarSeidArr) {
|
|
||||||
if (_colorStar >= star) seidList.set(type, value);
|
|
||||||
}
|
|
||||||
let list: number[] = [];
|
|
||||||
for(let [_type, value] of seidList) list.push(value);
|
|
||||||
let { fixUp, ratioUp } = this.addSeidEffect(list);
|
|
||||||
for(let [attrId, value] of fixUp) {
|
|
||||||
let heroAttr = this.getHeroAttrByHidAndId(hid, attrId);
|
|
||||||
heroAttr.skill = value;
|
|
||||||
}
|
|
||||||
for(let [attrId, value] of ratioUp) {
|
|
||||||
let heroAttr = this.getHeroAttrByHidAndId(hid, attrId);
|
|
||||||
heroAttr.skillRatio = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 职业基础
|
// 职业基础
|
||||||
public setJob(hid: number, job: number, jobStage: number) {
|
public setJob(hid: number, job: number, jobStage: number) {
|
||||||
const dicJob = gameData.job.get(job);
|
const dicJob = gameData.job.get(job);
|
||||||
@@ -284,15 +309,17 @@ export class CalCe extends RoleCe {
|
|||||||
|
|
||||||
abstract class GlobalAllAttr {
|
abstract class GlobalAllAttr {
|
||||||
attrId: number;
|
attrId: number;
|
||||||
schoolRatio: number = 0;
|
school: number = 0;
|
||||||
title: number = 0;
|
|
||||||
teraph: number = 0;
|
teraph: number = 0;
|
||||||
|
title: number = 0;
|
||||||
|
scroll: number = 0;
|
||||||
|
skin: number = 0;
|
||||||
|
|
||||||
constructor(attrId: number) {
|
constructor(attrId: number) {
|
||||||
this.attrId = attrId;
|
this.attrId = attrId;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract setByRoleCe(data: GlobalAttr): void;
|
abstract setByRoleCe(data: AttrCell): void;
|
||||||
abstract getValues(): number[];
|
abstract getValues(): number[];
|
||||||
|
|
||||||
public getGlobalAttr() {
|
public getGlobalAttr() {
|
||||||
@@ -305,17 +332,21 @@ abstract class GlobalAllAttr {
|
|||||||
|
|
||||||
class GlobalMainAttr extends GlobalAllAttr {
|
class GlobalMainAttr extends GlobalAllAttr {
|
||||||
|
|
||||||
public setByRoleCe(globalAttr: GlobalAttr) {
|
public setByRoleCe(globalAttr: AttrCell) {
|
||||||
for(let i = 0; i < globalAttr.values.length; i++) {
|
for(let i = 0; i < globalAttr.values.length; i++) {
|
||||||
let value = globalAttr.values[i];
|
let value = globalAttr.values[i];
|
||||||
if(value != undefined) {
|
if(value != undefined) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case GLOBAL_ATTR_INDEX.SCHOOL:
|
case GLOBAL_MAIN_ATTR_INDEX.SCHOOL:
|
||||||
this.schoolRatio = value; break;
|
this.school = value; break;
|
||||||
case GLOBAL_ATTR_INDEX.TITLE:
|
case GLOBAL_MAIN_ATTR_INDEX.TERAPH:
|
||||||
this.title = value; break;
|
|
||||||
case GLOBAL_ATTR_INDEX.TERAPH:
|
|
||||||
this.teraph = value; break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -323,14 +354,23 @@ class GlobalMainAttr extends GlobalAllAttr {
|
|||||||
|
|
||||||
public getValues() {
|
public getValues() {
|
||||||
let values: number[] = [];
|
let values: number[] = [];
|
||||||
for(let i = GLOBAL_ATTR_INDEX.START; i < GLOBAL_ATTR_INDEX.END; i++) {
|
for(let i = GLOBAL_MAIN_ATTR_INDEX.START; i < GLOBAL_MAIN_ATTR_INDEX.END; i++) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case GLOBAL_ATTR_INDEX.SCHOOL:
|
case GLOBAL_MAIN_ATTR_INDEX.SCHOOL:
|
||||||
values.push(this.schoolRatio); break;
|
if(this.school) values[i] = this.school;
|
||||||
case GLOBAL_ATTR_INDEX.TITLE:
|
break;
|
||||||
values.push(this.title); break;
|
case GLOBAL_MAIN_ATTR_INDEX.TERAPH:
|
||||||
case GLOBAL_ATTR_INDEX.TERAPH:
|
if(this.teraph) values[i] = this.teraph;
|
||||||
values.push(this.teraph); break;
|
break;
|
||||||
|
case GLOBAL_MAIN_ATTR_INDEX.TITLE:
|
||||||
|
if(this.title) values[i] = this.title;
|
||||||
|
break;
|
||||||
|
case GLOBAL_MAIN_ATTR_INDEX.SCROLL:
|
||||||
|
if(this.scroll) values[i] = this.scroll;
|
||||||
|
break;
|
||||||
|
case GLOBAL_MAIN_ATTR_INDEX.SKIN:
|
||||||
|
if(this.skin) values[i] = this.skin;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
@@ -339,17 +379,19 @@ class GlobalMainAttr extends GlobalAllAttr {
|
|||||||
|
|
||||||
class GlobalSubAttr extends GlobalAllAttr {
|
class GlobalSubAttr extends GlobalAllAttr {
|
||||||
|
|
||||||
public setByRoleCe(globalAttr: GlobalAttr) {
|
public setByRoleCe(globalAttr: AttrCell) {
|
||||||
for(let i = 0; i < globalAttr.values.length; i++) {
|
for(let i = 0; i < globalAttr.values.length; i++) {
|
||||||
let value = globalAttr.values[i];
|
let value = globalAttr.values[i];
|
||||||
if(value != undefined) {
|
if(value != undefined) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case GLOBAL_ATTR_INDEX.SCHOOL:
|
case GLOBAL_SUB_ATTR_INDEX.SCHOOL:
|
||||||
this.schoolRatio = value; break;
|
this.school = value; break;
|
||||||
case GLOBAL_ATTR_INDEX.TITLE:
|
case GLOBAL_MAIN_ATTR_INDEX.TERAPH:
|
||||||
this.title = value; break;
|
|
||||||
case GLOBAL_ATTR_INDEX.TERAPH:
|
|
||||||
this.teraph = value; break;
|
this.teraph = value; break;
|
||||||
|
case GLOBAL_MAIN_ATTR_INDEX.TITLE:
|
||||||
|
this.title = value; break;
|
||||||
|
case GLOBAL_MAIN_ATTR_INDEX.SKIN:
|
||||||
|
this.skin = value; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -357,14 +399,20 @@ class GlobalSubAttr extends GlobalAllAttr {
|
|||||||
|
|
||||||
public getValues() {
|
public getValues() {
|
||||||
let values: number[] = [];
|
let values: number[] = [];
|
||||||
for(let i = GLOBAL_ATTR_INDEX.START; i < GLOBAL_ATTR_INDEX.END; i++) {
|
for(let i = GLOBAL_MAIN_ATTR_INDEX.START; i < GLOBAL_MAIN_ATTR_INDEX.END; i++) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case GLOBAL_ATTR_INDEX.SCHOOL:
|
case GLOBAL_MAIN_ATTR_INDEX.SCHOOL:
|
||||||
values.push(this.schoolRatio); break;
|
if(this.school) values[i] = this.school;
|
||||||
case GLOBAL_ATTR_INDEX.TITLE:
|
break;
|
||||||
values.push(this.title); break;
|
case GLOBAL_MAIN_ATTR_INDEX.TERAPH:
|
||||||
case GLOBAL_ATTR_INDEX.TERAPH:
|
if(this.teraph) values[i] = this.teraph;
|
||||||
values.push(this.teraph); break;
|
break;
|
||||||
|
case GLOBAL_MAIN_ATTR_INDEX.TITLE:
|
||||||
|
if(this.title) values[i] = this.title;
|
||||||
|
break;
|
||||||
|
case GLOBAL_MAIN_ATTR_INDEX.SKIN:
|
||||||
|
if(this.skin) values[i] = this.skin;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
@@ -375,12 +423,14 @@ abstract class HeroAllAttr {
|
|||||||
hid: number;
|
hid: number;
|
||||||
attrId: number;
|
attrId: number;
|
||||||
base: number = 0;
|
base: number = 0;
|
||||||
lv: number = 0;
|
|
||||||
baseUp: number = 0;
|
|
||||||
starUp: number = 0;
|
|
||||||
skillRatio: number = 0;
|
|
||||||
skill: number = 0;
|
|
||||||
job: number = 0;
|
job: number = 0;
|
||||||
|
starUp: number = 0;
|
||||||
|
connect: number = 0;
|
||||||
|
favour: number = 0;
|
||||||
|
talent: number = 0;
|
||||||
|
equip: number = 0;
|
||||||
|
equipUp: number = 0;
|
||||||
|
equipStone: number = 0;
|
||||||
|
|
||||||
constructor(hid: number, attrId: number, ) {
|
constructor(hid: number, attrId: number, ) {
|
||||||
this.hid = hid;
|
this.hid = hid;
|
||||||
@@ -388,7 +438,7 @@ abstract class HeroAllAttr {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract setByRoleCe(data: GlobalAttr): void;
|
abstract setByRoleCe(data: AttrCell): void;
|
||||||
abstract getValues(): number[];
|
abstract getValues(): number[];
|
||||||
|
|
||||||
public getHeroAttrCell() {
|
public getHeroAttrCell() {
|
||||||
@@ -400,13 +450,29 @@ abstract class HeroAllAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class HeroMainAttr extends HeroAllAttr {
|
class HeroMainAttr extends HeroAllAttr {
|
||||||
public setByRoleCe(heroAttr: HeroAttrCell) {
|
public setByRoleCe(heroAttr: AttrCell) {
|
||||||
for(let i = 0; i < heroAttr.values.length; i++) {
|
for(let i = 0; i < heroAttr.values.length; i++) {
|
||||||
let value = heroAttr.values[i];
|
let value = heroAttr.values[i];
|
||||||
if(value != undefined) {
|
if(value != undefined) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case HERO_ATTR_INDEX.BASE:
|
case HERO_MAIN_ATTR_INDEX.BASE:
|
||||||
this.base = value;
|
this.base = 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:
|
||||||
|
this.equip = value; break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.EQUIP_UP:
|
||||||
|
this.equipUp = value; break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.EQUIP_STONE:
|
||||||
|
this.equipStone = value; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -414,10 +480,35 @@ class HeroMainAttr extends HeroAllAttr {
|
|||||||
|
|
||||||
public getValues() {
|
public getValues() {
|
||||||
let values: number[] = [];
|
let values: number[] = [];
|
||||||
for(let i = HERO_ATTR_INDEX.START; i < HERO_ATTR_INDEX.END; i++) {
|
for(let i = HERO_MAIN_ATTR_INDEX.START; i < HERO_MAIN_ATTR_INDEX.END; i++) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case HERO_ATTR_INDEX.BASE:
|
case HERO_MAIN_ATTR_INDEX.BASE:
|
||||||
values.push(this.base); break;
|
if(this.base) values[i] = this.base;
|
||||||
|
break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.JOB:
|
||||||
|
if(this.job) values[i] = this.job;
|
||||||
|
break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.STAR_UP:
|
||||||
|
if(this.starUp) values[i] = this.starUp;
|
||||||
|
break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.CONNECT:
|
||||||
|
if(this.connect) values[i] = this.connect;
|
||||||
|
break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.FAVOUR:
|
||||||
|
if(this.favour) values[i] = this.favour;
|
||||||
|
break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.TALENT:
|
||||||
|
if(this.talent) values[i] = this.talent;
|
||||||
|
break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.EQUIP:
|
||||||
|
if(this.equip) values[i] = this.equip;
|
||||||
|
break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.EQUIP_UP:
|
||||||
|
if(this.equipUp) values[i] = this.equipUp;
|
||||||
|
break;
|
||||||
|
case HERO_MAIN_ATTR_INDEX.EQUIP_STONE:
|
||||||
|
if(this.equipStone) values[i] = this.equipStone;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
@@ -425,13 +516,19 @@ class HeroMainAttr extends HeroAllAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class HeroSubAttr extends HeroAllAttr {
|
class HeroSubAttr extends HeroAllAttr {
|
||||||
public setByRoleCe(heroAttr: HeroAttrCell) {
|
public setByRoleCe(heroAttr: AttrCell) {
|
||||||
for(let i = 0; i < heroAttr.values.length; i++) {
|
for(let i = 0; i < heroAttr.values.length; i++) {
|
||||||
let value = heroAttr.values[i];
|
let value = heroAttr.values[i];
|
||||||
if(value != undefined) {
|
if(value != undefined) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case HERO_ATTR_INDEX.BASE:
|
case HERO_SUB_ATTR_INDEX.BASE:
|
||||||
this.base = value;
|
this.base = 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.EQUIP:
|
||||||
|
this.equip = value; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -439,27 +536,192 @@ class HeroSubAttr extends HeroAllAttr {
|
|||||||
|
|
||||||
public getValues() {
|
public getValues() {
|
||||||
let values: number[] = [];
|
let values: number[] = [];
|
||||||
for(let i = HERO_ATTR_INDEX.START; i < HERO_ATTR_INDEX.END; i++) {
|
for(let i = HERO_SUB_ATTR_INDEX.START; i < HERO_SUB_ATTR_INDEX.END; i++) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case HERO_ATTR_INDEX.BASE:
|
case HERO_SUB_ATTR_INDEX.BASE:
|
||||||
values.push(this.base); break;
|
if(this.base) values[i] = this.base;
|
||||||
|
break;
|
||||||
|
case HERO_SUB_ATTR_INDEX.JOB:
|
||||||
|
if(this.job) values[i] = this.job;
|
||||||
|
break;
|
||||||
|
case HERO_SUB_ATTR_INDEX.TALENT:
|
||||||
|
if(this.talent) values[i] = this.talent;
|
||||||
|
break;
|
||||||
|
case HERO_SUB_ATTR_INDEX.EQUIP:
|
||||||
|
if(this.equip) values[i] = this.equip;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum GLOBAL_ATTR_INDEX {
|
abstract class EquipAllAttr {
|
||||||
|
hid: number;
|
||||||
|
eplaceId: number;
|
||||||
|
attrId: number;
|
||||||
|
equipQuality: number = 0;
|
||||||
|
equipStrengthen: number = 0;
|
||||||
|
equipStar: number = 0;
|
||||||
|
equipSuit: 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.EQUIP_SUIT:
|
||||||
|
this.equipSuit = 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:
|
||||||
|
if(this.equipQuality) values[i] = this.equipQuality;
|
||||||
|
break;
|
||||||
|
case EQUIP_MAIN_ATTR_INDEX.EQUIP_STRENGTH:
|
||||||
|
if(this.equipStrengthen) values[i] = this.equipStrengthen;
|
||||||
|
break;
|
||||||
|
case EQUIP_MAIN_ATTR_INDEX.EQUIP_STAR:
|
||||||
|
if(this.equipStar) values[i] = this.equipStar;
|
||||||
|
break;
|
||||||
|
case EQUIP_MAIN_ATTR_INDEX.EQUIP_SUIT:
|
||||||
|
if(this.equipSuit) values[i] = this.equipSuit;
|
||||||
|
break;
|
||||||
|
case EQUIP_MAIN_ATTR_INDEX.JEWEL:
|
||||||
|
if(this.jewel) values[i] = this.jewel;
|
||||||
|
break;
|
||||||
|
case EQUIP_MAIN_ATTR_INDEX.STONE:
|
||||||
|
if(this.stone) values[i] = 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:
|
||||||
|
if(this.equipStar) values[i] = this.equipStar;
|
||||||
|
break;
|
||||||
|
case EQUIP_SUB_ATTR_INDEX.JEWEL:
|
||||||
|
if(this.jewel) values[i] = this.jewel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum GLOBAL_MAIN_ATTR_INDEX {
|
||||||
START,
|
START,
|
||||||
SCHOOL = 0,
|
SCHOOL = 0, // hp5,百家学宫百分比加成(dic_zyz_schoolRate的mainAttrApercent)
|
||||||
TITLE = 1,
|
TERAPH = 1, // hp11, 神像加成(直接读数据库teraph字段的值)
|
||||||
TERAPH = 2,
|
TITLE = 2, // hp11, 爵位加成(dic_zyz_title的hp)
|
||||||
|
SCROLL = 3, // hp11,名将谱加成(dic_zyz_heroScroll的hp)
|
||||||
|
SKIN = 4, // hp12, 皮肤加成(dic_zyz_fashion的actorAttr)
|
||||||
END
|
END
|
||||||
}
|
}
|
||||||
|
|
||||||
enum HERO_ATTR_INDEX {
|
enum GLOBAL_SUB_ATTR_INDEX {
|
||||||
START,
|
START,
|
||||||
BASE = 0, // 角色基础属性(dic_zyz_hero的hp)
|
SCHOOL = 0, // attr5, 百家学宫(根据dic_zyz_school中的upAttribute决定书院加的是那些次级属性,具体值读取dic_zyz_schoolRate中的assiAttrAddValue一列)
|
||||||
BASE_UP = 1,
|
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 = 6, // (hp6+hp7)*(1+hp8) 装备,equipAttr加成之后加到这里
|
||||||
|
EQUIP_UP = 7, // hp9, 天晶洗练处的主属性百分比加成,equipAttr中计算好加和加入
|
||||||
|
EQUIP_STONE = 8, // hp10, 地玉石增加的固定值,equipAttr中计算好和加入
|
||||||
|
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)
|
||||||
|
EQUIP = 3, // attr7+attr9, 天晶加成和精炼加成,equipAttr加起来
|
||||||
|
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)
|
||||||
|
EQUIP_SUIT = 3, // hp8, 装备套装加成(dic_zyz_equipSuit)
|
||||||
|
JEWEL = 4, // hp9, 天晶洗练出的主属性百分比加成,equipAttr加起来
|
||||||
|
STONE = 5, // hp10,地玉石增加的固定值,equipAttr加起来
|
||||||
|
END
|
||||||
|
}
|
||||||
|
|
||||||
|
enum EQUIP_SUB_ATTR_INDEX {
|
||||||
|
START,
|
||||||
|
JEWEL = 0, // attr7, 天晶随机属性(随机出来的值在dic_zyz_randomEffectPool中读最终值)
|
||||||
|
EQUIP_STAR = 1, // attr8, 精炼次级属性(dic_zyz_equipStar的subAttr)
|
||||||
END
|
END
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ import { getInitHeroById } from "../roleService";
|
|||||||
import { addItems, combineFigureInfo, unlockFigure, unlockFigureWithoutSave } from "./rewardService";
|
import { addItems, combineFigureInfo, unlockFigure, unlockFigureWithoutSave } from "./rewardService";
|
||||||
import { gameData } from "../../pubUtils/data";
|
import { gameData } from "../../pubUtils/data";
|
||||||
import { CalCe } from "./calCe";
|
import { CalCe } from "./calCe";
|
||||||
import { RoleCeUpdate } from "../../db/RoleCe";
|
import RoleCe, { RoleCeModel, RoleCeUpdate } from "../../db/RoleCe";
|
||||||
|
|
||||||
export class CreateHeroes {
|
export class CreateHeroes {
|
||||||
private roleId: string;
|
private roleId: string;
|
||||||
@@ -102,6 +102,8 @@ export class CreateHeroes {
|
|||||||
// 更新role表
|
// 更新role表
|
||||||
role = await RoleModel.incRoleInfo(this.roleId, { heroNum: this.incHeroNum, ce: this.incRoleCe }, { heroNumUpdatedAt: nowSeconds(), });
|
role = await RoleModel.incRoleInfo(this.roleId, { heroNum: this.incHeroNum, ce: this.incRoleCe }, { heroNumUpdatedAt: nowSeconds(), });
|
||||||
this.setRole(role);
|
this.setRole(role);
|
||||||
|
// 更新roleCe表
|
||||||
|
await RoleCeModel.updateRoleCe(this.roleId, this.roleCe);
|
||||||
// 更新皮肤表
|
// 更新皮肤表
|
||||||
await SkinModel.insertSkins(this.roleId, this.roleName, this.skins)
|
await SkinModel.insertSkins(this.roleId, this.roleName, this.skins)
|
||||||
// 更新guild表
|
// 更新guild表
|
||||||
|
|||||||
+19
-23
@@ -2,7 +2,7 @@ import BaseModel from './BaseModel';
|
|||||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||||
|
|
||||||
// 全局加成
|
// 全局加成
|
||||||
export class GlobalAttr {
|
export class AttrCell {
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
attrId: number; // 属性id
|
attrId: number; // 属性id
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
@@ -15,27 +15,19 @@ export class HeroAttr {
|
|||||||
hid: number; // 武将id
|
hid: number; // 武将id
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
lv: number;
|
lv: number;
|
||||||
@prop({ required: true, type: () => HeroAttrCell, _id: false })
|
@prop({ required: true, type: () => AttrCell, _id: false })
|
||||||
attrs: HeroAttrCell[];
|
attrs: AttrCell[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export class HeroAttrCell {
|
export class EquipAttr {
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
attrId: number; // 属性id
|
hid: number; // 武将id
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
values: number[]; // 战力公式中的武将加成的数据,查表后的结果
|
eplaceId: number; // 装备位置
|
||||||
}
|
@prop({ required: true })
|
||||||
|
lv: number;
|
||||||
// 装备加成
|
@prop({ required: true, type: () => AttrCell, _id: false })
|
||||||
class EquipAttr {
|
attrs: AttrCell[];
|
||||||
@prop({ required: true })
|
|
||||||
hid: number; // 武将id
|
|
||||||
@prop({ required: true })
|
|
||||||
eplaceId: number; // 装备位置
|
|
||||||
@prop({ required: true })
|
|
||||||
attrId: number; // 属性id
|
|
||||||
@prop({ required: true })
|
|
||||||
values: number[]; // 战力公式中的武将加成的数据,查表后的结果
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 百家学宫加成
|
// 百家学宫加成
|
||||||
@@ -70,8 +62,8 @@ export default class RoleCe extends BaseModel {
|
|||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
roleId: string; // 角色 id
|
roleId: string; // 角色 id
|
||||||
|
|
||||||
@prop({ required: true, type: GlobalAttr, _id: false })
|
@prop({ required: true, type: AttrCell, _id: false })
|
||||||
globalAttrs: GlobalAttr[]
|
globalAttrs: AttrCell[]
|
||||||
|
|
||||||
@prop({ required: true, type: HeroAttr, _id: false })
|
@prop({ required: true, type: HeroAttr, _id: false })
|
||||||
heroAttrs: HeroAttr[]
|
heroAttrs: HeroAttr[]
|
||||||
@@ -86,10 +78,14 @@ export default class RoleCe extends BaseModel {
|
|||||||
scrollAttrs: ScrollAttr[];
|
scrollAttrs: ScrollAttr[];
|
||||||
|
|
||||||
public static async findByRoleId(roleId: string) {
|
public static async findByRoleId(roleId: string) {
|
||||||
let result: RoleCeType[] = await RoleCeModel.find({ roleId }).lean();
|
let result: RoleCeType = await RoleCeModel.findOne({ roleId }).lean();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async updateRoleCe(roleId: string, update: RoleCeUpdate) {
|
||||||
|
let result: RoleCeType = await RoleCeModel.findOneAndUpdate({ roleId }, { $set: update }, { new: true, upsert: true }).lean();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RoleCeModel = getModelForClass(RoleCe);
|
export const RoleCeModel = getModelForClass(RoleCe);
|
||||||
|
|||||||
Reference in New Issue
Block a user