diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index e19a14a6f..94514a0cd 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -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(); - 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 } }); } //穿带时装 diff --git a/game-server/app/servers/role/handler/roleHandler.ts b/game-server/app/servers/role/handler/roleHandler.ts index 8c0b27553..a4cc51068 100644 --- a/game-server/app/servers/role/handler/roleHandler.ts +++ b/game-server/app/servers/role/handler/roleHandler.ts @@ -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']) }); } diff --git a/game-server/app/services/playerCeService.ts b/game-server/app/services/playerCeService.ts index b90bfd549..ec8081f5d 100644 --- a/game-server/app/services/playerCeService.ts +++ b/game-server/app/services/playerCeService.ts @@ -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) { diff --git a/game-server/app/services/role/calCe.ts b/game-server/app/services/role/calCe.ts index 5bbcb89c2..07fa915d0 100644 --- a/game-server/app/services/role/calCe.ts +++ b/game-server/app/services/role/calCe.ts @@ -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(); // 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) diff --git a/game-server/app/services/roleService.ts b/game-server/app/services/roleService.ts index c2ba0f608..74824217e 100644 --- a/game-server/app/services/roleService.ts +++ b/game-server/app/services/roleService.ts @@ -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); diff --git a/game-server/app/services/task/taskObj.ts b/game-server/app/services/task/taskObj.ts index 4e0d6614e..bcc7a8b79 100644 --- a/game-server/app/services/task/taskObj.ts +++ b/game-server/app/services/task/taskObj.ts @@ -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; diff --git a/game-server/config/clientProtos.ts b/game-server/config/clientProtos.ts index 29ebcfde5..9fd667436 100644 --- a/game-server/config/clientProtos.ts +++ b/game-server/config/clientProtos.ts @@ -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 }, diff --git a/game-server/test/CheckPatten.ts b/game-server/test/CheckPatten.ts index 43903c8d4..e29ccae0c 100644 --- a/game-server/test/CheckPatten.ts +++ b/game-server/test/CheckPatten.ts @@ -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'); diff --git a/shared/consts/constModules/selectConst.ts b/shared/consts/constModules/selectConst.ts index 6d19ab45a..af6b6547c 100644 --- a/shared/consts/constModules/selectConst.ts +++ b/shared/consts/constModules/selectConst.ts @@ -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' } diff --git a/shared/db/Hero.ts b/shared/db/Hero.ts index a2c8aaef7..96cd4939f 100644 --- a/shared/db/Hero.ts +++ b/shared/db/Hero.ts @@ -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 }) diff --git a/shared/domain/roleField/friend.ts b/shared/domain/roleField/friend.ts index 8babebd4c..a4237cd54 100644 --- a/shared/domain/roleField/friend.ts +++ b/shared/domain/roleField/friend.ts @@ -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}) { diff --git a/shared/domain/roleField/hero.ts b/shared/domain/roleField/hero.ts index bbcb2ed48..fcf3c704a 100644 --- a/shared/domain/roleField/hero.ts +++ b/shared/domain/roleField/hero.ts @@ -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)); diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 14f4f7fee..7c459b6a9 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -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(); diff --git a/shared/pubUtils/dictionary/DicFriendShip.ts b/shared/pubUtils/dictionary/DicFriendShip.ts index 9e4819af0..9cd93e2f4 100644 --- a/shared/pubUtils/dictionary/DicFriendShip.ts +++ b/shared/pubUtils/dictionary/DicFriendShip.ts @@ -17,24 +17,30 @@ export interface DicFriendShip { readonly hids: Array; // 属性加成 readonly attributes: Array<{id: number, number: number}> - // 消耗铜币 - readonly costCoin: number; + // 升到这一级所需的羁绊值 + readonly shipValue: number; } -export const friendShips = new Map(); -export const friendShipHidAandIds = new Map(); +export const friendShips = new Map(); +export const friendShipsByLv = new Map(); 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; } diff --git a/shared/pubUtils/dictionary/DicFriendShipLevel.ts b/shared/pubUtils/dictionary/DicFriendShipLevel.ts deleted file mode 100644 index 40f342a90..000000000 --- a/shared/pubUtils/dictionary/DicFriendShipLevel.ts +++ /dev/null @@ -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(); -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; -} \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_friend_ship.json b/shared/resource/jsons/dic_zyz_friend_ship.json index 1c6d02576..c2107402f 100644 --- a/shared/resource/jsons/dic_zyz_friend_ship.json +++ b/shared/resource/jsons/dic_zyz_friend_ship.json @@ -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,