diff --git a/game-server/app/servers/role/handler/equipHandler.ts b/game-server/app/servers/role/handler/equipHandler.ts index c351f27a7..05c6a485d 100644 --- a/game-server/app/servers/role/handler/equipHandler.ts +++ b/game-server/app/servers/role/handler/equipHandler.ts @@ -14,10 +14,16 @@ export class EquipHandler { // TODO 合成装备 public async composeEquip(msg: { gid: number, originalEquip: number[]}, session: BackendSession) { + let roleId: string = session.get('roleId'); + let roleName: string = session.get('roleName'); + let sid: string = session.get('sid'); // 消耗材料 // 获得装备 + let {gid, } = msg; - // 1. 获得部位 + let items = [{id: gid, count: 1}]; + let goods = await addItems(roleId, roleName, sid, items); + return resResult(STATUS.SUCCESS, { goods }); } // TODO 装备栏强化 diff --git a/game-server/app/servers/role/handler/roleHandler.ts b/game-server/app/servers/role/handler/roleHandler.ts index 5dfc803dd..3834ccaff 100644 --- a/game-server/app/servers/role/handler/roleHandler.ts +++ b/game-server/app/servers/role/handler/roleHandler.ts @@ -16,17 +16,17 @@ export class RoleHandler { } async initEquips(roleId: string, roleName: string) { - const seqId = await CounterModel.getNewCounter(COUNTER.EID); - const equipInfo = { - roleId, - roleName, - id: 1, - name: '倚天剑', - seqId, - type: 1 - } - const equip = await EquipModel.createEquip(equipInfo); - await HeroModel.addEquip(roleId, 12, equip._id); + // const seqId = await CounterModel.getNewCounter(COUNTER.EID); + // const equipInfo = { + // roleId, + // roleName, + // id: 1, + // name: '倚天剑', + // seqId, + // type: 1 + // } + // const equip = await EquipModel.createEquip(equipInfo); + // await HeroModel.addEquip(roleId, 12, equip._id); } async initHeros(roleId: string, roleName: string) { diff --git a/game-server/app/services/rewardService.ts b/game-server/app/services/rewardService.ts index 69b18fa57..cf16f01b8 100644 --- a/game-server/app/services/rewardService.ts +++ b/game-server/app/services/rewardService.ts @@ -9,6 +9,8 @@ import { ItemModel } from '../db/Item'; import { STATUS } from '../consts/statusCode'; import { pinus } from 'pinus'; import { addEquips, addBags, addSkins } from '../pubUtils/itemUtils'; +import { EquipInter } from '../pubUtils/interface'; +import { gameData } from '../pubUtils/data'; const _ = require('underscore'); export async function handleFixedReward(roleId: string, roleName: string, rewardStr: string, multi: number) { @@ -62,21 +64,21 @@ async function rewardWeapons (roleId: string, roleName: string, dicGood: any, w let weaponsData = []; let cnt = weapon.cnt; - while (cnt > 0) { - const seqId = await CounterModel.getNewCounter(COUNTER.EID); - const equipInfo = { - roleId, - roleName, - id: weapon.id, - name: dicGood.name, - seqId, - quality: dicGood.lv, - type: dicGood.goodType - } - const equip = await EquipModel.createEquip(equipInfo); - cnt -= 1; - weaponsData.push(equip); - } + // while (cnt > 0) { + // const seqId = await CounterModel.getNewCounter(COUNTER.EID); + // const equipInfo = { + // roleId, + // roleName, + // id: weapon.id, + // name: dicGood.name, + // seqId, + // quality: dicGood.lv, + // type: dicGood.goodType + // } + // const equip = await EquipModel.createEquip(equipInfo); + // cnt -= 1; + // weaponsData.push(equip); + // } return weaponsData; } @@ -125,7 +127,6 @@ async function rewardCurrency (roleId: string, dicGood: any, data: {id:number,cn return goods; } interface Item {id?: number, count?: number, seqId?: number, type?: number}; -interface Equip {id: number, name: string, quality: number, type: number}; interface Bag {id: number, itemName: string, count: number, type: number, hid:number}; export async function handleCost(roleId: string, sid: string, goods: Array) { let currencysMap: any = {}; @@ -208,7 +209,7 @@ function sortConsumes(goods: Array, bags: Array, currencysMap: any, export async function addItems(roleId: string, roleName: string, sid: string, goods: Array) { let showItems: Array = []; let currencysMap: any = {}; - let equips: Array = []; + let equips: Array = []; let bags: Array = []; let skins: Array = []; let uids = [{uid: roleId, sid}]; @@ -216,7 +217,7 @@ export async function addItems(roleId: string, roleName: string, sid: string, go let equipInfos = []; for (let equip of equips) { let equipInfo = await addEquips(roleId, roleName, equip); - showItems.push({id: equip.id, count: 1}); + showItems.push({seqId: equipInfo.seqId, id: equip.id, count: 1}); equipInfos.push(equipInfo); } //装备推送 @@ -262,12 +263,12 @@ export async function addItems(roleId: string, roleName: string, sid: string, go return showItems; } -function sortItems (goods: Array, bags: Array, skins: Array, currencysMap: any, equips: Array, showItems: Array) { +function sortItems (goods: Array, bags: Array, skins: Array, currencysMap: any, equips: Array, showItems: Array) { for (let good of goods) { - let goodInfo = getGoodById(good.id); + let goodInfo = gameData.goods.get(good.id); if (goodInfo.goodType == GOOD_TYPE.EQUIP) { // 装备 for (let i = 0; i < good.count; i++) { - equips.push({id: good.id, name: goodInfo.name, quality: goodInfo.lv, type: goodInfo.goodType}); + equips.push({id: good.id, ...goodInfo}); } } else { let {type, isCurrency} = ITID.get(goodInfo.itid); diff --git a/gm-server/app/controller/users.ts b/gm-server/app/controller/users.ts index ca49c28f6..497abff6d 100644 --- a/gm-server/app/controller/users.ts +++ b/gm-server/app/controller/users.ts @@ -30,11 +30,11 @@ export default class UserController extends Controller { public async createRoleData() { const { ctx } = this; - const { hid, hlv, eid, elv, ecount, ehid, itemid, itemcount, count, lv, skinid, selectedRowKeys: uids, optType } = ctx.request.body; + const { hid, hlv, eid, ecount, itemid, itemcount, count, lv, skinid, selectedRowKeys: uids, optType } = ctx.request.body; if(optType == 'hero') { ctx.body = await ctx.service.users.createHero(uids, hid, hlv); } else if(optType == 'equip') { - ctx.body = await ctx.service.users.createEquip(uids, eid, elv, ecount, ehid); + ctx.body = await ctx.service.users.createEquip(uids, eid, ecount); } else if (optType == 'item') { ctx.body = await ctx.service.users.createItem(uids, itemid, itemcount); } else if (optType == 'gold') { diff --git a/gm-server/app/service/users.ts b/gm-server/app/service/users.ts index 5c678f701..680502b9d 100644 --- a/gm-server/app/service/users.ts +++ b/gm-server/app/service/users.ts @@ -2,7 +2,6 @@ import { UserModel } from '@db/User'; import { RoleModel } from '@db/Role'; import Hero, { HeroModel } from '@db/Hero'; import { EquipModel } from '@db/Equip'; -import { CounterModel } from '@db/Counter'; import { ActionPointModel } from '@db/ActionPoint'; import { BattleDropModel } from '@db/BattleDrop'; import { BattleRecordModel } from '@db/BattleRecord'; @@ -219,14 +218,12 @@ export default class GMUsers extends Service { } } - public async createEquip(uids: Array, _eid: string, _elv: string, _ecount: string, _ehid: string) { + public async createEquip(uids: Array, _eid: string, _ecount: string) { const {ctx} = this; - console.log('gm createEquip', uids, _eid, _elv, _ecount, _ehid); + console.log('gm createEquip', uids, _eid, _ecount); let eid = parseInt(_eid); - let elv = parseInt(_elv); let ecount = parseInt(_ecount); - let ehid = parseInt(_ehid); - if(isNaN(eid) || isNaN(elv) || isNaN(ecount) || isNaN(ehid)) return ctx.service.utils.resResult(STATUS.WRONG_PARMS); + if(isNaN(eid) || isNaN(ecount)) return ctx.service.utils.resResult(STATUS.WRONG_PARMS); let flag = 0, msg = '创建失败'; for(let roleId of uids) { @@ -234,25 +231,12 @@ export default class GMUsers extends Service { if(role) { for(let i = 0; i 0 && equip) { - await HeroModel.addEquip(roleId, ehid, equip._id); - } + await ctx.service.utils.addEquips(roleId, role.roleName, {id: eid, ...dicEquip}); } } else { flag = 1, msg = '未找到角色' + roleId; diff --git a/shared/consts/constModules/itemConst.ts b/shared/consts/constModules/itemConst.ts index 08eb81059..ab70012c5 100644 --- a/shared/consts/constModules/itemConst.ts +++ b/shared/consts/constModules/itemConst.ts @@ -2,7 +2,6 @@ export const IT_TYPE = { BLUEPRT: 28 } -export const GOOD_QUALITY = [1, 2, 3, 4, 5]; // 大类型,区分存到哪张表里 export const GOOD_TYPE = { @@ -110,3 +109,24 @@ for(let obj of currencyArr) { CURRENCY.set(obj.gid, obj); CURRENCY_BY_TYPE.set(obj.type, obj.gid); } + +export enum QUALITY_TYPE { + BLUE = 1, // 蓝 + PURPLE = 2, // 紫 + ORANGE = 3, // 橙 + RED = 4, // 红 + GOLD = 5 // 金 +} + +export const GOOD_QUALITY = [QUALITY_TYPE.BLUE, QUALITY_TYPE.PURPLE, QUALITY_TYPE.ORANGE, QUALITY_TYPE.RED, QUALITY_TYPE.GOLD]; + +// 各品质随机属性条数 quality => number +export const RANDOM_SE_COUNT = new Map([ + [QUALITY_TYPE.BLUE, 0], + [QUALITY_TYPE.PURPLE, 1], + [QUALITY_TYPE.ORANGE, 2], + [QUALITY_TYPE.RED, 3], + [QUALITY_TYPE.GOLD, 4] +]); + +export const FIX_ATTRIBUTES_RAN = 20; // 固定属性值+-20%随机 \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index a5052eb6b..839003510 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -83,6 +83,7 @@ export const FILENAME = { DIC_TOWER: 'dic_zyz_tower', DIC_XUNBAO: 'dic_zyz_xunbao', DIC_QUESTION: 'Questions', + DIC_RANDOM_EFFECT_POOL: 'dic_random_effect_pool' } export const WAR_RELATE_TABLES = [ diff --git a/shared/db/Equip.ts b/shared/db/Equip.ts index 591510bd9..345fd5ab4 100644 --- a/shared/db/Equip.ts +++ b/shared/db/Equip.ts @@ -1,7 +1,9 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose'; +import { COUNTER } from '../consts'; +import { CounterModel } from './Counter'; -class RandSe { +export class RandSe { @prop({ required: true }) id: number; // 随机属性位置id @prop({ required: true }) @@ -12,7 +14,7 @@ class RandSe { locked: boolean; // 洗炼是否锁定 } -class Holes { +export class Holes { @prop({ required: true }) id: number; // 孔的id @prop({ required: true }) @@ -36,18 +38,16 @@ export default class Equip extends BaseModel { id: number; // 装备 id @prop({ required: true }) name: string; // 装备名称 - @prop({ required: false }) + @prop({ required: false, default: 0 }) hid: number; // 装备此装备的武将 id + @prop({ required: false, default: 0 }) + ePlaceId: number; // 武将装备的部位 @prop({ required: false, default: 1 }) count: number; // 装备数量 @prop({ required: true, default: 1 }) quality: number; // 品质 @prop({ required: true, default: 0 }) - type: number; // 装备类型 - @prop({ required: true, default: 1 }) - wearLv: number; // 穿戴等级 - @prop({ required: true, default: 0 }) suitId: number; // 套装id @prop({ required: true, default: 0 }) @@ -62,10 +62,12 @@ export default class Equip extends BaseModel { return equips; } - public static async createEquip(equipInfo: {roleId: string, roleName: string, id: number, seqId: number, type: number, name: string, lv?: number}, lean = true) { + public static async createEquip(equipInfo: {roleId: string, roleName: string, id: number, name: string, quality: number, suitId: number, ePlaceId: number, randSe: RandSe[], randRange: number, holes: Holes[]}, lean = true) { + const seqId = await CounterModel.getNewCounter(COUNTER.EID); + const doc = new EquipModel(); - const update = Object.assign(doc.toJSON(), equipInfo); - const equip: EquipType = await EquipModel.findOneAndUpdate({ seqId: equipInfo.seqId }, update, {upsert: true, new: true}).lean(lean); + const update = Object.assign(doc.toJSON(), seqId, equipInfo); + const equip: EquipType = await EquipModel.findOneAndUpdate({ seqId }, update, {upsert: true, new: true}).lean(lean); return equip; } diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 426dca7d9..12b84de8b 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -25,6 +25,7 @@ import { dicFriendShipLevel, dicFriendShipLevelMap } from "./dictionary/DicFrien import { dicHeroQualityUp } from "./dictionary/DicHeroQualityUp"; import { dicHeroStar } from "./dictionary/DicHeroStar"; import { dicHeroWake } from "./dictionary/DicHeroWake"; +import { dicRandomEffectPool } from './dictionary/DicRandomEffectPool'; export const gameData = { blurprtCompose: dicBlueprtCompose, @@ -60,7 +61,8 @@ export const gameData = { friendShips: friendShips, friendShipHidAandIds: friendShipHidAandIds, friendShipLevel: dicFriendShipLevel, - friendShipLevelMap: dicFriendShipLevelMap + friendShipLevelMap: dicFriendShipLevelMap, + randomEffectPool: dicRandomEffectPool, }; // 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据 diff --git a/shared/pubUtils/dictionary/DicGoods.ts b/shared/pubUtils/dictionary/DicGoods.ts index fec003d02..d377b2815 100644 --- a/shared/pubUtils/dictionary/DicGoods.ts +++ b/shared/pubUtils/dictionary/DicGoods.ts @@ -1,5 +1,5 @@ // 物品表 -import {decodeArrayListStr, readJsonFile, parseReward} from '../util' +import {decodeArrayListStr, readJsonFile, parseReward, parseNumberList, decodeArrayStr} from '../util' import { FILENAME, IT_TYPE, ABI_TYPE } from '../../consts' import { RewardInter } from '../interface'; const _ = require('lodash'); @@ -15,12 +15,17 @@ export interface DicGoods { readonly pieces: number; // 合成材料 readonly composeMaterial: Array; + // 特殊材料 + readonly specialMaterial: Array<{id: number[], count: number}>; // 分解所得 readonly decomposeItem: Array; // 物品品质 readonly quality: number; // 洞数 readonly hole: number; + // 随机属性范围 + readonly randomEffect: Array; + // 类型id readonly itid: number; // 物品类型 @@ -32,7 +37,7 @@ export interface DicGoods { // 强化属性 readonly goodsAbilityUp:Map; // 套装id - readonly setid: number; + readonly suitId: number; // 特殊属性 readonly specialAttr: Map; // 属性外加的值,经验,好感 @@ -44,7 +49,26 @@ const str = readJsonFile(FILENAME.DIC_GOODS); let arr = JSON.parse(str); type KeysEnum = { [P in keyof Required]: true }; -const DicGoodsKeys: KeysEnum = {good_id: true, name: true, lvLimted: true, pieces: true, composeMaterial: true, decomposeItem: true, quality: true, hole: true, itid: true, goodType: true, hid: true, goodsAbility: true, goodsAbilityUp: true, setid: true, specialAttr: true, value: true } +const DicGoodsKeys: KeysEnum = { + good_id: true, + name: true, + lvLimted: true, + pieces: true, + composeMaterial: true, + specialMaterial: true, + decomposeItem: true, + quality: true, + hole: true, + randomEffect: true, + itid: true, + goodType: true, + hid: true, + goodsAbility: true, + goodsAbilityUp: true, + suitId: true, + specialAttr: true, + value: true +} export const dicGoods = new Map(); export const blueprt = new Map>(); @@ -55,6 +79,8 @@ arr.forEach(o => { o.composeMaterial = parseReward(o.composeMaterial); o.decomposeItem = parseReward(o.decomposeItem); o.specialAttr = parseSpecialAttr(o.specialAttr); + o.specialMaterial = parseSpecialMaterial(o.specialMaterial); + o.randomEffect = parseNumberList(o.randomEffect); dicGoods.set(o.good_id, _.pick(o, Object.keys(DicGoodsKeys))); if(o.itid == IT_TYPE.BLUEPRT) { @@ -104,4 +130,18 @@ function parseAbilityUp(json) { map.set(ABI_TYPE.ABI_LUK, json.luk_up||0); map.set(ABI_TYPE.ABI_SPEED, json.speed_up||0); return map +} + +function parseSpecialMaterial(str: string) { + let specialAttr = new Array<{id: number[], count: number}>(); + if(str) { + let decodeArr = decodeArrayStr(str); + if(decodeArr.length >= 2) { + let ids = parseNumberList(decodeArr[0]); + let count = parseInt(decodeArr[0]); + if(isNaN(count)) return specialAttr; + specialAttr.push({id: ids, count}); + } + } + return specialAttr; } \ No newline at end of file diff --git a/shared/pubUtils/dictionary/DicRandomEffectPool.ts b/shared/pubUtils/dictionary/DicRandomEffectPool.ts new file mode 100644 index 000000000..cefdf4cf8 --- /dev/null +++ b/shared/pubUtils/dictionary/DicRandomEffectPool.ts @@ -0,0 +1,31 @@ +// 武将特技表 +import { readJsonFile, parseNumberList } from '../util' +import { FILENAME } from '../../consts' + +export interface DicRandomEffectPool { + + // 特技id + readonly id: number; + // 类型 + readonly type: number; + // 包含的值 + readonly gainValueArr: Array; + // 随机值位置 + readonly index: number; + // 随机最小值 + readonly min: number; + // 随机最大值 + readonly max: number; + +} + + +const str = readJsonFile(FILENAME.DIC_RANDOM_EFFECT_POOL); +let arr = JSON.parse(str); + +export const dicRandomEffectPool = new Map(); + +arr.forEach(o => { + o.gainValueArr = parseNumberList(o.gainvalue) + dicRandomEffectPool.set(o.id, o); +}); \ No newline at end of file diff --git a/shared/pubUtils/interface.ts b/shared/pubUtils/interface.ts index 3378ef258..d8cc21f2b 100644 --- a/shared/pubUtils/interface.ts +++ b/shared/pubUtils/interface.ts @@ -26,5 +26,15 @@ export interface Attributes { ap?: number; } -export interface EquipInter {id: number, name: string, quality: number, type: number}; +export interface EquipInter { + id: number; + name: string; + quality: number; + suitId: number; + hole: number; + randomEffect: Array; + itid: number; +}; + + export interface BagInter {id: number, itemName: string, count: number, type: number, hid:number}; \ No newline at end of file diff --git a/shared/pubUtils/itemUtils.ts b/shared/pubUtils/itemUtils.ts index fa6cef4fd..418a7158c 100644 --- a/shared/pubUtils/itemUtils.ts +++ b/shared/pubUtils/itemUtils.ts @@ -1,13 +1,12 @@ -import { HeroModel, EPlace } from '../db/Hero'; +import { HeroModel } from '../db/Hero'; import { ItemModel } from '../db/Item'; -import { EquipModel } from './../db/Equip'; -import { CounterModel } from './../db/Counter'; -import { COUNTER } from './../consts/consts'; +import { EquipModel, RandSe, Holes } from './../db/Equip'; import { BagInter, EquipInter } from './interface'; import { gameData } from './data'; -import { EQUIP_TYPE } from '../consts'; +import { RANDOM_SE_COUNT, FIX_ATTRIBUTES_RAN, ITID } from '../consts'; +import { getRandomByLen } from './util'; const _ = require('underscore'); @@ -32,7 +31,33 @@ export async function addBags(roleId: string, roleName: string, data: BagInter) } export async function addEquips(roleId: string, roleName: string, weapon: EquipInter) { - const seqId = await CounterModel.getNewCounter(COUNTER.EID); - let equip = Object.assign({ seqId, roleId, roleName }, weapon); - return await EquipModel.createEquip(equip); + let { id, name, quality, suitId, hole, randomEffect, itid } = weapon; + let {type} = ITID.get(itid); + console.log(itid, type) + let randomNum = RANDOM_SE_COUNT.get(quality); + let pool = randomEffect.map(cur => gameData.randomEffectPool.get(cur)); + let chosen = new Array(); + let randSe = new Array(); + for(let i = 0; i < randomNum; i++) { + pool = pool.filter(cur => !chosen.includes(cur.id)); + let random = getRandomByLen(pool); + if(!random) break; + chosen.push(random.id); + let rand = 0; + if(random.id > 0) rand = Math.floor(Math.random() * (random.max - random.min) + random.min); + randSe.push({ + id: i + 1, + seid: random.id, + rand, + locked: false + }); + } + let randRange = Math.floor(Math.random() * FIX_ATTRIBUTES_RAN); + let holes = new Array(); + for(let i = 0; i < hole; i++) { + holes.push({id: i+1, isOpen: false, jewel: 0}) + } + + const equip = await EquipModel.createEquip({roleId, roleName, id, name, quality, suitId, randRange, ePlaceId: type, randSe, holes}); + return equip } diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index a72e5515b..6999ab6fe 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -8,6 +8,7 @@ import Actor from './actor'; import fs = require('fs'); import path = require('path'); +import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool'; const moment = require('moment'); @@ -188,6 +189,7 @@ export function decodeIdCntArrayStr(str: string, multi: number) { } export function getRandomByLen(arr: Array):number + export function getRandomByLen(arr: Array):DicRandomEffectPool export function getRandomByLen(arr: Array): any { let len = arr.length; return arr[Math.floor(Math.random() * len)] diff --git a/shared/resource/jsons/dic_random_effect_pool.json b/shared/resource/jsons/dic_random_effect_pool.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/shared/resource/jsons/dic_random_effect_pool.json @@ -0,0 +1 @@ +[] \ No newline at end of file