寻宝:伪随机掉落装备图纸
This commit is contained in:
@@ -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);// 主公升级经验
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
50
shared/db/EquipPrintDrop.ts
Normal file
50
shared/db/EquipPrintDrop.ts
Normal 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>{}
|
||||
@@ -51,4 +51,4 @@ export const ARMY = {
|
||||
export const TREASURE = {
|
||||
CAPTAIN_DROP: 5, // 普通套装图纸队长必掉落次数
|
||||
TEAMMATE_DROP: 10, // 普通套装图纸队员必掉落次数
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user