Revert "revert 50867e88 to a1aabfdd"

This reverts commit a112732226.
This commit is contained in:
luying
2021-07-12 14:47:43 +08:00
parent c4d5bf3edd
commit 30bd43d98e
17 changed files with 6675 additions and 3876 deletions
@@ -1,5 +1,5 @@
import { Application, BackendSession } from "pinus"; import { Application, BackendSession } from "pinus";
import { STATUS, EQUIP_STRENGTHEN_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, HERO_SYSTEM_TYPE, CONSUME_TYPE, HERO_GROW_MAX, MSG_SOURCE, JEWEL_PUSH_LV, TASK_TYPE } from "../../../consts"; import { STATUS, EQUIP_STRENGTHEN_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, HERO_SYSTEM_TYPE, CONSUME_TYPE, HERO_GROW_MAX, MSG_SOURCE, JEWEL_PUSH_LV, TASK_TYPE, HERO_CE_RATIO } from "../../../consts";
import { ItemInter } from "../../../pubUtils/interface"; import { ItemInter } from "../../../pubUtils/interface";
import { resResult, parseGoodStr, getRandValueByMinMax, getRandEelm } from "../../../pubUtils/util"; import { resResult, parseGoodStr, getRandValueByMinMax, getRandEelm } from "../../../pubUtils/util";
@@ -10,12 +10,13 @@ import Role from "../../../db/Role";
import { calPlayerCeAndSave } from "../../../services/playerCeService"; import { calPlayerCeAndSave } from "../../../services/playerCeService";
import { getHeroJob, getGoodById, gameData, getHeroEquipByClassId } from "../../../pubUtils/data"; import { getHeroJob, getGoodById, gameData, getHeroEquipByClassId } from "../../../pubUtils/data";
import { EQUIP } from "../../../pubUtils/dicParam"; import { EQUIP } from "../../../pubUtils/dicParam";
import { ITID, SPEICAL_ITEM, QUALITY_TYPE } from "../../../consts/constModules/itemConst"; import { ITID, SPEICAL_ITEM, QUALITY_TYPE, equipTypeToSortAttr } from "../../../consts/constModules/itemConst";
import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe } from "../../../services/equipService"; import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe } from "../../../services/equipService";
import { indexOf, findIndex } from 'underscore'; import { indexOf, findIndex } from 'underscore';
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService"; import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService"; import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService";
import { Attribute } from "../../../domain/roleField/attribute";
export default function (app: Application) { export default function (app: Application) {
return new EquipHandler(app); return new EquipHandler(app);
@@ -528,6 +529,66 @@ export class EquipHandler {
return resResult(STATUS.SUCCESS, { curEquips: curEquips }); return resResult(STATUS.SUCCESS, { curEquips: curEquips });
} }
// 一次性装备上
public async putOnOnce(msg: { hid: number }, session: BackendSession) {
let { hid } = msg;
let roleId: string = session.get('roleId');
const serverId = session.get('serverId');
let sid: string = session.get('sid');
let funcs: number[] = session.get('funcs');
let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
let dicHero = gameData.hero.get(hid);
if(!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let dicJob = gameData.job.get(dicHero.jobid);
let allEquips = await EquipModel.findNotWearEquips(roleId);
let sortEquips = allEquips.map(equip => {
let { id, quality, randRange, ePlaceId } = equip;
let { goodsAbility, lvLimited, itid } = gameData.goods.get(id);
let attrObj = new Attribute();
attrObj.setByMap(goodsAbility, HERO_CE_RATIO + randRange);
let ce = attrObj.calEquipCe();
let { classId } = getHeroEquipByClassId(itid);
return { id, quality, ce, equip, goodsAbility, lvLimited, classId, ePlaceId }
});
let { ePlace, lv } = hero;
let curEquips: Array<{ seqId: number, hid: number }> = [];
for(let curEPlace of ePlace) {
if(!curEPlace.equip) { // 未装备
let sortAttrId = equipTypeToSortAttr.get(curEPlace.id);
let sortedAndSuitEquips = sortEquips.filter(equipInfos => { // 筛选可穿的
let { lvLimited, classId, ePlaceId } = equipInfos;
return lv >= lvLimited && classId.indexOf(dicJob.job_class) != -1 && curEPlace.id == ePlaceId;
}).sort((a, b) => { // 排序按:战力 => 根据位置看个别属性 => 品质
if(b.ce - a.ce != 0) return b.ce - a.ce;
let abilityA = a.goodsAbility.get(sortAttrId)||0;
let abilityB = b.goodsAbility.get(sortAttrId)||0;
if( abilityA - abilityB != 0) return abilityB - abilityA;
return b.quality - a.quality;
});
if(sortedAndSuitEquips.length > 0) {
let { equip } = sortedAndSuitEquips.shift();
let curEquip = await dressEquip(serverId, roleId, sid, hero,equip, funcs);
if(!!curEquip) curEquips.push(curEquip);
}
}
}
//任务
//英雄满装备且都镶嵌相同阶数的宝石
let { isTask, jewelLevel } = await checkTaskConditionEquipSuitJewelStage(hero)
if (isTask) {
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_SUIT_JEWEL_STAGE, 1, { stage: jewelLevel })
}
return resResult(STATUS.SUCCESS, { curEquips });
}
//装备打孔 //装备打孔
public async digHole(msg: { eid: number, id: number }, session: BackendSession) { public async digHole(msg: { eid: number, id: number }, session: BackendSession) {
let { eid, id } = msg; let { eid, id } = msg;
@@ -196,17 +196,19 @@ export class HeroHandler {
} }
// 武将升星 // 武将升星
public async starUp(msg: { hid: number, star: number, starStage: number }, session: BackendSession) { public async starUp(msg: { hid: number, star: number, starStage: number, isOneClick: boolean }, session: BackendSession) {
let roleId: string = session.get('roleId'); let roleId: string = session.get('roleId');
const serverId = session.get('serverId'); const serverId = session.get('serverId');
let sid: string = session.get('sid'); let sid: string = session.get('sid');
let funcs: number[] = session.get('funcs'); let funcs: number[] = session.get('funcs');
let { hid, star, starStage } = msg; let { hid, star, starStage, isOneClick } = msg;
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质 // 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = gameData.hero.get(hid); let dicHero = gameData.hero.get(hid);
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let { pieceId } = dicHero; let { pieceId, jobid } = dicHero;
let dicJob = gameData.job.get(jobid);
if(!dicJob) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let hero = await HeroModel.findByHidAndRole(hid, roleId); let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS); if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
@@ -219,17 +221,23 @@ export class HeroHandler {
return resResult(STATUS.ROLE_STAR_REACH_MAX); return resResult(STATUS.ROLE_STAR_REACH_MAX);
} }
// 根据dic_zyz_hero_star 计算需要花的碎片并检查碎片数量 // 根据dic_zyz_hero_star 计算需要花的碎片并检查碎片数量
const curDicHeroStar = getHeroStarByQuality(quality, oldStar); const curDicHeroStar = getHeroStarByQuality(dicJob.job_class, quality, oldStar);
if (!curDicHeroStar) return resResult(STATUS.DIC_DATA_NOT_FOUND); if (!curDicHeroStar) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let newStarStage = 0;
let max = isOneClick? ABI_STAGE.END: oldStarStage + 1;
for(let i = 0; i < max; i++ ) {
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: curDicHeroStar.advanceUpFragmentNum }]);
if (!costResult) break;
newStarStage++;
}
if(newStarStage == 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: curDicHeroStar.advanceUpFragmentNum }]); let isUpStar = newStarStage == ABI_STAGE.END;
if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let isUpStar = oldStarStage + 1 == ABI_STAGE.END;
let update = { let update = {
star: isUpStar ? oldStar + 1 : oldStar, star: isUpStar ? oldStar + 1 : oldStar,
starStage: isUpStar ? ABI_STAGE.START : oldStarStage + 1 starStage: isUpStar ? ABI_STAGE.START : newStarStage
} }
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.STAR, sid, roleId, hero, update); hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.STAR, sid, roleId, hero, update);
@@ -307,7 +315,7 @@ export class HeroHandler {
} }
// 武将觉醒 // 武将觉醒
public async wakeUp(msg: { hid: number, colorStar: number, colorStarStage: number }, session: BackendSession) { public async wakeUp(msg: { hid: number, colorStar: number, colorStarStage: number, isOneClick: boolean }, session: BackendSession) {
let roleId: string = session.get('roleId'); let roleId: string = session.get('roleId');
let sid: string = session.get('sid'); let sid: string = session.get('sid');
@@ -315,11 +323,13 @@ export class HeroHandler {
const serverId = session.get('serverId'); const serverId = session.get('serverId');
let funcs: number[] = session.get('funcs'); let funcs: number[] = session.get('funcs');
let { hid, colorStar, colorStarStage } = msg; let { hid, colorStar, colorStarStage, isOneClick } = msg;
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质 // 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = gameData.hero.get(hid); let dicHero = gameData.hero.get(hid);
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let { pieceId } = dicHero; let { pieceId, jobid } = dicHero;
let dicJob = gameData.job.get(jobid);
if (!dicJob) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let hero = await HeroModel.findByHidAndRole(hid, roleId); let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS); if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
@@ -335,21 +345,27 @@ export class HeroHandler {
return resResult(STATUS.ROLE_QUALITY_NOT_ENOUGH); return resResult(STATUS.ROLE_QUALITY_NOT_ENOUGH);
} }
// 根据dic_zyz_hero_wake 计算需要花的碎片并检查碎片数量 // 根据dic_zyz_hero_wake 计算需要花的碎片并检查碎片数量
const curDicHeroStar = getHeroWakeByQuality(dicHero.quality, oldColorStar) const curDicHeroStar = getHeroWakeByQuality(dicJob.job_class, dicHero.quality, oldColorStar)
if (!curDicHeroStar) return resResult(STATUS.DIC_DATA_NOT_FOUND); if (!curDicHeroStar) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let { fragmentNum, consume } = curDicHeroStar; let newColorStarStage = 0;
let max = isOneClick? ABI_STAGE.END: oldColorStarStage + 1;
// console.log(JSON.stringify([{id: pieceId, count: fragmentNum}, ...consumeArr])) for(let i = 0; i < max; i++) {
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: fragmentNum }, ...consume]); let { fragmentNum, consume } = curDicHeroStar;
if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
// console.log(JSON.stringify([{id: pieceId, count: fragmentNum}, ...consumeArr]))
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: fragmentNum }, ...consume]);
if (!costResult) break;
newColorStarStage++;
}
if(newColorStarStage == 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let isWakeUp = oldColorStar == 0; let isWakeUp = oldColorStar == 0;
let isUpStar = isWakeUp || oldColorStarStage + 1 == ABI_STAGE.END; let isUpStar = isWakeUp || newColorStarStage == ABI_STAGE.END;
let update = { let update = {
colorStar: isUpStar ? oldColorStar + 1 : oldColorStar, colorStar: isUpStar ? oldColorStar + 1 : oldColorStar,
colorStarStage: isUpStar ? ABI_STAGE.START : oldColorStarStage + 1 colorStarStage: isUpStar ? ABI_STAGE.START : newColorStarStage
} }
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.COLORSTAR, sid, roleId, hero, update); hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.COLORSTAR, sid, roleId, hero, update);
@@ -388,7 +404,7 @@ export class HeroHandler {
let dicJob = gameData.job.get(hero.job); let dicJob = gameData.job.get(hero.job);
if (!dicJob) return resResult(STATUS.DIC_DATA_NOT_FOUND); if (!dicJob) return resResult(STATUS.DIC_DATA_NOT_FOUND);
if (hero.jobStage >= ABI_STAGE.END) if (hero.jobStage >= dicJob.maxStage)
return resResult(STATUS.HERO_JOB_STAGE_REACH_MAX_STAGE); return resResult(STATUS.HERO_JOB_STAGE_REACH_MAX_STAGE);
if (hero.job >= getMaxGradeByjobClass(dicJob.job_class)) if (hero.job >= getMaxGradeByjobClass(dicJob.job_class))
return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE); return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE);
@@ -418,7 +434,6 @@ export class HeroHandler {
//进阶 //进阶
async heroJobStageUp(msg: { hid: number }, session: BackendSession) { async heroJobStageUp(msg: { hid: number }, session: BackendSession) {
console.log(JSON.stringify([...gameData.jobClassMaxGrades]))
let roleId: string = session.get('roleId'); let roleId: string = session.get('roleId');
const serverId = session.get('serverId'); const serverId = session.get('serverId');
let sid: string = session.get('sid'); let sid: string = session.get('sid');
@@ -522,10 +537,9 @@ export class HeroHandler {
let hero = await HeroModel.findByHidAndRole(hid, roleId); let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS); if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
let { favourLv: oldLv, favour: oldExp } = hero; let { favourLv: oldLv, favour: oldExp, lv } = hero;
let maxLv = gameData.maxFriendShipLv.max; // 好感度最大等级 let maxLv = lv > gameData.maxFriendShipLv.max? gameData.maxFriendShipLv.max: lv; // 好感度最大等级
console.log(maxLv)
if (maxLv <= oldLv) if (maxLv <= oldLv)
return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT); return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT);
+2 -2
View File
@@ -109,7 +109,7 @@ export async function takeOffEquipAndCalPlayerCe(roleId: string, sid: string, he
// 任务 // 任务
await checkTask(roleId, sid, funcs, TASK_TYPE.EQUIP_SUM, -1, true, {}); await checkTask(roleId, sid, funcs, TASK_TYPE.EQUIP_SUM, -1, true, {});
await checkTaskWithEquip(roleId, sid, funcs, TASK_TYPE.EQUIP_QUALITY, equip, [-1]); await checkTaskWithEquip(roleId, sid, funcs, TASK_TYPE.EQUIP_QUALITY, equip, [-1]);
return { seqId: equip.seqId, hid: 0 }; return { seqId: equip.seqId, hid: 0, id: equip.id, ePlaceId: equip.ePlaceId };
} }
/** /**
* 穿戴装备并重算战力 * 穿戴装备并重算战力
@@ -131,5 +131,5 @@ export async function dressEquip(serverId: number, roleId: string, sid: string,
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_QUALITY, 1, { quality: equip.quality }) await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_QUALITY, 1, { quality: equip.quality })
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_SUM, 1) await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_SUM, 1)
return { seqId: equip.seqId, hid: hero.hid }; return { seqId: equip.seqId, hid: hero.hid, id: equip.id, ePlaceId: equip.ePlaceId };
} }
+10 -10
View File
@@ -103,16 +103,16 @@ module.exports = {
"required uInt32 type": 2, "required uInt32 type": 2,
"repeated Material material": 3 "repeated Material material": 3
}, },
"role.heroHandler.starUp": { // "role.heroHandler.starUp": {
"required uInt32 hid": 1, // "required uInt32 hid": 1,
"required uInt32 star": 2, // "required uInt32 star": 2,
"required uInt32 starStage": 3 // "required uInt32 starStage": 3
}, // },
"role.heroHandler.wakeUp": { // "role.heroHandler.wakeUp": {
"required uInt32 hid": 1, // "required uInt32 hid": 1,
"required uInt32 colorStar": 2, // "required uInt32 colorStar": 2,
"required uInt32 colorStarStage": 3 // "required uInt32 colorStarStage": 3
}, // },
"role.heroHandler.qualityUp": { "role.heroHandler.qualityUp": {
"required uInt32 hid": 1, "required uInt32 hid": 1,
"required uInt32 quality": 2 "required uInt32 quality": 2
+26 -7
View File
@@ -9,15 +9,15 @@ export enum ABI_TYPE{
ABI_HP = 1, ABI_HP = 1,
/**物攻 */ /**物攻 */
ABI_ATK = 2, ABI_ATK = 2,
/**策攻 */ /**策攻 (废弃)*/
ABI_MATK = 3, ABI_MATK = 3,
/**物防 */ /**物防 */
ABI_DEF = 4, ABI_DEF = 4,
/**策防 */ /**策防 */
ABI_MDEF = 5, ABI_MDEF = 5,
/**敏捷 */ /**敏捷 (废弃)*/
ABI_AGI = 6, ABI_AGI = 6,
/**幸运 */ /**幸运 (废弃)*/
ABI_LUK = 7, ABI_LUK = 7,
/**移动 */ /**移动 */
ABI_SPEED = 8, ABI_SPEED = 8,
@@ -30,9 +30,9 @@ export enum ABI_TYPE{
ABI_FLEE = 11, ABI_FLEE = 11,
/**抗暴等级 */ /**抗暴等级 */
ABI_ANT_CRI = 12, ABI_ANT_CRI = 12,
/**伤害加深等级 */ /**伤害加深等级 (废弃) */
ABI_DAMAGE_INCREASE = 13, ABI_DAMAGE_INCREASE = 13,
/**伤害减免等级 */ /**伤害减免等级 (废弃) */
ABI_DAMAGE_DECREASE = 14, ABI_DAMAGE_DECREASE = 14,
/**忽视防御等级 */ /**忽视防御等级 */
ABI_DEF_IGNORE = 15, ABI_DEF_IGNORE = 15,
@@ -42,6 +42,16 @@ export enum ABI_TYPE{
ABI_AP = 17, ABI_AP = 17,
/**暴击伤害 */ /**暴击伤害 */
ABI_DAMAGE_CRI = 18, ABI_DAMAGE_CRI = 18,
/**物伤加深 */
ABI_PDAMAGE_INC = 19,
/**法伤加深 */
ABI_MDAMAGE_INC = 20,
/**物伤减免 */
ABI_PDAMAGE_DEC = 21,
/**法伤减免 */
ABI_MDAMAGE_DEC = 22,
/**反击伤害 */
ABI_STRIKE_BACK = 23,
ABI_MAX, ABI_MAX,
} }
@@ -84,6 +94,10 @@ export enum ABI_STAGE {
END = 4 END = 4
} }
export enum ABI_JOB_STAGE {
START = 0,
END = 6
}
export const ATTR = {} export const ATTR = {}
export const HERO_ATTR = { export const HERO_ATTR = {
@@ -103,8 +117,13 @@ export const HERO_ATTR = {
14: "damageDecrease", // 伤害减免等级 14: "damageDecrease", // 伤害减免等级
15: "defIngnore", // 忽视防御等级 15: "defIngnore", // 忽视防御等级
16: "bloodSuck", // 吸血等级 16: "bloodSuck", // 吸血等级
17: "damageCri", // 暴击伤害 17: "ap", // 怒气
18: "ap" // 暴击伤害 18: "damageCri", // 暴击伤害
19: "pdamageInc", // 物伤加深
20: "mdamageInc", // 法伤加深
21: "pdamageDec", // 物伤减免
22: "mdamageDec", // 法伤减免
23: "strikeBack", // 反击伤害
}; };
export const ABI_TYPE_TO_STAGE = new Map<number, number>([ export const ABI_TYPE_TO_STAGE = new Map<number, number>([
+11
View File
@@ -1,3 +1,5 @@
import { ABI_TYPE } from "./abilityConst";
export const IT_TYPE = { export const IT_TYPE = {
BLUEPRT: 28, BLUEPRT: 28,
EQUIP_PIECE: 40, EQUIP_PIECE: 40,
@@ -67,6 +69,15 @@ export enum EQUIP_TYPE {
END = 6 END = 6
} }
export const equipTypeToSortAttr = new Map([
[ EQUIP_TYPE.WEAPON, ABI_TYPE.ABI_ATK ],
[ EQUIP_TYPE.CLOTHES, ABI_TYPE.ABI_HP ],
[ EQUIP_TYPE.SHOES, ABI_TYPE.ABI_ATK ],
[ EQUIP_TYPE.CAP, ABI_TYPE.ABI_HP ],
[ EQUIP_TYPE.ACCESSORY, ABI_TYPE.ABI_DEF ],
[ EQUIP_TYPE.BOOK, ABI_TYPE.ABI_MDEF ]
]);
export enum JEWEL_TYPE { export enum JEWEL_TYPE {
WEAPON = 42, // 神兵(武器) WEAPON = 42, // 神兵(武器)
CLOTHES = 43, // 宝甲(上装) CLOTHES = 43, // 宝甲(上装)
+6
View File
@@ -99,6 +99,12 @@ export default class Equip extends BaseModel {
return equip; return equip;
} }
public static async findNotWearEquips(roleId: string) {
const equips: EquipType[] = await EquipModel.find({ roleId, hid: 0 }).lean();
return equips;
}
public static async deleteAccount(roleId: string) { public static async deleteAccount(roleId: string) {
let result = await EquipModel.deleteMany({ roleId }); let result = await EquipModel.deleteMany({ roleId });
return result; return result;
+38 -1
View File
@@ -81,6 +81,16 @@ export class Attribute {
@prop({ required: false }) @prop({ required: false })
damageCri: number = 0; damageCri: number = 0;
@prop({ required: false }) @prop({ required: false })
pDamageInc: number = 0;
@prop({ required: false })
mDamageInc: number = 0;
@prop({ required: false })
pDamageDec: number = 0;
@prop({ required: false })
mDemageDec: number = 0;
@prop({ required: false })
strikeBack: number = 0;
@prop({ required: false })
ce?: number = 0; ce?: number = 0;
setByDbData(roleAttrs: CeAttrDataRole[], heroAttrs: CeAttrData[]) { setByDbData(roleAttrs: CeAttrDataRole[], heroAttrs: CeAttrData[]) {
@@ -118,6 +128,17 @@ export class Attribute {
} }
} }
setByMap( attributes: Map<number, number>, ratio: number = 1 ) {
for(let [id, val] of attributes) {
let attrName = getAtrrNameById(id);
if(ABI_TYPE_MAIN.includes(id)) {
if(attrName in this) this[attrName] = Math.floor(val * ratio * HERO_CE_RATIO * HERO_CE_RATIO);
} else {
if(attrName in this) this[attrName] = Math.floor(val * HERO_CE_RATIO * HERO_CE_RATIO);
}
}
}
private calAttrValue(roleFix: number = 0, roleRatio: number = 0, heroBase: number = 0, heroFix: number = 0, heroRatio: number = 0, heroEquip: number = 0) { private calAttrValue(roleFix: number = 0, roleRatio: number = 0, heroBase: number = 0, heroFix: number = 0, heroRatio: number = 0, heroEquip: number = 0) {
return (heroFix + heroEquip + roleFix) * HERO_CE_RATIO + heroBase * ( HERO_CE_RATIO + heroRatio + roleRatio ); return (heroFix + heroEquip + roleFix) * HERO_CE_RATIO + heroBase * ( HERO_CE_RATIO + heroRatio + roleRatio );
} }
@@ -131,7 +152,12 @@ export class Attribute {
damageIncrease: this.damageIncrease / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO, damageIncrease: this.damageIncrease / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
damageDecrease: this.damageDecrease / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO, damageDecrease: this.damageDecrease / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
defIngnore: this.defIngnore / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO, defIngnore: this.defIngnore / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
damageCri: this.damageCri / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO damageCri: this.damageCri / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
pDamageInc: this.pDamageInc / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
mDamageInc: this.mDamageInc / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
pDamageDec: this.pDamageDec / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
mDemageDec: this.mDemageDec / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
strikeBack: this.strikeBack / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO
} }
} }
@@ -161,6 +187,11 @@ export class Attribute {
newAttr.bloodSuck = reduceCe(this.bloodSuck); newAttr.bloodSuck = reduceCe(this.bloodSuck);
newAttr.ap = reduceCe(this.ap); newAttr.ap = reduceCe(this.ap);
newAttr.damageCri = reduceCe(this.damageCri); newAttr.damageCri = reduceCe(this.damageCri);
newAttr.pDamageInc = reduceCe(this.pDamageInc);
newAttr.mDamageInc = reduceCe(this.mDamageInc);
newAttr.pDamageDec = reduceCe(this.pDamageDec);
newAttr.mDemageDec = reduceCe(this.mDemageDec);
newAttr.strikeBack = reduceCe(this.strikeBack);
return newAttr; return newAttr;
} }
@@ -189,6 +220,12 @@ export class Attribute {
return ce > 0? ce: 1; return ce > 0? ce: 1;
} }
// 计算未装备的装备的简易战力公式
public calEquipCe() {
let { hp, atk, def, mdef } = this.getRealMainAttr();
return hp * 1 + atk * 3 + def * 2 + mdef * 2;
}
public calCelAndReduce() { public calCelAndReduce() {
return Math.floor(this.calCe() / HERO_CE_RATIO / HERO_CE_RATIO); return Math.floor(this.calCe() / HERO_CE_RATIO / HERO_CE_RATIO);
} }
+4 -4
View File
@@ -365,12 +365,12 @@ export function comBtlRanges() {
} }
export function getHeroStarByQuality(quality: number, star: number) { export function getHeroStarByQuality(classType: number, quality: number, star: number) {
return gameData.heroStar.get(`${quality}_${star}`); return gameData.heroStar.get(`${classType}_${quality}_${star}`);
} }
export function getHeroWakeByQuality(quality: number, star: number) { export function getHeroWakeByQuality(classType: number, quality: number, star: number) {
return gameData.heroWake.get(`${quality}_${star}`); return gameData.heroWake.get(`${classType}_${quality}_${star}`);
} }
export function getMaxGradeByjobClass(jobClass: number) { export function getMaxGradeByjobClass(jobClass: number) {
+5 -2
View File
@@ -7,6 +7,8 @@ export interface DicHeroStar {
// 唯一id // 唯一id
readonly id: number; readonly id: number;
// 职业类型
readonly classType: number;
// 品质 // 品质
readonly quality: number; readonly quality: number;
// 星级 // 星级
@@ -20,7 +22,7 @@ export interface DicHeroStar {
type KeysEnum<T> = { [P in keyof Required<T>]: true }; 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 const dicHeroStar = new Map<string, DicHeroStar>();
export function loadHeroStar() { export function loadHeroStar() {
@@ -28,7 +30,8 @@ export function loadHeroStar() {
arr.forEach(o => { arr.forEach(o => {
o.ceAttr = parseCeAttr(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; arr = undefined;
} }
+5 -2
View File
@@ -8,6 +8,8 @@ export interface DicHeroWake {
// 唯一id // 唯一id
readonly id: number; readonly id: number;
// 职业类型
readonly classType: number;
// 品质 // 品质
readonly quality: number; readonly quality: number;
// 彩星级 // 彩星级
@@ -22,7 +24,7 @@ export interface DicHeroWake {
} }
type KeysEnum<T> = { [P in keyof Required<T>]: true }; 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 const dicHeroWake = new Map<string, DicHeroWake>();
export function loadHeroWake() { export function loadHeroWake() {
@@ -31,7 +33,8 @@ export function loadHeroWake() {
arr.forEach(o => { arr.forEach(o => {
o.consume = parseGoodStr(o.consume); o.consume = parseGoodStr(o.consume);
o.ceAttr = parseCeAttr(o); 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; arr = undefined;
} }
+20 -12
View File
@@ -1,6 +1,6 @@
// 兵种表 // 兵种表
import { readFileAndParse, parseNumberList, parseGoodStr} from '../util' import { readFileAndParse, parseNumberList, parseGoodStr, decodeArrayListStr} from '../util'
import { FILENAME, ABI_STAGE } from '../../consts' import { FILENAME, } from '../../consts'
import { RewardInter } from '../interface'; import { RewardInter } from '../interface';
const _ = require('lodash'); const _ = require('lodash');
@@ -24,12 +24,14 @@ export interface DicJob {
// 升阶消耗 // 升阶消耗
readonly upGradeConsume: Array<RewardInter>; 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 }; 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 dicJob = new Map<number, DicJob>();
export const jobClassMaxGrades = new Map<number, {grade:number, jobid:number}>(); export const jobClassMaxGrades = new Map<number, {grade:number, jobid:number}>();
@@ -42,8 +44,9 @@ export function loadJob() {
arr.forEach(o => { arr.forEach(o => {
o.seid = parseNumberList(o.seid); o.seid = parseNumberList(o.seid);
o.trainingConsume = parseGoodStr(o.trainingConsume); o.trainingConsume = parseGoodStr(o.trainingConsume);
o.maxStage = o.trainingConsume.length;
o.upGradeConsume = parseGoodStr(o.upGradeConsume); 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))); dicJob.set(o.jobid, _.pick(o, Object.keys(DicJobKeys)));
let jobClass = jobClassMaxGrades.get(o.job_class); let jobClass = jobClassMaxGrades.get(o.job_class);
if (!jobClass || jobClass.grade < o.grade) { if (!jobClass || jobClass.grade < o.grade) {
@@ -55,11 +58,16 @@ export function loadJob() {
arr = undefined; arr = undefined;
} }
function parseCeAttr(elem) { function parseCeAttr(maxStage: number, str: string) {
let ceAttr = new Map<number, number>(); let result = new Map<number, { id: number, attr: number }>();
ceAttr.set(ABI_STAGE.HP, elem.hp); if (!str) return result;
ceAttr.set(ABI_STAGE.ATK, elem.atk); let decodeArr = decodeArrayListStr(str);
ceAttr.set(ABI_STAGE.DEF, elem.def); for (let i = 1; i <= maxStage; i++) {
ceAttr.set(ABI_STAGE.MDEF, elem.mdef); let [id, attr] = decodeArr[i]||[i.toString(), "0"];
return ceAttr; 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
} }
+32 -15
View File
@@ -14,7 +14,7 @@ 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 { SchoolModel } from '../db/School'; 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 { PvpDefenseModel } from '../db/PvpDefense';
import { findIndex } from 'underscore'; import { findIndex } from 'underscore';
import { GuildModel } from '../db/Guild'; import { GuildModel } from '../db/Guild';
@@ -293,7 +293,8 @@ export function calHeroStarIncAttr(originHero: HeroType, update: HeroUpdate, typ
if(starStage == ABI_STAGE.START) star--; if(starStage == ABI_STAGE.START) star--;
if(colorStarStage == ABI_STAGE.START) colorStar--; 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>(); // 需要升级的阶 let stages = new Array<number>(); // 需要升级的阶
@@ -302,14 +303,28 @@ export function calHeroStarIncAttr(originHero: HeroType, update: HeroUpdate, typ
} else if (type == HERO_SYSTEM_TYPE.LVUP) { } else if (type == HERO_SYSTEM_TYPE.LVUP) {
stages = getAllAttrStage(); stages = getAllAttrStage();
} else if (type == HERO_SYSTEM_TYPE.STAR) { } 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) { } else if (type == HERO_SYSTEM_TYPE.QUALITY) {
stages = getAllAttrStage(); stages = getAllAttrStage();
} else if (type = HERO_SYSTEM_TYPE.COLORSTAR) { } else if (type = HERO_SYSTEM_TYPE.COLORSTAR) {
if (isFirstWake) { // 首次觉醒 if (isFirstWake) { // 首次觉醒
stages = getAllAttrStage(); stages = getAllAttrStage();
} else { } 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) { 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 { attr: heroAttrs, job: oldJob, jobStage: oldJobStage } = originHero;
let { job = oldJob, jobStage = oldJobStage } = update; let { job = oldJob, jobStage = oldJobStage } = update;
let targetAttrId = ABI_TYPE_TO_STAGE.get(jobStage); // 转换为18维的属性id
let dicJob = gameData.job.get(job); let dicJob = gameData.job.get(job);
if (dicJob.grade > 1) {
if (dicJob.grade >= 1) {
let jobGradeAndClass = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1); let jobGradeAndClass = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1);
let lastJob = gameData.job.get(jobGradeAndClass.jobid); let lastJob = gameData.job.get(jobGradeAndClass.jobid);
let inc = (dicJob.ceAttr.get(jobStage) - lastJob.ceAttr.get(jobStage)) * HERO_CE_RATIO; let targetAttrId = dicJob.ceAttr.get(jobStage).id;
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } }) let inc = (dicJob.ceAttr.get(jobStage).attr - lastJob.ceAttr.get(jobStage).attr) * HERO_CE_RATIO;
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } });
} else { } else {
let inc = dicJob.ceAttr.get(jobStage) * HERO_CE_RATIO; let targetAttrId = dicJob.ceAttr.get(jobStage).id;
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } }) let inc = dicJob.ceAttr.get(jobStage).attr * HERO_CE_RATIO;
updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } });
} }
return heroAttrs; return heroAttrs;
} }
@@ -489,14 +505,15 @@ export function calHeroJobAttr(originHero: HeroType, hero: HeroUpdate, addSeidLi
lastJob = gameData.job.get(jobGradeAndClass.jobid); lastJob = gameData.job.get(jobGradeAndClass.jobid);
} }
for (let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) { for (let stage = ABI_JOB_STAGE.START; stage < ABI_JOB_STAGE.END; stage++) {
let targetAttrId = ABI_TYPE_TO_STAGE.get(stage);
if(hero.jobStage >= 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 }}) updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp }})
} else { } else {
if(lastJob) { 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 } }); updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp } });
} }
} }
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff