From e6665208e111c0b1400215fe590563615ad13ddf Mon Sep 17 00:00:00 2001 From: luying Date: Fri, 25 Aug 2023 14:57:06 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(=E7=99=BE=E5=AE=B6=E4=BA=89?= =?UTF-8?q?=E9=B8=A3):=E7=A5=88=E7=81=B5=20=E6=9B=B4=E6=96=B0=E8=87=B3=20e?= =?UTF-8?q?b9f941ae?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 5 + .../activity/handler/authorGachaHandler.ts | 65 +++++ .../servers/activity/handler/gachaHandler.ts | 13 +- .../app/services/activity/activityService.ts | 7 + .../services/activity/authorGachaService.ts | 33 +++ game-server/app/services/checkParam.ts | 30 +- game-server/test/activity.test.ts | 273 ++++++++++-------- shared/consts/constModules/activityConst.ts | 1 + shared/consts/constModules/sysConst.ts | 4 +- shared/db/AuthorGachaRec.ts | 54 ++++ .../domain/activityField/authorGachaField.ts | 61 ++++ shared/pubUtils/util.ts | 2 +- .../resource/jsons/dic_zyz_activityType.json | 6 + 13 files changed, 417 insertions(+), 137 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 game-server/app/servers/activity/handler/authorGachaHandler.ts create mode 100644 game-server/app/services/activity/authorGachaService.ts create mode 100644 shared/db/AuthorGachaRec.ts create mode 100644 shared/domain/activityField/authorGachaField.ts diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..b58b603fe --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/game-server/app/servers/activity/handler/authorGachaHandler.ts b/game-server/app/servers/activity/handler/authorGachaHandler.ts new file mode 100644 index 000000000..268dd1669 --- /dev/null +++ b/game-server/app/servers/activity/handler/authorGachaHandler.ts @@ -0,0 +1,65 @@ +import { Application, BackendSession, HandlerService, } from "pinus"; +import { getPlayerAuthorGachaDataShow } from "../../../services/activity/authorGachaService"; +import { parseGoodStrWithType, resResult } from "../../../pubUtils/util"; +import { ITEM_CHANGE_REASON, STATUS } from "../../../consts"; +import { AuthorGachaData } from "../../../domain/activityField/authorGachaField"; +import { addReward } from "../../../services/activity/giftPackageService"; +import { ActivityAuthorGachaRecModel } from "../../../db/AuthorGachaRec"; + + +export default function (app: Application) { + new HandlerService(app, {}); + return new AuthorGachaHandler(app); +} + +export class AuthorGachaHandler { + constructor(private app: Application) { + + } + + /** + * 祈灵获取数据 + * @param msg + * @param session + * @returns + */ + async getData(msg: { activityId: number }, session: BackendSession) { + const roleId: string = session.get('roleId'); + const serverId: number = session.get('serverId'); + + const { activityId } = msg; + let playerData = await getPlayerAuthorGachaDataShow(activityId, serverId, roleId); + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + return resResult(STATUS.SUCCESS, { ...playerData }); + } + + + /** + * 祈灵获取奖励 + * @param msg + * @param session + * @returns + */ + async receiveBox(msg: { activityId: number, count: number }, session: BackendSession) { + const roleId: string = session.get('roleId'); + const roleName: string = session.get('roleName'); + const serverId: number = session.get('serverId'); + const sid: string = session.get('sid'); + + const { activityId, count } = msg; + let playerData = await getPlayerAuthorGachaDataShow(activityId, serverId, roleId); + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + let box = playerData.box.find(cur => cur.count == count); + if (box == undefined || box.hasReceived) return resResult(STATUS.ACTIVITY_REWARDED); + box.hasReceived = true; + let rewards = parseGoodStrWithType(box.rewards); + + + let result = await addReward(roleId, roleName, sid, serverId, rewards, ITEM_CHANGE_REASON.AUTHOR_GACHA_REWARD); + await ActivityAuthorGachaRecModel.record(serverId, activityId, playerData.roundIndex, roleId, count); + + return resResult(STATUS.SUCCESS, { goods: result.goods, curBox: playerData.box }) + } +} \ No newline at end of file diff --git a/game-server/app/servers/activity/handler/gachaHandler.ts b/game-server/app/servers/activity/handler/gachaHandler.ts index 576e42fac..5747e93f7 100644 --- a/game-server/app/servers/activity/handler/gachaHandler.ts +++ b/game-server/app/servers/activity/handler/gachaHandler.ts @@ -19,6 +19,8 @@ import { isHeroHidden } from "../../../services/dataService"; import { GachaResultIndb } from "../../../domain/activityField/gachaField"; import { CreateHeroParam } from "../../../domain/roleField/hero"; import { ItemInter, RewardInter } from "../../../pubUtils/interface"; +import { getPlayerAuthorGachaData } from "../../../services/activity/authorGachaService"; +import { ActivityAuthorGachaRecModel, ActivityAuthorGachaRecModelType } from "../../../db/AuthorGachaRec"; export default function (app: Application) { new HandlerService(app, {}); @@ -113,6 +115,14 @@ export class GachaHandler { await UserGachaRecModel.createRec(roleId, gachaId, activityId, count, resultList); if(dicGacha.isTask) await checkTaskInGacha(serverId, roleId, sid, count, resultHeroes, resultList, false); + + //百家争鸣祈灵 + let playerData = await getPlayerAuthorGachaData(activityId, serverId, roleId); + let dbAuthorGacha:ActivityAuthorGachaRecModelType; + if (playerData) { + dbAuthorGacha = await ActivityAuthorGachaRecModel.updateGachaCnt(serverId, activityId, playerData.roundIndex, roleId, gachaId, count); + } + return resResult(STATUS.SUCCESS, { gachaId, activityId, isFree: freeCount < newDicGacha.free.count, cost: newDicGacha.cost, @@ -120,7 +130,8 @@ export class GachaHandler { // heroes: resultHeroes, addHeros: heroes, result: resultList, - remainFloor: getGachaRemainFloor(gachaId, floor) + remainFloor: getGachaRemainFloor(gachaId, floor), + authorGachaCnt:dbAuthorGacha?.gachaCnt||0, }); } diff --git a/game-server/app/services/activity/activityService.ts b/game-server/app/services/activity/activityService.ts index 057473cac..6ecff4ffc 100644 --- a/game-server/app/services/activity/activityService.ts +++ b/game-server/app/services/activity/activityService.ts @@ -51,6 +51,7 @@ import { getPlayerDragonBoatDataShow } from './dragonBoatService'; import { getPlayerEntertainDataShow } from './entertainService'; import { getPlayerQixiDataShow } from './qixiService'; import { getPlayerMidAutumnDataShow } from './midAutumnService'; +import { getPlayerAuthorGachaDataShow } from './authorGachaService'; /** * 获取活动数据 @@ -292,6 +293,12 @@ export async function getActivity(serverId: number, roleId: string, uid: number, activityData = await getPlayerMidAutumnDataShow(activityId, serverId, roleId); break; } + case ACTIVITY_TYPE.AUTHOR_GACHA: + { + activityData = await getPlayerAuthorGachaDataShow(activityId, serverId, roleId); + break; + } + default: { console.log('未知活动类型.........', activityType) break; diff --git a/game-server/app/services/activity/authorGachaService.ts b/game-server/app/services/activity/authorGachaService.ts new file mode 100644 index 000000000..9a7936f23 --- /dev/null +++ b/game-server/app/services/activity/authorGachaService.ts @@ -0,0 +1,33 @@ +import { ACTIVITY_TYPE } from "../../consts/constModules/activityConst"; +import { ActivityAuthorGachaRecModel } from "../../db/AuthorGachaRec"; +import { UserGachaModel } from "../../db/UserGacha"; +import { AuthorGachaData } from "../../domain/activityField/authorGachaField"; +import { getGachaRemainFloor } from "../../pubUtils/util"; +import { getRoleCreateTime, getServerCreateTime } from "../redisService"; +import { getActivityById } from "./activityService"; + +export async function getPlayerAuthorGachaData(activityId: number, serverId: number, roleId: string) { + let activityData = await getActivityById(activityId); + let createTime = await getRoleCreateTime(roleId); + let serverTime = await getServerCreateTime(serverId); + let playerData = new AuthorGachaData(activityData, createTime, serverTime); + if ((playerData?.type || 0) != ACTIVITY_TYPE.AUTHOR_GACHA) return + let playerRecord = await ActivityAuthorGachaRecModel.findData(serverId, activityId, playerData.roundIndex, roleId); + playerData.setPlayerRecords(playerRecord); + return playerData; +} + +export async function getUseGachaData(activityId: number, roleId: string, playerData: AuthorGachaData) { + let userGacha = await UserGachaModel.findByRole(roleId, playerData.gachaId, activityId); + let count = userGacha?.count || 0; + let remainFloor = getGachaRemainFloor(playerData.gachaId, userGacha?.floor || []); + return { count, remainFloor } +} + +export async function getPlayerAuthorGachaDataShow(activityId: number, serverId: number, roleId: string) { + let playerData = await getPlayerAuthorGachaData(activityId, serverId, roleId); + if (playerData && playerData.canShow && playerData.canShow()) { + return { ...playerData.getShowResult(), ...await getUseGachaData(activityId, roleId, playerData) }; + } + return null +} \ No newline at end of file diff --git a/game-server/app/services/checkParam.ts b/game-server/app/services/checkParam.ts index bab21605d..643c1c683 100644 --- a/game-server/app/services/checkParam.ts +++ b/game-server/app/services/checkParam.ts @@ -761,7 +761,7 @@ export function checkRouteParam(route: string, msg: any) { for (let { actorId, dataId, order, ai } of heroes) { if (!checkNaturalNumbers(actorId, dataId, order, ai)) return false; } - if(!checkCombo(combo)) return false + if (!checkCombo(combo)) return false break; } case "battle.pvpHandler.receiveBox": @@ -822,7 +822,7 @@ export function checkRouteParam(route: string, msg: any) { for (let { actorId, dataId, order } of msg.heroes) { if (!checkNaturalNumbers(actorId, dataId, order)) return false; } - if(!checkCombo(msg.combo)) return false + if (!checkCombo(msg.combo)) return false break; } case "battle.ladderHandler.buyCnt": @@ -2108,6 +2108,16 @@ export function checkRouteParam(route: string, msg: any) { if (!checkNaturalNumbers(msg.activityId, msg.count)) return false; break; } + case 'activity.authorGachaHandler.getData': + { + if (!checkNaturalNumbers(msg.activityId)) return false; + break; + } + case 'activity.authorGachaHandler.receiveBox': + { + if (!checkNaturalNumbers(msg.activityId, msg.count)) return false; + break; + } case 'activity.activityHandler.debugActivityMemory': case 'activity.popUpShopHandler.debugPushPopUpShop': case 'activity.popUpShopHandler.debugPushPopUpInterval': @@ -2334,14 +2344,14 @@ function checkSeqId(...seqIds: (number | string)[]) { return true; } -function checkCombo(combo: {groupId: number, levelList: number[]}[]) { - if(combo) { - if(!isArray(combo)) return false; - for(let {groupId, levelList} of combo) { - if(!isNumber(groupId)) return false; - if(!isArray(levelList)) return false; - for(let lv of levelList) { - if(!isNumber(lv)) return false; +function checkCombo(combo: { groupId: number, levelList: number[] }[]) { + if (combo) { + if (!isArray(combo)) return false; + for (let { groupId, levelList } of combo) { + if (!isNumber(groupId)) return false; + if (!isArray(levelList)) return false; + for (let lv of levelList) { + if (!isNumber(lv)) return false; } } } diff --git a/game-server/test/activity.test.ts b/game-server/test/activity.test.ts index 5dd55bfed..9515d7c16 100644 --- a/game-server/test/activity.test.ts +++ b/game-server/test/activity.test.ts @@ -4,6 +4,8 @@ import { expect } from 'chai'; import { Client } from './Client'; import { checkSuccessResponse } from './CheckPatten'; import { ACTIVITY_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, DEBUG_MAGIC_WORD, STATUS } from '../app/consts'; +import * as util from 'util'; + describe('活动测试', function () { let pinusClient: PinusWSClient; let playerGroupArray: [] = []; @@ -11,7 +13,7 @@ describe('活动测试', function () { before(function (done) { const c = new Client(); - const timer = setInterval(() => { + const timer = setInterval(() => { if (c.client) { pinusClient = c.client; clearInterval(timer); @@ -25,167 +27,190 @@ describe('活动测试', function () { done(); }); - it('获取所有活动', function (done) { - pinusClient.request('activity.activityHandler.getAllOpenActivity', {}, (res) => { - checkSuccessResponse(res); - playerGroupArray = res.data.playerGroupArray; - console.log(`${playerGroupArray.length}个合集数据`) + // it('获取所有活动', function (done) { + // pinusClient.request('activity.activityHandler.getAllOpenActivity', {}, (res) => { + // console.log("x-x-x-x-x-x-x--x-x-x-x res", res) + // checkSuccessResponse(res); + // playerGroupArray = res.data.playerGroupArray; + // console.log(`${playerGroupArray.length}个合集数据`) + // done(); + // }); + // }); + + it('获得祈灵活动数据', function (done) { + pinusClient.request('activity.authorGachaHandler.getData', { activityId: 1296 }, (res) => { + console.log('-x-x--x-x-x-x-x-x-x-x-x- res', util.inspect(res, { depth: null })); done(); }); }); - it('签到活动-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.signInHandler.getSignInActivity', ACTIVITY_TYPE.SIGN_IN, done); - }); - it('签到活动(高级)-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.signInHandler.getSignInActivity', ACTIVITY_TYPE.SIGN_IN_VIP, done); - }); + // it('获得祈灵活动数据', function (done) { + // pinusClient.request('activity.gachaHandler.pull', { activityId: 1296, gachaId: 12, count: 1 }, (res) => { + // console.log('-x-x--x-x-x-x-x-x-x-x-x- res', util.inspect(res, { depth: null })); + // done(); + // }); + // }); - it('主线成长基金-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_MAIN, done); - }); + // it('获得祈灵活动数据', function (done) { + // pinusClient.request('activity.authorGachaHandler.receiveBox', { activityId: 1296, count: 100000 }, (res) => { + // console.log('-x-x--x-x-x-x-x-x-x-x-x- res', util.inspect(res, { depth: null })); + // done(); + // }); + // }); - it('主线成长基金高阶-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP, done); - }); + // it('签到活动-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.signInHandler.getSignInActivity', ACTIVITY_TYPE.SIGN_IN, done); + // }); - it('镇念塔成长基金-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_TOWER, done); - }); + // it('签到活动(高级)-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.signInHandler.getSignInActivity', ACTIVITY_TYPE.SIGN_IN_VIP, done); + // }); - it('镇念塔成长基金高阶-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP, done); - }); + // it('主线成长基金-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_MAIN, done); + // }); - it('精英成长基金-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE, done); - }); + // it('主线成长基金高阶-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP, done); + // }); - it('精英成长基金高阶-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP, done); - }); + // it('镇念塔成长基金-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_TOWER, done); + // }); - it('30日目标活动-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.thirtyDaysHandler.getThirtyDaysActivity', ACTIVITY_TYPE.THIRTY_DAYS, done); - }); + // it('镇念塔成长基金高阶-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP, done); + // }); - it.skip('自选商店-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.selfServiceShopHandler.getSelfServiceShopActivity', ACTIVITY_TYPE.SELF_SERVICE_SHOP, done); - }); + // it('精英成长基金-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE, done); + // }); - it('首充礼包-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.firstGiftHandler.getFirstGiftActivity', ACTIVITY_TYPE.FIRST_GIFT, done); - }); + // it('精英成长基金高阶-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.growthFundHandler.getGrowthFundActivity', ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP, done); + // }); - it.skip('新手限定RMB购买礼包-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.limitPackageHandler.getNewPlayerLimitPackageActivity', ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE, done); - }); + // it('30日目标活动-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.thirtyDaysHandler.getThirtyDaysActivity', ACTIVITY_TYPE.THIRTY_DAYS, done); + // }); - it('每日限购礼包-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.limitPackageHandler.getLimitPackageActivity', ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY, done); - }); + // it.skip('自选商店-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.selfServiceShopHandler.getSelfServiceShopActivity', ACTIVITY_TYPE.SELF_SERVICE_SHOP, done); + // }); - it('每周限购礼包-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.limitPackageHandler.getLimitPackageActivity', ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY, done); - }); + // it('首充礼包-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.firstGiftHandler.getFirstGiftActivity', ACTIVITY_TYPE.FIRST_GIFT, done); + // }); - it('元宝充值商店-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.yuanbaoShopHandler.getShopActivity', ACTIVITY_TYPE.YUAN_BAO_SHOP, done); - }); + // it.skip('新手限定RMB购买礼包-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.limitPackageHandler.getNewPlayerLimitPackageActivity', ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE, done); + // }); - it('月卡1(普通)-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.monthlyTicketHandler.getMonthlyTicketActivity', ACTIVITY_TYPE.MONTHLY_TICKET_1, done); - }); + // it('每日限购礼包-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.limitPackageHandler.getLimitPackageActivity', ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY, done); + // }); - it('月卡2(至尊)-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.monthlyTicketHandler.getMonthlyTicketActivity', ACTIVITY_TYPE.MONTHLY_TICKET_2, done); - }); + // it('每周限购礼包-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.limitPackageHandler.getLimitPackageActivity', ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY, done); + // }); - it('累计充值RMB活动-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.rechargeMoneyHandler.getRechargeMoneyActivity', ACTIVITY_TYPE.RECHARGE_MONEY, done); - }); + // it('元宝充值商店-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.yuanbaoShopHandler.getShopActivity', ACTIVITY_TYPE.YUAN_BAO_SHOP, done); + // }); - it('每日特惠RMB购买-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.dailyRMBGiftsHandler.getDailyRMBGiftsActivity', ACTIVITY_TYPE.DAILY_RMB_GIFTS, done); - }); + // it('月卡1(普通)-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.monthlyTicketHandler.getMonthlyTicketActivity', ACTIVITY_TYPE.MONTHLY_TICKET_1, done); + // }); - it.skip('寻宝骑兵活动-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.treasureHuntHandler.getTreasureHuntActivity', ACTIVITY_TYPE.TREASURE_HUNT, done); - }); + // it('月卡2(至尊)-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.monthlyTicketHandler.getMonthlyTicketActivity', ACTIVITY_TYPE.MONTHLY_TICKET_2, done); + // }); - it('弹出商店-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.popUpShopHandler.getPopUpShopActivity', ACTIVITY_TYPE.POP_UP_SHOP, done); - }); + // it('累计充值RMB活动-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.rechargeMoneyHandler.getRechargeMoneyActivity', ACTIVITY_TYPE.RECHARGE_MONEY, done); + // }); - it('新手签到活动-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.signInHandler.getSignInActivity', ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN, done); - }); + // it('每日特惠RMB购买-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.dailyRMBGiftsHandler.getDailyRMBGiftsActivity', ACTIVITY_TYPE.DAILY_RMB_GIFTS, done); + // }); - it('vip累计充值RMB活动-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.vipRechargeMoneyHandler.getVipRechargeMoneyActivity', ACTIVITY_TYPE.VIP_RECHARGE_MONEY, done); - }); + // it.skip('寻宝骑兵活动-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.treasureHuntHandler.getTreasureHuntActivity', ACTIVITY_TYPE.TREASURE_HUNT, done); + // }); - it('通用七天乐活动-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.sevenDaysHandler.getSevenDaysActivity', ACTIVITY_TYPE.COMMON_SEVEN_DAY, done); - }); + // it('弹出商店-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.popUpShopHandler.getPopUpShopActivity', ACTIVITY_TYPE.POP_UP_SHOP, done); + // }); - it('每日领取免费午饭、晚饭-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.dailyMealHandler.getDailyMealActivity', ACTIVITY_TYPE.DAILY_MEAL, done); - }); + // it('新手签到活动-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.signInHandler.getSignInActivity', ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN, done); + // }); - it('每日兑换铜钱-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.dailyCoinHandler.getDailyCoinActivity', ACTIVITY_TYPE.DAILY_COIN, done); - }); + // it('vip累计充值RMB活动-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.vipRechargeMoneyHandler.getVipRechargeMoneyActivity', ACTIVITY_TYPE.VIP_RECHARGE_MONEY, done); + // }); - it('每日关卡-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.dailyGKHandler.getDailyGKActivity', ACTIVITY_TYPE.DAILY_GK, done); - }); + // it('通用七天乐活动-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.sevenDaysHandler.getSevenDaysActivity', ACTIVITY_TYPE.COMMON_SEVEN_DAY, done); + // }); - it('通用的刷新商店-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.refreshShopHandler.getRefreshShopActivity', ACTIVITY_TYPE.REFRESH_SHOP, done); - }); + // it('每日领取免费午饭、晚饭-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.dailyMealHandler.getDailyMealActivity', ACTIVITY_TYPE.DAILY_MEAL, done); + // }); - it('通用的刷新任务-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.refreshTaskHandler.getRefreshTaskActivity', ACTIVITY_TYPE.REFRESH_TASK, done); - }); + // it('每日兑换铜钱-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.dailyCoinHandler.getDailyCoinActivity', ACTIVITY_TYPE.DAILY_COIN, done); + // }); - it('大富翁-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.activityMonopolyHandler.getMonopolyActivity', ACTIVITY_TYPE.MONOPOLY, done); - }); + // it('每日关卡-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.dailyGKHandler.getDailyGKActivity', ACTIVITY_TYPE.DAILY_GK, done); + // }); - it('大富翁-移动', function (done) { - if (activityId) { - requestActivity(pinusClient, 'role.heroHandler.addItem', { id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.NORMAL_DICE), count: 1 }) - .then((data: any) => { - checkSuccessResponse(data); - return requestActivity(pinusClient, 'activity.activityMonopolyHandler.move', { activityId: activityId, step: 0 }) - }) - .then((data: any) => { - checkSuccessResponse(data); - done() - }) - } else { - noActivityData(done); - } - }); + // it('通用的刷新商店-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.refreshShopHandler.getRefreshShopActivity', ACTIVITY_TYPE.REFRESH_SHOP, done); + // }); - it('通用签到-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.signInHandler.getSignInActivity', ACTIVITY_TYPE.COMMON_SIGN_IN, done); - }); + // it('通用的刷新任务-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.refreshTaskHandler.getRefreshTaskActivity', ACTIVITY_TYPE.REFRESH_TASK, done); + // }); - it('新将好礼-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.newHeroGiftsHandler.getNewHeroGiftsActivity', ACTIVITY_TYPE.NEW_HERO_GIFTS, done); - }); + // it('大富翁-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.activityMonopolyHandler.getMonopolyActivity', ACTIVITY_TYPE.MONOPOLY, done); + // }); - it('新将演绎-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.newHeroGKHandler.getNewHeroGKActivity', ACTIVITY_TYPE.NEW_HERO_GK, done); - }); + // it('大富翁-移动', function (done) { + // if (activityId) { + // requestActivity(pinusClient, 'role.heroHandler.addItem', { id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.NORMAL_DICE), count: 1 }) + // .then((data: any) => { + // checkSuccessResponse(data); + // return requestActivity(pinusClient, 'activity.activityMonopolyHandler.move', { activityId: activityId, step: 0 }) + // }) + // .then((data: any) => { + // checkSuccessResponse(data); + // done() + // }) + // } else { + // noActivityData(done); + // } + // }); - // 未找到该接口,暂时skip - it.skip('新将擢迁(新武将抽卡)-活动数据', function (done) { - checkActivityData(pinusClient, 'activity.newHeroGachaHandler.getNewHeroGachaActivity', ACTIVITY_TYPE.NEW_HERO_GACHA, done); - }); + // it('通用签到-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.signInHandler.getSignInActivity', ACTIVITY_TYPE.COMMON_SIGN_IN, done); + // }); + + // it('新将好礼-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.newHeroGiftsHandler.getNewHeroGiftsActivity', ACTIVITY_TYPE.NEW_HERO_GIFTS, done); + // }); + + // it('新将演绎-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.newHeroGKHandler.getNewHeroGKActivity', ACTIVITY_TYPE.NEW_HERO_GK, done); + // }); + + // // 未找到该接口,暂时skip + // it.skip('新将擢迁(新武将抽卡)-活动数据', function (done) { + // checkActivityData(pinusClient, 'activity.newHeroGachaHandler.getNewHeroGachaActivity', ACTIVITY_TYPE.NEW_HERO_GACHA, done); + // }); function checkActivityData(pinusClient, url, type, done) { try { diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index 8d2122fbf..f320c40e1 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -71,6 +71,7 @@ export enum ACTIVITY_TYPE { ENTERTAIN = 56, // 宴请百家 QIXI = 57, // 七夕活动 MID_AUTUMN = 58, // 中秋活动 + AUTHOR_GACHA = 59, //百家争鸣祈灵活动 } /** diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 07baa9527..0fd83bd2b 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -653,7 +653,7 @@ export const FILENAME = { DIC_AUTHORS_BOOK_POINT: 'dic_zyz_authorsBookPoint', DIC_AUTHORS_BOOK_SUB: 'dic_zyz_authorsBookSub', DIC_AUTHORS_GOODID: 'dic_zyz_authorsGoodId', - DIC_BOSS_RANK_ACTIVE_POINT:'dic_zyz_bossRank_activePoint', + DIC_BOSS_RANK_ACTIVE_POINT: 'dic_zyz_bossRank_activePoint', } export const WAR_RELATE_TABLES = [ @@ -907,6 +907,7 @@ export enum GACHA_TYPE { ASSIGN = 3, // 指定卡池 GUIDE = 4, // 限时 ACTIVITY = 5, // 新武将活动 + TAUTOR=6, // 百家争鸣祈灵 } export enum GACHA_PLAN_TYPE { @@ -1209,6 +1210,7 @@ export enum ITEM_CHANGE_REASON { BUY_SPIRIT = 194, // 购买英灵 QIXI_REWARD = 195, // 七夕活动奖励 MID_AUTUMN_REWARD = 196, // 中秋活动奖励 + AUTHOR_GACHA_REWARD = 197, // 百家争鸣祈灵奖励 } export enum TA_EVENT { diff --git a/shared/db/AuthorGachaRec.ts b/shared/db/AuthorGachaRec.ts new file mode 100644 index 000000000..9d8466acf --- /dev/null +++ b/shared/db/AuthorGachaRec.ts @@ -0,0 +1,54 @@ +import { getModelForClass, prop, DocumentType, index } from "@typegoose/typegoose"; +import BaseModel from "./BaseModel"; + + +/** + * 百家争鸣祈灵 + */ + +@index({ serverId: 1, activityId: 1, roundIndex: 1, roleId: 1 }) + +export default class Activity_AuthorGacha_Rec extends BaseModel { + @prop({ required: true }) + serverId: number; // 服Id + + @prop({ required: true }) + activityId: number; // 活动Id + + @prop({ required: true }) + roundIndex: number; // 第几轮 + + @prop({ required: true }) + roleId: string; // 用户Id + + @prop({ required: true, default: 0 }) + gachaId: number; + + @prop({ required: true, default: 0 }) + gachaCnt: number; // 累计抽奖次数 + + @prop({ required: true, type: Number, default: [] }) + record: number[]; // 领取奖励标记 + + + public static async findData(serverId: number, activityId: number, roundIndex: number, roleId: string) { + let result: ActivityAuthorGachaRecModelType = await ActivityAuthorGachaRecModel.findOne({ serverId, roleId, activityId, roundIndex }).lean(); + return result; + } + + public static async updateGachaCnt(serverId: number, activityId: number, roundIndex: number, roleId: string, gachaId: number, gachaCnt: number) { + let result: ActivityAuthorGachaRecModelType = await ActivityAuthorGachaRecModel.findOneAndUpdate({ serverId, roleId, activityId, roundIndex }, { $set: { gachaId }, $inc: { gachaCnt } }, { new: true, upsert: true }).lean(); + return result; + } + + public static async record(serverId: number, activityId: number, roundIndex: number, roleId: string, record: number) { + let result: ActivityAuthorGachaRecModelType = await ActivityAuthorGachaRecModel.findOneAndUpdate({ serverId, roleId, activityId, roundIndex }, { $push: { record } }, { new: true, upsert: true }).lean(); + return result; + } + +} + +export const ActivityAuthorGachaRecModel = getModelForClass(Activity_AuthorGacha_Rec); + +export interface ActivityAuthorGachaRecModelType extends Pick, keyof Activity_AuthorGacha_Rec> { } +export type ActivityAuthorGachaRecModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/authorGachaField.ts b/shared/domain/activityField/authorGachaField.ts new file mode 100644 index 000000000..be3aea07f --- /dev/null +++ b/shared/domain/activityField/authorGachaField.ts @@ -0,0 +1,61 @@ +// 百家争鸣活动 - 祈灵 +import { ActivityModelType } from '../../db/Activity'; +import { ActivityAuthorGachaRecModelType } from '../../db/AuthorGachaRec'; +import { ActivityBase } from './activityField'; + +// 后台格式 +interface AuthorGachaDataInDb { + gachaId: number; // 卡池 + box: { + count: number; // 次数 + rewards: string; // type&id&count, type: 1-武将 2-道具 3-礼包 + hasReceived?: boolean; // 是否获得 + }[]; +} + +export class AuthorGachaData extends ActivityBase { + gachaId: number; + box: AuthorGachaDataInDb['box'] = []; + + gachaCnt: number = 0; + record: number[] = []; + + constructor(activityData: ActivityModelType, createTime: number, serverTime: number) { + super(activityData, createTime, serverTime) + this.initData(activityData.data) + } + + public initData(data: string): void { + let dataObj: AuthorGachaDataInDb = JSON.parse(data); + if (!dataObj) return; + + this.gachaId = dataObj.gachaId; + this.box = dataObj.box; + } + + public setPlayerRecords(playerData: ActivityAuthorGachaRecModelType) { + this.updatePlayerRecord(playerData); + } + + public updatePlayerRecord(playerData: ActivityAuthorGachaRecModelType) { + if (!playerData) return; + this.gachaCnt = playerData?.gachaCnt || 0; + this.record = playerData?.record || []; + } + + public getShowResult() { + let box: AuthorGachaDataInDb['box'] = []; + for (let { count, rewards } of this.box) { + let hasReceived = false; + if (this.record.indexOf(count) != -1) hasReceived = true; + box.push({ count, rewards, hasReceived }) + } + + return { + ...this.getBaseKeys(), + gachaId: this.gachaId, + authorGachaCnt: this.gachaCnt, + box, + } + } +} \ No newline at end of file diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index 1de0396e0..9f76cb6c8 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -839,7 +839,7 @@ export function arrToMap(arr: T[], getKey: (obj: T) => number|string): Map