百家学宫,名将谱战力
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import {Application, BackendSession, ChannelService} from 'pinus';
|
||||
import { handleCost, addItems } from '../../../services/rewardService';
|
||||
import { calPlayerCeAndSave } from '../../../services/playerCeService';
|
||||
import { resResult, returnHeroCeRatio } from '../../../pubUtils/util';
|
||||
import { resResult, returnHeroCeRatio, getAllAttrStage } from '../../../pubUtils/util';
|
||||
import { STATUS } from '../../../consts/statusCode';
|
||||
import {HeroModel} from '../../../db/Hero';
|
||||
import {CURRENCY_BY_TYPE, CURRENCY_TYPE, CONSUME_TYPE, HERO_GROW_MAX, HERO_SYSTEM_TYPE, ITID, ABI_STAGE, HERO_CE_RATIO} from '../../../consts';
|
||||
@@ -9,7 +9,6 @@ import { RoleModel } from '../../../db/Role';
|
||||
import { ItemModel } from '../../../db/Item';
|
||||
import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getFriendShipById } from '../../../pubUtils/data';
|
||||
import { RewardInter } from '../../../pubUtils/interface';
|
||||
import { getAllAttrStage } from '../../../pubUtils/playerCe';
|
||||
|
||||
export default function(app: Application) {
|
||||
return new HeroHandler(app);
|
||||
@@ -136,7 +135,7 @@ export class HeroHandler {
|
||||
hero.lv = playerLv > newLv?newLv: playerLv;
|
||||
hero.exp = newExp;
|
||||
|
||||
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, getAllAttrStage());
|
||||
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.LVUP, [hid]);
|
||||
const curHero = {
|
||||
hid, lv : heros[0].lv, exp : heros[0].exp
|
||||
}
|
||||
@@ -176,7 +175,7 @@ export class HeroHandler {
|
||||
hero.star = isUpStar? oldStar + 1: oldStar;
|
||||
hero.starStage = isUpStar? ABI_STAGE.START: oldStarStage + 1;
|
||||
|
||||
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, [isUpStar? ABI_STAGE.END: hero.starStage]);
|
||||
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, [hid, isUpStar?1:0]);
|
||||
const curHero = {
|
||||
hid,
|
||||
star : heros[0].star,
|
||||
@@ -220,7 +219,7 @@ export class HeroHandler {
|
||||
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
hero.quality ++;
|
||||
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, getAllAttrStage());
|
||||
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.QUALITY, [hid]);
|
||||
const curHero = {
|
||||
hid,
|
||||
quality : heros[0].quality
|
||||
@@ -263,18 +262,12 @@ export class HeroHandler {
|
||||
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: fragmentNum}, ...consume]);
|
||||
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
let isUpStar = oldColorStar == 0|| oldColorStarStage + 1 == ABI_STAGE.END;
|
||||
let isWakeUp = oldColorStar == 0;
|
||||
let isUpStar = isWakeUp || oldColorStarStage + 1 == ABI_STAGE.END;
|
||||
hero.colorStar = isUpStar? oldColorStar + 1: oldColorStar;
|
||||
hero.colorStarStage = isUpStar? ABI_STAGE.START: oldColorStarStage + 1;
|
||||
|
||||
let args = new Array<number>();
|
||||
if(oldColorStarStage + 1 == ABI_STAGE.END) {
|
||||
args = getAllAttrStage();
|
||||
} else {
|
||||
args.push(isUpStar? ABI_STAGE.END: hero.colorStarStage)
|
||||
}
|
||||
|
||||
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR, args);
|
||||
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.COLORSTAR, [hid, isUpStar?1:0, isWakeUp?1:0]);
|
||||
const curHero = {
|
||||
hid,
|
||||
star : heros[0].star,
|
||||
|
||||
@@ -12,6 +12,9 @@ import { SclResultInter, SclPosInter } from '../../../pubUtils/interface';
|
||||
import { SchoolModel } from '../../../db/School';
|
||||
import { TERAPH_RANDOM } from '../../../consts/consts';
|
||||
import { checkMaterialEnough } from '../../../services/roleService'
|
||||
import { calPlayerCeAndSave } from '../../../services/playerCeService';
|
||||
import { HERO_SYSTEM_TYPE } from '../../../consts';
|
||||
|
||||
export default function(app: Application) {
|
||||
return new RoleHandler(app);
|
||||
}
|
||||
@@ -154,6 +157,7 @@ export class RoleHandler {
|
||||
await RoleModel.updateRoleInfo(roleId, { teraphs: role.teraphs });
|
||||
return resResult(STATUS.SUCCESS, { roleId, teraphs: role.teraphs });
|
||||
}
|
||||
|
||||
// 获得百家学宫
|
||||
async getSchoolList(msg: {}, session: BackendSession) {
|
||||
let roleId = session.get('roleId');
|
||||
@@ -209,10 +213,16 @@ export class RoleHandler {
|
||||
}
|
||||
let isOpen = !!dicPosition.get(positionId.toString()); // 该位置是否解锁
|
||||
|
||||
let findHero = await SchoolModel.findByHid(roleId, hid);
|
||||
if (!!findHero) {
|
||||
return resResult(STATUS.ROLE_SCHOOL_HERO_USED);
|
||||
if(hid > 0) {
|
||||
let findHero = await SchoolModel.findByHid(roleId, hid);
|
||||
if (!!findHero) {
|
||||
return resResult(STATUS.ROLE_SCHOOL_HERO_USED);
|
||||
}
|
||||
|
||||
let curHero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!curHero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
}
|
||||
|
||||
let curSchool = await SchoolModel.findBySclAndPos(roleId, schoolId, positionId);
|
||||
let preHid = 0; // 原先在该位置上的武将
|
||||
if (curSchool) {
|
||||
@@ -220,14 +230,13 @@ export class RoleHandler {
|
||||
preHid = curSchool.hid;
|
||||
}
|
||||
|
||||
let curHero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!curHero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
|
||||
if (!isOpen) {
|
||||
return resResult(STATUS.ROLE_SCHOOL_POSITION_LOCKED);
|
||||
}
|
||||
|
||||
await SchoolModel.updateBySclAndPos(roleId, schoolId, positionId, { hid, isOpen })
|
||||
await calPlayerCeAndSave(sid, roleId, [], HERO_SYSTEM_TYPE.SCHOOL, [schoolId, hid, preHid]);
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
schoolId, positionId, hid, preHid, isOpen
|
||||
@@ -321,6 +330,7 @@ export class RoleHandler {
|
||||
}
|
||||
|
||||
curHero = await HeroModel.updateHeroInfo(roleId, hid, update, 'hid scrollActive scrollStar scrollColorStar scrollQuality favour favourLv');
|
||||
await calPlayerCeAndSave(sid, roleId, [], HERO_SYSTEM_TYPE.SCROLL, [hid, favourLv]);
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
curHero
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
import { pinus } from 'pinus';
|
||||
import { STATUS } from '../consts/statusCode';
|
||||
|
||||
import { resResult } from '../pubUtils/util';
|
||||
import { resResult, reduceCe } from '../pubUtils/util';
|
||||
import { calPlayerCeAndSave as pubCalPlayerCeAndSave, reCalAllHeroCe } from '../pubUtils/playerCe';
|
||||
import { HeroType } from '../db/Hero';
|
||||
const _ = require('underscore');
|
||||
@@ -16,13 +16,19 @@ export async function calPlayerCeAndSave(sid: string, roleId: string, heros: Arr
|
||||
let {role, pushHeros} = await pubCalPlayerCeAndSave(roleId, heros, type, args);
|
||||
//下发战力
|
||||
let uids = [{ uid: roleId, sid }];
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: role.ce, heros: pushHeros, topFiveCe: 0 }), uids);
|
||||
let pushHerosReduced = pushHeros.map(cur => {
|
||||
return { hid: cur.hid, ce: reduceCe(cur.ce), incHeroCe: reduceCe(cur.incHeroCe) }
|
||||
});
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(role.ce) , heros: pushHerosReduced, topFiveCe: 0 }), uids);
|
||||
return heros;
|
||||
}
|
||||
|
||||
export async function calAllHeroCe(sid: string, roleId: string, type:number, args:Array<number>) {
|
||||
let {ce, pushHeros}= await reCalAllHeroCe(roleId,type, args);
|
||||
let uids = [{ uid: roleId, sid }];
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: ce, heros: pushHeros, topFiveCe: 0 }), uids);
|
||||
let pushHerosReduced = pushHeros.map(cur => {
|
||||
return { hid: cur.hid, ce: reduceCe(cur.ce), incHeroCe: reduceCe(cur.incHeroCe) }
|
||||
});
|
||||
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(ce), heros: pushHerosReduced, topFiveCe: 0 }), uids);
|
||||
return;
|
||||
}
|
||||
@@ -1,7 +1,10 @@
|
||||
//武将养成系统分类
|
||||
export const HERO_SYSTEM_TYPE = {
|
||||
INIT: 1,
|
||||
STAR: 2,
|
||||
INIT: 0,
|
||||
STAR: 1,
|
||||
LVUP: 2,
|
||||
COLORSTAR: 3,
|
||||
QUALITY: 4,
|
||||
TRAIN: 5,
|
||||
STAGEUP:6,
|
||||
SKIN:7,
|
||||
@@ -12,7 +15,9 @@ export const HERO_SYSTEM_TYPE = {
|
||||
RESTRENGTHEN: 12,
|
||||
JEWEL_ON: 13,
|
||||
JEWEL_OFF: 14,
|
||||
ADD_SKIN: 15
|
||||
ADD_SKIN: 15,
|
||||
SCHOOL: 16,
|
||||
SCROLL: 17
|
||||
};
|
||||
|
||||
// 武将上限
|
||||
|
||||
@@ -90,7 +90,9 @@ export const FILENAME = {
|
||||
DIC_SUIT: 'dic_zyz_suit',
|
||||
DIC_TITLE: 'dic_zyz_title',
|
||||
DIC_TERAPH: 'dic_zyz_teraph',
|
||||
DIC_SCHOOL: 'dic_zyz_school'
|
||||
DIC_SCHOOL: 'dic_zyz_school',
|
||||
DIC_SCHOOL_RATE: 'dic_zyz_schoolRate',
|
||||
DIC_HERO_SCROLL: 'dic_zyz_heroScroll'
|
||||
}
|
||||
|
||||
export const WAR_RELATE_TABLES = [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { HANG_UP_CONSTS, ROLE_TERAPH } from './../consts';
|
||||
import BaseModel from './BaseModel';
|
||||
import { CeAttr } from './generalField';
|
||||
import { CeAttrRole } from './generalField';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import User from './User';
|
||||
import { shouldRefresh } from '../pubUtils/util';
|
||||
@@ -12,7 +12,7 @@ interface roleUpdate {
|
||||
gold?:number;
|
||||
frdCnt?: number;
|
||||
expeditionPoint?:number;
|
||||
globalCeAttr?:CeAttr;
|
||||
globalCeAttr?:CeAttrRole;
|
||||
title?:number;
|
||||
teraphs?: Teraph[];
|
||||
}
|
||||
@@ -121,8 +121,8 @@ export default class Role extends BaseModel {
|
||||
lv: number; // 主公等级
|
||||
@prop({ required: true, default: 0 })
|
||||
ce: number; // 总战力
|
||||
@prop({ required: true, default: new CeAttr() })
|
||||
globalCeAttr: CeAttr; // 总战力
|
||||
@prop({ required: true, default: new CeAttrRole() })
|
||||
globalCeAttr: CeAttrRole; // 总战力
|
||||
@prop({ required: true, default: 0 })
|
||||
topFiveCe: number; // 最强5人战力
|
||||
@prop({ required: true, type: TopHero, default: [] })
|
||||
|
||||
@@ -2,7 +2,7 @@ import { prop } from '@typegoose/typegoose';
|
||||
|
||||
export class CeAttrData {
|
||||
@prop({ required: true })
|
||||
base?: number = 0;
|
||||
base: number = 0;
|
||||
@prop({ required: true })
|
||||
ratioUp: number = 0;
|
||||
@prop({ required: true })
|
||||
@@ -45,6 +45,47 @@ export class CeAttr {
|
||||
}
|
||||
|
||||
|
||||
export class CeAttrDataRole {
|
||||
@prop({ required: true })
|
||||
ratioUp: number = 0;
|
||||
@prop({ required: true })
|
||||
fixUp: number = 0;
|
||||
}
|
||||
|
||||
export class CeAttrRole {
|
||||
@prop({ required: false })
|
||||
hp?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
atk?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
matk?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
def?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
mdef?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
agi?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
luk?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
hit?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
cri?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
flee?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
antCri?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
damageIncrease?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
damageDecrease?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
defIngnore?: CeAttrDataRole = new CeAttrDataRole();
|
||||
@prop({ required: false })
|
||||
bloodSuck?: CeAttrDataRole = new CeAttrDataRole();
|
||||
}
|
||||
|
||||
|
||||
|
||||
export class CeAttrNumber {
|
||||
@prop({ required: false })
|
||||
|
||||
@@ -33,6 +33,9 @@ import { dicSuit } from './dictionary/DicSuit';
|
||||
import { dicTitle } from './dictionary/DicTitle';
|
||||
import { dicTeraph } from './dictionary/DicTeraph';
|
||||
import { dicSchool } from './dictionary/DicSchool';
|
||||
import { dicSchoolRate } from './dictionary/DicSchoolRate';
|
||||
import { dicHeroScroll, preHeroScroll } from './dictionary/DicHeroScroll';
|
||||
import { ABI_TYPE_TO_STAGE } from "../consts";
|
||||
|
||||
export const gameData = {
|
||||
blurprtCompose: dicBlueprtCompose,
|
||||
@@ -77,7 +80,10 @@ export const gameData = {
|
||||
suit: dicSuit,
|
||||
title: dicTitle,
|
||||
teraphs: dicTeraph,
|
||||
school: dicSchool
|
||||
school: dicSchool,
|
||||
schoolRate: dicSchoolRate,
|
||||
heroScroll: dicHeroScroll,
|
||||
preHeroScroll: preHeroScroll
|
||||
};
|
||||
|
||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||
@@ -214,3 +220,25 @@ export function getTeraph(id: number, grade: number) {
|
||||
const teraphInfo = gameData.teraphs.get(id +'_'+ grade);
|
||||
return teraphInfo;
|
||||
}
|
||||
|
||||
export function getSchoolRateByStar(star: number, colorStar: number, quality: number) {
|
||||
const schoolRate = gameData.schoolRate.get(`${star}_${colorStar}_${quality}`);
|
||||
return schoolRate;
|
||||
}
|
||||
|
||||
export function getScollByStar(quality: number, star: number, curQuality: number, colorStar: number) {
|
||||
const heroScroll = gameData.heroScroll.get(`${quality}_${star}_${curQuality}_${colorStar}`);
|
||||
return heroScroll;
|
||||
}
|
||||
|
||||
|
||||
// 根据存在升星表等的stage字段的id对应17维id
|
||||
export function getFieldByStage(stage: number, jobid: number) {
|
||||
let targetAttrId = ABI_TYPE_TO_STAGE.get(stage);
|
||||
if(typeof targetAttrId === 'number') {
|
||||
return targetAttrId
|
||||
} else {
|
||||
const dicJob = gameData.job.get(jobid);
|
||||
return targetAttrId(dicJob.type);
|
||||
}
|
||||
}
|
||||
47
shared/pubUtils/dictionary/DicHeroScroll.ts
Normal file
47
shared/pubUtils/dictionary/DicHeroScroll.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
// 武将技能表
|
||||
import { readJsonFile } from '../util'
|
||||
import { FILENAME, ABI_STAGE } from '../../consts'
|
||||
|
||||
export interface DicHeroScroll {
|
||||
|
||||
// id
|
||||
readonly id: number;
|
||||
// 初始品质
|
||||
readonly quality: number;
|
||||
// 星级
|
||||
readonly stars: number;
|
||||
// 当前品质
|
||||
readonly qualityUp: number;
|
||||
// 觉醒星级
|
||||
readonly colorstars: number;
|
||||
// 每阶升级属性
|
||||
readonly ceAttr: Map<number, number>
|
||||
|
||||
}
|
||||
|
||||
const str = readJsonFile(FILENAME.DIC_HERO_SCROLL);
|
||||
let arr = JSON.parse(str);
|
||||
|
||||
export const dicHeroScroll = new Map<string, DicHeroScroll>();
|
||||
export const preHeroScroll = new Map<number, DicHeroScroll>(); // 前一个
|
||||
let pre: DicHeroScroll;
|
||||
|
||||
arr.forEach(o => {
|
||||
o.ceAttr = parseCeAttr(o);
|
||||
dicHeroScroll.set(`${o.quality}_${o.stars}_${o.qualityUp}_${o.colorstars}`, o);
|
||||
if(pre && pre.quality == o.quality) preHeroScroll.set(o.id, pre);
|
||||
pre = o;
|
||||
});
|
||||
arr = undefined;
|
||||
pre = 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);
|
||||
ceAttr.set(ABI_STAGE.AGI, elem.agi);
|
||||
ceAttr.set(ABI_STAGE.LUK, elem.luk);
|
||||
return ceAttr;
|
||||
}
|
||||
31
shared/pubUtils/dictionary/DicSchoolRate.ts
Normal file
31
shared/pubUtils/dictionary/DicSchoolRate.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
// 百家学宫列表
|
||||
import { readJsonFile, parseNumberList } from '../util'
|
||||
import { FILENAME } from '../../consts'
|
||||
|
||||
export interface DicSchoolRate {
|
||||
|
||||
// id
|
||||
readonly id: number;
|
||||
// 品质
|
||||
readonly quality: number;
|
||||
// 星级
|
||||
readonly stars: number;
|
||||
// 觉醒星级
|
||||
readonly colorstars: number;
|
||||
// 主属性加百分比
|
||||
readonly mainAttrAPerent: number;
|
||||
// 次级属性加值
|
||||
readonly assiAttrAddValue: number;
|
||||
}
|
||||
|
||||
|
||||
const str = readJsonFile(FILENAME.DIC_SCHOOL_RATE);
|
||||
let arr = JSON.parse(str);
|
||||
|
||||
export const dicSchoolRate = new Map<string, DicSchoolRate>();
|
||||
|
||||
arr.forEach(o => {
|
||||
dicSchoolRate.set(`${o.stars}_${o.colorstars}_${o.quality}`, o);
|
||||
});
|
||||
|
||||
arr = undefined;
|
||||
@@ -4,22 +4,23 @@
|
||||
|
||||
import { HERO_SYSTEM_TYPE, ABI_TYPE, JEWEL_ATTR } from '../consts';
|
||||
|
||||
import { deepCopy } from './util';
|
||||
import { deepCopy, getAllAttrStage } from './util';
|
||||
import { HeroModel, HeroType } from '../db/Hero';
|
||||
import { RoleModel } from '../db/Role';
|
||||
import { CeAttrData, CeAttr, CeAttrNumber } from '../db/generalField';
|
||||
import { CeAttrData, CeAttr, CeAttrRole, CeAttrNumber, CeAttrDataRole } from '../db/generalField';
|
||||
import { getAttrNameByJobStage, getAttrCeRatio, getAtrrNameById, ABI_TYPE_TO_STAGE, ABI_STAGE, SEID_TYPE} from '../consts';
|
||||
import { gameData, getJobByGradeAndClass, getHeroWakeByQuality, getHeroStarByQuality, getFriendShipById } from './data';
|
||||
import { gameData, getJobByGradeAndClass, getHeroWakeByQuality, getHeroStarByQuality, getFriendShipById, getSchoolRateByStar, getScollByStar, getFieldByStage } from './data';
|
||||
import { Attributes } from './interface';
|
||||
import { DicSe } from './dictionary/DicSe';
|
||||
import { EquipType } from '../db/Equip';
|
||||
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||||
import { getGoodById } from './gamedata';
|
||||
import { SchoolModel } from '../db/School';
|
||||
|
||||
const HERO_CE_RATIO = 100;
|
||||
const _ = require('underscore');
|
||||
//战力计算TODO
|
||||
export function calPlayerCe(globalCeAttr: CeAttr, hero: HeroType, type: number, args: Array<number>) {
|
||||
export function calPlayerCe(globalCeAttr: CeAttrRole, hero: HeroType, type: number, args: Array<number> = []) {
|
||||
let incCe = 0;
|
||||
let incArr: Attributes = {};
|
||||
let reIncAttr: CeAttr = {}; // {"hp": {"base": number, "fixUp": number, "ratioUp": number}}
|
||||
@@ -29,8 +30,8 @@ export function calPlayerCe(globalCeAttr: CeAttr, hero: HeroType, type: number,
|
||||
|
||||
if (type == HERO_SYSTEM_TYPE.INIT) {
|
||||
reIncAttr = calHeroInitIncAttr(hero, addSeidList, removeSeidList); // args: 升的星盘
|
||||
} else if (type == HERO_SYSTEM_TYPE.STAR) {
|
||||
reIncAttr = calHeroStarIncAttr(hero, args, addSeidList, removeSeidList); // args: 升的星盘
|
||||
} else if (type == HERO_SYSTEM_TYPE.STAR || type == HERO_SYSTEM_TYPE.LVUP || type == HERO_SYSTEM_TYPE.COLORSTAR || type == HERO_SYSTEM_TYPE.QUALITY) {
|
||||
reIncAttr = calHeroStarIncAttr(hero, type, args.shift(), args, addSeidList, removeSeidList); // args: 升的星盘
|
||||
} else if (type == HERO_SYSTEM_TYPE.TRAIN) {
|
||||
reIncAttr = calHeroTrainIncAttr(hero);
|
||||
} else if (type == HERO_SYSTEM_TYPE.STAGEUP) {
|
||||
@@ -51,19 +52,22 @@ export function calPlayerCe(globalCeAttr: CeAttr, hero: HeroType, type: number,
|
||||
reIncAttr = calHeroCeWhenJewelOn(hero, args);
|
||||
} else if (type == HERO_SYSTEM_TYPE.JEWEL_OFF) {//宝石卸下
|
||||
reIncAttr = calHeroCeWhenJewelOff(hero, args);
|
||||
} else if (type == HERO_SYSTEM_TYPE.SCROLL) { // 名将谱初次激活增加好感度
|
||||
reIncAttr = calHeroCeScrollIncAttr(hero, args[0], args[1]);
|
||||
} else {
|
||||
return incCe;
|
||||
reIncAttr = hero.ceAttr;
|
||||
}
|
||||
|
||||
addSeidEffect(reIncAttr, hero.ceAttr, addSeidList, removeSeidList); // 处理加值
|
||||
if(!hero.ceAttr) hero.ceAttr = new CeAttr();
|
||||
for (let attrName in reIncAttr) {
|
||||
if(!reIncAttr[attrName]) continue;
|
||||
if(!reIncAttr[attrName] || attrName == '_id') continue;
|
||||
let originalAttrData: CeAttrData = hero.ceAttr[attrName]||new CeAttrData();
|
||||
let originalGlobalAttrData: CeAttrData = globalCeAttr[attrName]||new CeAttrData();
|
||||
let originalGlobalAttrData: CeAttrDataRole = globalCeAttr[attrName]||new CeAttrDataRole();
|
||||
let oldCe = (originalAttrData.fixUp + (originalAttrData.equipUp||0)) * HERO_CE_RATIO + originalAttrData.base *(HERO_CE_RATIO + originalAttrData.ratioUp + originalGlobalAttrData.ratioUp);
|
||||
if(!hero.ceAttr[attrName]) hero.ceAttr[attrName] = new CeAttrData();
|
||||
for (let attrKey in reIncAttr[attrName]) {
|
||||
if(attrKey == '_id') continue;
|
||||
hero.ceAttr[attrName][attrKey] = parseInt(reIncAttr[attrName][attrKey]||0);
|
||||
}
|
||||
incArr[attrName] = (reIncAttr[attrName].fixUp + (reIncAttr[attrName].equipUp||0)) * HERO_CE_RATIO + reIncAttr[attrName].base *(HERO_CE_RATIO + reIncAttr[attrName].ratioUp + originalGlobalAttrData.ratioUp) - oldCe; //计算属性
|
||||
@@ -82,23 +86,31 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array<HeroType>,
|
||||
let pushHeros = new Array<{hid: number, ce: number, incHeroCe: number}>();
|
||||
let role = await RoleModel.findByRoleId(roleId);
|
||||
if(!role.globalCeAttr) role.globalCeAttr = new CeAttr();
|
||||
let originalAttr = role.globalCeAttr;
|
||||
|
||||
let reIncAttr: CeAttr = {}; // role表属性增量
|
||||
let reIncAttr: CeAttrRole = {}; // role表属性增量
|
||||
|
||||
if (type == HERO_SYSTEM_TYPE.INIT) {
|
||||
reIncAttr = calRoleInitIncAttr(heros, role.globalCeAttr); // 全局变量增
|
||||
} else if (type == HERO_SYSTEM_TYPE.ADD_SKIN) {
|
||||
reIncAttr = calHeroAddSkin(args, role.globalCeAttr);
|
||||
}
|
||||
|
||||
for (let attrName in reIncAttr) {
|
||||
role.globalCeAttr[attrName].fixUp = reIncAttr[attrName].fixUp;
|
||||
role.globalCeAttr[attrName].ratioUp = reIncAttr[attrName].ratioUp;
|
||||
} else if (type == HERO_SYSTEM_TYPE.SCHOOL) {
|
||||
reIncAttr = calSchoolAddAttr(heros, args[0], args[1], args[2], role.globalCeAttr);
|
||||
} else if (type == HERO_SYSTEM_TYPE.SCROLL) {
|
||||
reIncAttr = calScrollAddAttr(heros, args[0], role.globalCeAttr);
|
||||
} else if (type == HERO_SYSTEM_TYPE.STAR || type == HERO_SYSTEM_TYPE.COLORSTAR || type == HERO_SYSTEM_TYPE.QUALITY) { // 升星时,在百家学宫中部署的武将加成会同时增加
|
||||
reIncAttr = await calSchoolStarIncAttr(heros, type, args, role.globalCeAttr);
|
||||
}
|
||||
|
||||
for (let hero of heros) {
|
||||
let incHeroCe = calPlayerCe(role.globalCeAttr, hero, type, args);
|
||||
for (let attrName in reIncAttr) {
|
||||
let oldcCe = originalAttr[attrName].fixUp * HERO_CE_RATIO + hero.ceAttr[attrName].base * (HERO_CE_RATIO + originalAttr[attrName].ratioUp);
|
||||
let incArr = reIncAttr[attrName].fixUp * HERO_CE_RATIO + hero.ceAttr[attrName].base * (HERO_CE_RATIO + reIncAttr[attrName].ratioUp) - oldcCe;
|
||||
incHeroCe += incArr * getAttrCeRatio(attrName);
|
||||
}
|
||||
incPlayerCe += incHeroCe;
|
||||
hero.ce += incHeroCe;
|
||||
await HeroModel.updateHeroInfo(roleId, hero.hid, hero);
|
||||
pushHeros.push({
|
||||
hid: hero.hid,
|
||||
@@ -106,6 +118,11 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array<HeroType>,
|
||||
incHeroCe : incHeroCe,
|
||||
});
|
||||
}
|
||||
|
||||
for (let attrName in reIncAttr) {
|
||||
role.globalCeAttr[attrName].fixUp = reIncAttr[attrName].fixUp;
|
||||
role.globalCeAttr[attrName].ratioUp = reIncAttr[attrName].ratioUp;
|
||||
}
|
||||
role.ce += incPlayerCe;
|
||||
await RoleModel.updateRoleInfo(roleId, {globalCeAttr: role.globalCeAttr, ce: role.ce});
|
||||
return {pushHeros, role}
|
||||
@@ -113,7 +130,7 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array<HeroType>,
|
||||
|
||||
// 初始战力
|
||||
export function calHeroInitIncAttr(hero: HeroType, addSeidList: Array<number>, removeSeidList: Array<number>) {
|
||||
let res1 = calHeroStarIncAttr(hero, getAllAttrStage(), addSeidList, removeSeidList, true);
|
||||
let res1 = calHeroStarIncAttr(hero, HERO_SYSTEM_TYPE.INIT, hero.hid, [], addSeidList, removeSeidList);
|
||||
let hero1 = combineHeroCeAttr(hero, res1);
|
||||
|
||||
let curSkin = hero.skins.find(cur => cur.enable);
|
||||
@@ -146,7 +163,7 @@ function combineAttrResult(target: CeAttr, origin: CeAttr) {
|
||||
}
|
||||
}
|
||||
|
||||
export function calRoleInitIncAttr(heros: HeroType[], globalCeAttr: CeAttr) {
|
||||
export function calRoleInitIncAttr(heros: HeroType[], globalCeAttr: CeAttrRole) {
|
||||
let args = new Array<number>();
|
||||
for(let hero of heros) {
|
||||
for(let skin of hero.skins) {
|
||||
@@ -175,16 +192,20 @@ function combineHeroCeAttr(originalHero: HeroType, result: CeAttr) {
|
||||
/**
|
||||
*
|
||||
* @param hero HeroType 武将更新后的值
|
||||
* @param args number[] 参数,表示需要更新多少个维
|
||||
* @param type number 类型
|
||||
* @param hid number 当前武将id
|
||||
* @param args number[] 当升星时,一个参数,0-是否升了一星;当觉醒时,两个参数,0-是否升了一星,1-是否初次觉醒
|
||||
* @param addSeidList number[] 用于更新被动
|
||||
* @param removeSeidList number[] 用于更新被动
|
||||
* @param isInit boolean 是否是初次创建武将
|
||||
*/
|
||||
export function calHeroStarIncAttr (hero: HeroType, args: Array<number>, addSeidList: Array<number>, removeSeidList: Array<number>, isInit = false) {
|
||||
export function calHeroStarIncAttr (hero: HeroType, type: number, hid: number, args: number[], addSeidList: Array<number>, removeSeidList: Array<number>) {
|
||||
let isInit = type == HERO_SYSTEM_TYPE.INIT;
|
||||
let {star, starStage, quality, colorStar, colorStarStage, ceAttr, skins} = hero;
|
||||
let originStar = star, originColorStar = colorStar;
|
||||
|
||||
let res: CeAttr = {};
|
||||
if(hero.hid != hid) return res;
|
||||
|
||||
const dicHero = gameData.hero.get(hero.hid);
|
||||
|
||||
const isWake = colorStar > 0; // 是否觉醒,只要激活了觉醒,彩星就会 > 1
|
||||
@@ -195,7 +216,23 @@ export function calHeroStarIncAttr (hero: HeroType, args: Array<number>, addSeid
|
||||
}
|
||||
const dicStar = isWake? getHeroWakeByQuality(quality, originColorStar): getHeroStarByQuality(quality, originStar); // 星级表
|
||||
|
||||
for(let stage of args) {
|
||||
let stages = new Array<number>(); // 需要升级的阶
|
||||
if(type == HERO_SYSTEM_TYPE.INIT) {
|
||||
stages = getAllAttrStage();
|
||||
} else if (type == HERO_SYSTEM_TYPE.LVUP) {
|
||||
stages = getAllAttrStage();
|
||||
} else if (type == HERO_SYSTEM_TYPE.STAR) {
|
||||
stages = [args[0]? ABI_STAGE.END: starStage];
|
||||
} else if (type == HERO_SYSTEM_TYPE.QUALITY) {
|
||||
stages = getAllAttrStage();
|
||||
} else if (type = HERO_SYSTEM_TYPE.COLORSTAR) {
|
||||
if(args[1]) { // 首次觉醒
|
||||
stages = getAllAttrStage();
|
||||
} else {
|
||||
stages.push(args[0]? ABI_STAGE.END: hero.colorStarStage)
|
||||
}
|
||||
}
|
||||
for(let stage of stages) {
|
||||
|
||||
let targetAttrId = getFieldByStage(stage, hero.job); // 转换为17维的属性id
|
||||
let heroAttr = dicHero.baseAbilityArr.get(targetAttrId); // 武将表hp等
|
||||
@@ -249,13 +286,6 @@ function getSeidListOfFashion(fashionid: number, originStar: number, originColor
|
||||
return seidList
|
||||
}
|
||||
|
||||
export function getAllAttrStage () {
|
||||
let attrs = new Array<number>(); // 有升级的属性 1-hp 2-atk 3-def 4-mdef 5-agi 6-luk
|
||||
for(let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) {
|
||||
attrs.push(stage)
|
||||
};
|
||||
return attrs;
|
||||
}
|
||||
//训练
|
||||
export function calHeroTrainIncAttr(hero: HeroType) {
|
||||
let res: CeAttr = {};
|
||||
@@ -495,19 +525,6 @@ export function calRestrengthenIncAttr (hero: HeroType, ePaceId: number, args: A
|
||||
return res
|
||||
}
|
||||
|
||||
|
||||
// 根据存在升星表等的stage字段的id对应17维id
|
||||
function getFieldByStage(stage: number, jobid: number) {
|
||||
let targetAttrId = ABI_TYPE_TO_STAGE.get(stage);
|
||||
if(typeof targetAttrId === 'number') {
|
||||
return targetAttrId
|
||||
} else {
|
||||
const dicJob = gameData.job.get(jobid);
|
||||
return targetAttrId(dicJob.type);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 添加技能增加的被动属性
|
||||
function addSeidEffect(reIncAttr: CeAttr, heroCeAttr: CeAttr,addSeidList: Array<number>, removeSeidList: Array<number>) {
|
||||
|
||||
@@ -613,9 +630,9 @@ function calHeroCeWhenJewelOff(hero: HeroType, args: Array<number>) {
|
||||
}
|
||||
//全局属性加成
|
||||
export async function reCalAllHeroCe(roleId: string, type: number, args:Array<number>) {
|
||||
let reIncAttr: CeAttr = {};
|
||||
let reIncAttr: CeAttrRole = {};
|
||||
let role = await RoleModel.findByRoleId(roleId);
|
||||
if(!role.globalCeAttr) role.globalCeAttr = new CeAttr();
|
||||
if(!role.globalCeAttr) role.globalCeAttr = new CeAttrRole();
|
||||
let originalAttr = role.globalCeAttr;
|
||||
let pushHeros:Array<{hid:number, ce:number, incHeroCe:number}> = []
|
||||
if (type == 1) {//获得皮肤
|
||||
@@ -642,8 +659,8 @@ export async function reCalAllHeroCe(roleId: string, type: number, args:Array<nu
|
||||
return {pushHeros, ce: role.ce}
|
||||
}
|
||||
|
||||
function calHeroAddSkin(args:Array<number>, ceAttr: CeAttr){
|
||||
let res: CeAttr = {};
|
||||
function calHeroAddSkin(args:Array<number>, ceAttr: CeAttrRole){
|
||||
let res: CeAttrRole = {};
|
||||
for (let arg of args) {
|
||||
let addSkin = gameData.fashion.get(arg);
|
||||
let attrName: string;
|
||||
@@ -656,3 +673,139 @@ function calHeroAddSkin(args:Array<number>, ceAttr: CeAttr){
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 全局加成,百家学宫
|
||||
* @param heros 所有武将
|
||||
* @param schoolId 学宫学派
|
||||
* @param hid 换上的武将
|
||||
* @param preHid 撤下的武将
|
||||
* @param ceAttr
|
||||
*/
|
||||
function calSchoolAddAttr(heros: HeroType[], schoolId: number, hid: number, preHid: number, ceAttr: CeAttrRole){
|
||||
let res: CeAttrRole = {};
|
||||
let school = gameData.school.get(schoolId);
|
||||
let preHero = heros.find(cur => cur.hid == preHid);
|
||||
let curHero = heros.find(cur => cur.hid == hid);
|
||||
if(!school ) return res;
|
||||
|
||||
let defaultPercent = {mainAttrAPerent: 0, assiAttrAddValue: 0};
|
||||
let preRate = preHero?getSchoolRateByStar(preHero.star, preHero.colorStar, preHero.quality):defaultPercent;
|
||||
let curRate = curHero?getSchoolRateByStar(curHero.star, curHero.colorStar, curHero.quality):defaultPercent;
|
||||
|
||||
let attrName: string;
|
||||
for(let attrId of school.upAttribute) {
|
||||
attrName = getAtrrNameById(attrId);
|
||||
res[attrName] = {fixUp: ceAttr[attrName].fixUp, ratioUp: ceAttr[attrName].ratioUp};
|
||||
if(attrId < ABI_TYPE.ABI_SPEED) { // 主属性
|
||||
res[attrName].ratioUp += curRate.mainAttrAPerent - preRate.mainAttrAPerent;
|
||||
} else { // 次级属性
|
||||
res[attrName].fixUp += (curRate.assiAttrAddValue - preRate.assiAttrAddValue) * HERO_CE_RATIO;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 升星,觉醒,升品时,百家学宫配置武将会相应修改全局战力
|
||||
* @param heros HeroType[] 传入只有一个,如果有全局计算,后面push其他武将
|
||||
* @param type number 类型
|
||||
* @param args
|
||||
* @param ceAttr
|
||||
*/
|
||||
async function calSchoolStarIncAttr(heros: HeroType[], type: number, args: number[], ceAttr: CeAttrRole) {
|
||||
let res: CeAttrRole = {};
|
||||
let [hid, isStarUp] = args; // 是否升星,是否初次觉醒
|
||||
let needCal = false;
|
||||
let roleId: string = '';
|
||||
for(let hero of heros) {
|
||||
if(hero.hid != hid) {
|
||||
continue;
|
||||
}
|
||||
if((type == HERO_SYSTEM_TYPE.STAR || type == HERO_SYSTEM_TYPE.COLORSTAR) && !isStarUp) {
|
||||
continue;
|
||||
}
|
||||
roleId = hero.roleId;
|
||||
let curHeroInSchool = await SchoolModel.findByHid(roleId, hid);
|
||||
if(!curHeroInSchool) continue;
|
||||
|
||||
let preStar = hero.star, preColorStar = hero.colorStar, preQuality = hero.quality;
|
||||
if( type == HERO_SYSTEM_TYPE.STAR && isStarUp) {
|
||||
preStar --;
|
||||
} else if ( type == HERO_SYSTEM_TYPE.QUALITY ) {
|
||||
preQuality --;
|
||||
} else if ( type == HERO_SYSTEM_TYPE.COLORSTAR ) {
|
||||
preColorStar --;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
let school = gameData.school.get(curHeroInSchool.schoolId);
|
||||
let preRate = getSchoolRateByStar(preStar, preColorStar, preQuality);
|
||||
let curRate = getSchoolRateByStar(hero.star, hero.colorStar, hero.quality);
|
||||
|
||||
let attrName: string;
|
||||
for(let attrId of school.upAttribute) {
|
||||
attrName = getAtrrNameById(attrId);
|
||||
res[attrName] = {fixUp: ceAttr[attrName].fixUp, ratioUp: ceAttr[attrName].ratioUp};
|
||||
if(attrId < ABI_TYPE.ABI_SPEED) { // 主属性
|
||||
res[attrName].ratioUp += curRate.mainAttrAPerent - preRate.mainAttrAPerent;
|
||||
} else { // 次级属性
|
||||
res[attrName].fixUp += (curRate.assiAttrAddValue - preRate.assiAttrAddValue) * HERO_CE_RATIO;
|
||||
}
|
||||
}
|
||||
needCal = true;
|
||||
|
||||
}
|
||||
|
||||
if(needCal) {
|
||||
const allHeros = await HeroModel.findByRole(roleId);
|
||||
for(let hero of allHeros) {
|
||||
if(hero.hid != hid) heros.push(hero);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 全局加成, 名将谱
|
||||
* @param heros 所有武将
|
||||
* @param hid 激活的武将
|
||||
* @param ceAttr
|
||||
*/
|
||||
function calScrollAddAttr(heros: HeroType[], hid: number, ceAttr: CeAttrRole){
|
||||
let res: CeAttrRole = {};
|
||||
|
||||
let curHero = heros.find(cur => cur.hid == hid);
|
||||
let dicHero = gameData.hero.get(hid);
|
||||
if(!curHero|| ! dicHero) return res;
|
||||
let { quality } = dicHero;
|
||||
let { star, quality: curQuality, colorStar, job } = curHero;
|
||||
let heroScroll = getScollByStar(quality, star, curQuality, colorStar);
|
||||
if(!heroScroll) return res;
|
||||
|
||||
let preScroll = gameData.preHeroScroll.get(heroScroll.id);
|
||||
heroScroll.ceAttr.forEach((add, id) => {
|
||||
let attId = getFieldByStage(id, job);
|
||||
let attrName = getAtrrNameById(attId);
|
||||
|
||||
let preAdd = preScroll?preScroll.ceAttr.get(id): 0;
|
||||
|
||||
res[attrName] = {fixUp: ceAttr[attrName].fixUp, ratioUp: ceAttr[attrName].ratioUp};
|
||||
res[attrName].fixUp += (add - preAdd) * HERO_CE_RATIO;
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 名将谱激活增加单个武将好感
|
||||
* @param hero 当前武将
|
||||
* @param hid 激活武将
|
||||
* @param preFavourLv 之前的好感度等级,有提升时才计算加成
|
||||
*/
|
||||
function calHeroCeScrollIncAttr(hero: HeroType, hid: number, preFavourLv: number) {
|
||||
let res: CeAttr = {};
|
||||
if(hero.hid == hid && hero.favourLv != preFavourLv) {
|
||||
res = calHeroFavourUpIncAttr(hero, [preFavourLv]);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@ import Actor from './actor';
|
||||
import fs = require('fs');
|
||||
import path = require('path');
|
||||
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||||
import { HERO_CE_RATIO } from '../consts';
|
||||
import { HERO_CE_RATIO, ABI_STAGE } from '../consts';
|
||||
|
||||
const _ = require('underscore');
|
||||
|
||||
const moment = require('moment');
|
||||
@@ -546,4 +547,14 @@ export function getRandomArr(allarr, ranNum) {
|
||||
result.push(arr.splice(ran, 1)[0]);
|
||||
};
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// 获取全部属性
|
||||
export function getAllAttrStage () {
|
||||
let attrs = new Array<number>(); // 有升级的属性 1-hp 2-atk 3-def 4-mdef 5-agi 6-luk
|
||||
for(let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) {
|
||||
attrs.push(stage)
|
||||
};
|
||||
return attrs;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user