初步加入天梯接口
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
import { HangUpRecordModel } from './../../../shared/db/HangUpRecord';
|
||||
import { ChannelService } from 'pinus';
|
||||
import { HANG_UP_CONSTS } from './../consts/consts';
|
||||
import { BattleRecordModel } from './../../../gm-server/app/db/BattleRecord';
|
||||
import { TowerRecordModel } from './../../../shared/db/TowerRecord';
|
||||
import { RoleModel } from './../db/Role';
|
||||
import { getTowerDataByLv } from "../util/gamedata"
|
||||
import { decodeArrayStr } from '../util/util';
|
||||
import { handleFixedReward } from './rewardService';
|
||||
|
||||
export async function checkTowerWar(roleId: string, battleId: number) {
|
||||
const battleIdStr = `${battleId}`;
|
||||
let { towerLv } = await RoleModel.findByRoleId(roleId);
|
||||
const towerInfo = getTowerDataByLv(towerLv);
|
||||
if (!towerInfo) {
|
||||
console.error(`天梯层数异常,lv ${towerLv} by ${roleId}`);
|
||||
return { status: -1, msg: '天梯层数异常' };
|
||||
}
|
||||
const warArray = decodeArrayStr(towerInfo.warArray) || [];
|
||||
if (warArray.indexOf(battleIdStr) === -1) {
|
||||
return { status: -1, msg: '战斗 Id 异常' };
|
||||
}
|
||||
|
||||
let { heroes = [], warStatus = [] } = await TowerRecordModel.getRecordByLv(roleId, towerLv);
|
||||
const curWarStatus = warStatus.find(elem => elem.warId == battleId);
|
||||
if (curWarStatus.status) {
|
||||
return {status: -1, msg: '天梯关卡不能重复挑战'};
|
||||
}
|
||||
|
||||
return { status: 0, data: {
|
||||
heroes, warStatus: curWarStatus
|
||||
}};
|
||||
}
|
||||
|
||||
export async function towerBattleEnd(channelService: ChannelService, sid: string, roleId: string, battleCode: string, battleId: number, succeed: boolean, heroes: Array<number>) {
|
||||
if (succeed) {
|
||||
let battleRec = await BattleRecordModel.getBattleRecordByCode(battleCode);
|
||||
if (battleRec.battleId != battleId) {
|
||||
return { status: -1, msg: '战斗数据错误' };
|
||||
}
|
||||
let { towerLv, roleName } = await RoleModel.findByRoleId(roleId);
|
||||
let { warStatus, heroes: recHeroes } = await TowerRecordModel.getRecordByLv(roleId, towerLv);
|
||||
for (let hid of heroes) {
|
||||
if (recHeroes.indexOf(hid) !== -1) {
|
||||
return { status: -1, msg: '使用了重复的武将' };
|
||||
}
|
||||
}
|
||||
|
||||
let inc = 1;
|
||||
warStatus.forEach(st => {
|
||||
if (st.warId !== battleId && st.status === false) {
|
||||
inc = 0;
|
||||
}
|
||||
})
|
||||
let newRec = await TowerRecordModel.updateRecord(roleId, towerLv, battleCode, battleId, heroes, inc);
|
||||
let bonusReward = null;
|
||||
if (inc === 1) {
|
||||
await RoleModel.towerLvUp(roleId);
|
||||
const nextTowerInfo = getTowerDataByLv(towerLv + 1);
|
||||
if (nextTowerInfo) {
|
||||
const { wars } = nextTowerInfo;
|
||||
const sts = wars.map(id => {
|
||||
return {warId: id, status: false};
|
||||
});
|
||||
await TowerRecordModel.createRecord({roleId, lv: towerLv + 1, warStatus: sts});
|
||||
}
|
||||
const { bonus } = getTowerDataByLv(towerLv);
|
||||
if (bonus) {
|
||||
bonusReward = await handleFixedReward(roleId, roleName, bonus, 1);
|
||||
}
|
||||
if (towerLv + 1 >= HANG_UP_CONSTS.ENABLE_LV) {
|
||||
await startHangUp(roleId, roleName);
|
||||
channelService.pushMessageByUids('hangUpEnable', {code: 200, data: {enable: true}}, [{uid: roleId, sid}]);
|
||||
}
|
||||
}
|
||||
return {
|
||||
status: 0,
|
||||
data: {
|
||||
newRec,
|
||||
bonusReward,
|
||||
towerStatus: !!inc
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
async function startHangUp(roleId: string, roleName: string) {
|
||||
await HangUpRecordModel.initRecord(roleId, roleName);
|
||||
}
|
||||
|
||||
export async function calcuHangUpReward(roleId: string) {
|
||||
let { towerLv } = 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);
|
||||
return {
|
||||
endLv: towerLv - 1,
|
||||
endTime: new Date(startTime.getTime() + multi * HANG_UP_CONSTS.UNIT_TIME),
|
||||
timeReward: towerInfo.timeReward,
|
||||
multi
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
import { BATTLE_REWARD_TYPE, GOOD_TYPE } from './../../../shared/consts/consts';
|
||||
import { EquipModel } from './../db/Equip';
|
||||
import { CounterModel } from './../db/Counter';
|
||||
import { decodeStr } from '../util/util';
|
||||
import { getGoodById } from '../util/gamedata';
|
||||
|
||||
export async function handleFixedReward(roleId: string, roleName: string, rewardStr: string, multi: number) {
|
||||
let reward = decodeStr('fixReward', rewardStr);
|
||||
let rewards = [];
|
||||
for(let obj of reward)
|
||||
rewards.push({type: BATTLE_REWARD_TYPE.FIX_REWARD, ...obj, count: obj.count});
|
||||
|
||||
let returnGoods = new Array();
|
||||
for(let goods of rewards) {
|
||||
let goodInfo = getGoodById(goods.gid);
|
||||
if(goodInfo.goodType == GOOD_TYPE.EQUIP) { // 装备
|
||||
let result = await rewardWeapons(roleId, roleName, goodInfo, {id: goods.gid, cnt: goods.count });
|
||||
for(let obj of result) {
|
||||
returnGoods.push({dropType: goods.type, ...obj})
|
||||
}
|
||||
}
|
||||
}
|
||||
return returnGoods;
|
||||
}
|
||||
|
||||
async function rewardWeapons (roleId: string, roleName: string, dicGood: any, weapon: {id:number,cnt:number }) {
|
||||
|
||||
let weaponsData = [];
|
||||
let cnt = weapon.cnt;
|
||||
while (cnt > 0) {
|
||||
const seqId = await CounterModel.getNewCounter('eid');
|
||||
const equipInfo = {
|
||||
roleId,
|
||||
roleName,
|
||||
eid: weapon.id,
|
||||
eName: dicGood.name,
|
||||
seqId,
|
||||
quality: dicGood.lv,
|
||||
type: dicGood.goodType
|
||||
}
|
||||
const equip = await EquipModel.createEquip(equipInfo);
|
||||
cnt -= 1;
|
||||
weaponsData.push(equip);
|
||||
}
|
||||
return weaponsData;
|
||||
}
|
||||
Reference in New Issue
Block a user