import { Application, BackendSession, HandlerService, } from 'pinus'; import { parseNumberList, resResult } from '../../../pubUtils/util'; import { ITEM_CHANGE_REASON, STATUS } from '../../../consts'; import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/activity/giftPackageService'; import { getPlayerDragonBoatData, getPlayerDragonBoatDataShow } from '../../../services/activity/dragonBoatService'; import { ActivityDragonBoatModel } from '../../../db/ActivityDragonBoat'; import { handleCost } from '../../../services/role/rewardService'; export default function (app: Application) { new HandlerService(app, {}); return new DragonBoatHandler(app); } export class DragonBoatHandler { constructor(private app: Application) { } /** * @description 获取火神祭祀活动数据 * @param {{ activityId: number}} msg * @param {BackendSession} session * @memberof DragonBoatHandler */ async getData(msg: { activityId: number }, session: BackendSession) { const { activityId } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); let playerData = await getPlayerDragonBoatDataShow(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); return resResult(STATUS.SUCCESS, playerData); } /** * @description 挑战开始 * @param {{ activityId: number, id: number}} msg * @param {BackendSession} session * @memberof DragonBoatHandler */ async gameStart(msg: { activityId: number, id: number }, session: BackendSession) { const { activityId, id } = msg; const roleId = session.get('roleId'); const roleName = session.get('roleName'); const sid = session.get('sid'); const serverId = session.get('serverId'); let playerData = await getPlayerDragonBoatData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); // 挑战次数 if(playerData.playCnt >= playerData.freeCnt + playerData.buyCnt) return resResult(STATUS.ACTIVITY_DRAGON_BOAT_COUNT_OVER); let route = playerData.findRoute(id); if(!route) return resResult(STATUS.ACTIVITY_DRAGON_BOAT_ROUTE_NOTFOUND); if(route.hasPass) return resResult(STATUS.ACTIVITY_DRAGON_BOAT_ROUTE_HAS_PASS); if(route.preId && route.preId != '&') { let preIds = parseNumberList(route.preId); let hasPass = preIds.find(preId => { let preRoute = playerData.findRoute(preId); return preRoute && preRoute.hasPass; }); if(!hasPass) return resResult(STATUS.ACTIVITY_DRAGON_BOAT_PRE_NOT_PASS); } let rewards = stringToRewardParam(route.reward); let playerRecord = await ActivityDragonBoatModel.record(serverId, activityId, playerData.roundIndex, roleId, { todayIndex: playerData.todayIndex, id, time: new Date(), rewards }) playerData.setPlayerRecords(playerRecord); await addReward(roleId, roleName, sid, serverId, rewards, ITEM_CHANGE_REASON.ACT_DRAGON_BOAT); return resResult(STATUS.SUCCESS, { activityId, todayPlayCnt: playerData.todayPlayCnt, playCnt: playerData.playCnt, route: playerData.findRoute(id)?.getShowResult() }); } /** * @description 挑战结束 * @param {{ activityId: number, id: number, count: number}} msg * @param {BackendSession} session * @memberof DragonBoatHandler */ async gameEnd(msg: { activityId: number, id: number }, session: BackendSession) { const { activityId, id } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); let playerData = await getPlayerDragonBoatData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); let route = playerData.findRoute(id); if(!route) return resResult(STATUS.ACTIVITY_DRAGON_BOAT_ROUTE_NOTFOUND); return resResult(STATUS.SUCCESS, { activityId, todayPlayCnt: playerData.todayPlayCnt, playCnt: playerData.playCnt, route: route.getShowResult(), goods: route.resultReward }); } /** * @description 购买次数 * @param {{ activityId: number, id: number, count: number}} msg * @param {BackendSession} session * @memberof DragonBoatHandler */ 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 getPlayerDragonBoatData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); // 可购买次数 if(playerData.buyCnt + count > playerData.maxBuyCnt) return resResult(STATUS.ACTIVITY_DRAGON_BOAT_BUY_COUNT_OVER); if(playerData.todayPlayCnt < playerData.freeCnt) return resResult(STATUS.ACTIVITY_DRAGON_BOAT_CANNOT_BUY); // 扣材料 let costResult = await handleCost(roleId, sid, stringToConsumeParam(playerData.buyCost), ITEM_CHANGE_REASON.ACT_DRAGON_BOAT_BUY_COST); if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); // 保存数据 let buildResult = await ActivityDragonBoatModel.buyCnt(serverId, activityId, playerData.roundIndex, roleId, count); // 更新数据 playerData.setPlayerRecords(buildResult); return resResult(STATUS.SUCCESS, { activityId, maxBuyCnt: playerData.maxBuyCnt, buyCnt: playerData.buyCnt }); } }