装备:升星
This commit is contained in:
@@ -8,7 +8,7 @@ import { EquipModel, EquipType } from "../../../db/Equip";
|
||||
import { HeroModel, EPlace, HeroType } from "../../../db/Hero";
|
||||
import Role from "../../../db/Role";
|
||||
import { calPlayerCeAndSave } from "../../../services/playerCeService";
|
||||
import { getGoodById, gameData, getEquipByJobClassAndEPlace, getNextEquipQuality, getEquipQualityIdByEquipIdAndPoint } from "../../../pubUtils/data";
|
||||
import { getGoodById, gameData, getEquipByJobClassAndEPlace, getNextEquipQuality, getEquipQualityIdByEquipIdAndPoint, getEquipStarIdByEquipId, getNextEquipStar } from "../../../pubUtils/data";
|
||||
import { BAG, EQUIP } from "../../../pubUtils/dicParam";
|
||||
import { ITID, QUALITY_TYPE, equipTypeToSortAttr, IT_TYPE, QUENCH_TYPE, REFINE_TYPE } from "../../../consts";
|
||||
import { checkMaterialEnough, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult, refineOnce, checkRefineReachNextLv, calEquipCe, updateEplace, updateEplaces } from "../../../services/equipService";
|
||||
@@ -106,59 +106,6 @@ export class EquipHandler {
|
||||
|
||||
}
|
||||
|
||||
// 装备升品
|
||||
public async qualityUp(msg: { hid: number, eplaceId: number, isOneClick: boolean }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
// let roleName: string = session.get('roleName');
|
||||
const serverId = session.get('serverId');
|
||||
let sid: string = session.get('sid');
|
||||
|
||||
let { hid, eplaceId, isOneClick } = msg;
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
|
||||
let curEquip = hero.ePlace?.find(cur => cur.id == eplaceId);
|
||||
if(!curEquip) return resResult(STATUS.EQUIP_NOT_FIND);
|
||||
|
||||
let nextEquipQuality = getNextEquipQuality(curEquip.equipId, curEquip.quality, curEquip.qualityStage);
|
||||
if(!nextEquipQuality) return resResult(STATUS.EQUIP_QUALITY_MAX);
|
||||
|
||||
let update = {
|
||||
quality: curEquip.quality,
|
||||
qualityStage: curEquip.qualityStage,
|
||||
}
|
||||
let check = new CheckMeterial(roleId);
|
||||
if(isOneClick) {
|
||||
while(nextEquipQuality) {
|
||||
let isEnough = await check.decrease(nextEquipQuality.consume);
|
||||
if(!isEnough) break; // 消耗不足
|
||||
update.qualityStage++;
|
||||
nextEquipQuality = getNextEquipQuality(curEquip.equipId, update.quality, update.qualityStage)
|
||||
}
|
||||
} else {
|
||||
let isEnough = await check.decrease(nextEquipQuality.consume);
|
||||
if(isEnough) {
|
||||
update.quality = nextEquipQuality.quality;
|
||||
update.qualityStage = nextEquipQuality.point;
|
||||
}
|
||||
}
|
||||
if(update.quality == curEquip.quality && update.qualityStage == curEquip.qualityStage) {
|
||||
return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
}
|
||||
|
||||
let { newEplace, updatedEplace } = updateEplace(hero.ePlace, eplaceId, update);
|
||||
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_QUALITY, sid, roleId, hero, { ePlace: newEplace }, [eplaceId]);
|
||||
|
||||
// TODO 任务
|
||||
|
||||
const curHero = {
|
||||
hid,
|
||||
ePlace: updatedEplace
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, { curHero });
|
||||
|
||||
}
|
||||
|
||||
// 装备栏一键强化至相应等级
|
||||
public async strengthenAll(msg: { hid: number, lv: number }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
@@ -208,6 +155,130 @@ export class EquipHandler {
|
||||
}
|
||||
|
||||
|
||||
// 装备升品
|
||||
public async qualityUp(msg: { hid: number, eplaceId: number, isOneClick: boolean }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
// let roleName: string = session.get('roleName');
|
||||
const serverId = session.get('serverId');
|
||||
let sid: string = session.get('sid');
|
||||
|
||||
let { hid, eplaceId, isOneClick } = msg;
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
|
||||
let curEquip = hero.ePlace?.find(cur => cur.id == eplaceId);
|
||||
if(!curEquip) return resResult(STATUS.EQUIP_NOT_FIND);
|
||||
|
||||
let nextEquipQuality = getNextEquipQuality(curEquip.equipId, curEquip.quality, curEquip.qualityStage);
|
||||
if(!nextEquipQuality) return resResult(STATUS.EQUIP_QUALITY_MAX);
|
||||
|
||||
let update = {
|
||||
quality: curEquip.quality,
|
||||
qualityStage: curEquip.qualityStage,
|
||||
}
|
||||
let check = new CheckMeterial(roleId);
|
||||
if(isOneClick) { // 一键升到该品最高点
|
||||
if(nextEquipQuality.quality != curEquip.quality) {
|
||||
return resResult(STATUS.EQUIP_QUALITYSTAGE_IS_MAX);
|
||||
}
|
||||
while(nextEquipQuality && nextEquipQuality.quality == curEquip.quality) {
|
||||
let isEnough = await check.decrease(nextEquipQuality.consume);
|
||||
if(!isEnough) break; // 消耗不足
|
||||
update.qualityStage++;
|
||||
nextEquipQuality = getNextEquipQuality(curEquip.equipId, update.quality, update.qualityStage)
|
||||
}
|
||||
} else { // 往下一阶,包括满点之后的升品
|
||||
let isEnough = await check.decrease(nextEquipQuality.consume);
|
||||
if(isEnough) {
|
||||
update.quality = nextEquipQuality.quality;
|
||||
update.qualityStage = nextEquipQuality.point;
|
||||
}
|
||||
}
|
||||
if(update.quality == curEquip.quality && update.qualityStage == curEquip.qualityStage) {
|
||||
return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
}
|
||||
let isUpQuality = update.quality != curEquip.quality;
|
||||
|
||||
let { newEplace, updatedEplace } = updateEplace(hero.ePlace, eplaceId, update);
|
||||
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_QUALITY, sid, roleId, hero, { ePlace: newEplace }, [eplaceId]);
|
||||
|
||||
// TODO 任务
|
||||
const curHero = {
|
||||
hid,
|
||||
isUpQuality,
|
||||
ePlace: updatedEplace
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, { curHero });
|
||||
|
||||
}
|
||||
|
||||
// 装备升星
|
||||
public async starUp(msg: { hid: number, eplaceId: number, isOneClick: boolean }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
// let roleName: string = session.get('roleName');
|
||||
const serverId = session.get('serverId');
|
||||
let sid: string = session.get('sid');
|
||||
|
||||
let { hid, eplaceId, isOneClick } = msg;
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
|
||||
let curEquip = hero.ePlace?.find(cur => cur.id == eplaceId);
|
||||
if(!curEquip) return resResult(STATUS.EQUIP_NOT_FIND);
|
||||
|
||||
let update = {
|
||||
star: curEquip.star,
|
||||
starStage: curEquip.starStage,
|
||||
}
|
||||
|
||||
let check = new CheckMeterial(roleId);
|
||||
let dicEquipStar = getEquipStarIdByEquipId(curEquip.equipId, curEquip.star);
|
||||
if(!dicEquipStar) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
let isUpStar = curEquip.starStage == dicEquipStar.count;
|
||||
if(isUpStar) { // 升星
|
||||
if(isOneClick) {
|
||||
return resResult(STATUS.EQUIP_STARSTAGE_IS_MAX);
|
||||
} else {
|
||||
let nextEquipStar = getNextEquipStar(curEquip.equipId, curEquip.star);
|
||||
if(!nextEquipStar) return resResult(STATUS.EQUIP_STAR_MAX);
|
||||
let dicEquipQualityExtra = gameData.equipQualityExtra.get(curEquip.quality);
|
||||
if(!dicEquipQualityExtra || dicEquipQualityExtra.star < nextEquipStar.star) {
|
||||
return resResult(STATUS.EQUIP_QUALITY_NOT_ENOUGH);
|
||||
}
|
||||
|
||||
let isEnough = await check.decrease(nextEquipStar.subConsume);
|
||||
if(isEnough) {
|
||||
update.star = nextEquipStar.star;
|
||||
update.starStage = 0;
|
||||
}
|
||||
}
|
||||
} else { // 升小点,包括一键升到满小点和升一个小点
|
||||
let toStage = isOneClick? dicEquipStar.count: curEquip.starStage + 1;
|
||||
for(let stage = curEquip.starStage + 1; stage <= toStage; stage++) {
|
||||
let isEnough = await check.decrease(dicEquipStar.mainConsume);
|
||||
if(!isEnough) break; // 消耗不足
|
||||
update.starStage = stage;
|
||||
}
|
||||
}
|
||||
|
||||
if(update.star == curEquip.star && update.starStage == curEquip.starStage) {
|
||||
return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
}
|
||||
|
||||
let { newEplace, updatedEplace } = updateEplace(hero.ePlace, eplaceId, update);
|
||||
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STAR, sid, roleId, hero, { ePlace: newEplace }, [eplaceId]);
|
||||
|
||||
// TODO 任务
|
||||
|
||||
const curHero = {
|
||||
hid,
|
||||
isUpStar,
|
||||
ePlace: updatedEplace
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, { curHero });
|
||||
|
||||
}
|
||||
|
||||
// // 装备栏精炼
|
||||
// public async refine(msg: { hid: number, ePlaceId: number, type: REFINE_TYPE }, session: BackendSession) {
|
||||
// let roleId: string = session.get('roleId');
|
||||
|
||||
@@ -24,6 +24,7 @@ export enum HERO_SYSTEM_TYPE {
|
||||
COMPOSE_EQUIP = 21, // 合成装备
|
||||
EQUIP_STRENGTH = 22, // 装备强化
|
||||
EQUIP_QUALITY = 23, // 装备升品
|
||||
EQUIP_STAR = 24, // 装备升星
|
||||
};
|
||||
|
||||
// 武将上限
|
||||
|
||||
@@ -490,6 +490,8 @@ export const FILENAME = {
|
||||
DIC_EQUIP_SUIT: 'dic_zyz_equipSuit',
|
||||
DIC_EQUIP_STRENGTH: 'dic_zyz_equipStrength',
|
||||
DIC_EQUIP_QUALITY: 'dic_zyz_equipQuality',
|
||||
DIC_EQUIP_STAR: 'dic_zyz_equipStar',
|
||||
DIC_EQUIP_QUALITY_EXTRA: 'dic_zyz_equipQuality_extra',
|
||||
DIC_JEWEL: 'dic_jewel',
|
||||
}
|
||||
|
||||
|
||||
@@ -312,6 +312,10 @@ export const STATUS = {
|
||||
EQUIP_DECOMPOSE_IS_UPLIMIT: { code: 30516, simStr: '装备分解数量已达上限' },
|
||||
EQUIP_HAS_COMPOSE: { code: 30517, simStr: '该装备已合成' },
|
||||
EQUIP_QUALITY_MAX: { code: 30518, simStr: '该装备已升品到最高' },
|
||||
EQUIP_STAR_MAX: { code: 30519, simStr: '该装备已升星到最高' },
|
||||
EQUIP_QUALITY_NOT_ENOUGH: { code: 30520, simStr: '该装备品质不足' },
|
||||
EQUIP_QUALITYSTAGE_IS_MAX: { code: 30521, simStr: '该装备已到该品质下最高,请升品' },
|
||||
EQUIP_STARSTAGE_IS_MAX: { code: 30522, simStr: '该装备已到该星级下最高,请升星' },
|
||||
|
||||
//全局养成30600-30699
|
||||
ROLE_REACH_MAX_TITLE_LEVEL: { code: 30600, simStr: '玩家已达到最高的爵位' },
|
||||
|
||||
@@ -90,7 +90,7 @@ export class EPlace {
|
||||
@prop({ required: true })
|
||||
qualityStage: number = 0;
|
||||
@prop({ required: true })
|
||||
star: number = 1;
|
||||
star: number = 0;
|
||||
@prop({ required: true })
|
||||
starStage: number = 0;
|
||||
@prop({ required: true, type: Stone, _id: false })
|
||||
|
||||
@@ -104,6 +104,9 @@ import { dicEquipById, dicEquipIdByJobClassAndEplace, loadEquip } from "./dictio
|
||||
import { dicJewel, loadJewel } from "./dictionary/DicJewel";
|
||||
import { dicEquipStrength, loadEquipStrength } from "./dictionary/DicEquipStrength";
|
||||
import { dicEquipQuality, dicEquipQualityIdByEquipIdAndPoint, loadEquipQuality } from "./dictionary/DicEquipQuality";
|
||||
import { dicEquipStar, dicEquipStarIdByEquipId, loadEquipStar } from './dictionary/DicEquipStar';
|
||||
import { dicEquipQualityExtra, loadEquipQualityExtra } from './dictionary/DicEquipQualityExtra';
|
||||
import { dicEquipSuit, dicEquipSuitByJobClass, loadEquipSuit } from "./dictionary/DicEquipSuit";
|
||||
|
||||
export const gameData = {
|
||||
blurprtCompose: dicBlueprtCompose,
|
||||
@@ -258,6 +261,11 @@ export const gameData = {
|
||||
equipStrengthenCost: dicEquipStrength,
|
||||
equipQuality: dicEquipQuality,
|
||||
equipQualityIdByEquipIdAndPoint: dicEquipQualityIdByEquipIdAndPoint,
|
||||
equipStar: dicEquipStar,
|
||||
equipStarIdByEquipId: dicEquipStarIdByEquipId,
|
||||
equipQualityExtra: dicEquipQualityExtra,
|
||||
equipSuit: dicEquipSuit,
|
||||
equipSuitByJobClass: dicEquipSuitByJobClass,
|
||||
};
|
||||
|
||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||
@@ -853,7 +861,6 @@ export function getNextEquipQuality(equipId: number, quality: number, point: num
|
||||
let equipQuality = getEquipQualityIdByEquipIdAndPoint(equipId, quality, point);
|
||||
if(equipQuality) {
|
||||
let nextId = equipQuality.id + 1;
|
||||
console.log(nextId)
|
||||
let nextEquipQuality = gameData.equipQuality.get(nextId);
|
||||
if(nextEquipQuality && nextEquipQuality.equipId == equipQuality.equipId) {
|
||||
return nextEquipQuality
|
||||
@@ -862,6 +869,55 @@ export function getNextEquipQuality(equipId: number, quality: number, point: num
|
||||
return null
|
||||
}
|
||||
|
||||
export function getEquipStarIdByEquipId(equipId: number, star: number) {
|
||||
let equipStarId = gameData.equipStarIdByEquipId.get(`${equipId}_${star}`);
|
||||
return equipStarId?gameData.equipStar.get(equipStarId): null;
|
||||
}
|
||||
|
||||
export function getNextEquipStar(equipId: number, star: number) {
|
||||
let equipStar = getEquipStarIdByEquipId(equipId, star);
|
||||
if(equipStar) {
|
||||
let nextId = equipStar.id + 1;
|
||||
let nextEquipStar = gameData.equipStar.get(nextId);
|
||||
if(nextEquipStar && nextEquipStar.equipId == equipStar.equipId) {
|
||||
return nextEquipStar;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export function getPreEquipStar(equipId: number, star: number) {
|
||||
let equipStar = getEquipStarIdByEquipId(equipId, star);
|
||||
if(equipStar) {
|
||||
let nextId = equipStar.id - 1;
|
||||
let nextEquipStar = gameData.equipStar.get(nextId);
|
||||
if(nextEquipStar && nextEquipStar.equipId == equipStar.equipId) {
|
||||
return nextEquipStar;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export function getEquipStarMainAttrByStage(equipId: number, star: number, starStage: number) {
|
||||
if(starStage == 0) {
|
||||
let preEquipStar = getPreEquipStar(equipId, star);
|
||||
if(!preEquipStar || preEquipStar.equipId != equipId) {
|
||||
return [];
|
||||
} else {
|
||||
return preEquipStar.mainAttr.get(preEquipStar.count);
|
||||
}
|
||||
} else {
|
||||
let equipStar = getEquipStarIdByEquipId(equipId, star);
|
||||
return equipStar.mainAttr.get(starStage);
|
||||
}
|
||||
}
|
||||
|
||||
export function getEquipSuitByHero(hid: number) {
|
||||
let dicHero = gameData.hero.get(hid);
|
||||
let equipSuitId = gameData.equipSuitByJobClass.get(dicHero.jobClass);
|
||||
return gameData.equipSuit.get(equipSuitId);
|
||||
}
|
||||
|
||||
// 初始加载
|
||||
function initDatas() {
|
||||
parseDicParam();
|
||||
@@ -1030,6 +1086,9 @@ function loadDatas() {
|
||||
loadEquip();
|
||||
loadEquipStrength();
|
||||
loadEquipQuality();
|
||||
loadEquipStar();
|
||||
loadEquipSuit();
|
||||
loadEquipQualityExtra();
|
||||
loadJewel();
|
||||
}
|
||||
|
||||
|
||||
29
shared/pubUtils/dictionary/DicEquipQualityExtra.ts
Normal file
29
shared/pubUtils/dictionary/DicEquipQualityExtra.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
// 装备升品表
|
||||
import { readFileAndParse } from '../util'
|
||||
import { FILENAME } from '../../consts';
|
||||
|
||||
export interface DicEquipQualityExtra {
|
||||
// id
|
||||
readonly id: number;
|
||||
// 品质
|
||||
readonly quality: number;
|
||||
// 限制星级
|
||||
readonly star: number;
|
||||
// 天晶石
|
||||
readonly jewelCnt: number;
|
||||
// 地玉石
|
||||
readonly stoneCnt: number;
|
||||
|
||||
}
|
||||
|
||||
export const dicEquipQualityExtra = new Map<number, DicEquipQualityExtra>();
|
||||
|
||||
export function loadEquipQualityExtra() {
|
||||
dicEquipQualityExtra.clear();
|
||||
let arr = readFileAndParse(FILENAME.DIC_EQUIP_QUALITY_EXTRA);
|
||||
|
||||
arr.forEach(o => {
|
||||
dicEquipQualityExtra.set(o.quality, o);
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
74
shared/pubUtils/dictionary/DicEquipStar.ts
Normal file
74
shared/pubUtils/dictionary/DicEquipStar.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
// 装备升品表
|
||||
import { readFileAndParse, parseGoodStr, decodeArrayListStr } from '../util'
|
||||
import { FILENAME } from '../../consts'
|
||||
import { RewardInter } from '../interface';
|
||||
|
||||
export interface DicEquipStar {
|
||||
// id
|
||||
readonly id: number;
|
||||
// 装备id
|
||||
readonly equipId: number;
|
||||
// 装备星级
|
||||
readonly star: number;
|
||||
// 装备的武将职业大类
|
||||
readonly jobClass: number;
|
||||
// 装备栏id
|
||||
readonly eplaceId: number;
|
||||
// 一共有多少点
|
||||
readonly count: number;
|
||||
// 主属性
|
||||
readonly mainAttr: Map<number, {id: number, num: number}[]>;
|
||||
// 次级属性
|
||||
readonly subAttr: {id: number, num: number}[];
|
||||
// 一次升点消耗
|
||||
readonly mainConsume: RewardInter[];
|
||||
// 升星消耗
|
||||
readonly subConsume: RewardInter[];
|
||||
|
||||
}
|
||||
|
||||
export const dicEquipStar = new Map<number, DicEquipStar>();
|
||||
export const dicEquipStarIdByEquipId = new Map<string, number>(); // equipId&point => id
|
||||
|
||||
export function loadEquipStar() {
|
||||
dicEquipStar.clear();
|
||||
dicEquipStarIdByEquipId.clear();
|
||||
let arr = readFileAndParse(FILENAME.DIC_EQUIP_STAR);
|
||||
|
||||
arr.forEach(o => {
|
||||
o.mainConsume = parseGoodStr(o.mainConsume);
|
||||
o.subConsume = parseGoodStr(o.subConsume);
|
||||
o.mainAttr = parseAttrMap(o.mainAttr);
|
||||
o.subAttr = parseAttr(o.subAttr);
|
||||
dicEquipStarIdByEquipId.set(`${o.equipId}_${o.star}`, o.id);
|
||||
dicEquipStar.set(o.id, o);
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
function parseAttrMap(str: string) {
|
||||
let result = new Map<number, {id: number, num: number}[]>();
|
||||
if(!str) return result;
|
||||
let decodeArr = decodeArrayListStr(str);
|
||||
for(let i = 0; i < decodeArr.length; i++) {
|
||||
let [id, num] = decodeArr[i];
|
||||
if(isNaN(parseInt(id)) || isNaN(parseInt(num))) {
|
||||
throw new Error('data table format wrong');
|
||||
}
|
||||
result.set(i + 1, [{id: parseInt(id), num: parseInt(num)}]);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function parseAttr(str: string) {
|
||||
let result = new Array<{id: number, num: number}>();
|
||||
if(!str) return result;
|
||||
let decodeArr = decodeArrayListStr(str);
|
||||
for(let [id, num] of decodeArr) {
|
||||
if(isNaN(parseInt(id)) || isNaN(parseInt(num))) {
|
||||
throw new Error('data table format wrong');
|
||||
}
|
||||
result.push({id: parseInt(id), num: parseInt(num)});
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -11,34 +11,33 @@ export interface DicEquipSuit {
|
||||
readonly equips: number[];
|
||||
// 按星级可解锁的属性
|
||||
readonly effect: { star: number, seid: number }[];
|
||||
// 解锁条件索引
|
||||
readonly effectCondition: Map<number, number>
|
||||
}
|
||||
|
||||
export const dicEquipSuit = new Map<number, DicEquipSuit>();
|
||||
export const dicEquipSuitByJobClass = new Map<number, number>();
|
||||
export function loadEquipSuit() {
|
||||
dicEquipSuit.clear();
|
||||
let arr = readFileAndParse(FILENAME.DIC_EQUIP);
|
||||
dicEquipSuitByJobClass.clear();
|
||||
let arr = readFileAndParse(FILENAME.DIC_EQUIP_SUIT);
|
||||
|
||||
arr.forEach(o => {
|
||||
o.equips = parseNumberList(o.equips);
|
||||
parseRandomEffect(o, o.effect);
|
||||
dicEquipSuit.set(o.jobClass, o);
|
||||
o.effect = parseEffect(o.effect);
|
||||
dicEquipSuit.set(o.id, o);
|
||||
dicEquipSuitByJobClass.set(o.jobClass, o.id);
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
function parseRandomEffect(o: any, str: string) {
|
||||
if (!str) return null;
|
||||
function parseEffect(str: string) {
|
||||
let result = new Array<{star: number, seid: number}>();
|
||||
if(!str) return result;
|
||||
let decodeArr = decodeArrayListStr(str);
|
||||
let effect: number[] = [], effectCondition = new Map<number, number>();
|
||||
for(let [star, seid] of decodeArr) {
|
||||
if (isNaN(parseInt(star)) || isNaN(parseFloat(seid))) {
|
||||
if(isNaN(parseInt(star)) || isNaN(parseInt(seid))) {
|
||||
throw new Error('data table format wrong');
|
||||
}
|
||||
effect.push(parseInt(seid));
|
||||
effectCondition.set(parseInt(seid), parseInt(star));
|
||||
result.push({star: parseInt(star), seid: parseInt(seid)});
|
||||
}
|
||||
o.effect = effect;
|
||||
o.effectCondition = effectCondition;
|
||||
return result
|
||||
}
|
||||
@@ -5,11 +5,11 @@
|
||||
import { HERO_SYSTEM_TYPE, ABI_TYPE, HERO_CE_RATIO, LINEUP_NUM } from '../consts';
|
||||
|
||||
import { cal, deepCopy, getAllAttrStage, reduceCe } from './util';
|
||||
import { HeroModel, HeroType, HeroUpdate, CeAttrData } from '../db/Hero';
|
||||
import { HeroModel, HeroType, HeroUpdate, CeAttrData, EPlace } from '../db/Hero';
|
||||
import { RoleModel, RoleType, RoleUpdate, CeAttrDataRole } from '../db/Role';
|
||||
import { AttributeCal } from '../domain/roleField/attribute';
|
||||
import { ABI_STAGE, SEID_TYPE } from '../consts';
|
||||
import { gameData, getJobByGradeAndClass, getHeroWakeByQuality, getHeroStarByQuality, getFriendShipById, getSchoolRateByStar, getScollByStar, getTeraph } from './data';
|
||||
import { gameData, getJobByGradeAndClass, getHeroWakeByQuality, getHeroStarByQuality, getFriendShipById, getSchoolRateByStar, getScollByStar, getTeraph, getEquipQualityIdByEquipIdAndPoint, getEquipStarIdByEquipId, getEquipSuitByHero, getEquipStarMainAttrByStage } from './data';
|
||||
import { DicSe } from './dictionary/DicSe';
|
||||
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||||
import { SchoolModel } from '../db/School';
|
||||
@@ -173,6 +173,9 @@ export function calPlayerCe(hero: HeroType, update: HeroUpdate, type: number, ar
|
||||
case HERO_SYSTEM_TYPE.EQUIP_QUALITY:
|
||||
heroAttrs = calEquipQualityIncAttr(hero, update, args);
|
||||
break;
|
||||
case HERO_SYSTEM_TYPE.EQUIP_STAR:
|
||||
heroAttrs = calEquipStarIncAttr(hero, update, args, addSeidList, removeSeidList);
|
||||
break;
|
||||
case HERO_SYSTEM_TYPE.EQUIP: //
|
||||
heroAttrs = calEquipPutOnOffIncAttr(hero, args, addSeidList, removeSeidList);
|
||||
break;
|
||||
@@ -645,8 +648,8 @@ export function calEquipQualityIncAttr(hero: HeroType, update: HeroUpdate, eplac
|
||||
let oldEquip = oldEplace.find(cur => cur.id == eplaceId);
|
||||
let newEquip = newEplace.find(cur => cur.id == eplaceId);
|
||||
if(newEquip && oldEquip) {
|
||||
let dicOldEquipQuality = gameData.equipQuality.get(oldEquip.equipId);
|
||||
let dicNewEquipQuality = gameData.equipQuality.get(oldEquip.equipId);
|
||||
let dicOldEquipQuality = getEquipQualityIdByEquipIdAndPoint(oldEquip.equipId, oldEquip.quality, oldEquip.qualityStage);
|
||||
let dicNewEquipQuality = getEquipQualityIdByEquipIdAndPoint(newEquip.equipId, newEquip.quality, newEquip.qualityStage);
|
||||
for(let attr of dicOldEquipQuality.attribute) {
|
||||
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: -1 * attr.num * HERO_CE_RATIO } });
|
||||
}
|
||||
@@ -658,6 +661,56 @@ export function calEquipQualityIncAttr(hero: HeroType, update: HeroUpdate, eplac
|
||||
return heroAttrs
|
||||
}
|
||||
|
||||
|
||||
export function calEquipStarIncAttr(hero: HeroType, update: HeroUpdate, eplaceIds: number[], addSeidList: number[], removeSeidList: number[]) {
|
||||
// 升星本身的属性加成
|
||||
let { hid, attr: heroAttrs, ePlace: oldEplace } = hero;
|
||||
let { ePlace: newEplace } = update;
|
||||
for(let eplaceId of eplaceIds) {
|
||||
let oldEquip = oldEplace.find(cur => cur.id == eplaceId);
|
||||
let newEquip = newEplace.find(cur => cur.id == eplaceId);
|
||||
if(newEquip && oldEquip) {
|
||||
let dicOldEquipStar = getEquipStarIdByEquipId(oldEquip.equipId, oldEquip.star);
|
||||
let dicNewEquipStar = getEquipStarIdByEquipId(newEquip.equipId, newEquip.star);
|
||||
// 主属性
|
||||
for(let attr of getEquipStarMainAttrByStage(oldEquip.equipId, oldEquip.star, oldEquip.starStage)) {
|
||||
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: -1 * attr.num * HERO_CE_RATIO } });
|
||||
}
|
||||
for(let attr of getEquipStarMainAttrByStage(newEquip.equipId, newEquip.star, newEquip.starStage)) {
|
||||
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: attr.num * HERO_CE_RATIO } });
|
||||
}
|
||||
for(let attr of dicOldEquipStar.subAttr) {
|
||||
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: -1 * attr.num * HERO_CE_RATIO } });
|
||||
}
|
||||
for(let attr of dicNewEquipStar.subAttr) {
|
||||
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: attr.num * HERO_CE_RATIO } });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 套装属性
|
||||
calEquipSuitIncAttr(hid, oldEplace, newEplace, addSeidList, removeSeidList);
|
||||
return heroAttrs;
|
||||
}
|
||||
|
||||
function calEquipSuitIncAttr(hid: number, oldEplace: EPlace[], newEplace: EPlace[], addSeidList: number[], removeSeidList: number[]) {
|
||||
let dicEquipSuit = getEquipSuitByHero(hid);
|
||||
let oldSuitStars: number[] = [], newSuitStars: number[] = [];
|
||||
for(let equipId of dicEquipSuit.equips) {
|
||||
let oldEquip = oldEplace.find(cur => cur.equipId == equipId);
|
||||
oldSuitStars.push(oldEquip? oldEquip.star: 0);
|
||||
let newEquip = newEplace.find(cur => cur.equipId == equipId);
|
||||
newSuitStars.push(newEquip? newEquip.star: 0);
|
||||
}
|
||||
let oldStar = Math.min(...oldSuitStars);
|
||||
let newStar = Math.min(...newSuitStars);
|
||||
|
||||
for(let { star, seid } of dicEquipSuit.effect) {
|
||||
if(oldStar >= star) removeSeidList.push(seid);
|
||||
if(newStar >= star) addSeidList.push(seid);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 穿脱, removeSeidList原来身上穿着的所有装备的seid,包括套装的
|
||||
* @param {HeroType} hero 武将
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user