天梯挂机加速;天梯派遣部分新接口
fixed:
数据库类型和插入数据的用法修复
This commit is contained in:
liangtongchuan
2020-10-15 01:49:26 +08:00
parent 2b1575516f
commit 33ee71adcd
14 changed files with 380 additions and 21 deletions

View File

@@ -1,10 +1,12 @@
// import { HANG_UP_CONSTS } from './../../../consts/consts';
import { TOWER_TASK_CONST } from './../../../consts/consts';
import { TowerTaskRecModel } from './../../../db/TowerTaskRec';
import { HangUpSpdUpRecModel } from './../../../db/HangUpSpdUpRec';
import { HangUpRecordModel } from './../../../db/HangUpRecord';
import { RoleModel } from './../../../db/Role';
import { TowerRecordModel } from './../../../db/TowerRecord';
import { Application, BackendSession } from 'pinus';
import { getTowerDataByLv } from '../../../util/gamedata';
import { decodeArrayStr, decodeIdCntArrayStr } from '../../../util/util';
import { getTaskIdByQuality, getTowerDataByLv } from '../../../util/gamedata';
import { decodeArrayStr, decodeIdCntArrayStr, getRandEelm } from '../../../util/util';
import { calcuHangUpReward } from '../../../services/battleService';
import { handleFixedReward } from '../../../services/rewardService';
@@ -87,7 +89,7 @@ export class TowerBattleHandler {
};
}
async recHangUpRewards(msg: {speedUp: boolean, speedUpCnt: number}, session: BackendSession) {
async recHangUpRewards(msg: {}, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
const { multi, timeReward, endLv, endTime } = await calcuHangUpReward(roleId);
@@ -109,4 +111,67 @@ export class TowerBattleHandler {
}
}
}
}
async hangUpSpeedUp(msg: {speedUpCnt: number}, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
if (msg.speedUpCnt <= 0) {
return {
code: 201,
data: {
msg: '加速参数错误',
}
};
}
const curTime = new Date();
const { multi, timeReward, endLv } = await calcuHangUpReward(roleId, true, msg.speedUpCnt, curTime);
if (multi <= 0) {
return {
code: 201,
data: {
msg: '今日加速次数不足'
}
};
}
const role = await RoleModel.hangUpSpdUp(roleId, multi, curTime);
if (!role) {
return {
code: 201,
data: {
msg: '不满足加速条件'
}
};
}
const spdUpRec = await HangUpSpdUpRecModel.updateRec(roleId, roleName, multi, endLv);
const goods = await handleFixedReward(roleId, roleName, timeReward, multi);
return {
code : 200,
data: {
msg: '成功',
goods, rewardLv: endLv, spdUpRec
}
};
}
async getTask(msg: {}, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let curTask = await TowerTaskRecModel.getCurTask(roleId);
if (!curTask) {
let taskIds = [];
TOWER_TASK_CONST.RAND_CNT.forEach(qualityId => {
const ids = getTaskIdByQuality(qualityId);
taskIds.concat(getRandEelm(ids, 1));
})
curTask = await TowerTaskRecModel.createTask(roleId, roleName, taskIds);
}
return {
code: 200,
data: {
msg: '成功',
curTask
}
}
}
}

View File

