From 8c6fc419ea5b1b0abc145c2312653b5999794af4 Mon Sep 17 00:00:00 2001 From: liangtongchuan Date: Thu, 21 Jan 2021 19:33:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BB=E5=AE=9D=EF=BC=9A=E4=BC=AA=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E6=8E=89=E8=90=BD=E8=A3=85=E5=A4=87=E5=9B=BE=E7=BA=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/handler/comBattleHandler.ts | 10 ++- game-server/app/services/comBattleService.ts | 68 ++++++++++++++++++- shared/db/EquipPrintDrop.ts | 50 ++++++++++++++ shared/pubUtils/dicParam.ts | 2 +- 4 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 shared/db/EquipPrintDrop.ts diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index fea0c7ee2..37f104606 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -17,7 +17,7 @@ import { ItemModel } from '../../../db/Item'; import { handleFixedReward, addItems, handleCost, decreaseItems } from '../../../services/rewardService'; import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService'; import { transBossHpArr } from '../../../services/battleService'; -import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd, updateRobotHurt, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam } from '../../../services/comBattleService'; +import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd, updateRobotHurt, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, incEquipPrintDrop, randEquipPrintId } from '../../../services/comBattleService'; import { setAp } from '../../../services/actionPointService'; import { roleLevelup } from '../../../services/normalBattleService'; @@ -677,6 +677,14 @@ export class ComBattleHandler { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); } + const { dropResult } = await incEquipPrintDrop(roleSt); + if (dropResult) { + const dropEquipId = randEquipPrintId(warInfo); + if (dropEquipId) { + roleSt.fixReward = `${roleSt.fixReward}|${dropEquipId}&${1}`; + } + } + await ComBattleTeamModel.updateRewardSt(teamCode, roleId, true); const goods = await handleFixedReward(roleId, roleName, sid, roleSt.fixReward, 1); let actordata = await roleLevelup(roleId, warInfo.kingExp, session);// 主公升级经验 diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index 58c428e03..b68e8310b 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -1,13 +1,14 @@ -// import { EquipPrintDropType, EquipPrintDropModel } from './../db/EquipPrintDrop'; +import { EquipPrintDropType, EquipPrintDropModel } from './../db/EquipPrintDrop'; import { FriendPointModel } from './../db/FriendPoint'; import { STATUS } from './../consts/statusCode'; import { COM_BATTLE_ROBOT_ID_NAME, COM_TEAM_STATUS, CURRENCY_BY_TYPE, CURRENCY_TYPE, FRIEND_DROP_TYPE, COM_BTL_CONST, FRIEND_DROP_MAX } from './../consts'; import { RoleStatus, ComBattleTeamModel } from './../db/ComBattleTeam'; import { getBluePrtByQuality, getComBtlSetByQuality, getRewardByBlueprtId, getWarById, getWarIdByBlueprtId, comBtlRangeInfo } from "../pubUtils/gamedata"; -import { getRandEelm, getRandValue, resResult, ratioReward, getRandValueByMinMax } from "../pubUtils/util"; +import { getRandEelm, getRandValue, resResult, ratioReward, getRandValueByMinMax, getRandomWithWeight, decodeStr } from "../pubUtils/util"; import { getRandRobot } from "./battleService"; -import { difference } from 'underscore'; +import { difference, drop } from 'underscore'; import { Channel } from 'pinus'; +import { TREASURE } from '../pubUtils/dicParam'; /** * 在给定的品质列表中随机返回一定数量的藏宝图Id @@ -325,3 +326,64 @@ export function setDismissTimer(teamStatus, teamMap: Map, roleId: s teamDisTimer.set(teamStatus.teamCode, timer); } } + +function initEquipPrintDropData(roleId: string, roleName: string) { + let result: EquipPrintDropType = new EquipPrintDropModel().toJSON(); + result.roleId = roleId; + result.roleName = roleName; + result.capTarget = getRandValueByMinMax(1, TREASURE.CAPTAIN_DROP, 0); + result.teammateTarget = getRandValueByMinMax(1, TREASURE.TEAMMATE_DROP, 0); + return result; +} + +function incEquipPrintDropData(roleSt: RoleStatus, dropRec: EquipPrintDropType) { + const { isCap } = roleSt; + let dropResult = false; + if (isCap === true) { + dropRec.capAll += 1; + dropRec.capCur += 1; + if (dropRec.capCur > TREASURE.CAPTAIN_DROP) { + dropRec.capCur = 1; + dropRec.capTarget = getRandValueByMinMax(1, TREASURE.CAPTAIN_DROP, 0); + } + if (dropRec.capCur === dropRec.capTarget) { + dropResult = true; + dropRec.capDropAll += 1; + } + } else { + dropRec.teammateAll += 1; + dropRec.teammateCur += 1; + if (dropRec.teammateCur > TREASURE.TEAMMATE_DROP) { + dropRec.teammateCur = 1; + dropRec.teammateTarget = getRandValueByMinMax(1, TREASURE.TEAMMATE_DROP, 0); + } + if (dropRec.teammateCur === dropRec.teammateTarget) { + dropResult = true; + dropRec.teammateDropAll += 1; + } + } + return dropResult; +} + +export async function incEquipPrintDrop(roleSt: RoleStatus) { + const { roleId, roleName } = roleSt; + let dropRec = await EquipPrintDropModel.getByRoleId(roleId); + if (!dropRec) { + dropRec = await EquipPrintDropModel.createDoc(initEquipPrintDropData(roleId, roleName)); + } + + const dropResult = incEquipPrintDropData(roleSt, dropRec); + dropRec = await EquipPrintDropModel.updateDoc(roleId, dropRec); + return { dropResult, dropRec }; +} + +export function randEquipPrintId(warInfo) { + if (!warInfo || !warInfo['jackpotReward']) { + return null; + } + const result = getRandomWithWeight(decodeStr('possibility', warInfo['jackpotReward'])); + if (!result || !result.dic || !result.dic.id) { + return null; + } + return result.dic.id; +} \ No newline at end of file diff --git a/shared/db/EquipPrintDrop.ts b/shared/db/EquipPrintDrop.ts new file mode 100644 index 000000000..152bce421 --- /dev/null +++ b/shared/db/EquipPrintDrop.ts @@ -0,0 +1,50 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 寻宝中图纸掉落的伪随机记录 + */ +@index({ roleId: 1 }) + +export default class EquipPrintDrop extends BaseModel { + @prop({ required: true, unique: true }) + roleId: string; // 角色 id + @prop({ required: true}) + roleName: string; // 角色名 + + @prop({ required: true, default: 0 }) + capTarget: number; // 本轮第几次会掉落,本轮结束后重置 + @prop({ required: true, default: 0 }) + capCur: number; // 本轮进行的次数 + + @prop({ required: true, default: 0 }) + teammateTarget: number; // 本轮第几次会掉落,本轮结束后重置 + @prop({ required: true, default: 0 }) + teammateCur: number; // 本轮进行的次数 + + @prop({ required: true, default: 0 }) + capDropAll: number; // 队长掉落总次数,累积 + @prop({ required: true, default: 0 }) + teammateDropAll: number; // 队员掉落总次数,累积 + + @prop({ required: true, default: 0 }) + capAll: number; // 队长随机总次数,累积 + @prop({ required: true, default: 0 }) + teammateAll: number; // 队员随机总次数,累积 + + public static async getByRoleId(roleId: string, lean = true) { + return await EquipPrintDropModel.findOne({roleId}).lean(lean); + } + + public static async createDoc(docData: EquipPrintDropType, lean = true) { + return await EquipPrintDropModel.findOneAndUpdate({}, {...docData}, {upsert: true, new: true}).lean(lean); + } + + public static async updateDoc(roleId: string, docData: Partial, lean = true) { + return await EquipPrintDropModel.findOneAndUpdate({roleId}, {...docData}, {new: true}).lean(lean); + } +} + +export const EquipPrintDropModel = getModelForClass(EquipPrintDrop); + +export interface EquipPrintDropType extends Pick, keyof EquipPrintDrop>{} \ No newline at end of file diff --git a/shared/pubUtils/dicParam.ts b/shared/pubUtils/dicParam.ts index 9f25a152a..3b1ca4677 100644 --- a/shared/pubUtils/dicParam.ts +++ b/shared/pubUtils/dicParam.ts @@ -51,4 +51,4 @@ export const ARMY = { export const TREASURE = { CAPTAIN_DROP: 5, // 普通套装图纸队长必掉落次数 TEAMMATE_DROP: 10, // 普通套装图纸队员必掉落次数 -}; \ No newline at end of file +};