HJ_Server/src/public/dxlt.ts

142 lines
5.1 KiB
TypeScript

import { ApiCall } from 'tsrpc';
import { ResOpen } from '../shared/protocols/dixialeitai/PtlOpen';
import { PublicShared } from '../shared/public/public';
export class DxltFun {
/**修改数据 */
static async changeData(call: ApiCall, change: Partial<ResOpen>) {
let data = await this.getData(call);
Object.assign(data, change);
G.ioredis.set(`dxlt:${call.uid}`, JSON.stringify(data));
G.mongodb.collection('dxlt').updateOne({ uid: call.uid }, { $set: { ...change } });
return change;
}
static async getData(call: ApiCall) {
return JSON.parse(await G.ioredis.get(`dxlt:${call.uid}`)) ;
}
/**回退层数 */
static backLayer(data: ResOpen) {
let num = data.curLayer - G.gc.dxlt_com.dayResetBackLayer;
data.curLayer = num < 1 ? 1 : num;
data.over = G.gc.dxlt_layer[data.curLayer].type == 2;
}
/**扫荡 */
static saodan(data: ResOpen, num?: number) {
let prizeNum = 0;
data.saodang = {
item: {},
buff: {}
};
let conf = G.gc.dxlt_layer[data.curLayer];
if (conf.isBoss) {
let random = PublicShared.randomDropAny(G.gc.dxlt_com.fightPrizeBoss.random);
if (random.dlz) data.saodang.prize = PublicShared.randomDropGroup(random.dlz);
if (random.mibaoNum) data.saodang.mibaoNum = random.mibaoNum;
} else {
let r = PublicShared.randomDropAny(G.gc.dxlt_com.fightPrize.random);
switch (r.type) {
case 'item':
let item = PublicShared.randomDropAny(r.rd);
let itemObj = Object.fromEntries(Object.keys(item).filter(k => k == 'id').map(k => [item[k], 1]));
PublicShared.mergeProperty(data.saodang.item, itemObj);
PublicShared.mergeProperty(data.item, itemObj);
break;
case 'buff':
let buff = PublicShared.randomDropAny(r.rd);
let buffObj = Object.fromEntries(Object.keys(buff).filter(k => k == 'id').map(k => [buff[k], 1]));
PublicShared.mergeProperty(data.saodang.buff, buffObj);
PublicShared.mergeProperty(data.buff, buffObj);
break;
case 'prize':
prizeNum++;
break;
case 'shop':
data.saodang.shop = true;
break;
}
if (prizeNum > 0) {
data.saodang.prize = PublicShared.randomDropGroup(G.gc.dxlt_com.fightPrize.prizeDlz, prizeNum);
}
}
}
/**获取buff */
static getBuff(data: ResOpen) {
let buff = {};
Object.entries(data.buff).forEach(b => {
PublicShared.mergeProperty(buff, G.gc.dxlt_com.fightPrize.buff[b[0]]);
buff[b[0]] *= b[1];
});
return buff;
}
/**通关一层后修改数据 */
static passLayerChange(data: ResOpen, change: Partial<ResOpen>) {
if (data.curLayer > data.maxLayer) change.maxLayer = data.curLayer;
if (data.curLayer > data.curMaxLayer) change.curMaxLayer = data.curLayer;
if (data.recordLayer < G.gc.dxlt_com.getMiBaoByFightNum * G.gc.dxlt_com.getPrizeByMiBaoNum) change.recordLayer = data.recordLayer + 1;
}
/**修改商店 */
static changeShop(data: ResOpen, change: Partial<ResOpen>) {
let shop = PublicShared.randomDropAny(Object.values(G.gc.dxlt_shop));
if (data.shop[shop.id]) {
data.shop[shop.id].buyNum++;
} else {
data.shop[shop.id] = {
...shop,
useBuyNum: 0
};
}
change.shop = data.shop;
}
/**红点 子函数 */
static async getFinish(call: ApiCall, _type: string, data) {
let ishd: 0 | 1 = 0;
let _val = _type == 'killPrizeRec' ? (data.killBoss || 0) : data.maxLayer;
let _taskCon = _type == 'killPrizeRec' ? G.gc.dxlt_com.killPrize : G.gc.dxlt_com.passPrize;
for (let indexTask = 0; indexTask < _taskCon.length; indexTask++) {
const elementTask = _taskCon[indexTask];
if (elementTask.need > _val) continue;
if (data[_type].includes(indexTask)) continue;
ishd = 1;
break;
}
return ishd;
}
/**红点 */
static async getHongDian(call: ApiCall) {
let _res = {
show: false
};
let data = await this.getData(call);
if (!data) return _res;
if (data.recordLayer / G.gc.dxlt_com.getMiBaoByFightNum >= G.gc.dxlt_com.getPrizeByMiBaoNum) {
// 秘宝奖励
_res.show = true;
}
if (!_res.show) {
const _type = ['killPrizeRec'];
for (let index = 0; index < _type.length; index++) {
const element = _type[index];
let ishd = await this.getFinish(call, element, data);
if (ishd) {
_res.show = true;
break;
}
}
}
return _res;
}
}