@@ -365,12 +365,12 @@ export function comBtlRanges() {
|
||||
}
|
||||
|
||||
|
||||
export function getHeroStarByQuality(quality: number, star: number) {
|
||||
return gameData.heroStar.get(`${quality}_${star}`);
|
||||
export function getHeroStarByQuality(classType: number, quality: number, star: number) {
|
||||
return gameData.heroStar.get(`${classType}_${quality}_${star}`);
|
||||
}
|
||||
|
||||
export function getHeroWakeByQuality(quality: number, star: number) {
|
||||
return gameData.heroWake.get(`${quality}_${star}`);
|
||||
export function getHeroWakeByQuality(classType: number, quality: number, star: number) {
|
||||
return gameData.heroWake.get(`${classType}_${quality}_${star}`);
|
||||
}
|
||||
|
||||
export function getMaxGradeByjobClass(jobClass: number) {
|
||||
|
||||
@@ -7,6 +7,8 @@ export interface DicHeroStar {
|
||||
|
||||
// 唯一id
|
||||
readonly id: number;
|
||||
// 职业类型
|
||||
readonly classType: number;
|
||||
// 品质
|
||||
readonly quality: number;
|
||||
// 星级
|
||||
@@ -20,7 +22,7 @@ export interface DicHeroStar {
|
||||
|
||||
|
||||
type KeysEnum<T> = { [P in keyof Required<T>]: true };
|
||||
const DicHeroStarKeys: KeysEnum<DicHeroStar> = {id: true, quality: true, star: true, advanceUpFragmentNum: true, ceAttr: true};
|
||||
const DicHeroStarKeys: KeysEnum<DicHeroStar> = {id: true, classType: true, quality: true, star: true, advanceUpFragmentNum: true, ceAttr: true};
|
||||
|
||||
export const dicHeroStar = new Map<string, DicHeroStar>();
|
||||
export function loadHeroStar() {
|
||||
@@ -28,7 +30,8 @@ export function loadHeroStar() {
|
||||
|
||||
arr.forEach(o => {
|
||||
o.ceAttr = parseCeAttr(o);
|
||||
dicHeroStar.set(`${o.quality}_${o.star}`, _.pick(o, Object.keys(DicHeroStarKeys)));
|
||||
o.classType = o.class_type;
|
||||
dicHeroStar.set(`${o.classType}_${o.quality}_${o.star}`, _.pick(o, Object.keys(DicHeroStarKeys)));
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ export interface DicHeroWake {
|
||||
|
||||
// 唯一id
|
||||
readonly id: number;
|
||||
// 职业类型
|
||||
readonly classType: number;
|
||||
// 品质
|
||||
readonly quality: number;
|
||||
// 彩星级
|
||||
@@ -22,7 +24,7 @@ export interface DicHeroWake {
|
||||
}
|
||||
|
||||
type KeysEnum<T> = { [P in keyof Required<T>]: true };
|
||||
const DicHeroWakeKeys: KeysEnum<DicHeroWake> = {id: true, quality: true, star: true, fragmentNum: true, consume: true, ceAttr: true};
|
||||
const DicHeroWakeKeys: KeysEnum<DicHeroWake> = {id: true, classType: true, quality: true, star: true, fragmentNum: true, consume: true, ceAttr: true};
|
||||
|
||||
export const dicHeroWake = new Map<string, DicHeroWake>();
|
||||
export function loadHeroWake() {
|
||||
@@ -31,7 +33,8 @@ export function loadHeroWake() {
|
||||
arr.forEach(o => {
|
||||
o.consume = parseGoodStr(o.consume);
|
||||
o.ceAttr = parseCeAttr(o);
|
||||
dicHeroWake.set(`${o.quality}_${o.star}`, _.pick(o, Object.keys(DicHeroWakeKeys)));
|
||||
o.classType = o.class_type;
|
||||
dicHeroWake.set(`${o.classType}_${o.quality}_${o.star}`, _.pick(o, Object.keys(DicHeroWakeKeys)));
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// 兵种表
|
||||
import { readFileAndParse, parseNumberList, parseGoodStr} from '../util'
|
||||
import { FILENAME, ABI_STAGE } from '../../consts'
|
||||
import { readFileAndParse, parseNumberList, parseGoodStr, decodeArrayListStr} from '../util'
|
||||
import { FILENAME, } from '../../consts'
|
||||
import { RewardInter } from '../interface';
|
||||
const _ = require('lodash');
|
||||
|
||||
@@ -24,12 +24,14 @@ export interface DicJob {
|
||||
// 升阶消耗
|
||||
readonly upGradeConsume: Array<RewardInter>;
|
||||
// 每阶升级属性
|
||||
readonly ceAttr: Map<number, number>
|
||||
readonly ceAttr: Map<number, {id: number, attr: number}>;
|
||||
// 一共有多少阶升级
|
||||
readonly maxStage: number;
|
||||
|
||||
}
|
||||
|
||||
type KeysEnum<T> = { [P in keyof Required<T>]: true };
|
||||
const DicJobKeys: KeysEnum<DicJob> = {jobid: true, name: true, grade: true, unlockLevel: true, job_class: true, type: true, seid: true,trainingConsume: true, upGradeConsume: true, ceAttr: true};
|
||||
const DicJobKeys: KeysEnum<DicJob> = {jobid: true, name: true, grade: true, unlockLevel: true, job_class: true, type: true, seid: true,trainingConsume: true, upGradeConsume: true, ceAttr: true, maxStage: true};
|
||||
|
||||
export const dicJob = new Map<number, DicJob>();
|
||||
export const jobClassMaxGrades = new Map<number, {grade:number, jobid:number}>();
|
||||
@@ -42,8 +44,9 @@ export function loadJob() {
|
||||
arr.forEach(o => {
|
||||
o.seid = parseNumberList(o.seid);
|
||||
o.trainingConsume = parseGoodStr(o.trainingConsume);
|
||||
o.maxStage = o.trainingConsume.length;
|
||||
o.upGradeConsume = parseGoodStr(o.upGradeConsume);
|
||||
o.ceAttr = parseCeAttr(o);
|
||||
o.ceAttr = parseCeAttr(o.maxStage, o.attr);
|
||||
dicJob.set(o.jobid, _.pick(o, Object.keys(DicJobKeys)));
|
||||
let jobClass = jobClassMaxGrades.get(o.job_class);
|
||||
if (!jobClass || jobClass.grade < o.grade) {
|
||||
@@ -55,11 +58,16 @@ export function loadJob() {
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
function parseCeAttr(elem) {
|
||||
let ceAttr = new Map<number, number>();
|
||||
ceAttr.set(ABI_STAGE.HP, elem.hp);
|
||||
ceAttr.set(ABI_STAGE.ATK, elem.atk);
|
||||
ceAttr.set(ABI_STAGE.DEF, elem.def);
|
||||
ceAttr.set(ABI_STAGE.MDEF, elem.mdef);
|
||||
return ceAttr;
|
||||
function parseCeAttr(maxStage: number, str: string) {
|
||||
let result = new Map<number, { id: number, attr: number }>();
|
||||
if (!str) return result;
|
||||
let decodeArr = decodeArrayListStr(str);
|
||||
for (let i = 1; i <= maxStage; i++) {
|
||||
let [id, attr] = decodeArr[i]||[i.toString(), "0"];
|
||||
if (isNaN(parseInt(id)) || isNaN(parseInt(attr))) {
|
||||
throw new Error('data table format wrong');
|
||||
}
|
||||
result.set(i, { id: parseInt(id), attr: parseFloat(attr) });
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -14,7 +14,7 @@ import { DicSe } from './dictionary/DicSe';
|
||||
import { EquipType } from '../db/Equip';
|
||||
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||||
import { SchoolModel } from '../db/School';
|
||||
import { ABI_TYPE_TO_STAGE, ABI_TYPE_MAIN } from '../consts/constModules/abilityConst'
|
||||
import { ABI_TYPE_TO_STAGE, ABI_TYPE_MAIN, ABI_JOB_STAGE } from '../consts/constModules/abilityConst'
|
||||
import { PvpDefenseModel } from '../db/PvpDefense';
|
||||
import { findIndex } from 'underscore';
|
||||
import { GuildModel } from '../db/Guild';
|
||||
@@ -293,7 +293,8 @@ export function calHeroStarIncAttr(originHero: HeroType, update: HeroUpdate, typ
|
||||
if(starStage == ABI_STAGE.START) star--;
|
||||
if(colorStarStage == ABI_STAGE.START) colorStar--;
|
||||
|
||||
const dicStar = isWake ? getHeroWakeByQuality(dicHero.quality, colorStar) : getHeroStarByQuality(quality, star); // 星级表
|
||||
const dicJob = gameData.job.get(dicHero.jobid);
|
||||
const dicStar = isWake ? getHeroWakeByQuality(dicJob.job_class, dicHero.quality, colorStar) : getHeroStarByQuality(dicJob.job_class, quality, star); // 星级表
|
||||
|
||||
|
||||
let stages = new Array<number>(); // 需要升级的阶
|
||||
@@ -302,14 +303,28 @@ export function calHeroStarIncAttr(originHero: HeroType, update: HeroUpdate, typ
|
||||
} else if (type == HERO_SYSTEM_TYPE.LVUP) {
|
||||
stages = getAllAttrStage();
|
||||
} else if (type == HERO_SYSTEM_TYPE.STAR) {
|
||||
stages.push(isUpStar? ABI_STAGE.END: starStage);
|
||||
let end = isUpStar? ABI_STAGE.END: starStage;
|
||||
if(end < originStarStage) {
|
||||
stages = getAllAttrStage();
|
||||
} else {
|
||||
for(let i = originStarStage; i < end; i++) {
|
||||
stages.push(i + 1);
|
||||
}
|
||||
}
|
||||
} else if (type == HERO_SYSTEM_TYPE.QUALITY) {
|
||||
stages = getAllAttrStage();
|
||||
} else if (type = HERO_SYSTEM_TYPE.COLORSTAR) {
|
||||
if (isFirstWake) { // 首次觉醒
|
||||
stages = getAllAttrStage();
|
||||
} else {
|
||||
stages.push(isUpStar ? ABI_STAGE.END : colorStarStage);
|
||||
let end = isUpStar? ABI_STAGE.END: colorStarStage;
|
||||
if(end < originColorStarStage) {
|
||||
stages = getAllAttrStage();
|
||||
} else {
|
||||
for(let i = originColorStarStage; i < end; i++) {
|
||||
stages.push(i + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (let stage of stages) {
|
||||
@@ -427,17 +442,18 @@ export function calHeroTrainIncAttr(originHero: HeroType, update: HeroUpdate) {
|
||||
let { attr: heroAttrs, job: oldJob, jobStage: oldJobStage } = originHero;
|
||||
let { job = oldJob, jobStage = oldJobStage } = update;
|
||||
|
||||
let targetAttrId = ABI_TYPE_TO_STAGE.get(jobStage); // 转换为18维的属性id
|
||||
|
||||
let dicJob = gameData.job.get(job);
|
||||
if (dicJob.grade > 1) {
|
||||
|
||||
if (dicJob.grade >= 1) {
|
||||
let jobGradeAndClass = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1);
|
||||
let lastJob = gameData.job.get(jobGradeAndClass.jobid);
|
||||
let inc = (dicJob.ceAttr.get(jobStage) - lastJob.ceAttr.get(jobStage)) * HERO_CE_RATIO;
|
||||
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } })
|
||||
let targetAttrId = dicJob.ceAttr.get(jobStage).id;
|
||||
let inc = (dicJob.ceAttr.get(jobStage).attr - lastJob.ceAttr.get(jobStage).attr) * HERO_CE_RATIO;
|
||||
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } });
|
||||
} else {
|
||||
let inc = dicJob.ceAttr.get(jobStage) * HERO_CE_RATIO;
|
||||
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } })
|
||||
let targetAttrId = dicJob.ceAttr.get(jobStage).id;
|
||||
let inc = dicJob.ceAttr.get(jobStage).attr * HERO_CE_RATIO;
|
||||
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } });
|
||||
}
|
||||
return heroAttrs;
|
||||
}
|
||||
@@ -489,14 +505,15 @@ export function calHeroJobAttr(originHero: HeroType, hero: HeroUpdate, addSeidLi
|
||||
lastJob = gameData.job.get(jobGradeAndClass.jobid);
|
||||
}
|
||||
|
||||
for (let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) {
|
||||
let targetAttrId = ABI_TYPE_TO_STAGE.get(stage);
|
||||
for (let stage = ABI_JOB_STAGE.START; stage < ABI_JOB_STAGE.END; stage++) {
|
||||
if(hero.jobStage >= stage) {
|
||||
let fixUp = currentJob.ceAttr.get(stage) * HERO_CE_RATIO;
|
||||
let targetAttrId = currentJob.ceAttr.get(stage).id;
|
||||
let fixUp = currentJob.ceAttr.get(stage).attr * HERO_CE_RATIO;
|
||||
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp }})
|
||||
} else {
|
||||
if(lastJob) {
|
||||
let fixUp = lastJob.ceAttr.get(stage) * HERO_CE_RATIO;
|
||||
let targetAttrId = lastJob.ceAttr.get(stage).id;
|
||||
let fixUp = lastJob.ceAttr.get(stage).attr * HERO_CE_RATIO;
|
||||
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp } });
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user