寻宝:情谊助战相关逻辑;更新物品表-加入情谊点

This commit is contained in:
liangtongchuan
2020-12-02 23:51:35 +08:00
parent ef86623241
commit 64e6a58ee9
5 changed files with 847 additions and 1388 deletions

View File

@@ -2,7 +2,7 @@
* @Author: 梁桐川
* @Date: 2020-11-30 15:05:48
* @Last Modified by: 梁桐川
* @Last Modified time: 2020-12-02 21:05:48
* @Last Modified time: 2020-12-02 23:23:16
*/
import { COM_BATTLE_ASSIST_TIME, COM_BATTLE_ROBOT_ROUND_LMT, COM_BATTLE_ROBOT_HURT_RATIO, COM_BATTLE_ROBOT_HURT_CH_RATIO, COM_TEAM_STATUS } from './../../../consts/consts';
import { IT_TYPE, GOLD_COST_RATIO, CURRENCY_BY_TYPE, CURRENCY_TYPE, COM_BATTLE_CAP_TIME, COM_BATTLE_TIME_LMT, COM_BATTLE_CAP_START_TIME, COM_BATTLE_ASSIST_REWARD_RATIO } from './../../../consts/consts';
@@ -18,7 +18,7 @@ import { ItemModel } from '../../../db/Item';
import { handleFixedReward, handleReward } from '../../../services/rewardService';
import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService';
import { transBossHpArr } from '../../../services/battleService';
import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward } from '../../../services/comBattleService';
import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd } from '../../../services/comBattleService';
import { setAp } from '../../../services/actionPointService';
import { roleLevelup } from '../../../services/normalBattleService';
@@ -119,8 +119,9 @@ export class ComBattleHandler {
if (!roleInfo || roleIds.indexOf(teammate.roleId) !== -1) continue;
let {roleId, roleName, headHid = 19, sHid = 19, topFiveCe, lv} = roleInfo;
if (topFiveCe < ceLimit) continue;
// TODO: 没处理情谊助战
const st = new RoleStatus(roleId, roleName, false, false, headHid, sHid, topFiveCe, lv);
let isFrd = await getFrd(roleId, goodData.quality);
const st = new RoleStatus(roleId, roleName, false, isFrd, headHid, sHid, topFiveCe, lv);
roleStatus.push(st);
roleIds.push(roleInfo.roleId);
}
@@ -228,8 +229,9 @@ export class ComBattleHandler {
let { bossHpSum, bossHpArr } = getBossHpByBlueprtId(blueprtId);
let comTeam = new ComTeam(teamCode, false, blueprtId, COM_TEAM_STATUS.DEFAULT, 'robot', 0, bossHpSum || 10000, quality, transBossHpArr(bossHpArr));
let isFrd = await getFrd(roleId, quality);
// 将玩家加入队伍
let roleInfo = new RoleStatus(roleId, roleName, false, false, headHid, sHid, topFiveCe, lv);
let roleInfo = new RoleStatus(roleId, roleName, false, isFrd, headHid, sHid, topFiveCe, lv);
roleStatus.push(roleInfo);
roleIds.push(roleId);
// 创建并添加机器人
@@ -284,9 +286,7 @@ export class ComBattleHandler {
return resResult(STATUS.COM_BATTLE_CE_LIMIT);
}
let teams = await ComBattleTeamModel.getAssistTeamsByTime(roleId, [teamStatus.quality], new Date(new Date().setHours(0, 0, 0, 0)), true);
if (teams.length >= assistanceTime) resResult(STATUS.COM_BATTLE_ASSIST_NOT_ENOUGH);
isFrd = await getFrd(roleId, quality);
// 加入队伍
let roleStatus = new RoleStatus(roleId, roleName, false, isFrd, headHid, sHid, topFiveCe, lv);
const team = await ComBattleTeamModel.addRole(teamCode, roleStatus);
@@ -338,13 +338,11 @@ export class ComBattleHandler {
*/
async getAssistCnt(msg: {}, session: BackendSession) {
let roleId = session.get('roleId');
let teams = await ComBattleTeamModel.getAssistTeamsByTime(roleId, null, new Date(new Date().setHours(0, 0, 0, 0)), true);
let cnt = [0, 0, 0, 0, 0];
teams.forEach(team => {
if (team && team.quality) {
cnt[team.quality - 1] += 1;
}
});
let cntMap = await getAssistTimesByQuality(roleId);
let cnt = [];
for (let i = 0; i < 5; ++i) {
cnt[i] = cntMap.get(i + 1) || 0;
}
return resResult(STATUS.SUCCESS, {cnt});
}
@@ -592,9 +590,9 @@ export class ComBattleHandler {
teamStatus.bossHpArr.forEach(bs => {
bs.curHp = 0;
});
teamStatus.roleStatus.forEach(st => {
st.fixReward = getRealReward(teamStatus.blueprtId, st);
});
for (let st of teamStatus.roleStatus) {
st.fixReward = await getRealReward(teamStatus.blueprtId, st);
};
}
let team = await ComBattleTeamModel.syncTeamData({teamCode, status: battleSt, roleStatus: teamStatus.roleStatus, bossHpArr: teamStatus.bossHpArr});
if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR);

View File

@@ -1,7 +1,8 @@
import { FriendPointModel } from './../db/FriendPoint';
import { STATUS } from './../consts/statusCode';
import { COM_BATTLE_ROBOT_ID_NAME, COM_BATTLE_ROBOT_CE_RATIO, COM_BATTLE_ROBOT_ROUND_LMT, COM_BATTLE_ROBOT_HURT_RATIO, COM_BATTLE_ROBOT_HURT_CH_RATIO, COM_TEAM_STATUS, COM_BATTLE_ASSIST_REWARD_RATIO } from './../consts/consts';
import { COM_BATTLE_ROBOT_ID_NAME, COM_BATTLE_ROBOT_CE_RATIO, COM_BATTLE_ROBOT_ROUND_LMT, COM_BATTLE_ROBOT_HURT_RATIO, COM_BATTLE_ROBOT_HURT_CH_RATIO, COM_TEAM_STATUS, COM_BATTLE_ASSIST_REWARD_RATIO, COM_BATTLE_FRDCNT_MAX, COM_BATTLE_FRDCNT_DROP, CURRENCY_BY_TYPE, CURRENCY_TYPE } from './../consts/consts';
import { RoleStatus, ComBattleTeamModel } from './../db/ComBattleTeam';
import { getBluePrtByQuality, getRewardByBlueprtId, getWarById, getWarIdByBlueprtId } from "../pubUtils/gamedata";
import { getBluePrtByQuality, getComBtlSetByQuality, getRewardByBlueprtId, getWarById, getWarIdByBlueprtId } from "../pubUtils/gamedata";
import { getRandEelm, getRandValue, resResult, ratioReward } from "../pubUtils/util";
import { getRandRobot } from "./battleService";
@@ -119,15 +120,48 @@ export function setComBtlTimer(teamCode: string, timer: NodeJS.Timer, timerMap:
timerMap.set(teamCode, timer);
}
export function getRealReward(blueprtId: number, roleSt: RoleStatus) {
export async function getRealReward(blueprtId: number, roleSt: RoleStatus) {
let warInfo = getWarById(getWarIdByBlueprtId(blueprtId));
let fixRewardStr = warInfo['fixReward'];
if (!roleSt.isCap) {
if (roleSt.isFrd) {
fixRewardStr = '&';
let frdPointRec = await FriendPointModel.getFrdPointRecToday(roleSt.roleId);
if (!frdPointRec || frdPointRec.cnt <= COM_BATTLE_FRDCNT_MAX - COM_BATTLE_FRDCNT_DROP) {
fixRewardStr = `${CURRENCY_BY_TYPE.get(CURRENCY_TYPE.FRIEND_POINT)}&${COM_BATTLE_FRDCNT_DROP}`;
} else if (frdPointRec.cnt < COM_BATTLE_FRDCNT_MAX) {
fixRewardStr = `${CURRENCY_BY_TYPE.get(CURRENCY_TYPE.FRIEND_POINT)}&${COM_BATTLE_FRDCNT_DROP - frdPointRec.cnt}`;
} else {
fixRewardStr = '&';
}
} else {
fixRewardStr = ratioReward(fixRewardStr, COM_BATTLE_ASSIST_REWARD_RATIO);
}
}
return fixRewardStr;
}
export async function getAssistTimesByQuality(roleId: string, qualityArr?: Array<number>) {
let teams = await ComBattleTeamModel.getAssistTeamsByTime(roleId, qualityArr, new Date(new Date().setHours(0, 0, 0, 0)), true);
let cntMap = new Map<number, number>();
teams.forEach(team => {
if (team && team.quality && team.roleStatus) {
for (let st of team.roleStatus) {
if (st.roleId !== roleId || st.isFrd) {
continue;
}
let cnt = cntMap.get(team.quality) || 0;
cntMap.set(team.quality, cnt + 1)
}
}
});
return cntMap;
}
export async function getFrd(roleId: string, quality: number) {
let isFrd = false;
let assistTimes = await getAssistTimesByQuality(roleId, [quality]);
let assistTime = assistTimes.get(quality);
let { assistanceTime } = getComBtlSetByQuality(quality);
if (assistTime >= assistanceTime) isFrd = true;
return isFrd;
}

View File

@@ -96,7 +96,8 @@ export const CURRENCY_TYPE = {
ACTION_POINT: "ap",
TREASURE_POINT: "treasurePoint",
EXPEDITION_POINT: "expeditionPoint",
DUNGEON_POINT: "dungeonPoint"
DUNGEON_POINT: "dungeonPoint",
FRIEND_POINT: "friendPoint"
}
const currencyArr = [
@@ -105,7 +106,8 @@ const currencyArr = [
{ "gid": 31003, "name": "体力", "type": CURRENCY_TYPE.ACTION_POINT },
{ "gid": 40001, "name": "远征币", "type": CURRENCY_TYPE.EXPEDITION_POINT },
{ "gid": 40002, "name": "寻宝币", "type": CURRENCY_TYPE.TREASURE_POINT },
{ "gid": 40003, "name": "秘境币", "type": CURRENCY_TYPE.DUNGEON_POINT },
{ "gid": 40003, "name": "情谊点", "type": CURRENCY_TYPE.FRIEND_POINT },
{ "gid": 40004, "name": "秘境币", "type": CURRENCY_TYPE.DUNGEON_POINT },
];
export const CURRENCY = new Map<number, {gid: number, name: string, type: string}>();
export const CURRENCY_BY_TYPE = new Map<string, number>();

41
shared/db/FriendPoint.ts Normal file
View File

@@ -0,0 +1,41 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop } from '@typegoose/typegoose';
/**
* 情谊点记录
*/
@index({ roleId: 1, createdAt: -1 })
export default class FriendPoint extends BaseModel {
@prop({ required: true, default: '' })
roleId: string; // 角色 id
@prop({ required: true, default: '' })
roleName: string; // 角色名称
@prop({ required: true, default: 0 })
cnt: number; // 当天获取的点数
/**
* @description 更新每天的情谊点获取情况cnt 有可能超过当日最大值,可根据返回值判断
* @static
* @param {string} roleId
* @param {string} roleName
* @param {number} cntInc
* @param {number} maxPerDay
* @param {boolean} [lean=true]
* @memberof FriendPoint
*/
public static async updatePointToday(roleId: string, roleName: string, cntInc: number, maxPerDay: number, lean = true) {
const curTime = new Date((new Date()).setHours(0, 0, 0, 0));
// 当 oldCnt + cntInc > maxPerDay 时需计算实际可以获得的点数cntInc - (newCnt - maxPerDay)
const rec = await FriendPointModel.findOneAndUpdate({roleId, roleName, createdAt: {$gte: curTime}, cnt: {$lt: maxPerDay}}, {$inc: {cnt: cntInc}}, {upsert: true, new: true}).lean(lean);
return rec;
}
public static async getFrdPointRecToday(roleId: string, lean = true) {
const curTime = new Date((new Date()).setHours(0, 0, 0, 0));
const rec = await FriendPointModel.findOne({roleId, createdAt: {$gte: curTime}}).lean(lean);
return rec;
}
}
export const FriendPointModel = getModelForClass(FriendPoint);

File diff suppressed because it is too large Load Diff