镇念塔:系统参数表

This commit is contained in:
luying
2021-08-18 16:44:54 +08:00
parent 7d1f49e02a
commit a4627b3ac6
7 changed files with 119 additions and 89 deletions
@@ -7,14 +7,14 @@ import { RoleModel } from './../../../db/Role';
import { TowerRecordModel } from './../../../db/TowerRecord';
import { Application, BackendSession } from 'pinus';
import { resResult, shouldRefresh, calculateNum, genCode } from '../../../pubUtils/util';
import { calcuHangUpReward, checkTaskConditions, checkHangUpSpdUpCnt, refreshTasks, treatTask, getRemainTime, getDoingOrWaitingTasks, getTowerStatus, getHungupRewards, getTasks, checkTaskRewards, getTowerTaskCostGold, getTowerTaskSpdUpCostGold } from '../../../services/battleService';
import { calcuHangUpReward, checkTaskConditions, checkHangUpSpdUpCnt, refreshTasks, treatTask, getRemainTime, getDoingOrWaitingTasks, getTowerStatus, getHungupRewards, getTasks, checkTaskRewards, getTowerTaskCostGold, getHangSpdUpCostGold, getManyHangSpdUpCostGold } from '../../../services/battleService';
import { addItems, handleCost } from '../../../services/rewardService';
import { checkBattleHeroes } from '../../../services/normalBattleService';
import { getGoldObject } from '../../../pubUtils/itemUtils';
import { Rank } from '../../../services/rankService';
import { gameData } from '../../../pubUtils/data';
import { ItemInter } from '../../../pubUtils/interface';
import { TOWER_SEARCH } from '../../../pubUtils/dicParam';
import * as dicParam from '../../../pubUtils/dicParam';
export default function(app: Application) {
return new TowerBattleHandler(app);
@@ -98,7 +98,7 @@ export class TowerBattleHandler {
if(result.status == -1) return result.resResult;
let {data: {hangUpSpdUpCnt, gold}} = result;
const costGold = this.getHangUpCost(hangUpSpdUpCnt, msg.speedUpCnt);
const costGold = getManyHangSpdUpCostGold(hangUpSpdUpCnt, msg.speedUpCnt);
if(costGold > gold) {
return resResult(STATUS.TOWER_GOLD_NOT_ENOUGH);
}
@@ -111,23 +111,12 @@ export class TowerBattleHandler {
}
const spdUpRec = await HangUpSpdUpRecModel.updateRec(roleId, roleName, msg.speedUpCnt, endLv, needReceiveGoods);
const goods = await addItems(roleId, roleName, sid, timeReward);
hangUpSpdUpCnt -= msg.speedUpCnt;
let num = HANG_UP_CONSTS.MAX_SPD_UP_CNT - hangUpSpdUpCnt + 1;
let nextCostGold = getTowerTaskSpdUpCostGold(num);
let num = getManyHangSpdUpCostGold(spdUpResult.hangUpSpdUpCnt, 1);
let nextCostGold = getHangSpdUpCostGold(num);
return resResult(STATUS.SUCCESS, { goods, hangUpSpdUpCnt, nextCostGold, hangUpPassTime: Math.floor(deltaTime/1000), rewardLv: endLv, costGold });
}
getHangUpCost(originCnt: number, count: number) {
let gold = 0;
for(let i = 1; i <= count; i++) {
let num = HANG_UP_CONSTS.MAX_SPD_UP_CNT - originCnt + i;
if(num < 0) num = i;
gold += getTowerTaskSpdUpCostGold(num);
}
return gold
}
async getTasks(msg: {}, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
@@ -142,11 +131,11 @@ export class TowerBattleHandler {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let curTime = new Date();
let { towerLv, towerTaskCnt = 0, towerTaskReCnt=0 } = await RoleModel.findByRoleId(roleId);
if(TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE <= towerTaskCnt) { // 付费刷新次数
let { towerLv, towerTaskRefTime, towerTaskReCnt=0 } = await RoleModel.findByRoleId(roleId);
if(towerTaskReCnt >= dicParam.TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE) { // 付费刷新次数
return resResult(STATUS.TOWER_REF_CNT_NOT_ENOUGH);
}
let costGold = getTowerTaskCostGold(towerTaskCnt + 1);
let costGold = getTowerTaskCostGold(towerTaskReCnt, towerTaskRefTime);
let {gold} = await RoleModel.findByRoleId(roleId);
if(costGold > gold) {
return resResult(STATUS.TOWER_GOLD_NOT_ENOUGH);
@@ -159,10 +148,10 @@ export class TowerBattleHandler {
if(task) batchCode = task.batchCode;
}
curTasks = await refreshTasks(towerLv, batchCode, roleId, roleName, curTasks);
await RoleModel.increaseTowerRefCnt(roleId, 1);
let newRole = await RoleModel.increaseTowerRefCnt(roleId, 1);
let refRemainTime = getRemainTime(curTime);
let nextCostGold = getTowerTaskCostGold(towerTaskReCnt + 1);
let nextCostGold = getTowerTaskCostGold(newRole.towerTaskReCnt, newRole.towerTaskRefTime);
return resResult(STATUS.SUCCESS, { curTasks: treatTask(curTasks, curTime), costGold, nextCostGold, refRemainTime});
}
@@ -213,7 +202,7 @@ export class TowerBattleHandler {
let refRemainTime = getRemainTime(curTime);
curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前显示中的任务
let costGold = getTowerTaskCostGold(role.towerTaskCnt + 1);
let costGold = getTowerTaskCostGold(role.towerTaskReCnt, role.towerTaskRefTime);
return resResult(STATUS.SUCCESS, { curTasks: treatTask(curTasks, curTime), refRemainTime, nextCostGold: costGold });
}
@@ -247,7 +236,7 @@ export class TowerBattleHandler {
let curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前显示中的任务
let role = await RoleModel.findByRoleId(roleId);
let costGold = getTowerTaskCostGold(role.towerTaskCnt + 1);
let costGold = getTowerTaskCostGold(role.towerTaskReCnt, role.towerTaskRefTime);
return resResult(STATUS.SUCCESS, { curTasks: treatTask(curTasks, curTime), goods, refRemainTime, nextCostGold: costGold });
}
}
+64 -26
View File
@@ -18,7 +18,7 @@ import { getTimeFunM } from '../pubUtils/timeUtil';
import { ComRoleStatusHero } from '../db/ComBattleTeam';
import { sendMailByContent } from './mailService';
import { DicTowerTask } from '../pubUtils/dictionary/DicTowerTask';
import { TOWER_SEARCH } from '../pubUtils/dicParam';
import * as dicParam from '../pubUtils/dicParam';
/**
* 获取当前镇念塔状态
@@ -41,9 +41,10 @@ export async function getTowerStatus(role: RoleType) {
// return { code: 201, data: '天梯记录异常' };
}
return {
canHungUp: towerLv >= HANG_UP_CONSTS.ENABLE_LV,
hungUpEnableLv: HANG_UP_CONSTS.ENABLE_LV,
canSendTask: true,
canHungUp: towerLv - 1 >= dicParam.TOWER_HANG_UP.TOWER_HANG_UP_ENABLE_LV,
hungUpEnableLv: dicParam.TOWER_HANG_UP.TOWER_HANG_UP_ENABLE_LV,
canSendTask: towerLv - 1 >= dicParam.TOWER_SEARCH.TOWER_SEARCH_STARTLIMITED,
sendTaskEnableLv: dicParam.TOWER_SEARCH.TOWER_SEARCH_STARTLIMITED,
curLv: towerLv,
usedHeroes: towerRec.heroes,
progress: towerRec.warStatus
@@ -60,13 +61,12 @@ export async function getHungupRewards(roleId: string) {
return result;
}
let {timeReward, startTime, deltaTime} = result.data;
let {hangUpSpdUpCnt, lastSpdUpTime} = await RoleModel.findByRoleId(roleId);
let {hangUpSpdUpCnt = 0, lastSpdUpTime} = await RoleModel.findByRoleId(roleId);
let curTime = new Date();
if (!lastSpdUpTime || (shouldRefresh(lastSpdUpTime, curTime) && hangUpSpdUpCnt <= HANG_UP_CONSTS.MAX_SPD_UP_CNT)) {
hangUpSpdUpCnt = HANG_UP_CONSTS.MAX_SPD_UP_CNT;
if (shouldRefresh(lastSpdUpTime, curTime)) {
hangUpSpdUpCnt = 0;
}
let num = HANG_UP_CONSTS.MAX_SPD_UP_CNT - hangUpSpdUpCnt + 1;
let nextCostGold = getTowerTaskSpdUpCostGold(num);
let nextCostGold = getManyHangSpdUpCostGold(hangUpSpdUpCnt, 1);
return {
status: 0,
@@ -83,6 +83,12 @@ export async function getHungupRewards(roleId: string) {
*/
export async function getTasks(role: RoleType) {
let { roleId, roleName, towerLv, towerTaskRefTime, towerTaskReCnt = 0 } = role;
// towerLv:从1开始,下次打得层数,dicParam内的:从0开始,打过的层数
if(towerLv - 1 <= dicParam.TOWER_SEARCH.TOWER_SEARCH_STARTLIMITED) {
return {curTasks: [], refRemainTime: 0, nextCostGold: 0}
}
let curTime = new Date();
let curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前显示中的任务
@@ -101,12 +107,12 @@ export async function getTasks(role: RoleType) {
curTasks = await refreshTasks(towerLv, batchCode, roleId, roleName, []); // 新建任务
// 重置派遣次数
const role = await RoleModel.resetTowerCnt(roleId, curTime);
role = await RoleModel.resetTowerCnt(roleId, curTime);
towerTaskReCnt = role.towerTaskReCnt;
}
let refRemainTime = getRemainTime(curTime);
let nextCostGold = getTowerTaskCostGold(towerTaskReCnt + 1);
let nextCostGold = getTowerTaskCostGold(role.towerTaskReCnt, role.towerTaskRefTime);
return {curTasks: treatTask(curTasks, curTime), refRemainTime, nextCostGold}
}
@@ -209,9 +215,8 @@ export async function towerBattleEnd(sid: string, funcs: number[], roleId: strin
}
const { reward } = gameData.tower.get(role.towerLv - 1);
if (reward) towerReward = reward;
if (role.towerLv == HANG_UP_CONSTS.ENABLE_LV) {
if (role.towerLv == dicParam.TOWER_HANG_UP.TOWER_HANG_UP_ENABLE_LV + 1) {
await startHangUp(roleId, roleName);
pinus.app.get('channelService').pushMessageByUids('hangUpEnable', resResult(STATUS.SUCCESS, { enable: true }), [{ uid: roleId, sid }]);
}
// 任务
await checkTask(roleId, sid, funcs, TASK_TYPE.BATTLE_TOWER_LV, role.towerLv, false, {});
@@ -235,10 +240,10 @@ async function startHangUp(roleId: string, roleName: string) {
export async function checkHangUpSpdUpCnt(roleId: string, cnt: number, curTime: Date) {
const role = await RoleModel.findByRoleId(roleId);
let { hangUpSpdUpCnt, gold, lastSpdUpTime } = role;
if (!lastSpdUpTime || (shouldRefresh(lastSpdUpTime, curTime) && hangUpSpdUpCnt <= HANG_UP_CONSTS.MAX_SPD_UP_CNT)) {
hangUpSpdUpCnt = HANG_UP_CONSTS.MAX_SPD_UP_CNT;
if (shouldRefresh(lastSpdUpTime, curTime)) {
hangUpSpdUpCnt = 0;
}
if (cnt > hangUpSpdUpCnt) {
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 } }
@@ -246,7 +251,7 @@ export async function checkHangUpSpdUpCnt(roleId: string, cnt: number, curTime:
export async function calcuHangUpReward(roleId: string, speedUp = false, speedUpCnt = 1, curTime = new Date()) {
let { towerLv = 1, hangUpSpdUpCnt = 0, lastSpdUpTime } = await RoleModel.findByRoleId(roleId);
if (towerLv < HANG_UP_CONSTS.ENABLE_LV) {
if (towerLv - 1 < dicParam.TOWER_HANG_UP.TOWER_HANG_UP_ENABLE_LV) {
return { status: -1, resResult: resResult(STATUS.TOWER_HANG_UP_NOT_START) }
}
@@ -267,7 +272,7 @@ export async function calcuHangUpReward(roleId: string, speedUp = false, speedUp
}
if (speedUp) { // 加速,直接收取6小时收益,小数的累积和普通收取独立
if (hangUpSpdUpCnt >= speedUpCnt || !lastSpdUpTime || shouldRefresh(lastSpdUpTime, new Date)) { // 可加速
if (hangUpSpdUpCnt < speedUpCnt || !lastSpdUpTime || shouldRefresh(lastSpdUpTime, new Date)) { // 可加速
let multi = Math.floor(HANG_UP_CONSTS.SPD_UP_REC_TIME / HANG_UP_CONSTS.UNIT_TIME);
let spdUpRec = await HangUpSpdUpRecModel.getSpdUpRec(roleId, towerLv - 1);
let goods = [];
@@ -380,7 +385,7 @@ export async function refreshTasks(towerLv: number, batchCode: string, roleId: s
let ridTaskIds: number[] = [];
let positions = new Map<number, TowerTaskRecType> (); // 需要创建或更新
for(let i = 1; i <= TOWER_SEARCH.TOWER_SEARCH_LIMITED; i++) {
for(let i = 1; i <= dicParam.TOWER_SEARCH.TOWER_SEARCH_LIMITED; i++) {
positions.set(i, null);
}
for(let task of oldTasks) {
@@ -575,14 +580,47 @@ export function transBossHpArr(source: Array<{ dataId: number, hp: number, actor
return cloneDeep(desArr);
}
export function getTowerTaskCostGold(times: number) {
let cost = times * TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_FEE;
if(cost > TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_MAX) cost = TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_MAX;
/**
* 获得下一次刷新派遣的花费
* @param times 玩家表上的次数
* @param refTime 玩家表上的刷新时间
* @returns
*/
export function getTowerTaskCostGold(times: number, refTime: Date) {
if(shouldRefresh(refTime, new Date())) {
times = 0;
}
let cost = (times + 1) * dicParam.TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_FEE;
if(cost > dicParam.TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_MAX) cost = dicParam.TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_MAX;
return cost;
}
export function getTowerTaskSpdUpCostGold(times:number) {
let cost = times * TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_FEE; // TODO 改成系统参数表
if(cost > TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_MAX) cost = TOWER_SEARCH.TOWER_SEARCH_REFRESHRULE_MAX;
return cost;
/**
* 多次加速挂机消耗的元宝
* @param originCnt 玩家表里原来的次数
* @param count 这次加速几次
* @returns
*/
export function getManyHangSpdUpCostGold(originCnt: number, count: number) {
let gold = 0;
for(let i = 1; i <= count; i++) {
let num = originCnt + i;
gold += getHangSpdUpCostGold(num);
}
return gold
}
/**
* 计算加速挂机消耗的元宝
* @param times 第几次,如果你没有加速过,这里给1
* @returns
*/
export function getHangSpdUpCostGold(times:number) {
if(times <= dicParam.TOWER_BOOST.TOWER_BOOSTFREETIME) {
return 0
} else {
let cost = (times - dicParam.TOWER_BOOST.TOWER_BOOSTFREETIME) * dicParam.TOWER_BOOST.TOWER_BOOSTCAST; // TODO 改成系统参数表
if(cost > dicParam.TOWER_BOOST.TOWER_BOOSTCASTMAX) cost = dicParam.TOWER_BOOST.TOWER_BOOSTCASTMAX;
return cost;
}
}