diff --git a/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts b/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts index e2b2fee57..c475ef0c2 100644 --- a/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts +++ b/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts @@ -66,11 +66,10 @@ export class RechargeMoneyHandler { await ActivityRechargeMoneyModel.addRecord(notGetRecord._id, item.id, `${item.gid}&${item.count}`); let goods = await addItems(roleId, roleName, sid, [{ id: item.gid, count: item.count }], ITEM_CHANGE_REASON.RECHARGE_REWARD) - item.setHasGet(true); - return resResult(STATUS.SUCCESS, { param: { activityId }, - item: item + item: item, + ticketCnt: playerData.ticketCnt, }); } } diff --git a/game-server/app/servers/battle/handler/dailyBattleHandler.ts b/game-server/app/servers/battle/handler/dailyBattleHandler.ts index 03beed116..824feee30 100644 --- a/game-server/app/servers/battle/handler/dailyBattleHandler.ts +++ b/game-server/app/servers/battle/handler/dailyBattleHandler.ts @@ -36,13 +36,10 @@ export class DailyBattleHandler { const curDaily = gameData.daily.find(cur => cur.dailyType == type); if(!curDaily) return resResult(STATUS.DAILY_TYPE_NOT_FOUND); - let { timesPerDay, timesCanBuy } = curDaily; + let { buyCount = 0 } = await DailyRecordModel.refreshRecord(roleId, type); - let { vLv } = await RoleModel.findByRoleId(roleId); - if(vLv > 0) { - timesCanBuy += 0; // 暂留,用于处理vip等级增加最大购买次数 - } - if(buyCount + count > timesCanBuy ) { + + if(buyCount + count > curDaily.timesCanBuy ) { return resResult(STATUS.DAILY_REFRESH_TIMES_LACK) } let buyCost = 0; @@ -50,15 +47,15 @@ export class DailyBattleHandler { let num = buyCount + i; buyCost += getDailyBuyCountCost(num); } - let {gold} = await RoleModel.findByRoleId(roleId); - if(buyCost > gold) { + let role = await RoleModel.findByRoleId(roleId); + if(buyCost > role.gold) { return resResult(STATUS.DAILY_REFRESH_GOLD_LACK); } await handleCost(roleId, sid, [getGoldObject(buyCost)], ITEM_CHANGE_REASON.DAILY_BATTLE_BUY_CNT); let newDailyRecord = await DailyRecordModel.increseBuyCount(roleId, type, count); - let checkDailyResult = await getDailyNum(newDailyRecord, timesPerDay, timesCanBuy); + let checkDailyResult = await getDailyNum(newDailyRecord, role); return resResult(STATUS.SUCCESS, { type, ...checkDailyResult, buyCost}); } diff --git a/game-server/app/servers/battle/handler/dungeonBattleHandler.ts b/game-server/app/servers/battle/handler/dungeonBattleHandler.ts index bbc610a2e..857bb0aa5 100644 --- a/game-server/app/servers/battle/handler/dungeonBattleHandler.ts +++ b/game-server/app/servers/battle/handler/dungeonBattleHandler.ts @@ -9,6 +9,7 @@ import * as dicParam from '../../../pubUtils/dicParam'; import { DungeonFirstModel } from '../../../db/DungeonFirst'; import { DungeonResultParam } from '../../../domain/battleField/dungeon'; import { DEBUG_MAGIC_WORD, ITEM_CHANGE_REASON } from '../../../consts'; +import { getVipDungeonCnt } from '../../../services/activity/monthlyTicketService'; export default function(app: Application) { return new DungeonBattleHandler(app); @@ -41,10 +42,6 @@ export class DungeonBattleHandler { } let timesCanBuy = dicParam.DUNGEON_CONST.DUNGEON_CONST_BUY; - let { vLv } = await RoleModel.findByRoleId(roleId); - if(vLv > 0) { - timesCanBuy += 0; // 暂留,用于处理vip等级增加最大购买次数 - } if(dungeonBuyCnt + count > timesCanBuy ) { return resResult(STATUS.DUNGEON_REFRESH_TIMES_LACK) } @@ -60,10 +57,11 @@ export class DungeonBattleHandler { await RoleModel.buyCnt(roleId, needRefresh, count, curTime); let nextCostGold = getDungeonBuyCountCost(dungeonBuyCnt + count + 1); + let freeCount = getVipDungeonCnt(session.get('vipStartTime')); return resResult(STATUS.SUCCESS, { costGold: buyCost, nextCostGold, - battleCount: dicParam.DUNGEON_CONST.DUNGEON_CONST_FREE + dungeonBuyCnt + count - dungeonCnt, + battleCount: freeCount + dungeonBuyCnt + count - dungeonCnt, buyCount: dicParam.DUNGEON_CONST.DUNGEON_CONST_BUY - dungeonBuyCnt - count }); } diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index db588c905..6b13454fe 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -52,7 +52,7 @@ export class PvpHandler { let update: pvpUpdateInter = { }; let result = new PvpDataReturn(); // 返回对象 // 刷新次数 - let refChallengeObj = refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime); + let refChallengeObj = await refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime, roleId, session.get('vipStartTime')); if(refChallengeObj.hasChanged) { update = { ...update, ...refChallengeObj } } @@ -161,7 +161,7 @@ export class PvpHandler { // 检查挑战次数 let seasonNum: number = this.app.get('pvpSeasonNum'); let seasonEndTime: number = this.app.get('pvpSeasonEndTime'); - let { challengeCnt, challengeRefTime } = refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime); + let { challengeCnt, challengeRefTime } = await refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime, session.get('vipStartTime')); if (challengeCnt == 0) { return resResult(STATUS.PVP_CHALLENGE_TIMES_NOT_ENOUGH); } @@ -194,7 +194,7 @@ export class PvpHandler { update.oppPlayers = oppPlayers; // 减少挑战次数 - let refChallengeObj = refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime); + let refChallengeObj = await refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime, roleId, session.get('vipStartTime')); refChallengeObj.challengeCnt--; update = {...update, ...refChallengeObj}; @@ -363,7 +363,7 @@ export class PvpHandler { let seasonNum: number = this.app.get('pvpSeasonNum'); let seasonEndTime: number = this.app.get('pvpSeasonEndTime'); - let refChallengeObj = refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime); + let refChallengeObj = await refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime, roleId, session.get('vipStartTime')); // 更新挑战阵容 let scores: number[] = []; for(let { actorId } of heroes) { @@ -400,7 +400,7 @@ export class PvpHandler { if(!pvpDefense) return resResult(STATUS.PVP_NOT_OPEN); // 刷新次数 let seasonEndTime: number = this.app.get('pvpSeasonEndTime'); - let refChallengeObj = refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime); + let refChallengeObj = await refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime, roleId, session.get('vipStartTime')); // 更新防守阵容 let scores: number[] = [], heroIdMap = new Map(), hids: number[] = []; for(let { actorId } of heroes) { @@ -532,7 +532,7 @@ export class PvpHandler { return resResult(STATUS.PVP_BOX_IS_GOT); } receivedBox.push(id); - let { challengeCnt, challengeRefTime } = refChallengeCnt(lastChallengeCnt, lastChallengeRefTime, seasonEndTime); + let { challengeCnt, challengeRefTime } = await refChallengeCnt(lastChallengeCnt, lastChallengeRefTime, seasonEndTime, roleId, session.get('vipStartTime')); await PvpDefenseModel.updateInfo(roleId, { receivedBox, challengeCnt, challengeRefTime }); let result = await addItems(roleId, roleName, sid, pvpBox.reward, ITEM_CHANGE_REASON.PVP_BOX_REWARD); // 任务 diff --git a/game-server/app/servers/battle/handler/towerBattleHandler.ts b/game-server/app/servers/battle/handler/towerBattleHandler.ts index 2168ca907..be476fa47 100644 --- a/game-server/app/servers/battle/handler/towerBattleHandler.ts +++ b/game-server/app/servers/battle/handler/towerBattleHandler.ts @@ -6,13 +6,14 @@ import { HangUpRecordModel } from './../../../db/HangUpRecord'; import { RoleModel } from './../../../db/Role'; import { TowerRecordModel } from './../../../db/TowerRecord'; import { Application, BackendSession } from 'pinus'; -import { resResult, genCode } from '../../../pubUtils/util'; -import { calcuHangUpReward, checkHangUpSpdUpCnt, refreshTasks, treatTask, getRemainTime, getTowerStatus, getHungupRewards, getTasks, checkTaskRewards, getTowerTaskCostGold, getHangSpdUpCostGold, getManyHangSpdUpCostGold, getTaskStatus } from '../../../services/battleService'; +import { resResult, genCode, shouldRefresh } from '../../../pubUtils/util'; +import { calcuHangUpReward, refreshTasks, treatTask, getRemainTime, getTowerStatus, getHungupRewards, getTasks, checkTaskRewards, getTowerTaskCostGold, getHangSpdUpCostGold, getManyHangSpdUpCostGold, getTaskStatus } from '../../../services/battleService'; import { addItems, handleCost } from '../../../services/rewardService'; import { checkBattleHeroes } from '../../../services/normalBattleService'; import { getGoldObject } from '../../../pubUtils/itemUtils'; import { gameData } from '../../../pubUtils/data'; import * as dicParam from '../../../pubUtils/dicParam'; +import { isNumber } from 'underscore'; export default function(app: Application) { return new TowerBattleHandler(app); @@ -56,21 +57,23 @@ export class TowerBattleHandler { async checkHangUpRewards(msg: {}, session: BackendSession) { let roleId = session.get('roleId'); let result = await getHungupRewards(roleId); - if(result.status == -1) { - return result.resResult; + if(!result) { + return resResult(STATUS.TOWER_HANG_UP_NOT_START); } - return resResult(STATUS.SUCCESS, result.data); + return resResult(STATUS.SUCCESS, result); } async recHangUpRewards(msg: {}, session: BackendSession) { let roleId = session.get('roleId'); let roleName = session.get('roleName'); let sid = session.get('sid'); - const result = await calcuHangUpReward(roleId); - if(result.status == -1) { - return result.resResult + + let role = await RoleModel.findByRoleId(roleId); + const result = await calcuHangUpReward(role); + if(!result) { + return resResult(STATUS.TOWER_HANG_UP_NOT_START); } - let { timeReward, endLv, endTime, deltaTime, needReceiveGoods } = result.data; + let { timeReward, endLv, endTime, deltaTime, needReceiveGoods } = result; const goods = await addItems(roleId, roleName, sid, timeReward, ITEM_CHANGE_REASON.TOWER_HUNG_UP_REWARD); await HangUpRecordModel.updateRec(roleId, roleName, endLv, endTime, needReceiveGoods); @@ -82,19 +85,27 @@ export class TowerBattleHandler { let roleId = session.get('roleId'); let roleName = session.get('roleName'); let sid = session.get('sid'); - if (msg.speedUpCnt <= 0) { + let { speedUpCnt } = msg; + + if (!isNumber(speedUpCnt) || speedUpCnt <= 0) { return resResult(STATUS.WRONG_PARMS); } const curTime = new Date(); - const calResult = await calcuHangUpReward(roleId, true, msg.speedUpCnt, curTime); - if(calResult.status == -1) { - return calResult.resResult; - } - let { timeReward, endLv, deltaTime, needReceiveGoods } = calResult.data; - let result = await checkHangUpSpdUpCnt(roleId, msg.speedUpCnt, curTime); - if(result.status == -1) return result.resResult; - let {data: {hangUpSpdUpCnt, gold}} = result; + let role = await RoleModel.findByRoleId(roleId); + let { hangUpSpdUpCnt, gold, lastSpdUpTime } = role; + if (shouldRefresh(lastSpdUpTime, curTime)) { + hangUpSpdUpCnt = 0; + } + if (speedUpCnt + hangUpSpdUpCnt > dicParam.TOWER_BOOST.TOWER_BOOSTTIME) { + return resResult(STATUS.TOWER_NOT_ENOUGH_HANG_UP_TIME) + } + + const calResult = await calcuHangUpReward(role, true, msg.speedUpCnt, curTime); + if(!calResult) { + return resResult(STATUS.TOWER_HANG_UP_FAILED); + } + let { timeReward, endLv, deltaTime, needReceiveGoods } = calResult; const costGold = getManyHangSpdUpCostGold(hangUpSpdUpCnt, msg.speedUpCnt); if(costGold > gold) { diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index b34b4c6d6..02757caf3 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -130,10 +130,7 @@ export class EntryHandler { await session.abind(role.roleId); session.set('userid', role.userInfo.uid); - session.set('uid', role.roleId); session.set('roleId', role.roleId); - let updatedMailAt = role.updatedMailAt ? role.updatedMailAt : 0; - session.set('updatedMailAt', updatedMailAt); session.set('loginTime', nowSeconds()); session.set('roleName', role.roleName); session.set('eventStatus', role.eventStatus); @@ -142,17 +139,18 @@ export class EntryHandler { session.set('serverId', role.serverId); session.set('guildCode', role.guildCode); session.set('ip', ip); + session.set('vipStartTime', role.vipStartTime||0); session.push('userid', () => { }); session.push('sid', () => { }); session.push('roleId', () => { }); session.push('roleName', () => { }); session.push('eventStatus', () => { }); session.push('serverId', () => { }); - session.push('updatedMailAt', () => { }); session.push('loginTime', () => { }); session.push('guildCode', () => { }); session.push('blockType', () => { }); session.push('ip', () => { }); + session.push('vipStartTime', () => { }); // console.log(role.guildCode) // session.push('rid', function (err) { // if (err) { diff --git a/game-server/app/servers/guild/handler/donateHandler.ts b/game-server/app/servers/guild/handler/donateHandler.ts index 39652e124..bcd6f4d0e 100644 --- a/game-server/app/servers/guild/handler/donateHandler.ts +++ b/game-server/app/servers/guild/handler/donateHandler.ts @@ -15,6 +15,7 @@ import { addActive } from '../../../services/guildService' import { checkActivityTask, checkTask } from '../../../services/taskService'; import { guildInter } from '../../../pubUtils/interface'; import { lockData } from '../../../services/redLockService'; +import { getVipDonateConsume } from '../../../services/activity/monthlyTicketService'; export default function (app: Application) { new HandlerService(app, {}); @@ -84,7 +85,8 @@ export class DonationHandler { let { donationLv } = await getDonation(code, guild, serverId); let { donateReward } = getArmyDonateBaseByLv(donationLv); let { rewardGood, rewardFund, cosume } = donateReward.get(id); - let result = await handleCost(roleId, sid, [cosume], ITEM_CHANGE_REASON.DONATE); + let consumeResult = getVipDonateConsume(cosume, session.get('vipStartTime')); + let result = await handleCost(roleId, sid, consumeResult, ITEM_CHANGE_REASON.DONATE); if (!result) { res.releaseCallback(); return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); diff --git a/game-server/app/services/activity/monthlyTicketService.ts b/game-server/app/services/activity/monthlyTicketService.ts index e536ca03b..fe6ec7318 100644 --- a/game-server/app/services/activity/monthlyTicketService.ts +++ b/game-server/app/services/activity/monthlyTicketService.ts @@ -1,4 +1,4 @@ -import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, MAIL_TYPE, STATUS } from '../../consts'; +import { ACTIVITY_TYPE, HANG_UP_CONSTS, ITEM_CHANGE_REASON, MAIL_TYPE, STATUS } from '../../consts'; import { ActivityModel, ActivityModelType } from '../../db/Activity'; import { ActivityMonthlyTicketModel, ActivityMonthlyTicketModelType } from '../../db/ActivityMonthlyTicket'; import { RewardParam } from '../../domain/activityField/rewardField'; @@ -7,8 +7,12 @@ import { addReward, stringToRewardInter, stringToRewardParam } from './giftPacka import moment = require('moment'); import { ServerlistModel } from '../../db/Serverlist'; import { sendMailByContent } from './../mailService'; -import { RoleModel } from '../../db/Role'; +import { RoleModel, RoleType } from '../../db/Role'; import { getActivityById } from './activityService'; +import { RewardInter } from '../../pubUtils/interface'; +import { getGoldId } from '../../pubUtils/itemUtils'; +import { DUNGEON_CONST, PVP, VIP } from '../../pubUtils/dicParam'; +import { cal } from '../../pubUtils/util'; /** * 获取活动数据 @@ -115,10 +119,10 @@ export async function makeMonthlyTicketReward(roleId: string, roleName: string, let { createTime } = await RoleModel.findByRoleId(roleId); let playerData = new MonthlyTicketData(activityData, createTime); - let endTime = moment(new Date()).startOf('d').add(playerData.days, 'day').toDate(); + let endTime = playerData.isForever? moment(new Date()).startOf('d').add(playerData.days, 'day').toDate(): null; console.log('endTime', moment(new Date()).startOf('d'), endTime, playerData.days) - await ActivityMonthlyTicketModel.buyMonthlyTicket(serverId, roleId, activityId, activityData.type, endTime) - + await ActivityMonthlyTicketModel.buyMonthlyTicket(serverId, roleId, activityId, activityData.type, endTime, playerData.isForever) + await RoleModel.buyForeverTicket(roleId); let firstReward = playerData.firstReward; let rewardParamArr: Array = stringToRewardParam(firstReward); let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.MONTHLY_TICKET_FIRST) @@ -127,3 +131,75 @@ export async function makeMonthlyTicketReward(roleId: string, roleName: string, data: Object.assign(result, { item: { isOpen: true, todayIndex: 1 }, activityId: activityData.activityId }) } } + +// 月卡权限 + +// 军团捐献消耗 +export function getVipDonateConsume(originConsume: RewardInter, vipStartTime: number) { + if(vipStartTime > 0) { + if(originConsume.id == getGoldId()) { + return [{ id: originConsume.id, count: Math.floor(originConsume.count * VIP.VIP_GUILD_DONATE_COST_GOLD_RATIO) }]; + } else { + return [originConsume]; + } + } else { + return [originConsume]; + } +} + +export function getVipHungupReward(startTime: number, endTime: number, baseReward: RewardInter[], notReceivedGoods: {gid: number, count: number}[], vipStartTime: number) { + let multi = Math.floor((endTime - startTime) / HANG_UP_CONSTS.UNIT_TIME); + if(vipStartTime > 0) { + if(vipStartTime > startTime) { // 开始挂机之后买的月卡 + let isNotVipNum = Math.floor((vipStartTime - startTime) / HANG_UP_CONSTS.UNIT_TIME); // 不是vip的时间段数 + let isVipNum = multi - isNotVipNum; // 是vip的时间段数 + multi = cal.add(isNotVipNum, cal.mul(isVipNum, VIP.VIP_TOWER_HUNG_UP_RATIO)); + } else { + multi = cal.mul(multi, VIP.VIP_TOWER_HUNG_UP_RATIO); + } + } + + let needReceiveGoods: {gid: number, count: number}[] = [];// 由于小数,未能领取的奖励 + let timeReward: {id: number, count: number}[] = []; // 本次奖励 + for (let { id, count } of baseReward) { + let newCount = cal.mul(count, multi); + let oldGoods = notReceivedGoods.find(cur => cur.gid == id); + if (oldGoods) newCount = cal.add(newCount, oldGoods.count); + let roundCount = Math.floor(newCount); + if (newCount > roundCount) { + needReceiveGoods.push({ gid: id, count: cal.sub(newCount, roundCount) }); + } + if (roundCount > 0) { + timeReward.push({ id, count: roundCount }) + } + } + return { needReceiveGoods, timeReward } +} + +export async function getVipPvpChallengeMaxCnt(roleId: string, vipStartTime?: number) { + if(vipStartTime == undefined) { + let role = await RoleModel.findByRoleId(roleId, 'vipStartTime'); + vipStartTime = role.vipStartTime; + } + let count = PVP.PVP_CHALLENGE_COUNTS; + if(vipStartTime > 0) { + count += VIP.VIP_PVP_CHALLENGE_COUNTS_ADD; + } + return count; +} + +export function getVipDailyCnt(timesPerDay: number, role: RoleType) { + let vipStartTime = role.vipStartTime; + if(vipStartTime > 0) { + timesPerDay += VIP.VIP_DAILY_TIMERS_PER_DAY_ADD; + } + return timesPerDay +} + +export function getVipDungeonCnt(vipStartTime: number) { + let count = DUNGEON_CONST.DUNGEON_CONST_FREE; + if(vipStartTime > 0) { + count += VIP.VIP_DUNGEON_CONST_FREE_ADD; + } + return count +} \ No newline at end of file diff --git a/game-server/app/services/battleService.ts b/game-server/app/services/battleService.ts index 6097b81ba..e69907f9b 100644 --- a/game-server/app/services/battleService.ts +++ b/game-server/app/services/battleService.ts @@ -17,6 +17,7 @@ import { ComRoleStatusHero } from '../db/ComBattleTeam'; import { sendMailByContent } from './mailService'; import { DicTowerTask } from '../pubUtils/dictionary/DicTowerTask'; import * as dicParam from '../pubUtils/dicParam'; +import { getVipHungupReward } from './activity/monthlyTicketService'; /** * 获取当前镇念塔状态 @@ -53,26 +54,20 @@ export async function getTowerStatus(role: RoleType) { * 获取镇念塔挂机收益 * @param roleId */ -export async function getHungupRewards(roleId: string) { - const result = await calcuHangUpReward(roleId); - if(result.status == -1) { - return result; - } - let {timeReward, startTime, deltaTime} = result.data; - let {hangUpSpdUpCnt = 0, lastSpdUpTime} = await RoleModel.findByRoleId(roleId); +export async function getHungupRewards(roleId: string, role?: RoleType) { + if(!role) role = await RoleModel.findByRoleId(roleId); + const result = await calcuHangUpReward(role); + if(!result) return false; + + let { hangUpSpdUpCnt = 0, lastSpdUpTime } = role; + let {timeReward, startTime, deltaTime} = result; let curTime = new Date(); if (shouldRefresh(lastSpdUpTime, curTime)) { hangUpSpdUpCnt = 0; } let nextCostGold = getManyHangSpdUpCostGold(hangUpSpdUpCnt, 1); - return { - status: 0, - resResult: null, - data: { - startTime, hangUpPassTime: Math.floor(deltaTime/1000), hangUpSpdUpCnt: dicParam.TOWER_BOOST.TOWER_BOOSTTIME - hangUpSpdUpCnt, nextCostGold, rewards: timeReward - } - } + return { startTime, hangUpPassTime: Math.floor(deltaTime/1000), hangUpSpdUpCnt: dicParam.TOWER_BOOST.TOWER_BOOSTTIME - hangUpSpdUpCnt, nextCostGold, rewards: timeReward } } /** @@ -265,43 +260,21 @@ async function startHangUp(roleId: string, roleName: string) { await HangUpRecordModel.initRecord(roleId, roleName); } -export async function checkHangUpSpdUpCnt(roleId: string, cnt: number, curTime: Date) { - const role = await RoleModel.findByRoleId(roleId); - let { hangUpSpdUpCnt, gold, lastSpdUpTime } = role; - if (shouldRefresh(lastSpdUpTime, curTime)) { - hangUpSpdUpCnt = 0; - } - if (cnt + hangUpSpdUpCnt > dicParam.TOWER_BOOST.TOWER_BOOSTTIME) { - return { status: -1, resResult: resResult(STATUS.TOWER_NOT_ENOUGH_HANG_UP_TIME) } - } - return { status: 0, data: { hangUpSpdUpCnt, gold, lastSpdUpTime } } -} - -export async function calcuHangUpReward(roleId: string, speedUp = false, speedUpCnt = 1, curTime = new Date()) { - let { towerLv = 1, hangUpSpdUpCnt = 0, lastSpdUpTime } = await RoleModel.findByRoleId(roleId); +export async function calcuHangUpReward(role: RoleType, speedUp = false, speedUpCnt = 1, curTime = new Date()) { + let { roleId, towerLv = 1, hangUpSpdUpCnt = 0, lastSpdUpTime, vipStartTime } = role; if (towerLv - 1 < dicParam.TOWER_HANG_UP.TOWER_HANG_UP_ENABLE_LV) { - return { status: -1, resResult: resResult(STATUS.TOWER_HANG_UP_NOT_START) } + return false } let towerInfo = gameData.tower.get(towerLv - 1); // towerLv 是当前层,奖励计算按照已经通过的层,即上一层 - let timeReward = []; // 奖励 - let needReceiveGoods = []; // 由于小数,未能领取的奖励 let baseReward = towerInfo.rewardOfcollect; - let { startTime } = await HangUpRecordModel.getCurRec(roleId); - let endTime = curTime; // 挂机结束时间,现在到开始时间,经历了10的倍数的时间 - let deltaTime = curTime.getTime() - startTime.getTime(); // 累计的挂机时间,受最大时间限制 - if (deltaTime > HANG_UP_CONSTS.MAX_TIME) { - deltaTime = HANG_UP_CONSTS.MAX_TIME; - endTime = curTime; // 累积到超过24小时,那么结束时间和下一次开启时间就取整了 - } else { - let multiReal = Math.floor(deltaTime / HANG_UP_CONSTS.UNIT_TIME);// 距开始挂机实际过去的时间单位 - endTime = new Date(startTime.getTime() + multiReal * HANG_UP_CONSTS.UNIT_TIME) - } - if (speedUp) { // 加速,直接收取6小时收益,小数的累积和普通收取独立 if (hangUpSpdUpCnt + speedUpCnt <= dicParam.TOWER_BOOST.TOWER_BOOSTTIME || !lastSpdUpTime || shouldRefresh(lastSpdUpTime, new Date)) { // 可加速 - let multi = Math.floor(HANG_UP_CONSTS.SPD_UP_REC_TIME / HANG_UP_CONSTS.UNIT_TIME); + let startTime = curTime; + let endTime = new Date(curTime.getTime() + HANG_UP_CONSTS.SPD_UP_REC_TIME); + let deltaTime = endTime.getTime() - startTime.getTime(); // 累计的挂机时间,受最大时间限制 + let spdUpRec = await HangUpSpdUpRecModel.getSpdUpRec(roleId, towerLv - 1); let goods = []; if (spdUpRec) { @@ -309,50 +282,37 @@ export async function calcuHangUpReward(roleId: string, speedUp = false, speedUp let notReceivedGoods = notReceivedGoodsList.find(cur => cur.cnt == cnt); goods = notReceivedGoods ? notReceivedGoods.goods : []; } - for (let { id, count } of baseReward) { - let newCount = cal.mul(count, multi); - let oldGoods = goods.find(cur => cur.gid == id); - if (oldGoods) newCount = cal.add(newCount, oldGoods.count); - let roundCount = Math.floor(newCount); - if (newCount > roundCount) { - needReceiveGoods.push({ gid: id, count: cal.sub(newCount, roundCount) }); - } - if (roundCount > 0) { - timeReward.push({ id, count: roundCount }) - } - } + + let { timeReward, needReceiveGoods } = getVipHungupReward(startTime.getTime(), endTime.getTime(), baseReward, goods, vipStartTime); + + return { + endLv: towerLv, startTime, deltaTime, endTime, timeReward, needReceiveGoods + }; + } else { + return false } } else { + let { startTime } = await HangUpRecordModel.getCurRec(roleId); + let endTime = curTime; // 挂机结束时间,现在到开始时间,经历了10的倍数的时间 + let deltaTime = curTime.getTime() - startTime.getTime(); // 累计的挂机时间,受最大时间限制 + if (deltaTime > HANG_UP_CONSTS.MAX_TIME) { + deltaTime = HANG_UP_CONSTS.MAX_TIME; + startTime = new Date(curTime.getTime() - deltaTime); + endTime = curTime; // 累积到超过24小时,那么结束时间和下一次开启时间就取整了 + } else { + let multiReal = Math.floor(deltaTime / HANG_UP_CONSTS.UNIT_TIME);// 距开始挂机实际过去的时间单位 + endTime = new Date(startTime.getTime() + multiReal * HANG_UP_CONSTS.UNIT_TIME) + } + let lastRec = await HangUpRecordModel.getLastRec(roleId); let notReceivedGoods = lastRec ? lastRec.notReceivedGoods : []; - let multi = Math.floor(deltaTime / HANG_UP_CONSTS.UNIT_TIME); // 结算奖励的倍数,受最大时间限制 + let { timeReward, needReceiveGoods } = getVipHungupReward(startTime.getTime(), endTime.getTime(), baseReward, notReceivedGoods, vipStartTime); - // console.log(deltaTime, multi, baseReward); - for (let { id, count } of baseReward) { - let newCount = cal.mul(count, multi); - let oldGoods = notReceivedGoods.find(cur => cur.gid == id); - if (oldGoods) newCount = cal.add(newCount, oldGoods.count); - let roundCount = Math.floor(newCount); - if (newCount > roundCount) { - needReceiveGoods.push({ gid: id, count: cal.sub(newCount, roundCount) }); - } - if (roundCount > 0) { - timeReward.push({ id, count: roundCount }) - } - } + return { + endLv: towerLv, startTime, deltaTime, endTime, timeReward, needReceiveGoods + }; } - return { - status: 0, - data: { - endLv: towerLv - 1, - startTime, - deltaTime, - endTime, - timeReward, - needReceiveGoods - } - }; } function checkCond(heroes: TaskHero[], type: number, param: number, cnt: number) { diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index ad0f6c833..9718bc96d 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -187,10 +187,10 @@ async function getTowerEntryData(role: RoleType) { const status = await getTowerStatus(role); const hungUp = await getHungupRewards(roleId); const tasks = await getTasks(role); - if (hungUp.status == -1) { + if (!hungUp) { return { status, hungUp: {}, tasks } } else { - return { status, hungUp: hungUp.data, tasks } + return { status, hungUp: hungUp, tasks } } } @@ -202,7 +202,7 @@ async function getPvpEntryData(roleId: string) { let pvpDefense = await PvpDefenseModel.findByRoleId(roleId); if (pvpDefense) { let seasonEndTime = pinus.app.get('pvpSeasonEndTime'); - let refChallengeObj = refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime); + let refChallengeObj = await refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime, roleId); let { challengeCnt } = refChallengeObj; let { receivedBox, score, hisScore } = pvpDefense; diff --git a/game-server/app/services/dailyBattleService.ts b/game-server/app/services/dailyBattleService.ts index ad848b8c2..8f34526de 100644 --- a/game-server/app/services/dailyBattleService.ts +++ b/game-server/app/services/dailyBattleService.ts @@ -11,6 +11,7 @@ import { DicWar } from '../pubUtils/dictionary/DicWar'; import { WarStar } from '../domain/dbGeneral'; import * as dicParam from '../pubUtils/dicParam'; import { calculateWarStar } from './normalBattleService'; +import { getVipDailyCnt } from './activity/monthlyTicketService'; /** * 获取全部每日关卡列表 @@ -29,7 +30,7 @@ export async function getDailyBattleList(role: RoleType) { let war = getDailyWarStatus(dic, warStar); wars.push(war); } - let checkDailyResult = await getDailyNum(refreshResult, timesPerDay, timesCanBuy); + let checkDailyResult = await getDailyNum(refreshResult, role); result.push({ type, name, ...checkDailyResult, wars @@ -75,7 +76,7 @@ export async function checkDaily(roleId: string, battleId: number, inc: number) if(count + inc > curDaily.timesPerDay + buyCount ) { return { status: -1, resResult: resResult(STATUS.DAILY_TIMES_LACK) } } - let checkDailyResult = await getDailyNum(dailyRecord, curDaily.timesPerDay, curDaily.timesCanBuy); + let checkDailyResult = await getDailyNum(dailyRecord); return {status: 1, data: {type, ...checkDailyResult }}; } @@ -109,21 +110,20 @@ export async function checkDailyAndIncrease(roleId: string, warStar: WarStar[], return { status: -1, resResult: resResult(STATUS.DAILY_TIMES_LACK) } } let result = await DailyRecordModel.increseDailyCount(roleId, type, inc); - let checkDailyResult = await getDailyNum(result, curDaily.timesPerDay, curDaily.timesCanBuy); + let checkDailyResult = await getDailyNum(result); return {status: 1, data: {type, ...checkDailyResult, war}}; } -export async function getDailyNum(dailyRecord: DailyRecord, timesPerDay?: number, timesCanBuy?: number) { +export async function getDailyNum(dailyRecord: DailyRecord, role?: RoleType) { let {roleId, type, count = 0, buyCount = 0} = dailyRecord; - if(!timesPerDay || !timesCanBuy) { - const curDaily = gameData.daily.find(cur => cur.dailyType == type); - timesPerDay = curDaily.timesPerDay; - timesCanBuy = curDaily.timesCanBuy; - } - let {vLv} = await RoleModel.findByRoleId(roleId); - if(vLv > 0) { - timesCanBuy += 0; // 暂留,用于处理vip等级增加最大购买次数 + const curDaily = gameData.daily.find(cur => cur.dailyType == type); + let {timesPerDay, timesCanBuy} = curDaily; + + if(!role) { + role = await RoleModel.findByRoleId(roleId, 'vipStartTime'); } + timesPerDay = getVipDailyCnt(timesPerDay, role); + return {count: timesPerDay - count + buyCount, buyCount: timesCanBuy - buyCount} } diff --git a/game-server/app/services/dungeonService.ts b/game-server/app/services/dungeonService.ts index dba8a0132..cb3db4088 100644 --- a/game-server/app/services/dungeonService.ts +++ b/game-server/app/services/dungeonService.ts @@ -11,6 +11,7 @@ import { BattleRecordType } from '../db/BattleRecord'; import { gameData } from '../pubUtils/data'; import { DungeonFirstModel } from '../db/DungeonFirst'; import { nowSeconds } from '../pubUtils/timeUtil'; +import { getVipDungeonCnt } from './activity/monthlyTicketService'; /** * 获取秘境本数据 @@ -24,29 +25,31 @@ export async function getDungeonData(role: RoleType) { } let nextCostGold = getDungeonBuyCountCost(dungeonBuyCnt + 1); + let freeCount = getVipDungeonCnt(role.vipStartTime); return { nextCostGold, dungeonHeroes, - battleCount: dicParam.DUNGEON_CONST.DUNGEON_CONST_FREE + dungeonBuyCnt - dungeonCnt, + battleCount: freeCount + dungeonBuyCnt - dungeonCnt, buyCount: dicParam.DUNGEON_CONST.DUNGEON_CONST_BUY - dungeonBuyCnt } } // 检查秘境本次数checkBattle使用 export async function checkDungeonNum(roleId: string, inc: number) { - let { dungeonCnt = 0, dungeonBuyCnt = 0, dungeonRefTime } = await RoleModel.findByRoleId(roleId); + let { dungeonCnt = 0, dungeonBuyCnt = 0, dungeonRefTime, vipStartTime } = await RoleModel.findByRoleId(roleId); let curTime = new Date(); let needRefresh = shouldRefresh(dungeonRefTime, curTime); if(needRefresh) { dungeonCnt = 0; dungeonBuyCnt = 0; } - if(dungeonCnt + inc > dicParam.DUNGEON_CONST.DUNGEON_CONST_FREE + dungeonBuyCnt) { + let freeCount = getVipDungeonCnt(vipStartTime); + if(dungeonCnt + inc > freeCount + dungeonBuyCnt) { return {status: -1, resResult: resResult(STATUS.DUNGEON_TIMES_LACK)} } await RoleModel.increaseDungeonCnt(roleId, needRefresh, 0, curTime); return { status: 0, data: { - battleCount: dicParam.DUNGEON_CONST.DUNGEON_CONST_FREE + dungeonBuyCnt - dungeonCnt, + battleCount: freeCount + dungeonBuyCnt - dungeonCnt, buyCount: dicParam.DUNGEON_CONST.DUNGEON_CONST_BUY - dungeonBuyCnt }}; } @@ -60,21 +63,22 @@ export async function checkDungeonNum(roleId: string, inc: number) { export async function checkDungeonAndIncrease(roleId: string, inc: number, isRef: boolean) { - let { dungeonCnt = 0, dungeonBuyCnt = 0, dungeonRefTime } = await RoleModel.findByRoleId(roleId); + let { dungeonCnt = 0, dungeonBuyCnt = 0, dungeonRefTime, vipStartTime } = await RoleModel.findByRoleId(roleId); let curTime = new Date(); let needRefresh = isRef && shouldRefresh(dungeonRefTime, curTime); if(needRefresh) { dungeonCnt = 0; dungeonBuyCnt = 0; } + let freeCount = getVipDungeonCnt(vipStartTime); - if(dungeonCnt + inc > dicParam.DUNGEON_CONST.DUNGEON_CONST_FREE + dungeonBuyCnt ) { + if(dungeonCnt + inc > freeCount + dungeonBuyCnt ) { return { status: -1, resResult: resResult(STATUS.DUNGEON_TIMES_LACK) } } // console.log('needRefresh', needRefresh); await RoleModel.increaseDungeonCnt(roleId, needRefresh, inc, curTime); return {status: 1, data: { - battleCount: dicParam.DUNGEON_CONST.DUNGEON_CONST_FREE + dungeonBuyCnt - dungeonCnt - inc, + battleCount: freeCount + dungeonBuyCnt - dungeonCnt - inc, buyCount: dicParam.DUNGEON_CONST.DUNGEON_CONST_BUY - dungeonBuyCnt }}; } diff --git a/game-server/app/services/pvpService.ts b/game-server/app/services/pvpService.ts index 3364c0517..babda80da 100644 --- a/game-server/app/services/pvpService.ts +++ b/game-server/app/services/pvpService.ts @@ -26,6 +26,7 @@ import { checkTask } from '../services/taskService'; import { sendMailByContent } from './mailService'; import { RoleRankInfo } from '../domain/rank'; import { reportTAEvent } from './sdkService'; +import { getVipPvpChallengeMaxCnt } from './activity/monthlyTicketService'; /** * 返回对手三人信息 @@ -296,9 +297,10 @@ export function getLvByScore(heroScores: HeroScore[]) { return getPLvByScore(score); } -export function refChallengeCnt(challengeCnt: number, challengeRefTime: number, seasonEndTime: number) { +export async function refChallengeCnt(challengeCnt: number, challengeRefTime: number, seasonEndTime: number, roleId: string, vipStartTime?: number) { let hasChanged = false; - if (challengeCnt >= PVP.PVP_CHALLENGE_COUNTS) { + let initCount = await getVipPvpChallengeMaxCnt(roleId, vipStartTime) + if (challengeCnt >= initCount) { return { hasChanged, challengeCnt, challengeRefTime: nowSeconds() }; } let period = PVP.PVP_CHALLENGE_NORMALTIMES * 60; @@ -312,20 +314,22 @@ export function refChallengeCnt(challengeCnt: number, challengeRefTime: number, challengeRefTime = challengeRefTime + period * num; hasChanged = true; } - challengeCnt = challengeCnt > PVP.PVP_CHALLENGE_COUNTS ? PVP.PVP_CHALLENGE_COUNTS : challengeCnt; + challengeCnt = challengeCnt > initCount ? initCount : challengeCnt; return { hasChanged, challengeCnt, challengeRefTime }; } -export function comsumeChallengeCnt(challengeCnt: number, challengeRefTime: number, seasonEndTime: number) { +export async function comsumeChallengeCnt(challengeCnt: number, challengeRefTime: number, seasonEndTime: number, roleId: string) { + let initCount = await getVipPvpChallengeMaxCnt(roleId) + challengeCnt--; - if (challengeCnt >= PVP.PVP_CHALLENGE_COUNTS) { + if (challengeCnt >= initCount) { return { challengeCnt, challengeRefTime }; } - if (challengeCnt == PVP.PVP_CHALLENGE_COUNTS - 1) { + if (challengeCnt == initCount - 1) { challengeRefTime = nowSeconds(); return { challengeCnt, challengeRefTime }; } - return refChallengeCnt(challengeCnt, challengeRefTime, seasonEndTime); + return refChallengeCnt(challengeCnt, challengeRefTime, seasonEndTime, roleId); } export async function sendLastSeasonRewardIfNotSent(pvpDefense: PvpDefenseType) { @@ -569,13 +573,14 @@ export async function sendPVPRewardToUser(pvpDefense: PvpDefenseType, seasonNum: async function resetPvpScores(pvpDefense: PvpDefenseType, seasonNum: number, pvpSeasonResult: PvpSeasonResultType) { let { roleId, attack, defense } = pvpDefense; let { newHeroScores, newScore } = pvpSeasonResult; + let initCount = await getVipPvpChallengeMaxCnt(roleId) let newAttack = calLineupScore(attack, newHeroScores); let newDefense = calLineupScore(defense, newHeroScores); pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { heroScores: newHeroScores, score: newScore, attack: newAttack, defense: newDefense, - seasonNum, challengeCnt: PVP.PVP_CHALLENGE_COUNTS, challengeRefTime: 0, winStreakNum: 0, isFirstEntry: true + seasonNum, challengeCnt: initCount, challengeRefTime: 0, winStreakNum: 0, isFirstEntry: true }); return pvpDefense; } diff --git a/gm-server/app/service/users.ts b/gm-server/app/service/users.ts index 7069643cc..4cfdba461 100644 --- a/gm-server/app/service/users.ts +++ b/gm-server/app/service/users.ts @@ -23,7 +23,6 @@ import { GuildModel } from '@db/Guild'; import { RedisClient } from 'redis'; import { UserGuildModel } from '@db/UserGuild'; import { TowerRecordModel } from '@db/TowerRecord'; -import { HangUpRecordModel } from '@db/HangUpRecord'; import { nowSeconds } from '@pubUtils/timeUtil'; // import { resResult } from '@pubUtils/util'; @@ -133,10 +132,10 @@ export default class GMUsers extends Service { let heroCount = await HeroModel.count({ roleId: role.roleId }).lean(); let itemCount = await ItemModel.count({ roleId: role.roleId }).lean(); - let { roleId, roleName, serverId, lv, vLv, gold, coin, ce, blockType = 0, blockReason = '' } = role; + let { roleId, roleName, serverId, lv, gold, coin, ce, blockType = 0, blockReason = '' } = role; let { uid, tel } = role.userInfo; list.push({ - key: roleId, roleId, roleName, serverId, lv, vLv, uid, tel, heroCount, itemCount, gold, coin, ce, blockType, blockReason, + key: roleId, roleId, roleName, serverId, lv, uid, tel, heroCount, itemCount, gold, coin, ce, blockType, blockReason, env: ctx.app.config.realEnv }); } @@ -580,10 +579,10 @@ export default class GMUsers extends Service { towerLv = lv; break; } } - let role = await RoleModel.updateRoleInfo(roleId, { towerLv }); + await RoleModel.updateRoleInfo(roleId, { towerLv }); await TowerRecordModel.deleteAccount(roleId); await TowerRecordModel.insertTowerRec(roleId, towerLv); - await HangUpRecordModel.updateRec(roleId, role.roleName, towerLv, new Date(), []); + // await HangUpRecordModel.updateRec(roleId, role.roleName, towerLv, new Date(), []); } public async setCreateTime(roleId: string, day: number) { diff --git a/shared/db/ActivityMonthlyTicket.ts b/shared/db/ActivityMonthlyTicket.ts index 2d2a2b041..c1e4bf429 100644 --- a/shared/db/ActivityMonthlyTicket.ts +++ b/shared/db/ActivityMonthlyTicket.ts @@ -20,7 +20,8 @@ export default class Activity_Monthly_Ticket extends BaseModel { endTime: Date; // 结束时间 @prop({ required: true }) dayIndex: number; // 结算到第几天,从0开始,1表示第一天已经领取过(包括邮件发放) - + @prop({ required: true }) + isForever: boolean; // 是否是永久卡 //记录领取的天数 public static async setDayIndex(serverId: number, roleId: string, activityId: number, dayIndex: number) { @@ -37,8 +38,8 @@ export default class Activity_Monthly_Ticket extends BaseModel { } //购买月卡 - public static async buyMonthlyTicket(serverId: number, roleId: string, activityId: number, activityType: number, endTime: Date) { - await ActivityMonthlyTicketModel.findOneAndUpdate({ serverId, roleId, activityId, activityType }, { $set: { endTime, dayIndex: 0 } }, { upsert: true, new: true }).lean(); + public static async buyMonthlyTicket(serverId: number, roleId: string, activityId: number, activityType: number, endTime: Date, isForever: boolean) { + await ActivityMonthlyTicketModel.findOneAndUpdate({ serverId, roleId, activityId, activityType }, { $set: { endTime, dayIndex: 0, isForever } }, { upsert: true, new: true }).lean(); } } diff --git a/shared/db/HangUpSpdUpRec.ts b/shared/db/HangUpSpdUpRec.ts index 8fbb84e35..6fc93d095 100644 --- a/shared/db/HangUpSpdUpRec.ts +++ b/shared/db/HangUpSpdUpRec.ts @@ -9,7 +9,7 @@ class Goods { count: number; // 这次挂机没来得及领取的 } -class NotReceivedGoods { +export class NotReceivedGoods { @prop({ required: true }) cnt: number; // 加速的次数 @prop({ required: true, default: [], type: Goods, _id: false }) diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 0e932dd24..53bb851a4 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -193,13 +193,9 @@ export default class Role extends BaseModel { topLineupCe: number; // 最强x人战力 @prop({ required: true, type: TopHero, default: [], _id: false }) topLineup: Array; // 总战力 - @prop({ required: true, default: 100 }) - tili: number; // 体力值 @prop({ required: false, set: (val: boolean) => val, get: () => true }) isReducedCe: boolean; // 如果战力没有缩过就会返回false,缩过了就会返回true - @prop({ required: true, default: 0 }) - vLv: number; // VIP 等级 @prop({ required: true, default: 100 }) gold: number; // 总金币 @prop({ required: true, default: 0 }) @@ -234,6 +230,12 @@ export default class Role extends BaseModel { @prop({ required: true, default: 0 }) quitTime: number; // 更新 / 登录时间 + // 月卡相关 + @prop({ required: true, default: 0 }) + vipStartTime: number; // 永久卡开始时间 + @prop({ required: true, default: 0 }) + isVip: boolean; // 是否购买了永久月卡 + // 天梯相关 @prop({ required: true, default: 1 }) towerLv: number; // 天梯当前层数 @@ -402,11 +404,6 @@ export default class Role extends BaseModel { return role; } - public static async deleteAccount(roleId: string) { - let result = await RoleModel.deleteMany({ roleId }); - return result; - } - public static async addCoin(roleId: string, cnt: number, lean = true) { let result: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $inc: { coin: cnt } }, { "new": true, "upsert": true }).lean(lean); return result; @@ -740,6 +737,11 @@ export default class Role extends BaseModel { return role; } + // 购买永久月卡 + public static async buyForeverTicket(roleId: string) { + const role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $set: { vipStartTime: Date.now(), isVip: true } }, { new: true }).lean(); + return role; + } private static getSearchObj(form: SearchRoleParam) { let searchObj = {}; diff --git a/shared/domain/activityField/monthlyTicketField.ts b/shared/domain/activityField/monthlyTicketField.ts index b834a88e2..fd41b4ee7 100644 --- a/shared/domain/activityField/monthlyTicketField.ts +++ b/shared/domain/activityField/monthlyTicketField.ts @@ -4,41 +4,45 @@ import { ActivityMonthlyTicketModelType } from '../../db/ActivityMonthlyTicket'; import { deltaDays } from '../../pubUtils/util'; import { ActivityBase } from './activityField'; +interface MonthlyTickerInDb { + name: string; // 月卡名字 + id: number; // 序列 + productID: string; // 商品id vip月卡商品ID + price: number ; // 价格 + isForever: boolean; // 是否是永久卡 + days: number; // 持续天数,永久卡的话这里填0 + baseReward: string; // 每天领取的奖励 "2&1&1" + firstReward: string;// 首次购买获得的奖励 "2&1&1" + imageName: string; // 图片名 + rebate: number; // 返利倍数 +} // 月卡数据 export class MonthlyTicketData extends ActivityBase { - name: string = '';//名称 - id: number = 0;//序列 - productID: string = '';//商品id - price: number = 0;//价格 - days: number = 0;//持续天数 - baseReward: string = '';//每天领取的奖励 - firstReward: string = '';//首次购买获得的奖励 + name: string = ''; // 名称 + id: number = 0; // 序列 + productID: string = ''; // 商品id + price: number = 0; // 价格 + days: number = 0; // 持续天数 + baseReward: string = ''; // 每天领取的奖励 + firstReward: string = ''; // 首次购买获得的奖励 imageName: string = ''; - rebate: number = 0;//返利倍数 + rebate: number = 0; // 返利倍数 + isForever: boolean = false; // 是否是永久卡 - endTime: number = 0;//结束时间 - dayIndex: number = 0;//已经领取了几天 - isOpen: boolean = false;//是否开启中 - todayIndex: number = 0;//现在可以领取第几天的奖励 - //解析玩家领取记录 - public setPlayerRecords(data: ActivityMonthlyTicketModelType) { - if (!data) {//没有购买月卡 - return; - } - this.dayIndex = data.dayIndex; - this.endTime = moment(data.endTime).valueOf(); - if (moment(new Date).valueOf() < this.endTime) { - this.isOpen = true; - this.todayIndex = deltaDays(moment(data.createdAt).startOf('d').toDate(), new Date) + 1; - } else { - this.todayIndex = 0; - } + cardEndTime: number = 0; // 结束时间 + dayIndex: number = 0; // 已经领取了几天 + isOpen: boolean = false; // 是否开启中 + todayIndex: number = 0; // 现在可以领取第几天的奖励 + + constructor(activityData: ActivityModelType, createTime: number) { + super(activityData, createTime) + this.initData(activityData.data) } public initData(data: string) { - let dataObj = JSON.parse(data); + let dataObj: MonthlyTickerInDb = JSON.parse(data); this.id = dataObj.id; this.name = dataObj.name; @@ -49,18 +53,22 @@ export class MonthlyTicketData extends ActivityBase { this.firstReward = dataObj.firstReward; this.imageName = dataObj.imageName; this.rebate = dataObj.rebate; - - this.isOpen = false; - this.todayIndex = 0; - this.dayIndex = 0; - this.endTime = 0; - } - public canShow() { // 开始结束时间用于判断是否购买了月卡了,所以直接显示 - return true + this.isForever = dataObj.isForever; } - constructor(activityData: ActivityModelType, createTime: number) { - super(activityData, createTime) - this.initData(activityData.data) + //解析玩家领取记录 + public setPlayerRecords(data: ActivityMonthlyTicketModelType) { + if (!data) {//没有购买月卡 + return; + } + this.dayIndex = data.dayIndex; + this.cardEndTime = data.isForever? moment(data.endTime).valueOf(): this.endTime; + if (data.isForever || moment(new Date).valueOf() < this.cardEndTime) { + this.isOpen = true; + this.todayIndex = deltaDays(moment(data.createdAt).startOf('d').toDate(), new Date) + 1; + } else { + this.todayIndex = 0; + } } + } \ No newline at end of file diff --git a/shared/domain/activityField/rechargeMoneyField.ts b/shared/domain/activityField/rechargeMoneyField.ts index f4e3cf6ca..82ce64c96 100644 --- a/shared/domain/activityField/rechargeMoneyField.ts +++ b/shared/domain/activityField/rechargeMoneyField.ts @@ -68,6 +68,7 @@ export class RechargeMoneyData extends ActivityBase { } public pull() { + this.ticketCnt --; let percent = this.percent; let randPercent = percent.filter(cur => { let hasAllGet = true; @@ -88,6 +89,7 @@ export class RechargeMoneyData extends ActivityBase { } } let result = getRandSingleEelm(elems); + result.setHasGet(true); return result; } diff --git a/shared/domain/rank.ts b/shared/domain/rank.ts index c24be6317..6dd003ec1 100644 --- a/shared/domain/rank.ts +++ b/shared/domain/rank.ts @@ -17,9 +17,6 @@ export class RankParam { @prop({ required: true }) lv: number = 0; - @prop({ required: true }) - vLv?: number = 0; - @prop({ required: true }) guildName: string = ""; @@ -44,7 +41,6 @@ export class RankParam { constructor(role: RoleUpdate|RankParam, fromDb: boolean) { if(role.roleName) this.roleName = role.roleName; if(role.lv) this.lv = role.lv; - if(role.vLv) this.vLv = role.vLv; if(role.head) this.head = role.head; if(role.frame) this.frame = role.frame; if(role.spine) this.spine = role.spine; diff --git a/shared/pubUtils/dicParam.ts b/shared/pubUtils/dicParam.ts index 84fc5a31d..c2b819523 100644 --- a/shared/pubUtils/dicParam.ts +++ b/shared/pubUtils/dicParam.ts @@ -255,3 +255,16 @@ export const LINK = { export const REBORN = { REBORON_HERO: 500, // 武将重生元宝数量 }; +export const VIP = { + VIP_GUILD_DONATE_COST_GOLD_RATIO: 0.5, // 军团贡献元宝,按照捐献所需要的元宝自动乘以倍率 + VIP_TOWER_SKIP_CE_RATIO_WITHOUT_VIP: 2, // 镇念塔没有月卡的时候所需要的战力倍数 + VIP_TOWER_SKIP_CE_RATIO_WITH_VIP: 1.2, // 镇念塔有月卡的时候所需要的战力倍数 + VIP_TOWER_TASK_CAN_SEND_AT_ONCE_WITHOUT_VIP: 0, // 镇念没有月卡是否可以被一键悬赏 + VIP_TOWER_TASK_CAN_SEND_AT_ONCE_WITH_VIP: 1, // 镇念塔有月卡是否可以被一键悬赏 + VIP_TOWER_HUNG_UP_RATIO: 1.2, // 镇念塔挂机奖励加成倍率,在dic_zyz_tower的rewardOfcollect基础上直接乘以这个倍数 + VIP_REGRET_CNT_WITHOUT_VIP: 0, // 没有月卡时候的悔棋次数 + VIP_REGRET_CNT_WITH_VIP: 1, // 有月卡时候的悔棋次数 + VIP_PVP_CHALLENGE_COUNTS_ADD: 2, // pvp上限增加,如果有月卡,在PVP.PVP_CHALLENGE_COUNTS的基础上增加X次 + VIP_DAILY_TIMERS_PER_DAY_ADD: 2, // 每日任务免费次数增加,如果有月卡,在dic_daily的timesPerDay的基础上增加多少次 + VIP_DUNGEON_CONST_FREE_ADD: 2, // 秘境免费次数增加,如果有月卡,在DUNGEON_CONST.DUNGEON_CONST_FREE的基础上加多少次 +}; diff --git a/shared/pubUtils/itemUtils.ts b/shared/pubUtils/itemUtils.ts index 7164f7aac..41fcb5983 100644 --- a/shared/pubUtils/itemUtils.ts +++ b/shared/pubUtils/itemUtils.ts @@ -135,6 +135,10 @@ export function getJewelRandSe(id: number, seid: number) { return new RandSe(id, dicRandom.id, rand); } +export function getGoldId() { + return CURRENCY_BY_TYPE.get(CURRENCY_TYPE.GOLD); +} + /** * @description 获取元宝物品 { id, count } * @param count 元宝数量