diff --git a/game-server/app/servers/role/handler/equipHandler.ts b/game-server/app/servers/role/handler/equipHandler.ts index 92fc9968c..16c2827d4 100644 --- a/game-server/app/servers/role/handler/equipHandler.ts +++ b/game-server/app/servers/role/handler/equipHandler.ts @@ -9,7 +9,7 @@ import Role from "../../../db/Role"; import { calPlayerCeAndSave } from "../../../services/playerCeService"; import { getGoodById, gameData, getJewelById } from "../../../pubUtils/data"; import { EQUIP } from "../../../pubUtils/dicParam"; -import { ITID } from "../../../consts/constModules/itemConst"; +import { ITID, SPEICAL_ITEM } from "../../../consts/constModules/itemConst"; const _ = require('underscore'); @@ -23,7 +23,7 @@ export class EquipHandler { } - // 合成装备 + // test接口添加任意道具 public async addItem(msg: { id: number, count: number}, session: BackendSession) { let roleId: string = session.get('roleId'); let roleName: string = session.get('roleName'); @@ -53,7 +53,7 @@ export class EquipHandler { for(let {id, seqId} of equips) { if(specialMaterial.ids.includes(id)) { costCount++; - cost.push({id, seqId, count: 1, type: GOOD_TYPE.EQUIP }); + cost.push({id, seqId, count: 1 }); } } if(specialMaterial.count > costCount) { @@ -69,7 +69,7 @@ export class EquipHandler { let result = await handleCost(roleId, sid, cost); if(!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - let items = [{type: GOOD_TYPE.EQUIP, id: gid, count: 1}]; + let items = [{ id: gid, count: 1}]; let goods = await addItems(roleId, roleName, sid, items); return resResult(STATUS.SUCCESS, { goods }); } @@ -101,6 +101,7 @@ export class EquipHandler { let {coin} = await Role.findByRoleId(roleId); let maxLv = type == EQUIP_STRENGTHEN_TYPE.SINGLE?minLv + 1:playerLv; + if(maxLv > playerLv) maxLv = playerLv; if(minLv >= maxLv) { return resResult(STATUS.ROLE_EQUIP_REACH_MAX); } @@ -172,25 +173,29 @@ export class EquipHandler { return resResult(STATUS.ROLE_INFO_NOT_FOUND) } - // let {successRate} = dicRefine; - // for(let {id, count} of material) { + let {successRate} = dicRefine; + for(let {id, count} of material) { + let dicGoods = gameData.goods.get(id); + if(!dicGoods) return resResult(STATUS.ROLE_INFO_NOT_FOUND); + if(!SPEICAL_ITEM.REFINE_ADD_RATE.includes(id)) { + return resResult(STATUS.ROLE_WRONG_ITEM) + } + successRate += count * dicGoods.value; + if(isNaN(successRate)) console.error(id, count, dicGoods.value); + } - // } - - let ran = Math.floor(Math.random() * 100) - let isSuccess = ran <= dicRefine.successRate; + let ran = Math.floor(Math.random() * 100); + let isSuccess = ran <= successRate; + console.log(successRate, ran, isSuccess) // 消耗道具提升成功率 每个道具提升10%成功率 - // 精炼 if(isSuccess) { curEplace.refineLv++; - } else { - curEplace.refineCount++; } - // TODO 消耗 - let cost = dicRefine.material; + // 消耗 + let cost = dicRefine.material.concat(material); let result = await handleCost(roleId, sid, cost); if(!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); @@ -218,8 +223,19 @@ export class EquipHandler { return resResult(STATUS.EQUIP_HAVE_NO_RANDSE); } - if(lock) { // 仅在上锁时消耗 - let result = await handleCost(roleId, sid, []); + if(lock) { // 仅在上锁时消耗,根据已有的锁的数量判断消耗 + let lockNum = randSe.filter(cur => cur.locked).length; + let consumes:Array<{id: number, count: number}> = []; + if (lockNum == 0) { + consumes = parseReward(EQUIP.EQUIP_ONE_LOCKED); + } else if (lockNum == 1) { + consumes = parseReward(EQUIP.EQUIP_TWO_LOCKED); + } else if (lockNum == 2) { + consumes = parseReward(EQUIP.EQUIP_THREE_LOCKED); + } else { + consumes = parseReward(EQUIP.EQUIP_FOUR_LOCKED); + } + let result = await handleCost(roleId, sid, consumes); if(!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); } @@ -231,7 +247,7 @@ export class EquipHandler { } - // TODO 装备洗炼,消耗TODO + // 装备洗炼 public async reStrengthen(msg: { eid: number }, session: BackendSession) { let roleId: string = session.get('roleId'); // let roleName: string = session.get('roleName'); @@ -241,7 +257,7 @@ export class EquipHandler { let equip = await EquipModel.findbySeqId(eid); if(!equip) return resResult(STATUS.EQUIP_NOT_FIND); - let {id, randSe} = equip; + let {id, randSe, reStrengthenNum = 0} = equip; if(!randSe || randSe.length <=0 ) { return resResult(STATUS.EQUIP_HAVE_NO_RANDSE); } @@ -271,16 +287,22 @@ export class EquipHandler { return resResult(STATUS.ROLE_EQUIP_CANNOT_RESTRENGTHEN); } - // TODO 消耗 - let cost = new Array(); - if(lockNum == 0) { - + // 消耗 + let consumes:Array<{id: number, count: number}> = []; + if (reStrengthenNum == 0) { + consumes = parseReward(EQUIP.EQUIP_ONE_REFORGED); + } else if (reStrengthenNum == 1) { + consumes = parseReward(EQUIP.EQUIP_TWO_REFORGED); + } else if (reStrengthenNum == 2) { + consumes = parseReward(EQUIP.EQUIP_THREE_REFORGED); + } else { + consumes = parseReward(EQUIP.EQUIP_FOUR_REFORGED); } - let result = await handleCost(roleId, sid, cost); + let result = await handleCost(roleId, sid, consumes); if(!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - let equipResult = await EquipModel.updateEquipInfo(eid, { randSe }) + let equipResult = await EquipModel.updateEquipInfo(eid, { randSe, reStrengthenNum: reStrengthenNum + 1 }) let curEquip = { seqId: equipResult.seqId, id: equipResult.id, diff --git a/shared/consts/constModules/itemConst.ts b/shared/consts/constModules/itemConst.ts index 0038b8651..9e4a1d27b 100644 --- a/shared/consts/constModules/itemConst.ts +++ b/shared/consts/constModules/itemConst.ts @@ -109,6 +109,11 @@ export const CURRENCY_TYPE = { FRIEND_POINT: "friendPoint" } + +export const SPEICAL_ITEM = { + REFINE_ADD_RATE: [17039] +}; + const currencyArr = [ { "gid": 31001, "name": "铜钱", "type": CURRENCY_TYPE.COIN }, { "gid": 31002, "name": "元宝", "type": CURRENCY_TYPE.GOLD }, diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 8807fa65c..0626b6d9f 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -151,6 +151,7 @@ export const STATUS = { ROLE_EQUIP_REACH_MAX: { code: 30404, simStr: '强化已达上限' }, ROLE_EQUIP_NOT_REACH_MAX: { code: 30405, simStr: '强化未达到上限' }, ROLE_EQUIP_CANNOT_RESTRENGTHEN: { code: 30406, simStr: '无属性可以洗炼' }, + ROLE_WRONG_ITEM: { code: 30407, simStr: '该道具不可用于该功能' }, EQUIP_NOT_FIND: {code: 30500, simStr: '装备不存在'}, EQUIP_IS_EQUIPED: {code: 30501, simStr: '装备已经穿戴'}, diff --git a/shared/db/Equip.ts b/shared/db/Equip.ts index 18ea0a2a6..88d6f4bbd 100644 --- a/shared/db/Equip.ts +++ b/shared/db/Equip.ts @@ -32,6 +32,7 @@ interface equipUpdate { holes?:Array; randSe?: Array; ePlaceId?:number; + reStrengthenNum?: number; } @index({ roleId: 1, hid: 1, id: 1 }) @@ -68,6 +69,8 @@ export default class Equip extends BaseModel { randSe: RandSe[]; // 强化随机属性 @prop({ required: true, type: Holes, default: [] }) holes: Holes[]; + @prop({ required: true, default: 0 }) + reStrengthenNum: number; // 洗炼次数 public static async findbyRole(roleId: string, lean = true) { const equips: EquipType[] = await EquipModel.find({ roleId }).lean(lean); diff --git a/shared/db/Hero.ts b/shared/db/Hero.ts index 307cfeca0..3a6b1068e 100644 --- a/shared/db/Hero.ts +++ b/shared/db/Hero.ts @@ -32,8 +32,6 @@ export class EPlace { lv: number; @prop({ required: true }) refineLv: number; - @prop({ required: true }) - refineCount: number; } // 初始化 @@ -45,7 +43,6 @@ function getInitialEplace() { p.equip = null; p.lv = 0; p.refineLv = 0; - p.refineCount = 0; ePlace.push(p); } diff --git a/shared/pubUtils/dictionary/DicRefine.ts b/shared/pubUtils/dictionary/DicRefine.ts index ee2ba5e58..4f4bad67f 100644 --- a/shared/pubUtils/dictionary/DicRefine.ts +++ b/shared/pubUtils/dictionary/DicRefine.ts @@ -25,6 +25,8 @@ let arr = JSON.parse(str); export const dicRefine = new Map(); arr.forEach(o => { - o.material = parseReward(o.gainvalue) + o.material = parseReward(o.material) dicRefine.set(o.id, o); -}); \ No newline at end of file +}); + +arr = undefined; \ No newline at end of file