百家学宫,名将谱战力
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import {Application, BackendSession, ChannelService} from 'pinus';
|
import {Application, BackendSession, ChannelService} from 'pinus';
|
||||||
import { handleCost, addItems } from '../../../services/rewardService';
|
import { handleCost, addItems } from '../../../services/rewardService';
|
||||||
import { calPlayerCeAndSave } from '../../../services/playerCeService';
|
import { calPlayerCeAndSave } from '../../../services/playerCeService';
|
||||||
import { resResult, returnHeroCeRatio } from '../../../pubUtils/util';
|
import { resResult, returnHeroCeRatio, getAllAttrStage } from '../../../pubUtils/util';
|
||||||
import { STATUS } from '../../../consts/statusCode';
|
import { STATUS } from '../../../consts/statusCode';
|
||||||
import {HeroModel} from '../../../db/Hero';
|
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';
|
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 { ItemModel } from '../../../db/Item';
|
||||||
import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getFriendShipById } from '../../../pubUtils/data';
|
import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getFriendShipById } from '../../../pubUtils/data';
|
||||||
import { RewardInter } from '../../../pubUtils/interface';
|
import { RewardInter } from '../../../pubUtils/interface';
|
||||||
import { getAllAttrStage } from '../../../pubUtils/playerCe';
|
|
||||||
|
|
||||||
export default function(app: Application) {
|
export default function(app: Application) {
|
||||||
return new HeroHandler(app);
|
return new HeroHandler(app);
|
||||||
@@ -136,7 +135,7 @@ export class HeroHandler {
|
|||||||
hero.lv = playerLv > newLv?newLv: playerLv;
|
hero.lv = playerLv > newLv?newLv: playerLv;
|
||||||
hero.exp = newExp;
|
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 = {
|
const curHero = {
|
||||||
hid, lv : heros[0].lv, exp : heros[0].exp
|
hid, lv : heros[0].lv, exp : heros[0].exp
|
||||||
}
|
}
|
||||||
@@ -176,7 +175,7 @@ export class HeroHandler {
|
|||||||
hero.star = isUpStar? oldStar + 1: oldStar;
|
hero.star = isUpStar? oldStar + 1: oldStar;
|
||||||
hero.starStage = isUpStar? ABI_STAGE.START: oldStarStage + 1;
|
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 = {
|
const curHero = {
|
||||||
hid,
|
hid,
|
||||||
star : heros[0].star,
|
star : heros[0].star,
|
||||||
@@ -220,7 +219,7 @@ export class HeroHandler {
|
|||||||
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||||
|
|
||||||
hero.quality ++;
|
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 = {
|
const curHero = {
|
||||||
hid,
|
hid,
|
||||||
quality : heros[0].quality
|
quality : heros[0].quality
|
||||||
@@ -263,18 +262,12 @@ export class HeroHandler {
|
|||||||
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: fragmentNum}, ...consume]);
|
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: fragmentNum}, ...consume]);
|
||||||
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
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.colorStar = isUpStar? oldColorStar + 1: oldColorStar;
|
||||||
hero.colorStarStage = isUpStar? ABI_STAGE.START: oldColorStarStage + 1;
|
hero.colorStarStage = isUpStar? ABI_STAGE.START: oldColorStarStage + 1;
|
||||||
|
|
||||||
let args = new Array<number>();
|
let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.COLORSTAR, [hid, isUpStar?1:0, isWakeUp?1:0]);
|
||||||
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);
|
|
||||||
const curHero = {
|
const curHero = {
|
||||||
hid,
|
hid,
|
||||||
star : heros[0].star,
|
star : heros[0].star,
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ import { SclResultInter, SclPosInter } from '../../../pubUtils/interface';
|
|||||||
import { SchoolModel } from '../../../db/School';
|
import { SchoolModel } from '../../../db/School';
|
||||||
import { TERAPH_RANDOM } from '../../../consts/consts';
|
import { TERAPH_RANDOM } from '../../../consts/consts';
|
||||||
import { checkMaterialEnough } from '../../../services/roleService'
|
import { checkMaterialEnough } from '../../../services/roleService'
|
||||||
|
import { calPlayerCeAndSave } from '../../../services/playerCeService';
|
||||||
|
import { HERO_SYSTEM_TYPE } from '../../../consts';
|
||||||
|
|
||||||
export default function(app: Application) {
|
export default function(app: Application) {
|
||||||
return new RoleHandler(app);
|
return new RoleHandler(app);
|
||||||
}
|
}
|
||||||
@@ -154,6 +157,7 @@ export class RoleHandler {
|
|||||||
await RoleModel.updateRoleInfo(roleId, { teraphs: role.teraphs });
|
await RoleModel.updateRoleInfo(roleId, { teraphs: role.teraphs });
|
||||||
return resResult(STATUS.SUCCESS, { roleId, teraphs: role.teraphs });
|
return resResult(STATUS.SUCCESS, { roleId, teraphs: role.teraphs });
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得百家学宫
|
// 获得百家学宫
|
||||||
async getSchoolList(msg: {}, session: BackendSession) {
|
async getSchoolList(msg: {}, session: BackendSession) {
|
||||||
let roleId = session.get('roleId');
|
let roleId = session.get('roleId');
|
||||||
@@ -209,10 +213,16 @@ export class RoleHandler {
|
|||||||
}
|
}
|
||||||
let isOpen = !!dicPosition.get(positionId.toString()); // 该位置是否解锁
|
let isOpen = !!dicPosition.get(positionId.toString()); // 该位置是否解锁
|
||||||
|
|
||||||
let findHero = await SchoolModel.findByHid(roleId, hid);
|
if(hid > 0) {
|
||||||
if (!!findHero) {
|
let findHero = await SchoolModel.findByHid(roleId, hid);
|
||||||
return resResult(STATUS.ROLE_SCHOOL_HERO_USED);
|
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 curSchool = await SchoolModel.findBySclAndPos(roleId, schoolId, positionId);
|
||||||
let preHid = 0; // 原先在该位置上的武将
|
let preHid = 0; // 原先在该位置上的武将
|
||||||
if (curSchool) {
|
if (curSchool) {
|
||||||
@@ -220,14 +230,13 @@ export class RoleHandler {
|
|||||||
preHid = curSchool.hid;
|
preHid = curSchool.hid;
|
||||||
}
|
}
|
||||||
|
|
||||||
let curHero = await HeroModel.findByHidAndRole(hid, roleId);
|
|
||||||
if (!curHero) return resResult(STATUS.HERO_NOT_FIND);
|
|
||||||
|
|
||||||
if (!isOpen) {
|
if (!isOpen) {
|
||||||
return resResult(STATUS.ROLE_SCHOOL_POSITION_LOCKED);
|
return resResult(STATUS.ROLE_SCHOOL_POSITION_LOCKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
await SchoolModel.updateBySclAndPos(roleId, schoolId, positionId, { hid, isOpen })
|
await SchoolModel.updateBySclAndPos(roleId, schoolId, positionId, { hid, isOpen })
|
||||||
|
await calPlayerCeAndSave(sid, roleId, [], HERO_SYSTEM_TYPE.SCHOOL, [schoolId, hid, preHid]);
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
schoolId, positionId, hid, preHid, isOpen
|
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');
|
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, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
curHero
|
curHero
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
import { pinus } from 'pinus';
|
import { pinus } from 'pinus';
|
||||||
import { STATUS } from '../consts/statusCode';
|
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 { calPlayerCeAndSave as pubCalPlayerCeAndSave, reCalAllHeroCe } from '../pubUtils/playerCe';
|
||||||
import { HeroType } from '../db/Hero';
|
import { HeroType } from '../db/Hero';
|
||||||
const _ = require('underscore');
|
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 {role, pushHeros} = await pubCalPlayerCeAndSave(roleId, heros, type, args);
|
||||||
//下发战力
|
//下发战力
|
||||||
let uids = [{ uid: roleId, sid }];
|
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;
|
return heros;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function calAllHeroCe(sid: string, roleId: string, type:number, args:Array<number>) {
|
export async function calAllHeroCe(sid: string, roleId: string, type:number, args:Array<number>) {
|
||||||
let {ce, pushHeros}= await reCalAllHeroCe(roleId,type, args);
|
let {ce, pushHeros}= await reCalAllHeroCe(roleId,type, args);
|
||||||
let uids = [{ uid: roleId, sid }];
|
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;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
//武将养成系统分类
|
//武将养成系统分类
|
||||||
export const HERO_SYSTEM_TYPE = {
|
export const HERO_SYSTEM_TYPE = {
|
||||||
INIT: 1,
|
INIT: 0,
|
||||||
STAR: 2,
|
STAR: 1,
|
||||||
|
LVUP: 2,
|
||||||
|
COLORSTAR: 3,
|
||||||
|
QUALITY: 4,
|
||||||
TRAIN: 5,
|
TRAIN: 5,
|
||||||
STAGEUP:6,
|
STAGEUP:6,
|
||||||
SKIN:7,
|
SKIN:7,
|
||||||
@@ -12,7 +15,9 @@ export const HERO_SYSTEM_TYPE = {
|
|||||||
RESTRENGTHEN: 12,
|
RESTRENGTHEN: 12,
|
||||||
JEWEL_ON: 13,
|
JEWEL_ON: 13,
|
||||||
JEWEL_OFF: 14,
|
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_SUIT: 'dic_zyz_suit',
|
||||||
DIC_TITLE: 'dic_zyz_title',
|
DIC_TITLE: 'dic_zyz_title',
|
||||||
DIC_TERAPH: 'dic_zyz_teraph',
|
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 = [
|
export const WAR_RELATE_TABLES = [
|
||||||
|
|||||||
+4
-4
@@ -1,6 +1,6 @@
|
|||||||
import { HANG_UP_CONSTS, ROLE_TERAPH } from './../consts';
|
import { HANG_UP_CONSTS, ROLE_TERAPH } from './../consts';
|
||||||
import BaseModel from './BaseModel';
|
import BaseModel from './BaseModel';
|
||||||
import { CeAttr } from './generalField';
|
import { CeAttrRole } from './generalField';
|
||||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||||
import User from './User';
|
import User from './User';
|
||||||
import { shouldRefresh } from '../pubUtils/util';
|
import { shouldRefresh } from '../pubUtils/util';
|
||||||
@@ -12,7 +12,7 @@ interface roleUpdate {
|
|||||||
gold?:number;
|
gold?:number;
|
||||||
frdCnt?: number;
|
frdCnt?: number;
|
||||||
expeditionPoint?:number;
|
expeditionPoint?:number;
|
||||||
globalCeAttr?:CeAttr;
|
globalCeAttr?:CeAttrRole;
|
||||||
title?:number;
|
title?:number;
|
||||||
teraphs?: Teraph[];
|
teraphs?: Teraph[];
|
||||||
}
|
}
|
||||||
@@ -121,8 +121,8 @@ export default class Role extends BaseModel {
|
|||||||
lv: number; // 主公等级
|
lv: number; // 主公等级
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
ce: number; // 总战力
|
ce: number; // 总战力
|
||||||
@prop({ required: true, default: new CeAttr() })
|
@prop({ required: true, default: new CeAttrRole() })
|
||||||
globalCeAttr: CeAttr; // 总战力
|
globalCeAttr: CeAttrRole; // 总战力
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
topFiveCe: number; // 最强5人战力
|
topFiveCe: number; // 最强5人战力
|
||||||
@prop({ required: true, type: TopHero, default: [] })
|
@prop({ required: true, type: TopHero, default: [] })
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { prop } from '@typegoose/typegoose';
|
|||||||
|
|
||||||
export class CeAttrData {
|
export class CeAttrData {
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
base?: number = 0;
|
base: number = 0;
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
ratioUp: number = 0;
|
ratioUp: number = 0;
|
||||||
@prop({ required: true })
|
@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 {
|
export class CeAttrNumber {
|
||||||
@prop({ required: false })
|
@prop({ required: false })
|
||||||
|
|||||||
+29
-1
@@ -33,6 +33,9 @@ import { dicSuit } from './dictionary/DicSuit';
|
|||||||
import { dicTitle } from './dictionary/DicTitle';
|
import { dicTitle } from './dictionary/DicTitle';
|
||||||
import { dicTeraph } from './dictionary/DicTeraph';
|
import { dicTeraph } from './dictionary/DicTeraph';
|
||||||
import { dicSchool } from './dictionary/DicSchool';
|
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 = {
|
export const gameData = {
|
||||||
blurprtCompose: dicBlueprtCompose,
|
blurprtCompose: dicBlueprtCompose,
|
||||||
@@ -77,7 +80,10 @@ export const gameData = {
|
|||||||
suit: dicSuit,
|
suit: dicSuit,
|
||||||
title: dicTitle,
|
title: dicTitle,
|
||||||
teraphs: dicTeraph,
|
teraphs: dicTeraph,
|
||||||
school: dicSchool
|
school: dicSchool,
|
||||||
|
schoolRate: dicSchoolRate,
|
||||||
|
heroScroll: dicHeroScroll,
|
||||||
|
preHeroScroll: preHeroScroll
|
||||||
};
|
};
|
||||||
|
|
||||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||||
@@ -214,3 +220,25 @@ export function getTeraph(id: number, grade: number) {
|
|||||||
const teraphInfo = gameData.teraphs.get(id +'_'+ grade);
|
const teraphInfo = gameData.teraphs.get(id +'_'+ grade);
|
||||||
return teraphInfo;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
+198
-45
@@ -4,22 +4,23 @@
|
|||||||
|
|
||||||
import { HERO_SYSTEM_TYPE, ABI_TYPE, JEWEL_ATTR } from '../consts';
|
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 { HeroModel, HeroType } from '../db/Hero';
|
||||||
import { RoleModel } from '../db/Role';
|
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 { 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 { Attributes } from './interface';
|
||||||
import { DicSe } from './dictionary/DicSe';
|
import { DicSe } from './dictionary/DicSe';
|
||||||
import { EquipType } from '../db/Equip';
|
import { EquipType } from '../db/Equip';
|
||||||
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||||||
import { getGoodById } from './gamedata';
|
import { getGoodById } from './gamedata';
|
||||||
|
import { SchoolModel } from '../db/School';
|
||||||
|
|
||||||
const HERO_CE_RATIO = 100;
|
const HERO_CE_RATIO = 100;
|
||||||
const _ = require('underscore');
|
const _ = require('underscore');
|
||||||
//战力计算TODO
|
//战力计算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 incCe = 0;
|
||||||
let incArr: Attributes = {};
|
let incArr: Attributes = {};
|
||||||
let reIncAttr: CeAttr = {}; // {"hp": {"base": number, "fixUp": number, "ratioUp": number}}
|
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) {
|
if (type == HERO_SYSTEM_TYPE.INIT) {
|
||||||
reIncAttr = calHeroInitIncAttr(hero, addSeidList, removeSeidList); // args: 升的星盘
|
reIncAttr = calHeroInitIncAttr(hero, addSeidList, removeSeidList); // args: 升的星盘
|
||||||
} else if (type == HERO_SYSTEM_TYPE.STAR) {
|
} 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, args, addSeidList, removeSeidList); // args: 升的星盘
|
reIncAttr = calHeroStarIncAttr(hero, type, args.shift(), args, addSeidList, removeSeidList); // args: 升的星盘
|
||||||
} else if (type == HERO_SYSTEM_TYPE.TRAIN) {
|
} else if (type == HERO_SYSTEM_TYPE.TRAIN) {
|
||||||
reIncAttr = calHeroTrainIncAttr(hero);
|
reIncAttr = calHeroTrainIncAttr(hero);
|
||||||
} else if (type == HERO_SYSTEM_TYPE.STAGEUP) {
|
} else if (type == HERO_SYSTEM_TYPE.STAGEUP) {
|
||||||
@@ -51,19 +52,22 @@ export function calPlayerCe(globalCeAttr: CeAttr, hero: HeroType, type: number,
|
|||||||
reIncAttr = calHeroCeWhenJewelOn(hero, args);
|
reIncAttr = calHeroCeWhenJewelOn(hero, args);
|
||||||
} else if (type == HERO_SYSTEM_TYPE.JEWEL_OFF) {//宝石卸下
|
} else if (type == HERO_SYSTEM_TYPE.JEWEL_OFF) {//宝石卸下
|
||||||
reIncAttr = calHeroCeWhenJewelOff(hero, args);
|
reIncAttr = calHeroCeWhenJewelOff(hero, args);
|
||||||
|
} else if (type == HERO_SYSTEM_TYPE.SCROLL) { // 名将谱初次激活增加好感度
|
||||||
|
reIncAttr = calHeroCeScrollIncAttr(hero, args[0], args[1]);
|
||||||
} else {
|
} else {
|
||||||
return incCe;
|
reIncAttr = hero.ceAttr;
|
||||||
}
|
}
|
||||||
|
|
||||||
addSeidEffect(reIncAttr, hero.ceAttr, addSeidList, removeSeidList); // 处理加值
|
addSeidEffect(reIncAttr, hero.ceAttr, addSeidList, removeSeidList); // 处理加值
|
||||||
if(!hero.ceAttr) hero.ceAttr = new CeAttr();
|
if(!hero.ceAttr) hero.ceAttr = new CeAttr();
|
||||||
for (let attrName in reIncAttr) {
|
for (let attrName in reIncAttr) {
|
||||||
if(!reIncAttr[attrName]) continue;
|
if(!reIncAttr[attrName] || attrName == '_id') continue;
|
||||||
let originalAttrData: CeAttrData = hero.ceAttr[attrName]||new CeAttrData();
|
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);
|
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();
|
if(!hero.ceAttr[attrName]) hero.ceAttr[attrName] = new CeAttrData();
|
||||||
for (let attrKey in reIncAttr[attrName]) {
|
for (let attrKey in reIncAttr[attrName]) {
|
||||||
|
if(attrKey == '_id') continue;
|
||||||
hero.ceAttr[attrName][attrKey] = parseInt(reIncAttr[attrName][attrKey]||0);
|
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; //计算属性
|
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 pushHeros = new Array<{hid: number, ce: number, incHeroCe: number}>();
|
||||||
let role = await RoleModel.findByRoleId(roleId);
|
let role = await RoleModel.findByRoleId(roleId);
|
||||||
if(!role.globalCeAttr) role.globalCeAttr = new CeAttr();
|
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) {
|
if (type == HERO_SYSTEM_TYPE.INIT) {
|
||||||
reIncAttr = calRoleInitIncAttr(heros, role.globalCeAttr); // 全局变量增
|
reIncAttr = calRoleInitIncAttr(heros, role.globalCeAttr); // 全局变量增
|
||||||
} else if (type == HERO_SYSTEM_TYPE.ADD_SKIN) {
|
} else if (type == HERO_SYSTEM_TYPE.ADD_SKIN) {
|
||||||
reIncAttr = calHeroAddSkin(args, role.globalCeAttr);
|
reIncAttr = calHeroAddSkin(args, role.globalCeAttr);
|
||||||
}
|
} else if (type == HERO_SYSTEM_TYPE.SCHOOL) {
|
||||||
|
reIncAttr = calSchoolAddAttr(heros, args[0], args[1], args[2], role.globalCeAttr);
|
||||||
for (let attrName in reIncAttr) {
|
} else if (type == HERO_SYSTEM_TYPE.SCROLL) {
|
||||||
role.globalCeAttr[attrName].fixUp = reIncAttr[attrName].fixUp;
|
reIncAttr = calScrollAddAttr(heros, args[0], role.globalCeAttr);
|
||||||
role.globalCeAttr[attrName].ratioUp = reIncAttr[attrName].ratioUp;
|
} 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) {
|
for (let hero of heros) {
|
||||||
let incHeroCe = calPlayerCe(role.globalCeAttr, hero, type, args);
|
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;
|
incPlayerCe += incHeroCe;
|
||||||
|
hero.ce += incHeroCe;
|
||||||
await HeroModel.updateHeroInfo(roleId, hero.hid, hero);
|
await HeroModel.updateHeroInfo(roleId, hero.hid, hero);
|
||||||
pushHeros.push({
|
pushHeros.push({
|
||||||
hid: hero.hid,
|
hid: hero.hid,
|
||||||
@@ -106,6 +118,11 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array<HeroType>,
|
|||||||
incHeroCe : incHeroCe,
|
incHeroCe : incHeroCe,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (let attrName in reIncAttr) {
|
||||||
|
role.globalCeAttr[attrName].fixUp = reIncAttr[attrName].fixUp;
|
||||||
|
role.globalCeAttr[attrName].ratioUp = reIncAttr[attrName].ratioUp;
|
||||||
|
}
|
||||||
role.ce += incPlayerCe;
|
role.ce += incPlayerCe;
|
||||||
await RoleModel.updateRoleInfo(roleId, {globalCeAttr: role.globalCeAttr, ce: role.ce});
|
await RoleModel.updateRoleInfo(roleId, {globalCeAttr: role.globalCeAttr, ce: role.ce});
|
||||||
return {pushHeros, role}
|
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>) {
|
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 hero1 = combineHeroCeAttr(hero, res1);
|
||||||
|
|
||||||
let curSkin = hero.skins.find(cur => cur.enable);
|
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>();
|
let args = new Array<number>();
|
||||||
for(let hero of heros) {
|
for(let hero of heros) {
|
||||||
for(let skin of hero.skins) {
|
for(let skin of hero.skins) {
|
||||||
@@ -175,16 +192,20 @@ function combineHeroCeAttr(originalHero: HeroType, result: CeAttr) {
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param hero HeroType 武将更新后的值
|
* @param hero HeroType 武将更新后的值
|
||||||
* @param args number[] 参数,表示需要更新多少个维
|
* @param type number 类型
|
||||||
|
* @param hid number 当前武将id
|
||||||
|
* @param args number[] 当升星时,一个参数,0-是否升了一星;当觉醒时,两个参数,0-是否升了一星,1-是否初次觉醒
|
||||||
* @param addSeidList number[] 用于更新被动
|
* @param addSeidList number[] 用于更新被动
|
||||||
* @param removeSeidList 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 {star, starStage, quality, colorStar, colorStarStage, ceAttr, skins} = hero;
|
||||||
let originStar = star, originColorStar = colorStar;
|
let originStar = star, originColorStar = colorStar;
|
||||||
|
|
||||||
let res: CeAttr = {};
|
let res: CeAttr = {};
|
||||||
|
if(hero.hid != hid) return res;
|
||||||
|
|
||||||
const dicHero = gameData.hero.get(hero.hid);
|
const dicHero = gameData.hero.get(hero.hid);
|
||||||
|
|
||||||
const isWake = colorStar > 0; // 是否觉醒,只要激活了觉醒,彩星就会 > 1
|
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); // 星级表
|
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 targetAttrId = getFieldByStage(stage, hero.job); // 转换为17维的属性id
|
||||||
let heroAttr = dicHero.baseAbilityArr.get(targetAttrId); // 武将表hp等
|
let heroAttr = dicHero.baseAbilityArr.get(targetAttrId); // 武将表hp等
|
||||||
@@ -249,13 +286,6 @@ function getSeidListOfFashion(fashionid: number, originStar: number, originColor
|
|||||||
return seidList
|
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) {
|
export function calHeroTrainIncAttr(hero: HeroType) {
|
||||||
let res: CeAttr = {};
|
let res: CeAttr = {};
|
||||||
@@ -495,19 +525,6 @@ export function calRestrengthenIncAttr (hero: HeroType, ePaceId: number, args: A
|
|||||||
return res
|
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>) {
|
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>) {
|
export async function reCalAllHeroCe(roleId: string, type: number, args:Array<number>) {
|
||||||
let reIncAttr: CeAttr = {};
|
let reIncAttr: CeAttrRole = {};
|
||||||
let role = await RoleModel.findByRoleId(roleId);
|
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 originalAttr = role.globalCeAttr;
|
||||||
let pushHeros:Array<{hid:number, ce:number, incHeroCe:number}> = []
|
let pushHeros:Array<{hid:number, ce:number, incHeroCe:number}> = []
|
||||||
if (type == 1) {//获得皮肤
|
if (type == 1) {//获得皮肤
|
||||||
@@ -642,8 +659,8 @@ export async function reCalAllHeroCe(roleId: string, type: number, args:Array<nu
|
|||||||
return {pushHeros, ce: role.ce}
|
return {pushHeros, ce: role.ce}
|
||||||
}
|
}
|
||||||
|
|
||||||
function calHeroAddSkin(args:Array<number>, ceAttr: CeAttr){
|
function calHeroAddSkin(args:Array<number>, ceAttr: CeAttrRole){
|
||||||
let res: CeAttr = {};
|
let res: CeAttrRole = {};
|
||||||
for (let arg of args) {
|
for (let arg of args) {
|
||||||
let addSkin = gameData.fashion.get(arg);
|
let addSkin = gameData.fashion.get(arg);
|
||||||
let attrName: string;
|
let attrName: string;
|
||||||
@@ -656,3 +673,139 @@ function calHeroAddSkin(args:Array<number>, ceAttr: CeAttr){
|
|||||||
return res;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
+12
-1
@@ -9,7 +9,8 @@ import Actor from './actor';
|
|||||||
import fs = require('fs');
|
import fs = require('fs');
|
||||||
import path = require('path');
|
import path = require('path');
|
||||||
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||||||
import { HERO_CE_RATIO } from '../consts';
|
import { HERO_CE_RATIO, ABI_STAGE } from '../consts';
|
||||||
|
|
||||||
const _ = require('underscore');
|
const _ = require('underscore');
|
||||||
|
|
||||||
const moment = require('moment');
|
const moment = require('moment');
|
||||||
@@ -547,3 +548,13 @@ export function getRandomArr(allarr, ranNum) {
|
|||||||
};
|
};
|
||||||
return result;
|
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