@@ -5,7 +5,7 @@ import { BattleRecordModel } from './../db/BattleRecord';
import { TowerRecordModel } from './../db/TowerRecord';
import { RoleModel } from './../db/Role';
import { getTowerDataByLv } from "../util/gamedata"
import { decodeArrayStr } from '../util/util';
import { decodeArrayStr, shouldRefresh } from '../util/util';
import { handleFixedReward } from './rewardService';
export async function checkTowerWar(roleId: string, battleId: number, heroes: Array<number>) {
@@ -97,18 +97,26 @@ async function startHangUp(roleId: string, roleName: string) {
await HangUpRecordModel.initRecord(roleId, roleName);
}
export async function calcuHangUpReward(roleId: string) {
let { towerLv } = await RoleModel.findByRoleId(roleId);
export async function calcuHangUpReward(roleId: string, speedUp = false, speedUpCnt = 1, curTime = new Date()) {
let { towerLv, hangUpSpdUpCnt, lastSpdUpTime } = await RoleModel.findByRoleId(roleId);
let { startLv, startTime} = await HangUpRecordModel.getCurRec(roleId);
let towerInfo = getTowerDataByLv(towerLv - 1); // towerLv 是当前层,奖励计算按照已经通过的层,即上一层
const curTime = new Date();
let deltaTime = curTime.getTime() - startTime.getTime();
if (deltaTime > HANG_UP_CONSTS.MAX_TIME) deltaTime = HANG_UP_CONSTS.MAX_TIME;
const multi = Math.floor(deltaTime / HANG_UP_CONSTS.UNIT_TIME);
let multi = 1;
if (speedUp) {
if (hangUpSpdUpCnt >= speedUpCnt || shouldRefresh(lastSpdUpTime, new Date, HANG_UP_CONSTS.REFRESH_TIME, 1)) {
multi = speedUpCnt;
} else {
multi = 0;
}
} else {
let deltaTime = curTime.getTime() - startTime.getTime();
if (deltaTime > HANG_UP_CONSTS.MAX_TIME) deltaTime = HANG_UP_CONSTS.MAX_TIME;
multi = Math.floor(deltaTime / HANG_UP_CONSTS.UNIT_TIME);
}
return {
endLv: towerLv - 1,
endTime: new Date(startTime.getTime() + multi * HANG_UP_CONSTS.UNIT_TIME),
timeReward: towerInfo.timeReward,
multi
};
}
}

View File

@@ -5,6 +5,8 @@ let gamedata = {};
const wars = ['dic_zyz_gk_main', 'dic_zyz_gk_mainElite', 'dic_zyz_gk_daily', 'dic_zyz_gk_event', 'dic_zyz_gk_tower', 'dic_zyz_gk_expedition']; // 关卡相关的表
const allWarInfos = new Map<number, any>();
const towerInfos = new Map<number, any>();
const towerTaskInfos = new Map<number, any>();
const towerTasksByQuality = new Map<number, Array<number>>();
function parseWarData() {
let result = null;
@@ -29,6 +31,19 @@ function parseTowerData() {
});
}
function parseTowerTaskData() {
const towerTaskFile = 'dic_zyz_tower_tasks';
const towerTaskData = gamedata['jsons'][towerTaskFile] || [];
towerTaskData.forEach(elem => {
if (elem && elem.taskId) {
towerTaskInfos.set(elem.taskId, elem);
let tasks = towerTasksByQuality.get(elem.quality) || [];
tasks.push(elem.taskId);
towerTasksByQuality.set(elem.quality, tasks);
}
});
}
function initData (folder) {
if(!gamedata.hasOwnProperty(folder)) {
gamedata[folder] = {};
@@ -55,6 +70,7 @@ function initData (folder) {
function parseData() {
parseWarData();
parseTowerData();
parseTowerTaskData();
}
initData('jsons'); // 加载一般json
@@ -91,3 +107,13 @@ export function getGoodById(gid) {
return cur.good_id == gid
});
}
export function getTaskById(tid: number) {
const taskInfo = towerTaskInfos.get(tid);
return taskInfo;
}
export function getTaskIdByQuality(quality: number) {
const taskIds = towerTasksByQuality.get(quality);
return taskIds;
}

View File

@@ -4,7 +4,8 @@ import { CounterModel } from '../db/Counter';
import { EquipModel } from '../db/Equip';
import { HeroModel } from '../db/Hero';
import { GOOD_TYPE } from '../consts/consts';
const moment = require('moment');
export function genCode(len) {
const chars = '123456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijklmnopqrstuvwxyz';
const charArr = chars.split('');
@@ -189,4 +190,41 @@ export function decodeIdCntArrayStr(str: string, multi: number) {
index -= weight;
}
return result
}
/**
* 传入两个时间,返回按照时间差计算,第二个时间比第一个晚几天
* @param preTime 之前的时间
* @param proTime 之后的时间
*/
export function deltaDays(preTime: Date, proTime: Date): number {
return moment(proTime).diff(moment(preTime), "days");
}
/**
* 计算按照每 x 天 y 点刷新一次,是否应该刷新
* @param preTime 基准时间
* @param curTime 当前时间
* @param hour 几点刷新
* @param deltaDay 间隔几天刷新,默认每天刷新(deltaDay = 1)
*/
export function shouldRefresh(preTime: Date, curTime: Date, hour: number, deltaDay = 1): boolean {
let refeshTime = curTime.setHours(hour, 0, 0, 0);
if (refeshTime - preTime.getTime() > deltaDay * 24 * 60 * 60 * 1000 && curTime.getTime() >= refeshTime) {
return true;
}
return false;
}
export function getRandEelm(source: Array<any> = [], cnt = 1): Array<any> {
if (cnt > source.length) return null;
if (cnt === source.length) return source;
let idxs = new Set();
for (let i = 1; i < cnt; ++i) {
let rand = Math.floor(Math.random() * source.length);
idxs.add(rand);
if (idxs.size == cnt) {
break;
}
}
return source.filter((item, idx) => idxs.has(idx));
}

View File

@@ -769,6 +769,11 @@
"minimist": "^1.2.5"
}
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&sync_timestamp=1601983423917&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz",
"integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M="
},
"mongodb": {
"version": "3.6.1",
"resolved": "https://registry.npm.taobao.org/mongodb/download/mongodb-3.6.1.tgz",

View File

@@ -21,6 +21,7 @@
"@types/redis": "^2.8.25",
"bluebird": "^3.5.1",
"crc": "^3.5.0",
"moment": "^2.29.1",
"mongoose": "^5.10.4",
"pinus": "^1.4.9",
"pinus-robot": "^1.4.9",