寻宝:伪随机掉落装备图纸

This commit is contained in:
liangtongchuan
2021-01-21 19:33:53 +08:00
parent da86ba4930
commit 8c6fc419ea
4 changed files with 125 additions and 5 deletions

View File

@@ -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);// 主公升级经验

View File

@@ -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<string, any>, 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;
}

View File

@@ -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<EquipPrintDropType>, lean = true) {
return await EquipPrintDropModel.findOneAndUpdate({roleId}, {...docData}, {new: true}).lean(lean);
}
}
export const EquipPrintDropModel = getModelForClass(EquipPrintDrop);
export interface EquipPrintDropType extends Pick<DocumentType<EquipPrintDrop>, keyof EquipPrintDrop>{}

View File

@@ -51,4 +51,4 @@ export const ARMY = {
export const TREASURE = {
CAPTAIN_DROP: 5, // 普通套装图纸队长必掉落次数
TEAMMATE_DROP: 10, // 普通套装图纸队员必掉落次数
};
};