From 4851c699b69903f1aab5367c06824b935af60af1 Mon Sep 17 00:00:00 2001 From: qiaoxin Date: Tue, 15 Jun 2021 17:37:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E5=85=91=E6=8D=A2=E9=93=9C=E5=B8=81=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/handler/dailyCoinHandler.ts | 41 +++++--- game-server/app/services/dailyCoinService.ts | 1 - shared/db/ActivityDailyCoin.ts | 8 +- shared/domain/activityField/dailyCoinField.ts | 97 +++++++++++++------ 4 files changed, 102 insertions(+), 45 deletions(-) diff --git a/game-server/app/servers/activity/handler/dailyCoinHandler.ts b/game-server/app/servers/activity/handler/dailyCoinHandler.ts index ab442a20d..83787009c 100644 --- a/game-server/app/servers/activity/handler/dailyCoinHandler.ts +++ b/game-server/app/servers/activity/handler/dailyCoinHandler.ts @@ -1,13 +1,15 @@ import { Application, BackendSession } from 'pinus'; import { resResult } from '../../../pubUtils/util'; -import { CURRENCY_BY_TYPE, CURRENCY_TYPE, STATUS } from '../../../consts'; +import { ACTIVITY_RESOURCES_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, STATUS } from '../../../consts'; import { handleCost } from '../../../services/rewardService'; import { getPlayerDailyCoinData, mergeData } from '../../../services/dailyCoinService'; -import { DailyCoinItem } from '../../../domain/activityField/dailyCoinField'; +import { ConsumeExchangeFormulaItem, CoinRewardFormulaItem } from '../../../domain/activityField/dailyCoinField'; import { ActivityDailyCoinModel } from '../../../db/ActivityDailyCoin'; import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/giftPackageService'; import { RewardParam } from '../../../domain/activityField/rewardField'; import { ItemInter } from '../../../pubUtils/interface'; +import { getGoldObject } from '../../../pubUtils/itemUtils'; +import { RoleModel } from '../../../db/Role'; export default function (app: Application) { @@ -36,7 +38,6 @@ export class DailyCoinHandler { if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); - delete playerData.list; return resResult(STATUS.SUCCESS, playerData); } @@ -57,28 +58,36 @@ export class DailyCoinHandler { let playerData = await getPlayerDailyCoinData(activityId, serverId, roleId) if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); let curIndex = playerData.exchangeCount; - if (curIndex + count > playerData.list.length) { + if (curIndex + count > playerData.countMax) { return resResult(STATUS.ACTIVITY_MAX_COUNT); } let allConsume: Array = [] let allReward: Array = []; + let role = await RoleModel.findByRoleId(roleId) for (let i = 1; i <= count; i++) { let index = curIndex + i; console.log('第几次抽奖', index) - let item: DailyCoinItem = playerData.findItem(index); - if (item.consume) {//消耗资源 - let consume = stringToConsumeParam(item.consume) + if (index > playerData.freeCount) {//消耗资源 + let consumeItem: ConsumeExchangeFormulaItem = playerData.findConsumeExchangeFormulaItem(index); + let times = index; + let consumeCount = eval(consumeItem.consumeFormula) + let consume = getGoldObject(consumeCount) allConsume = allConsume.concat(consume) } - let rate = item.getRate()//翻几倍 - let baseRewardParamArr: Array = stringToRewardParam(item.baseReward); + let rate = playerData.getRate()//翻几倍 + + let rewardItem: CoinRewardFormulaItem = playerData.findCoinRewardFormulaItem(index); + let lv = role.lv;//玩家等级 + let coinRewardCount = eval(rewardItem.rewardFormula); + + let baseRewardParamArr: Array = [{ id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.COIN), count: coinRewardCount, type: ACTIVITY_RESOURCES_TYPE.GOODS }]; console.log('基础奖励翻倍', JSON.stringify(baseRewardParamArr), rate) for (let reward of baseRewardParamArr) { reward.count = reward.count * rate; } allReward = allReward.concat(baseRewardParamArr); - if (item.extraReward) {//额外奖励 - let extraRewardParamArr: Array = stringToRewardParam(item.extraReward); + if (playerData.isExtra(index)) {//额外奖励 + let extraRewardParamArr: Array = stringToRewardParam(playerData.extraReward); console.log('额外奖励', JSON.stringify(extraRewardParamArr)) allReward = allReward.concat(extraRewardParamArr); } @@ -101,9 +110,17 @@ export class DailyCoinHandler { } } + let consumeGold = 0; + let goldId = CURRENCY_BY_TYPE.get(CURRENCY_TYPE.GOLD); + for (let obj of newConsume) { + if (obj.id === goldId) { + consumeGold += obj.count; + } + } + //免费期间 let result = await addReward(roleId, roleName, sid, serverId, funcs, newReward) - await ActivityDailyCoinModel.addExchangeRecord(serverId, activityId, roleId, playerData.beginTime, count, addCoin); + await ActivityDailyCoinModel.addExchangeRecord(serverId, activityId, roleId, playerData.beginTime, count, addCoin, `${count}&${consumeGold}&${addCoin}`); let exchangeCount = playerData.exchangeCount + count; return resResult(STATUS.SUCCESS, Object.assign(result, { diff --git a/game-server/app/services/dailyCoinService.ts b/game-server/app/services/dailyCoinService.ts index 0269d1596..d24b8836b 100644 --- a/game-server/app/services/dailyCoinService.ts +++ b/game-server/app/services/dailyCoinService.ts @@ -24,7 +24,6 @@ export async function dailyCoinActivity(serverId: number, roleId: string) { let playerRecord: ActivityDailyCoinModelType = await ActivityDailyCoinModel.findData(serverId, activityData.activityId, roleId, playerData.beginTime); playerData.setPlayerRecords(playerRecord); - delete playerData.list; return playerData; } diff --git a/shared/db/ActivityDailyCoin.ts b/shared/db/ActivityDailyCoin.ts index f34ee051d..4949ac3a8 100644 --- a/shared/db/ActivityDailyCoin.ts +++ b/shared/db/ActivityDailyCoin.ts @@ -19,11 +19,15 @@ export default class Activity_Daily_Coin extends BaseModel { exchangeCount: number; // 兑换次数 @prop({ required: true }) coinCount: number; // 兑换获得铜币数量 + @prop({ required: true }) + recordMsg: string[]; // 兑换记录 exchangeCount&cointCount + //兑换记录 - public static async addExchangeRecord(serverId: number, activityId: number, roleId: string, beginTime: number, count: number, coinCount: number) { - let result = await ActivityDailyCoinModel.findOneAndUpdate({ serverId, activityId, roleId, beginTime }, { $inc: { exchangeCount: count, coinCount: coinCount } }, { upsert: true, new: true }).lean(true) + public static async addExchangeRecord(serverId: number, activityId: number, roleId: string, beginTime: number, count: number, coinCount: number, msg: string) { + let result = await ActivityDailyCoinModel.findOneAndUpdate({ serverId, activityId, roleId, beginTime }, + { $inc: { exchangeCount: count, coinCount: coinCount }, $push: { recordMsg: msg } }, { upsert: true, new: true }).lean(true) return result; } diff --git a/shared/domain/activityField/dailyCoinField.ts b/shared/domain/activityField/dailyCoinField.ts index 49388a008..0f5ab802e 100644 --- a/shared/domain/activityField/dailyCoinField.ts +++ b/shared/domain/activityField/dailyCoinField.ts @@ -3,18 +3,53 @@ import { random } from 'underscore'; import { REFRESH_TIME } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; import { ActivityDailyCoinModelType } from '../../db/ActivityDailyCoin'; +import { splitString } from '../../pubUtils/util'; import { ActivityBase } from './activityField'; +export class CoinRewardFormulaItem { + levelMin: number; + levelMax: number; + rewardFormula: string; + rewardBaseRatio: number; + + constructor(data: any) { + this.levelMin = data.levelMin; + this.levelMax = data.levelMax; + this.rewardFormula = data.rewardFormula; + this.rewardBaseRatio = data.rewardBaseRatio; + } +} // 每次配置数据 -export class DailyCoinItem { - index: number; // 第几次从1开始 - baseReward: string; //基础奖励 - extraReward: string; //额外奖励 - exchangeRate: number; // 兑换比例 1元宝兑换多少铜币 - double: number; // 双倍概率 0.25 - fiveTimes: number; // 5倍概率 0.05 - consume: string; //补签消耗资源 +export class ConsumeExchangeFormulaItem { + countMin: number; + countMax: number; + consumeFormula: string; + exchangeRate: number; + + constructor(data: any) { + this.countMin = data.countMin; + this.countMax = data.countMax; + this.consumeFormula = data.consumeFormula; + this.exchangeRate = data.exchangeRate; + } +} + + +// 每日兑换铜币活动数据 +export class DailyCoinData extends ActivityBase { + countMax: number = 0;//每日上限 + freeCount: number = 0;//每日免费次数 + extraRewardCount: string = '';//可额外获得道具奖励的第X次 + extraReward: string = '';//额外获得的道具奖励 + double: number = 0;//2倍暴击触发的概率 + fiveTimes: number = 0;//5倍暴击触发的概率 + consumeExchangeFormulaItem: ConsumeExchangeFormulaItem[] = []; + coinRewardFormulaItem: CoinRewardFormulaItem[] = []; + + exchangeCount: number = 0;//已经兑换次数 + coinCount: number = 0;//已经兑换获得铜币数量 + recordMsg: string[] = [];//历史记录 public getRate() { let ran = (random(99) + 1) * 0.01;//[1,100] @@ -29,43 +64,45 @@ export class DailyCoinItem { return 1; } - constructor(data: any) { - this.index = data.index; - this.baseReward = data.baseReward; - this.extraReward = data.extraReward; - this.exchangeRate = data.exchangeRate; - this.double = data.double; - this.fiveTimes = data.fiveTimes; - this.consume = data.consume; + public isExtra(index: number) { + let arr = splitString(this.extraRewardCount, '&'); + return arr.indexOf(index) != -1; } -} + public findConsumeExchangeFormulaItem(index: number) { + let itemIndex = this.consumeExchangeFormulaItem.findIndex(obj => { return obj.countMin <= index && obj.countMax >= index }); + return (itemIndex != -1) ? this.consumeExchangeFormulaItem[itemIndex] : null; + } -// 每日兑换铜币活动数据 -export class DailyCoinData extends ActivityBase { - list: Array = []; - name: string = '';//名字 - exchangeCount: number = 0;//已经兑换次数 - coinCount: number = 0;//已经兑换获得铜币数量 - - public findItem(index: number) { - let itemIndex = this.list.findIndex(obj => { return obj.index === index }); - return (itemIndex != -1) ? this.list[itemIndex] : null; + public findCoinRewardFormulaItem(level: number) { + let itemIndex = this.coinRewardFormulaItem.findIndex(obj => { return obj.levelMin <= level && obj.levelMax >= level }); + return (itemIndex != -1) ? this.coinRewardFormulaItem[itemIndex] : null; } //解析玩家领取记录 public setPlayerRecords(data: ActivityDailyCoinModelType) { this.exchangeCount = data && data.exchangeCount ? data.exchangeCount : 0; this.coinCount = data && data.coinCount ? data.coinCount : 0; + this.recordMsg = data && data.recordMsg ? data.recordMsg : []; } public initData(data: string) { this.exchangeCount = 0; this.coinCount = 0; + let dataObj = JSON.parse(data); - let arr = dataObj; - for (let obj of arr) { - this.list.push(new DailyCoinItem(obj)) + this.countMax = dataObj.countMax; + this.freeCount = dataObj.freeCount; + this.extraRewardCount = dataObj.extraRewardCount; + this.extraReward = dataObj.extraReward; + this.double = dataObj.double; + this.fiveTimes = dataObj.fiveTimes; + + for (let obj of dataObj.consumeExchangeFormula) { + this.consumeExchangeFormulaItem.push(new ConsumeExchangeFormulaItem(obj)) + } + for (let obj of dataObj.coinRewardFormula) { + this.coinRewardFormulaItem.push(new CoinRewardFormulaItem(obj)) } let curDate = moment(new Date()); if (curDate.hour() < REFRESH_TIME) {