diff --git a/game-server/app/servers/activity/handler/growthFundHandler.ts b/game-server/app/servers/activity/handler/growthFundHandler.ts new file mode 100644 index 000000000..b59492774 --- /dev/null +++ b/game-server/app/servers/activity/handler/growthFundHandler.ts @@ -0,0 +1,80 @@ +import { Application, BackendSession } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS, ACTIVITY_RESOURCES_TYPE } from '../../../consts'; +import { getPlayerGrowthFundData, growthFundActivity } from '../../../services/growthFundService'; +import { GrowthFundItem } from '../../../domain/activityField/growthFundField'; +import { addItems, createHeroes } from '../../../services/rewardService'; +import { ActivityGrowthFundModel } from '../../../db/ActivityGrowthFund'; + + +export default function (app: Application) { + return new SevenDaysHandler(app); +} + +export class SevenDaysHandler { + constructor(private app: Application) { + } + + /************************成长基金****************************/ + + /** + * @description 获取成长基金活动数据 + * @param {{ type: number}} msg + * @param {BackendSession} session + * @memberof SevenDaysHandler + */ + async getGrowthFundActivity(msg: { type: number }, session: BackendSession) { + const { type } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + + let playerData = await growthFundActivity(type, serverId, roleId); + + if (!playerData) return resResult(STATUS.ACTIVITY_GROWTH_FUND_END); + + return resResult(STATUS.SUCCESS, playerData); + } + + /** + * @description 获取成长基金奖励 + * @param {{ activityId: number, pageIndex: number, cellIndex: number}} msg + * @param {BackendSession} session + * @memberof SevenDaysHandler + */ + async getGrowthFundCellReward(msg: { activityId: number, pageIndex: number, cellIndex: number }, session: BackendSession) { + const { activityId, pageIndex, cellIndex } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); + const funcs: number[] = session.get('funcs'); + + let playerData = await getPlayerGrowthFundData(activityId, serverId, roleId) + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + let growthFundItemData: GrowthFundItem = playerData.findGrowthFundItem(pageIndex, cellIndex); + if (!growthFundItemData) { + return resResult(STATUS.ACTIVITY_DATA_ERROR); + } + if (!growthFundItemData.isComplete) {//未完成任务 + return resResult(STATUS.ACTIVITY_TASK_UNCOMPLETED); + } + if (growthFundItemData.isReceive) {//已经领取过 + return resResult(STATUS.ACTIVITY_REWARDED); + } + + await ActivityGrowthFundModel.addRecord(activityId, roleId, pageIndex, cellIndex); + let reward = growthFundItemData.goodReward(); + let goods = await addItems(roleId, roleName, sid, reward); + let heroReward = growthFundItemData.heroReward(); + let addHeros = []; + if (heroReward.length > 0) { + let heroResult = await createHeroes(roleId, roleName, sid, serverId, funcs, heroReward); + goods = goods.concat(heroResult.goods) + addHeros = addHeros.concat(heroResult.heroes); + } + + return resResult(STATUS.SUCCESS, { goods, addHeros }); + } + +} diff --git a/game-server/app/servers/activity/handler/signInHandler.ts b/game-server/app/servers/activity/handler/signInHandler.ts index 57d5ec10f..41d03d866 100644 --- a/game-server/app/servers/activity/handler/signInHandler.ts +++ b/game-server/app/servers/activity/handler/signInHandler.ts @@ -28,11 +28,10 @@ export class SignInHandler { const roleId = session.get('roleId'); const serverId = session.get('serverId'); - let todayIndex = moment(Date.now()).day(); - console.log('todayIndex', todayIndex) - // if (todayIndex < 5 || todayIndex > 24) {//未开启 - // return resResult(STATUS.ACTIVITY_CLOSED); - // } + let todayIndex = moment(Date.now()).date(); + if (todayIndex < 5 || todayIndex > 24) {//未开启 + return resResult(STATUS.ACTIVITY_CLOSED); + } let activityData = await signInActivity(ACTIVITY_TYPE.SIGN_IN, serverId, roleId); if (!activityData) {//未配置活动数据 @@ -61,13 +60,13 @@ export class SignInHandler { const roleName = session.get('roleName'); const funcs: number[] = session.get('funcs'); - let todayIndex = moment(Date.now()).day(); - // if (todayIndex < 5 || todayIndex > 24) {//未开启 - // return resResult(STATUS.ACTIVITY_CLOSED); - // } - // if (todayIndex < dayIndex) { - // return resResult(STATUS.ACTIVITY_DAY_INDEX_OVER); - // } + let todayIndex = moment(Date.now()).date(); + if (todayIndex < 5 || todayIndex > 24) {//未开启 + return resResult(STATUS.ACTIVITY_CLOSED); + } + if (todayIndex < dayIndex) { + return resResult(STATUS.ACTIVITY_DAY_INDEX_OVER); + } let activityData = await signInActivity(ACTIVITY_TYPE.SIGN_IN, serverId, roleId); if (!activityData) {//未配置活动数据 diff --git a/game-server/app/services/growthFundService.ts b/game-server/app/services/growthFundService.ts new file mode 100644 index 000000000..819a19409 --- /dev/null +++ b/game-server/app/services/growthFundService.ts @@ -0,0 +1,74 @@ +import { ACTIVITY_TYPE, TASK_TYPE } from '../consts'; +import { ActivityModel, ActivityModelType } from '../db/Activity'; +import { ActivityGrowthFundModel, ActivityGrowthFundModelType } from '../db/ActivityGrowthFund'; +import { RoleModel } from '../db/Role'; +import { GrowthFundData, GrowthFundItem } from '../domain/activityField/growthFundField'; + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} type 活动类型 ACTIVITY_TYPE + * @param {string} roleId 角色Id + * + */ +export async function growthFundActivity(type: number, serverId: number, roleId: string) { + let activityArray: ActivityModelType[] = await (await ActivityModel.findActivityByType(type, true)).sort((a, b) => { + return a.acvitityId - b.acvitityId + }); + for (let i = 0; i < activityArray.length; i++) { + let activityData = activityArray[i]; + let playerData = await getPlayerGrowthFundData(activityData.acvitityId, serverId, roleId); + if (!playerData.isComplete()) { + return playerData; + } + } + return null +} + +/** + * 玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getPlayerGrowthFundData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + let playerRecords: ActivityGrowthFundModelType[] = await ActivityGrowthFundModel.findData(activityId, roleId); + + let playerData = new GrowthFundData(activityData); + playerData.setPlayerRecords(playerRecords); + + let activityType = activityData.type; + switch (activityType) { + case ACTIVITY_TYPE.GROWTH_FUND_MAIN: {//主线 + let role = await RoleModel.findByRoleId(roleId); + let { warStar = new Array<{ id: number, warType: number, star: number }>() } = role; + let warIDs = warStar.map(cur => cur.id); + for (let item of playerData.list) { + if (item.taskType == TASK_TYPE.BATTLE_MAIN) { + let index = warIDs.findIndex(id => { return id === item.taskParamArray[1] }) + if (index != -1) { + item.isComplete = true; + } + } + } + break; + } + case ACTIVITY_TYPE.GROWTH_FUND_TOWER: {//镇念塔 + + break; + } + case ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE: {//精英 + + break; + } + default: + break; + } + return playerData; +} + + diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index 69d0658fc..82ba84b5a 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -10,6 +10,9 @@ export enum ACTIVITY_TYPE { TASK_DAILY_CHALLENGES = 3, // 今日挑战活动 SIGN_IN = 4, // 签到活动 SIGN_IN_VIP = 5, // 签到活动(高级) + GROWTH_FUND_MAIN = 6, // 主线成长基金 + GROWTH_FUND_TOWER = 7, // 镇念塔成长基金 + GROWTH_FUND_MAIN_ELITE = 8, // 精英成长基金 } /** diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 847d245ca..eb21fad2b 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -346,6 +346,7 @@ export const STATUS = { ACTIVITY_CLOSED: { code: 50009, simStr: '关闭中' }, ACTIVITY_DAY_INDEX_OVER: { code: 50010, simStr: '心急吃不了热豆腐' }, ACTIVITY_EXPIRE: { code: 50011, simStr: '活动到期,刷新' }, + ACTIVITY_GROWTH_FUND_END: { code: 50012, simStr: '成长基金活动结束' }, // GM后台相关状态 60000 - 69999 GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' }, GM_MISS_API: { code: 60002, simStr: '未找到该接口' }, diff --git a/shared/db/ActivityGrowthFund.ts b/shared/db/ActivityGrowthFund.ts new file mode 100644 index 000000000..95c602480 --- /dev/null +++ b/shared/db/ActivityGrowthFund.ts @@ -0,0 +1,56 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 成长基金活动 +*/ +@index({ roleId: 1 }) + +export default class ActivityGrowthFund extends BaseModel { + @prop({ required: true }) + acvitityId: number; // 活动Id + @prop({ required: true }) + roleId: string; // 用户Id + @prop({ required: true }) + pageIndex: number; // 第几页 + @prop({ required: true }) + cellIndex: number; // 第*页的第几个奖励 + @prop({ required: true }) + isReceive: boolean; // 是否领取过奖励 + + + //添加领取记录 + public static async addRecord(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number, lean = true) { + let result: ActivityGrowthFundModelType = await ActivityGrowthFundModel.findOneAndUpdate({ roleId, acvitityId, pageIndex, cellIndex }, + { $set: { isReceive: true } }, { upsert: true, new: true }).lean(lean); + return result; + } + + //根据活动id查询活动数据 + public static async findData(acvitityId: number, roleId: string, lean = true) { + let result: ActivityGrowthFundModelType[] = await ActivityGrowthFundModel.find({ roleId, acvitityId }).lean(lean); + return result; + } + + //查询第几页的活动数据 + public static async findDataBypageIndex(acvitityId: number, roleId: string, pageIndex: number, lean = true) { + let result: ActivityGrowthFundModelType[] = await ActivityGrowthFundModel.find({ roleId, acvitityId, pageIndex }).lean(lean); + return result; + } + + //查询第*页的某个的活动数据 + public static async findDataByCellIndex(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number, lean = true) { + let result: ActivityGrowthFundModelType[] = await ActivityGrowthFundModel.find({ roleId, acvitityId, pageIndex, cellIndex }).lean(lean); + return result; + } + + //删除活动领取记录 + public static async deleteActivity(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number) { + await ActivityGrowthFundModel.deleteMany({ roleId, acvitityId, pageIndex, cellIndex }); + } +} + +export const ActivityGrowthFundModel = getModelForClass(ActivityGrowthFund); + +export interface ActivityGrowthFundModelType extends Pick, keyof ActivityGrowthFund> { } +export type ActivityGrowthFundModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/growthFundField.ts b/shared/domain/activityField/growthFundField.ts new file mode 100644 index 000000000..b47e1aaed --- /dev/null +++ b/shared/domain/activityField/growthFundField.ts @@ -0,0 +1,102 @@ +import { TASK_TYPE, ACTIVITY_RESOURCES_TYPE } from '../../consts'; +import { ActivityModelType } from '../../db/Activity'; +import { ActivityGrowthFundModelType } from '../../db/ActivityGrowthFund'; +import { RewardInter } from '../../pubUtils/interface'; +import { parseGoodStrWithType, parseHeroStrWithType, splitString } from '../../pubUtils/util'; +import { CreateHeroParam } from '../roleField/hero'; +import { ActivityBase } from './activityField'; + + +// 成长基金每个奖励的数据 +export class GrowthFundItem { + pageIndex: number; // 第几页,从1开始 + cellIndex: number; // 第几个,从1开始 + name: string; //名称 + taskType: number; // 任务类型 dic_zyz_taskType.json + taskParam: string; //任务数据 dic_zyz_taskType.json + taskParamArray: Array; //任务数据 dic_zyz_taskType.json + reward: string; // 任务奖励,格式:1&3&1(类型&id&数量) 类型定义:1.英雄,2.物品 + + + isComplete: boolean = false; //是否完成任务 + isReceive: boolean = false; //是否领取过奖励 + + constructor(data: any) { + this.pageIndex = data.pageIndex; + this.cellIndex = data.cellIndex; + this.name = data.name; + this.taskType = data.taskType; + this.taskParam = data.taskParam; + this.reward = data.reward; + + this.taskParamArray = splitString(data.taskParam, '&') + } + + public heroReward(): CreateHeroParam[] { + let rewardArray = []; + let rewardData = this.reward.split('|').filter(obj => { return obj && obj != '' }); + for (let objStr of rewardData) { + let reward = parseHeroStrWithType(objStr); + rewardArray.push(reward); + } + return rewardArray.filter(obj => { return obj && obj.type == ACTIVITY_RESOURCES_TYPE.HERO }) + } + + public goodReward(): RewardInter[] { + let rewardArray = []; + let rewardData = this.reward.split('|').filter(obj => { return obj && obj != '' }); + for (let objStr of rewardData) { + let reward = parseGoodStrWithType(objStr); + rewardArray.push(reward); + } + return rewardArray.filter(obj => { return obj && obj.type == ACTIVITY_RESOURCES_TYPE.GOODS }) + } + + public canReceive(): boolean { + return !this.isReceive; + } +} + + +// 成长基金活动数据 +export class GrowthFundData extends ActivityBase { + list: Array = []; + + //全部领取完成 + public isComplete() { + for (let i = 0; i < this.list.length; i++) { + let item = this.list[i]; + if (!item.isReceive) { + return false + } + } + return true; + } + + public findGrowthFundItem(pageIndex: number, cellIndex: number) { + let index = this.list.findIndex(obj => { return obj && obj.pageIndex == pageIndex && obj.cellIndex == cellIndex }) + return (index != -1) ? this.list[index] : null; + } + + //解析玩家领取记录 + public setPlayerRecords(data: ActivityGrowthFundModelType[]) { + for (let obj of this.list) { + let index = data.findIndex(record => { return obj.pageIndex == record.pageIndex && obj.cellIndex == record.cellIndex }) + if (index != -1) { + obj.isReceive = data[index].isReceive; + } + } + } + + public initData(data: string) { + let arr = JSON.parse(data); + for (let obj of arr) { + this.list.push(new GrowthFundItem(obj)) + } + } + + constructor(activityData: ActivityModelType) { + super(activityData) + this.initData(activityData.data) + } +} \ No newline at end of file