羁绊:修改武将羁绊格式
This commit is contained in:
@@ -6,15 +6,15 @@ import { HeroModel, Connect, HeroSkin, HeroUpdate, EPlace, Talent } from '../../
|
||||
import { CURRENCY_BY_TYPE, CURRENCY_TYPE, CONSUME_TYPE, HERO_GROW_MAX, HERO_SYSTEM_TYPE, ABI_STAGE, DEBUG_MAGIC_WORD, HERO_INITIAL_QUALITY, REDIS_KEY, TASK_TYPE, ITEM_CHANGE_REASON } from '../../../consts';
|
||||
import { RoleModel } from '../../../db/Role';
|
||||
import { ItemModel } from '../../../db/Item';
|
||||
import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getFriendShipById, getFavourLvByExp, reloadDicParam, getEquipByJobClassAndEPlace, getScollByStar, getExpByLv } from '../../../pubUtils/data';
|
||||
import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getConnectLvByExp, getEquipByJobClassAndEPlace, getScollByStar, getExpByLv, hasCurConnect } from '../../../pubUtils/data';
|
||||
import { ItemInter, RewardInter } from '../../../pubUtils/interface';
|
||||
import { getDropItems, FIGURE_UNLOCK_CONDITION } from '../../../consts/constModules/itemConst'
|
||||
import { getDropItems, FIGURE_UNLOCK_CONDITION, ITID } from '../../../consts/constModules/itemConst'
|
||||
import { pushComposeOrangeHero, pushHeroQualityUpMsg, pushHeroStarMax, pushHeroWakeUp } from '../../../services/chatService';
|
||||
import { PvpDefenseModel } from '../../../db/PvpDefense';
|
||||
import { checkTask, checkTaskInHeroQUalityUp, checkTaskInHeroStarUp, checkTaskInHeroTrain, checkTaskInHeroWakeUp } from '../../../services/task/taskService';
|
||||
import { isNumber, pick } from 'underscore';
|
||||
import { updateEplaces } from '../../../services/equipService';
|
||||
import { addConsumeToHero, checkUnlockTalentCondition, initSkinTalent, updateSkinTalent } from '../../../services/roleService';
|
||||
import { addConnect, addConsumeToHero, checkUnlockTalentCondition, initSkinTalent, updateSkinTalent } from '../../../services/roleService';
|
||||
import { JewelModel, jewelUpdate } from '../../../db/Jewel';
|
||||
import { HERO, REBORN } from '../../../pubUtils/dicParam';
|
||||
import { createHero, createHeroes } from '../../../services/role/createHero';
|
||||
@@ -408,136 +408,60 @@ export class HeroHandler {
|
||||
return resResult(STATUS.SUCCESS, { curHero: {...pick(heroResult, ['hid', 'job', 'jobStage', 'totalTalentPoint']) }});
|
||||
}
|
||||
|
||||
//激活羁绊
|
||||
async heroConectionActivate(msg: { shipId: number }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
let sid: string = session.get('sid');
|
||||
let serverId: number = session.get('serverId');
|
||||
|
||||
let { shipId } = msg;
|
||||
let shipHidAndLevel = gameData.friendShipHidAandIds.get(shipId);
|
||||
if (!shipHidAndLevel) return resResult(STATUS.HERO_CONECTION_IS_NOT_EXIT);
|
||||
let hero = await HeroModel.findByHidAndRole(shipHidAndLevel.actorId, roleId);
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
|
||||
let heroConnections: Connect[] = deepCopy(hero.connections);
|
||||
|
||||
let curConnect = heroConnections.find(cur => cur.shipId == shipId);
|
||||
if (!curConnect) {
|
||||
curConnect = { shipId, level: 0 };
|
||||
heroConnections.push(curConnect);
|
||||
}
|
||||
if (curConnect.level >= shipHidAndLevel.level) {
|
||||
return resResult(STATUS.HERO_CONECTION_IS_MAX_LEVEL);
|
||||
}
|
||||
|
||||
curConnect.level++;
|
||||
let level = curConnect.level;
|
||||
|
||||
let friendShip = getFriendShipById(shipId, level);
|
||||
if (hero.star + hero.colorStar < friendShip.level)
|
||||
return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL);
|
||||
let hids = friendShip.hids;
|
||||
for (let hid of hids) {
|
||||
if (hid == shipHidAndLevel.actorId)
|
||||
continue;
|
||||
let member = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!member)
|
||||
return resResult(STATUS.ROLE_SHORT_HERO_CONECTION);
|
||||
if (member.star + member.colorStar < friendShip.level)
|
||||
return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL);
|
||||
}
|
||||
let consumes = [getCoinObject(friendShip.costCoin)];
|
||||
let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.HERO_CONNECT_ACTIVE);
|
||||
if (!result) {
|
||||
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
|
||||
}
|
||||
let update = {
|
||||
connections: heroConnections,
|
||||
consumes: addConsumeToHero(hero.consumes, consumes)
|
||||
}
|
||||
//重算战力并下发
|
||||
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.CONNECT, roleId, serverId, sid, hero.hid, update, { shipId, hero });
|
||||
// 任务
|
||||
await checkTask(serverId, roleId, sid, TASK_TYPE.HERO_CONNECT, { connectLv: level })
|
||||
return resResult(STATUS.SUCCESS, { curHero: pick(curHero, ['hid', 'connections']) });
|
||||
}
|
||||
|
||||
//赠送(包括一键赠送)
|
||||
async heroGiveFavor(msg: { hid: number, type: number }, session: BackendSession) {
|
||||
async heroGiveFavor(msg: { hid: number, shipId: number, items: [{id: number, count: number}] }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
let sid: string = session.get('sid');
|
||||
let serverId: number = session.get('serverId');
|
||||
|
||||
let { hid, type } = msg;
|
||||
|
||||
let addLv = 0;
|
||||
if (type == 1) {
|
||||
addLv = 1;
|
||||
} else if (type == 5) {
|
||||
addLv = 5;
|
||||
} else {
|
||||
return resResult(STATUS.WRONG_PARMS);
|
||||
}
|
||||
let { hid, shipId, items } = msg;
|
||||
|
||||
if(!hasCurConnect(hid, shipId)) return resResult(STATUS.WRONG_PARMS);
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
|
||||
|
||||
let { favourLv: oldLv, favour: oldExp, lv } = hero;
|
||||
|
||||
let maxLv = lv > gameData.maxFriendShipLv.max ? gameData.maxFriendShipLv.max : lv; // 好感度最大等级
|
||||
if (maxLv <= oldLv)
|
||||
return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT);
|
||||
|
||||
// 计算武将可以升的级数
|
||||
if (oldLv + addLv > maxLv) addLv = maxLv - oldLv;
|
||||
|
||||
let nextObj = gameData.friendShipLevelMap.get(oldLv + addLv - 1);
|
||||
if (!nextObj) return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT);
|
||||
let nextExp = nextObj.expSum;
|
||||
let needExp = nextExp - oldExp;
|
||||
let newExp = oldExp;
|
||||
let { connections } = hero;
|
||||
let curConnect = connections.find(cur => cur.shipId == shipId);
|
||||
let { level = 0, exp = 0 } = curConnect||{};
|
||||
|
||||
let newLevel = level;
|
||||
// 计算得材料可转换的经验
|
||||
let originalConsumes = await ItemModel.findByRoleAndType(roleId, CONSUME_TYPE.FAVOUR);
|
||||
let material = new Array<RewardInter>();
|
||||
for (let { id, count } of originalConsumes) {
|
||||
let check = new CheckMeterial(roleId);
|
||||
for (let { id, count } of items) {
|
||||
let dicGoods = gameData.goods.get(id);
|
||||
if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
let needCount = Math.ceil(needExp / dicGoods.value);
|
||||
if(needCount <= 0) break;
|
||||
if(needCount > count) needCount = count;
|
||||
material.push({ id, count: needCount });
|
||||
newExp += dicGoods.value * needCount;
|
||||
needExp -= dicGoods.value * count;
|
||||
let dicItid = ITID.get(dicGoods.itid);
|
||||
if (!dicItid) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
if(dicItid.type != CONSUME_TYPE.FAVOUR) return resResult(STATUS.ROLE_WRONG_ITEM);
|
||||
|
||||
let isEnough = await check.decrease([{ id, count }]);
|
||||
if(!isEnough) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
exp += dicGoods.value * count;
|
||||
let { newLv, maxLv } = getConnectLvByExp(hid, shipId, exp);
|
||||
if(newLevel > maxLv) return resResult(STATUS.HERO_CONECTION_IS_MAX_LEVEL);
|
||||
newLevel = newLv;
|
||||
}
|
||||
|
||||
if (newExp == oldExp) {
|
||||
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
|
||||
}
|
||||
|
||||
let newLv = getFavourLvByExp(newExp);
|
||||
|
||||
let result = await handleCost(roleId, sid, material, ITEM_CHANGE_REASON.HERO_GIVE_FAVOR);
|
||||
let material = check.getConsume();
|
||||
let result = await handleCost(roleId, sid, items, ITEM_CHANGE_REASON.HERO_GIVE_FAVOR);
|
||||
if (!result) {
|
||||
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
|
||||
}
|
||||
|
||||
let updateConsume = addConsumeToHero(hero.consumes, material);
|
||||
let update = {
|
||||
favour: newExp,
|
||||
favourLv: newLv,
|
||||
connections: addConnect(connections, { shipId, level: newLevel, exp }),
|
||||
consumes: updateConsume
|
||||
}
|
||||
|
||||
let isFavourLvUp = oldLv != newLv;
|
||||
|
||||
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.FAVOUR, roleId, serverId, sid, hero.hid, update, { isFavourLvUp, hero });
|
||||
if(isFavourLvUp) {
|
||||
await unlockFigure(sid, roleId, [{ type: FIGURE_UNLOCK_CONDITION.HERO_FAVOR, paramHid: curHero.hid, paramFavourLv: curHero.favourLv }]);
|
||||
await checkTask(serverId, roleId, sid, TASK_TYPE.HERO_FAVOUR_LV, { hero: curHero, oldFavourLv: oldLv }); // 任务
|
||||
let isLv = level != newLevel;
|
||||
let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.CONNECT, roleId, serverId, sid, hero.hid, update);
|
||||
if(isLv) {
|
||||
// await unlockFigure(sid, roleId, [{ type: FIGURE_UNLOCK_CONDITION.HERO_FAVOR, paramHid: curHero.hid, paramFavourLv: curHero.favourLv }]);
|
||||
await checkTask(serverId, roleId, sid, TASK_TYPE.HERO_CONNECT, { connectLv: newLevel })
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, { curHero: { ...pick(curHero, ['hid', 'favour', 'favourLv']), cost: material } });
|
||||
return resResult(STATUS.SUCCESS, { curHero: { ...pick(curHero, ['hid', 'connections']), shipId } });
|
||||
}
|
||||
|
||||
//穿带时装
|
||||
|
||||
@@ -288,16 +288,16 @@ export class RoleHandler {
|
||||
|
||||
let { hid } = msg;
|
||||
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId, 'hid lv star colorStar quality scrollId scrollActive scrollStar scrollColorStar scrollQuality favour favourLv connections attr ce');
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId, 'hid lv star colorStar quality scrollId scrollActive scrollStar scrollColorStar scrollQuality connections attr ce');
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
|
||||
let dicHero = gameData.hero.get(hid);
|
||||
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let { star, colorStar, quality, scrollId, scrollActive, scrollStar, scrollColorStar, scrollQuality, favour, favourLv } = hero;
|
||||
let { star, colorStar, quality, scrollId, scrollActive, scrollStar, scrollColorStar, scrollQuality } = hero;
|
||||
|
||||
let update = {
|
||||
scrollActive, scrollId, scrollStar, scrollColorStar, scrollQuality, favour, favourLv
|
||||
scrollActive, scrollId, scrollStar, scrollColorStar, scrollQuality
|
||||
};
|
||||
if (!scrollActive) { // 初次激活
|
||||
update.scrollActive = true;
|
||||
@@ -327,7 +327,7 @@ export class RoleHandler {
|
||||
await checkTaskInActiveScroll(serverId, roleId, sid, scrollActive, hero);
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
curHero: pick(curHero, ['hid', 'scrollActive', 'scrollId', 'scrollStar', 'scrollColorStar', 'scrollQuality', 'favour', 'favourLv'])
|
||||
curHero: pick(curHero, ['hid', 'scrollActive', 'scrollId', 'scrollStar', 'scrollColorStar', 'scrollQuality'])
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -135,16 +135,6 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.FAVOUR: // 8. 好感度
|
||||
{
|
||||
let { hero: { connections }, isFavourLvUp } = param;
|
||||
if(isFavourLvUp) {
|
||||
for(let [hid, { favourLv }] of heroUpdates) {
|
||||
calCe.setFavour(hid, favourLv, connections);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HERO_SYSTEM_TYPE.CONNECT: // 9. 羁绊
|
||||
{
|
||||
for(let [ hid, { connections } ] of heroUpdates) {
|
||||
@@ -297,12 +287,11 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve
|
||||
{
|
||||
let { role, schools, jewels, heroes, skins } = param;
|
||||
calCe.clearRoleCe();
|
||||
for(let { hid, skinId, lv, quality, star, starStage, colorStar, colorStarStage, job, jobStage, connections, favourLv, skins, scrollStar, scrollQuality, scrollColorStar, ePlace } of heroes) {
|
||||
for(let { hid, skinId, lv, quality, star, starStage, colorStar, colorStarStage, job, jobStage, connections, skins, scrollStar, scrollQuality, scrollColorStar, ePlace } of heroes) {
|
||||
calCe.setHeroBase(hid, skinId);
|
||||
calCe.setHeroLv(hid, lv);
|
||||
calCe.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage);
|
||||
calCe.setJob(hid, job, jobStage);
|
||||
calCe.setFavour(hid, favourLv, connections);
|
||||
calCe.setConnection(hid, connections);
|
||||
calCe.setTalent(hid, skins);
|
||||
for(let { id, equipId, star, starStage, quality, qualityStage, lv: equipLv, stones, jewel } of ePlace) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import { RoleUpdate, Teraph } from "../../db/Role";
|
||||
import { AttrCell, Attribute, EquipAttr, HeroAttr, RoleCeType, SchoolAttr, ScrollAttr } from "../../db/RoleCe";
|
||||
import { TopHero } from "../../domain/dbGeneral";
|
||||
import { AttributeCal } from "../../domain/roleField/attribute";
|
||||
import { gameData, getEquipQualityIdByEquipIdAndPoint, getEquipStarAttrByStage, getEquipStrenthenAttr, getEquipSuitByHero, getFriendShipById, getHeroStarByQuality, getHeroWakeByQuality, getJewelConditionByLvAndSeId, getJobByGradeAndClass, getSchoolRateByStar, getScollByStar, getTeraph } from "../../pubUtils/data";
|
||||
import { gameData, getEquipQualityIdByEquipIdAndPoint, getEquipStarAttrByStage, getEquipStrenthenAttr, getEquipSuitByHero, getFriendShipByIdAndLv, getHeroStarByQuality, getHeroWakeByQuality, getJewelConditionByLvAndSeId, getJobByGradeAndClass, getSchoolRateByStar, getScollByStar, getTeraph } from "../../pubUtils/data";
|
||||
import { DicRandomEffectPool } from "../../pubUtils/dictionary/DicRandomEffectPool";
|
||||
import { DicSe } from "../../pubUtils/dictionary/DicSe";
|
||||
import { addToMap, deepCopy } from "../../pubUtils/util";
|
||||
@@ -45,13 +45,13 @@ export class CalCe {
|
||||
let lv = this.data.heroLv.get(hid)||1;
|
||||
for(let attrId = ABI_TYPE.ABI_HP; attrId < ABI_TYPE.ABI_MAX; attrId++) {
|
||||
if(!this.data.heroAttrs.has(`${hid}_${attrId}`) && !this.data.globalAttrs.has(attrId)) continue;
|
||||
let { mainBase = 0, subBase = 0, job = 0, starUp = 0, connect = 0, favour = 0, talent = 0, equipQuality = 0, equipStrength = 0, equipStar = 0, equipSuit = 0, jewel = 0, stone = 0 } = this.data.heroAttrs.get(`${hid}_${attrId}`)||{};
|
||||
let { mainBase = 0, subBase = 0, job = 0, starUp = 0, connect = 0, talent = 0, equipQuality = 0, equipStrength = 0, equipStar = 0, equipSuit = 0, jewel = 0, stone = 0 } = this.data.heroAttrs.get(`${hid}_${attrId}`)||{};
|
||||
let { school = 0, teraph = 0, title = 0, scroll = 0, skin = 0 } = this.data.getGlobalAttrById(attrId)||{};
|
||||
let val = 0, str = '';
|
||||
if(ABI_TYPE_MAIN.indexOf(attrId) != -1) {
|
||||
// {[hp1 + lv * hp2 + hp3 * ( 1 + hp4 )] * (1 + hp5 ) + [( hp6 + hp7 ) * ( 1 + hp8 )] } * ( 1 + hp9 ) + hp10 + hp11
|
||||
val = ((mainBase + job + lv * starUp + connect * ( 1 + favour/100 )) * ( 1 + school/100 + talent/100 ) + (( equipQuality + equipStrength ) * ( 1 + ( equipStar/100 + equipSuit/100 ))) ) * ( 1 + jewel/100 ) + stone + teraph + title + scroll + skin;
|
||||
str += `{[${mainBase}+${job}+${lv}*${starUp}+${connect}*(1+${favour}/100)]*(1+${school}/100+${talent}/100)+[(${equipQuality}+${equipStrength})*(1+${equipStar}/100+${equipSuit}/100)]}*(1+${jewel}/100)+${stone}+${teraph}+${title}+${scroll}+${skin}`;
|
||||
val = ((mainBase + job + lv * starUp + connect ) * ( 1 + school/100 + talent/100 ) + (( equipQuality + equipStrength ) * ( 1 + ( equipStar/100 + equipSuit/100 ))) ) * ( 1 + jewel/100 ) + stone + teraph + title + scroll + skin;
|
||||
str += `{[${mainBase}+${job}+${lv}*${starUp}+${connect}]*(1+${school}/100+${talent}/100)+[(${equipQuality}+${equipStrength})*(1+${equipStar}/100+${equipSuit}/100)]}*(1+${jewel}/100)+${stone}+${teraph}+${title}+${scroll}+${skin}`;
|
||||
} else {
|
||||
// attr1 + attr2 + attr3 + attr4 + attr5 + attr6 + attr7 + attr8 + attr9
|
||||
val = subBase + job + talent + teraph + school + title + jewel + skin + equipStar;
|
||||
@@ -191,26 +191,12 @@ export class CalCe {
|
||||
}
|
||||
}
|
||||
|
||||
// 好感度
|
||||
public setFavour(hid: number, favourLv: number, connections: Connect[]) {
|
||||
this.data.clearHeroAttrByHid(hid, 'favour');
|
||||
let currentFiendShipLevel = gameData.friendShipLevelMap.get(favourLv);
|
||||
let add = currentFiendShipLevel.add;
|
||||
for (let {shipId, level} of connections) {
|
||||
let dicHeroFriendShip = getFriendShipById(shipId, level);
|
||||
for (let { id } of dicHeroFriendShip.attributes) {
|
||||
let heroAttr = this.data.getHeroAttrByHidAndId(hid, id);
|
||||
heroAttr.favour = add;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 羁绊
|
||||
public setConnection(hid: number, connections: Connect[]) {
|
||||
this.data.clearHeroAttrByHid(hid, 'connect');
|
||||
let map = new Map<number, number>(); // attrId => val;
|
||||
for(let { shipId, level = 0 } of connections) {
|
||||
let currentShip = getFriendShipById(shipId, level);
|
||||
let currentShip = getFriendShipByIdAndLv(hid, shipId, level);
|
||||
if (currentShip) {
|
||||
for (let { id, number: val } of currentShip.attributes) {
|
||||
if(!map.has(id)) {
|
||||
@@ -988,7 +974,7 @@ abstract class HeroAllAttr {
|
||||
job: number = 0; // hp1 & attr2, 职业属性(dic_zyz_job的attr)
|
||||
starUp: number = 0; // hp2, 角色升星成长(dic_zyz_hero_star的hp或dic_zyz_hero_wake的hp)
|
||||
connect: number = 0; // hp3, 角色羁绊固定值(dic_zyz_friend_ship的attribute)
|
||||
favour: number = 0; // hp4, 声望加成(dic_zyz_friend_ship_level的add)
|
||||
favour: number = 0; // 删除-hp4, 声望加成(dic_zyz_friend_ship_level的add)
|
||||
talent: number = 0; // hp5 & attr3, 天赋树百分比加成(dic_zyz_hero_talent的levelSeid,然后对应到dic_zyz_se)
|
||||
equipQuality: number = 0; // hp6, 装备品质基础值(dic_zyz_equipQuality的attribute)
|
||||
equipStrength: number = 0; // hp7, 装备强化值(dic_zyz_equipStrenthAttr的attr)
|
||||
|
||||
@@ -7,7 +7,7 @@ import { SCHOOL } from '../pubUtils/dicParam';
|
||||
import { gameData, getHeroInitTalent } from '../pubUtils/data';
|
||||
import { SchoolModel } from '../db/School';
|
||||
import { SclResultInter, SclPosInter, RewardInter, ItemInter } from '../pubUtils/interface';
|
||||
import { HeroModel, HeroSkin, HeroUpdate, Talent } from '../db/Hero';
|
||||
import { Connect, HeroModel, HeroSkin, HeroUpdate, Talent } from '../db/Hero';
|
||||
import { SkinUpdate } from '../db/Skin';
|
||||
import { Figure } from '../domain/dbGeneral';
|
||||
import { pick } from 'underscore';
|
||||
@@ -165,6 +165,23 @@ export function addConsumeToHero(oldConsume: Reward[] = [], consumes: ItemInter[
|
||||
return newConsume;
|
||||
}
|
||||
|
||||
export function addConnect(connections: Connect[], curConnect: Connect) {
|
||||
let newConnections: Connect[] = [];
|
||||
let index = -1;
|
||||
for(let i = 0; i < connections.length; i++) {
|
||||
if(connections[i].shipId == curConnect.shipId) {
|
||||
index = i;
|
||||
newConnections.push(curConnect);
|
||||
} else {
|
||||
newConnections.push(connections[i]);
|
||||
}
|
||||
}
|
||||
if(index == -1) {
|
||||
newConnections.push(curConnect);
|
||||
}
|
||||
return newConnections;
|
||||
}
|
||||
|
||||
export function checkUnlockTalentCondition(hid: number, id: number, talents: Talent[], usedTalentPoint: number) {
|
||||
let dicHero = gameData.hero.get(hid);
|
||||
let dicHeroTalent = gameData.heroTalent.get(id);
|
||||
|
||||
@@ -521,14 +521,14 @@ export class CheckSingleTask {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TASK_TYPE.HERO_FAVOUR_LV: // 15.
|
||||
{
|
||||
let { hero, oldFavourLv } = param;
|
||||
if(dicTaskParam[1] > oldFavourLv && dicTaskParam[1] <= hero.favourLv) {
|
||||
result = { inc: 1 };
|
||||
}
|
||||
break;
|
||||
}
|
||||
// case TASK_TYPE.HERO_FAVOUR_LV: // 15.
|
||||
// {
|
||||
// let { hero, oldFavourLv } = param;
|
||||
// if(dicTaskParam[1] > oldFavourLv && dicTaskParam[1] <= hero.favourLv) {
|
||||
// result = { inc: 1 };
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
case TASK_TYPE.HERO_CONNECT: // 16. 激活x次 x星 武将羁绊
|
||||
{
|
||||
let { connectLv } = param;
|
||||
|
||||
@@ -121,10 +121,10 @@ module.exports = {
|
||||
"role.heroHandler.heroConectionActivate": {
|
||||
"required uInt32 shipId": 1
|
||||
},
|
||||
"role.heroHandler.heroGiveFavor": {
|
||||
"required uInt32 hid": 1,
|
||||
"required uInt32 type": 2,
|
||||
},
|
||||
// "role.heroHandler.heroGiveFavor": {
|
||||
// "required uInt32 hid": 1,
|
||||
// "required uInt32 type": 2,
|
||||
// },
|
||||
"role.heroHandler.heroWearSkin": {
|
||||
"required uInt32 id": 1
|
||||
},
|
||||
|
||||
@@ -49,8 +49,6 @@ export function checkHero(heroes) {
|
||||
expect(connection.shipId).to.be.a('number');
|
||||
expect(connection.level).to.be.a('number');
|
||||
});
|
||||
expect(hero.favour).to.be.a('number');
|
||||
expect(hero.favourLv).to.be.a('number');
|
||||
expect(hero.connections).to.be.an('array');
|
||||
hero.skins.forEach(skin => {
|
||||
expect(skin.id).to.be.a('number');
|
||||
@@ -190,7 +188,6 @@ function checkRoleHero(heros) {
|
||||
expect(hero.jobStage).to.be.a('number');
|
||||
expect(hero.skinId).to.be.a('number');
|
||||
expect(hero.favour).to.be.a('number');
|
||||
expect(hero.favourLv).to.be.a('number');
|
||||
expect(hero.connections).to.be.an('array');
|
||||
hero.connections.forEach(connect => {
|
||||
expect(connect.shipId).to.be.a('number');
|
||||
|
||||
@@ -19,7 +19,7 @@ export enum ROLE_SELECT {
|
||||
|
||||
export enum HERO_SELECT {
|
||||
ENTRY = '-_id -attr -__v',
|
||||
HERO_DETAIL = 'roleId roleName hid hName ce lv star colorStar quality job skins attr ePlace skinId connections favourLv',
|
||||
HERO_DETAIL = 'roleId roleName hid hName ce lv star colorStar quality job skins attr ePlace skinId connections',
|
||||
// 排行榜中lineup字段
|
||||
RANK_LINEUP = 'seqId roleId hid star colorStar lv quality job ce updatedAt skinId'
|
||||
}
|
||||
|
||||
@@ -16,6 +16,8 @@ export class Connect {
|
||||
shipId: number;
|
||||
@prop({ required: true })
|
||||
level: number;
|
||||
@prop({ required: true })
|
||||
exp: number;
|
||||
}
|
||||
|
||||
export class Talent {
|
||||
@@ -151,10 +153,6 @@ export default class Hero extends BaseModel {
|
||||
@prop({ required: true, default: 0 })
|
||||
skinId: number; // 当前皮肤id,fashions表的heroId字段
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
favour: number; // 好感度
|
||||
@prop({ required: true, default: 1 })
|
||||
favourLv: number; // 好感等级
|
||||
@prop({ required: true, type: Connect, default: [], _id: false })
|
||||
connections: Connect[]; // 羁绊
|
||||
@prop({ required: true, type: HeroSkin, default: [], _id: false })
|
||||
|
||||
@@ -192,7 +192,6 @@ export class HeroDetailParam {
|
||||
}
|
||||
talent: Talent[] = [];
|
||||
connections: Connect[] = [];
|
||||
favourLv: number = 0;
|
||||
role: {
|
||||
title: number;
|
||||
scroll: number;
|
||||
@@ -219,7 +218,6 @@ export class HeroDetailParam {
|
||||
}
|
||||
}
|
||||
this.connections = hero.connections;
|
||||
this.favourLv = hero.favourLv;
|
||||
}
|
||||
|
||||
setAttributes(attributes: {hp: number, atk: number, def: number, mdef: number}) {
|
||||
|
||||
@@ -56,8 +56,6 @@ export class HeroParam {
|
||||
jobStage: number; // 职阶
|
||||
skinId: number; // 当前皮肤id,fashions表的heroId字段
|
||||
|
||||
favour: number; // 好感度
|
||||
favourLv: number; // 好感等级
|
||||
connections: Connect[]; // 羁绊
|
||||
skins: HeroSKinParam[] = []; // 皮肤
|
||||
ePlace: EPlace[]; // 武将装备引用数组
|
||||
@@ -86,8 +84,6 @@ export class HeroParam {
|
||||
this.totalTalentPoint = gameData.talentPointOfJob.get(hero.job)||0;
|
||||
this.jobStage = hero.jobStage;
|
||||
this.skinId = hero.skinId;
|
||||
this.favour = hero.favour;
|
||||
this.favourLv = hero.favourLv;
|
||||
this.connections = hero.connections;
|
||||
for(let skin of hero.skins) {
|
||||
this.skins.push(new HeroSKinParam(skin));
|
||||
|
||||
@@ -15,8 +15,7 @@ import { dicWar, dicWarPvp, dicDailyWarByType, loadWar, dicHeroIdByWar } from ".
|
||||
import { dicWarJson, loadWarJson } from "./dictionary/DicWarJson";
|
||||
import { AUCTION_TIME } from "../consts";
|
||||
import { dicFashions, dicFashionsByHeroId, loadFashions } from "./dictionary/DicFashions";
|
||||
import { friendShips, friendShipHidAandIds, loadFriendShip } from "./dictionary/DicFriendShip";
|
||||
import { maxFriendShipLv, dicFriendShipLevelMap, loadFriendShipLevel } from "./dictionary/DicFriendShipLevel";
|
||||
import { friendShips, friendShipsByLv, loadFriendShip } from "./dictionary/DicFriendShip";
|
||||
import { dicHeroQualityUp, loadHeroQualityUp } from "./dictionary/DicHeroQualityUp";
|
||||
import { dicHeroStar, loadHeroStar } from "./dictionary/DicHeroStar";
|
||||
import { dicHeroWake, loadHeroWake } from "./dictionary/DicHeroWake";
|
||||
@@ -139,9 +138,7 @@ export const gameData = {
|
||||
fashion: dicFashions,
|
||||
fashionBySkinId: dicFashionsByHeroId,
|
||||
friendShips: friendShips,
|
||||
friendShipHidAandIds: friendShipHidAandIds,
|
||||
maxFriendShipLv: maxFriendShipLv,
|
||||
friendShipLevelMap: dicFriendShipLevelMap,
|
||||
friendShipsByLv: friendShipsByLv,
|
||||
randomEffectPool: dicRandomEffectPool,
|
||||
randomEffectPoolByGroupAndLv: dicRandomEffectPoolByGroupAndLv,
|
||||
title: dicTitle,
|
||||
@@ -321,19 +318,23 @@ export function getHeroExpByLv(lv: number) {
|
||||
return gameData.charexp.get(lv);
|
||||
}
|
||||
|
||||
export function hasCurConnect(actorId: number, shipId: number) {
|
||||
return gameData.friendShips.has(`${actorId}_${shipId}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据武将当前好感获得好感等级
|
||||
* @param exp 累积经验
|
||||
*/
|
||||
export function getFavourLvByExp(exp: number) {
|
||||
let curLv = 0;
|
||||
let entries = gameData.friendShipLevelMap.entries();
|
||||
for (let [lv, { expSum: sum }] of entries) {
|
||||
curLv = lv;
|
||||
if (exp < sum) break;
|
||||
export function getConnectLvByExp(actorId: number, shipId: number, newExp: number) {
|
||||
let exps = gameData.friendShips.get(`${actorId}_${shipId}`)||[];
|
||||
exps.sort((a, b) => a.level - b.level);
|
||||
let newLv = 0, maxLv = 0;
|
||||
for(let { level, shipValue } of exps) {
|
||||
if(newExp >= shipValue) newLv = level;
|
||||
if(maxLv < level) maxLv = level
|
||||
}
|
||||
|
||||
return curLv;
|
||||
return { newLv, maxLv }
|
||||
}
|
||||
|
||||
export function getBossHpByWarId(warId: number) {
|
||||
@@ -408,8 +409,8 @@ export function getJobByGradeAndClass(jobClass: number, grade: number) {
|
||||
return gameData.jobClassAndgrades.get(jobClass + '_' + grade);
|
||||
}
|
||||
|
||||
export function getFriendShipById(shipId: number, level: number) {
|
||||
return gameData.friendShips.get(shipId + '_' + level);
|
||||
export function getFriendShipByIdAndLv(actorId: number, shipId: number, level: number) {
|
||||
return gameData.friendShipsByLv.get(`${actorId}_${shipId}_${level}`);
|
||||
}
|
||||
|
||||
export function getGoodById(gid: number) {
|
||||
@@ -1057,7 +1058,6 @@ function loadDatas() {
|
||||
loadWarJson();
|
||||
loadFashions();
|
||||
loadFriendShip();
|
||||
loadFriendShipLevel();
|
||||
loadHeroQualityUp();
|
||||
loadHeroStar();
|
||||
loadHeroWake();
|
||||
|
||||
@@ -17,24 +17,30 @@ export interface DicFriendShip {
|
||||
readonly hids: Array<number>;
|
||||
// 属性加成
|
||||
readonly attributes: Array<{id: number, number: number}>
|
||||
// 消耗铜币
|
||||
readonly costCoin: number;
|
||||
// 升到这一级所需的羁绊值
|
||||
readonly shipValue: number;
|
||||
}
|
||||
|
||||
export const friendShips = new Map<string, DicFriendShip>();
|
||||
export const friendShipHidAandIds = new Map<number, {actorId: number, level:number}>();
|
||||
export const friendShips = new Map<string, { level: number, shipValue: number }[]>();
|
||||
export const friendShipsByLv = new Map<string, DicFriendShip>();
|
||||
export function loadFriendShip() {
|
||||
friendShips.clear();
|
||||
friendShipHidAandIds.clear();
|
||||
let arr = readFileAndParse(FILENAME.DIC_FRIEND_SHIP);
|
||||
|
||||
arr.forEach(o => {
|
||||
o.attributes = parseAttribute(o.attribute);
|
||||
o.hids = parseNumberList(o.memberId);
|
||||
friendShips.set(o.shipId + '_' + o.level, o);
|
||||
let fiendShipHidAandId = friendShipHidAandIds.get(o.shipId);
|
||||
if (!fiendShipHidAandId || fiendShipHidAandId.level < o.level)
|
||||
friendShipHidAandIds.set(o.shipId, {actorId: o.actorId, level: o.level});
|
||||
let key1 = `${o.actorId}_${o.shipId}`;
|
||||
let shipSumValue = 0;
|
||||
if(!friendShips.has(key1)) {
|
||||
friendShips.set(key1, []);
|
||||
shipSumValue = 0;
|
||||
}
|
||||
shipSumValue += o.shipValue;
|
||||
friendShips.get(key1).push({ level: o.level, shipValue: shipSumValue });
|
||||
|
||||
let key2 = `${o.actorId}_${o.shipId}_${o.level}`;
|
||||
friendShipsByLv.set(key2, o);
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
// 武将羁绊好感等级表
|
||||
import { readFileAndParse } from '../util';
|
||||
import { FILENAME } from '../../consts';
|
||||
|
||||
export interface DicFriendShipLevel {
|
||||
// 等级
|
||||
readonly level: number;
|
||||
// 下一级经验
|
||||
readonly exp: number;
|
||||
// 加成百分比
|
||||
readonly add: number;
|
||||
// 到这一级的总经验
|
||||
readonly expSum: number;
|
||||
}
|
||||
|
||||
export const maxFriendShipLv = { max: 0 };
|
||||
export const dicFriendShipLevelMap = new Map<number, DicFriendShipLevel>();
|
||||
export function loadFriendShipLevel() {
|
||||
maxFriendShipLv.max = 0;
|
||||
dicFriendShipLevelMap.clear();
|
||||
let arr = readFileAndParse(FILENAME.DIC_FRIEND_SHIP_LEVEL);
|
||||
let expSum = 0;
|
||||
arr.forEach(o => {
|
||||
expSum += o.exp;
|
||||
o.expSum = expSum;
|
||||
dicFriendShipLevelMap.set(o.level, o);
|
||||
if(o.level > maxFriendShipLv.max) maxFriendShipLv.max = o.level;
|
||||
});
|
||||
arr = undefined;
|
||||
}
|
||||
@@ -8,6 +8,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&84",
|
||||
"costCoin": 10000,
|
||||
"shipValue": 10,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -22,6 +23,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&168",
|
||||
"costCoin": 20000,
|
||||
"shipValue": 20,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -36,6 +38,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&252",
|
||||
"costCoin": 30000,
|
||||
"shipValue": 30,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -50,6 +53,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&336",
|
||||
"costCoin": 40000,
|
||||
"shipValue": 40,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -64,6 +68,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&420",
|
||||
"costCoin": 50000,
|
||||
"shipValue": 50,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -78,6 +83,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&504",
|
||||
"costCoin": 60000,
|
||||
"shipValue": 60,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -92,6 +98,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&588",
|
||||
"costCoin": 70000,
|
||||
"shipValue": 70,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -106,6 +113,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&672",
|
||||
"costCoin": 80000,
|
||||
"shipValue": 80,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -120,6 +128,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&756",
|
||||
"costCoin": 90000,
|
||||
"shipValue": 90,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -134,6 +143,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&840",
|
||||
"costCoin": 100000,
|
||||
"shipValue": 100,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -148,6 +158,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&924",
|
||||
"costCoin": 110000,
|
||||
"shipValue": 110,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
@@ -162,6 +173,7 @@
|
||||
"memberId": "1&5&14",
|
||||
"attribute": "2&1008",
|
||||
"costCoin": 120000,
|
||||
"shipValue": 120,
|
||||
"__EMPTY": 0,
|
||||
"__EMPTY_1": 0,
|
||||
"__EMPTY_2": 0,
|
||||
|
||||
Reference in New Issue
Block a user