import { Application, BackendSession, HandlerService, } from 'pinus'; import { resResult } from '../../../pubUtils/util'; import { ITEM_CHANGE_REASON, MINI_GAME_TYPE, REDIS_KEY, STATUS, TASK_TYPE } from '../../../consts'; import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/activity/giftPackageService'; import { getPlayerMiniGameData, getPlayerMiniGameDataShow } from '../../../services/activity/miniGameService'; import { ActivityMiniGameRecModel } from '../../../db/ActivityMiniGameRec'; import { ActivityMiniGameModel } from '../../../db/ActivityMiniGame'; import { handleCost } from '../../../services/role/rewardService'; import { Rank } from '../../../services/rankService'; import { nowSeconds } from '../../../pubUtils/timeUtil'; import { RoleRankInfo } from '../../../domain/rank'; import { getAllServerName } from '../../../services/redisService'; import { checkTask } from '../../../services/task/taskService'; export default function (app: Application) { new HandlerService(app, {}); return new ForgeHandler(app); } export class ForgeHandler { constructor(private app: Application) { } /** * @description 小游戏数据 * @param {{ activityId: number}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async getMiniGameActivity(msg: { activityId: number }, session: BackendSession) { const { activityId } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); let playerData = await getPlayerMiniGameDataShow(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); return resResult(STATUS.SUCCESS, playerData); } /** * @description 小游戏开始 * @param {{ activityId: number}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async gameStart(msg: { activityId: number }, session: BackendSession) { const { activityId } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); let playerData = await getPlayerMiniGameData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); if(playerData.playCnt >= playerData.buyCnt + playerData.freeCnt) return resResult(STATUS.ACTIVITY_MINI_GAME_COUNT_LACK); let record = await ActivityMiniGameRecModel.gameStart(serverId, activityId, playerData.roundIndex, playerData.todayIndex, roleId, playerData.gameType); return resResult(STATUS.SUCCESS, { activityId, gameCode: record.gameCode, playCnt: playerData.playCnt }); } /** * @description 小游戏结束 * @param {{ activityId: number}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async gameEnd(msg: { activityId: number, gameCode: string, score: number, params: number[] }, session: BackendSession) { let { activityId, gameCode, score, params } = msg; const roleId = session.get('roleId'); const roleName = session.get('roleName'); const sid = session.get('sid'); const serverId = session.get('serverId'); let playerData = await getPlayerMiniGameData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); // 记录得分&次数 let record = await ActivityMiniGameRecModel.gameEnd(activityId, roleId, gameCode, score, params); if(!record) return resResult(STATUS.ACTIVITY_MINI_GAME_RECORD_NOT_FOUND); if(playerData.gameType == MINI_GAME_TYPE.CATCH_ZONGZI && score > 100) score = 100; let playerRecord = await ActivityMiniGameModel.incScore(serverId, activityId, playerData.roundIndex, roleId, score, playerData.nextRefreshTime); if(!record) return resResult(STATUS.ACTIVITY_MINI_GAME_RECORD_NOT_FOUND); playerData.setPlayerData(playerRecord); playerData.incPlayCnt(); let rewards = stringToRewardParam(playerData.reward); let { goods } = await addReward(roleId, roleName, sid, serverId, rewards, ITEM_CHANGE_REASON.ACT_MINI_GAME_REWARD); let r = new Rank(REDIS_KEY.ACTIVITY_MINI_GAME, { activityId, roundIndex: playerData.roundIndex }); await r.setRankWithRoleInfo(roleId, score, nowSeconds(), null, true); if(playerData.gameType == MINI_GAME_TYPE.SHOOT) { await checkTask(serverId, roleId, sid, TASK_TYPE.MINI_GAME_SHOOT, { score }); } else if(playerData.gameType == MINI_GAME_TYPE.ERASE) { await checkTask(serverId, roleId, sid, TASK_TYPE.MINI_GAME_ERASE, { step: params[0] }); } else if(playerData.gameType == MINI_GAME_TYPE.EAT_ZONGZI) { await checkTask(serverId, roleId, sid, TASK_TYPE.MINI_GAME_EAT_ZONGZI, { score }); } else if(playerData.gameType == MINI_GAME_TYPE.CATCH_ZONGZI) { await checkTask(serverId, roleId, sid, TASK_TYPE.MINI_GAME_CATCH_ZONGZI, { score }); } else { await checkTask(serverId, roleId, sid, TASK_TYPE.MINI_GAME_SCORE, { gameType: playerData.gameType, score }); await checkTask(serverId, roleId, sid, TASK_TYPE.MINI_GAME_STEP, { gameType: playerData.gameType, step: params[0] }); } return resResult(STATUS.SUCCESS, { activityId, gameCode, playCnt: playerData.playCnt, score: playerData.score, goods }); } /** * @description 购买挑战次数 * @param {{ activityId: number}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async buyCnt(msg: { activityId: number, count: number }, session: BackendSession) { const { activityId, count } = msg; const roleId = session.get('roleId'); const sid = session.get('sid'); const serverId = session.get('serverId'); let playerData = await getPlayerMiniGameData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); if(playerData.buyCnt + count > playerData.maxBuyCnt) return resResult(STATUS.ACTIVITY_MINI_GAME_BUY_COUNT_MAX); // 扣材料 let costResult = await handleCost(roleId, sid, stringToConsumeParam(playerData.consume), ITEM_CHANGE_REASON.ACT_MINI_GAME_BUY_CNT); if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); let playerRecord = await ActivityMiniGameModel.buyCnt(serverId, activityId, playerData.roundIndex, roleId, count, playerData.nextRefreshTime); playerData.setPlayerData(playerRecord); return resResult(STATUS.SUCCESS, { activityId, buyCnt: playerData.buyCnt, maxBuyCnt: playerData.maxBuyCnt }); } /** * @description 领取宝箱 * @param {{ activityId: number}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async receiveBox(msg: { activityId: number, boxId: number }, session: BackendSession) { const { activityId, boxId } = msg; const roleId = session.get('roleId'); const roleName = session.get('roleName'); const sid = session.get('sid'); const serverId = session.get('serverId'); let playerData = await getPlayerMiniGameData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); let box = playerData.findBox(boxId); if(!box) return resResult(STATUS.ACTIVITY_MINI_GAME_BOX_NOT_FOUND); if(box.hasReceived) return resResult(STATUS.ACTIVITY_MINI_GAME_BOX_HAS_RECEIVED); if(box.score > playerData.score) return resResult(STATUS.ACTIVITY_MINI_GAME_SCORE_NOT_ENOUGH); let result = await ActivityMiniGameModel.receiveBox(serverId, activityId, playerData.roundIndex, roleId, boxId); if(!result) return resResult(STATUS.ACTIVITY_MINI_GAME_BOX_HAS_RECEIVED); playerData.setPlayerData(result); let rewards = stringToRewardParam(box.reward); let { goods } = await addReward(roleId, roleName, sid, serverId, rewards, ITEM_CHANGE_REASON.ACT_MINI_GAME_REWARD); return resResult(STATUS.SUCCESS, { activityId, curBox: playerData.findBox(boxId), goods }); } /** * @description 排行榜 * @param {{ activityId: number}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async getRanks(msg: { activityId: number }, session: BackendSession) { const { activityId } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); let playerData = await getPlayerMiniGameData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); let serverNames = await getAllServerName(); let r = new Rank(REDIS_KEY.ACTIVITY_MINI_GAME, { activityId, roundIndex: playerData.roundIndex }); r.setGenerFieldsFun((obj => { if(obj instanceof RoleRankInfo) { return { rank: obj.rank, roleId: obj.roleId, name: obj.roleName, serverId: obj.serverId, serverName: serverNames[obj.serverId], num: obj.num } } return null })); let { ranks, myRank } = await r.getRankListWithMyRank({ roleId }); if (!myRank) { myRank = await r.generMyRankWithRole(roleId, playerData.score, nowSeconds()); } return resResult(STATUS.SUCCESS, { activityId, gameType: playerData.gameType, ranks, myRank }); } }