领取奇遇事件
This commit is contained in:
@@ -1,11 +1,9 @@
|
|||||||
|
|
||||||
import { ActionPointModel } from '../../../db/ActionPoint';
|
import { ActionPointModel } from '../../../db/ActionPoint';
|
||||||
import { BattleDropModel } from '../../../db/BattleDrop';
|
import { BattleDropModel } from '../../../db/BattleDrop';
|
||||||
import { CounterModel } from '../../../db/Counter';
|
|
||||||
import { EquipModel } from '../../../db/Equip';
|
|
||||||
|
|
||||||
import { getWarById, getGoodById } from '../../../util/gamedata';
|
import { getWarById, getGoodById } from '../../../util/gamedata';
|
||||||
import { decodeStr } from '../../../util/util';
|
import { decodeStr, Reward } from '../../../util/util';
|
||||||
import { ACTION_POIN, BATTLE_REWARD_TYPE, GOOD_TYPE } from '../../../consts/consts';
|
import { ACTION_POIN, BATTLE_REWARD_TYPE, GOOD_TYPE } from '../../../consts/consts';
|
||||||
|
|
||||||
export async function getAp(now: number, roleId: string) {
|
export async function getAp(now: number, roleId: string) {
|
||||||
@@ -127,41 +125,9 @@ export class WarReward {
|
|||||||
await this.handleConditionReward(num);
|
await this.handleConditionReward(num);
|
||||||
await this.handleRandomReward(num);
|
await this.handleRandomReward(num);
|
||||||
|
|
||||||
let returnGoods = new Array();
|
let rewardObject = new Reward(this.roleId, this.roleName, this.rewards);
|
||||||
for(let goods of this.rewards) {
|
let returnGoods = await rewardObject.saveReward();
|
||||||
let goodInfo = getGoodById(goods.gid);
|
|
||||||
if(goodInfo.goodType == GOOD_TYPE.EQUIP) { // 装备
|
|
||||||
let result = await this.rewardWeapons(goodInfo, {id: goods.gid, cnt: goods.count });
|
|
||||||
for(let obj of result) {
|
|
||||||
returnGoods.push({dropType: goods.type, ...obj})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return returnGoods;
|
return returnGoods;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private async rewardWeapons (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: this.roleId,
|
|
||||||
roleName: this.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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,8 @@ import { Application, BackendSession, FrontendOrBackendSession } from 'pinus';
|
|||||||
import { getGamedata } from '../../../util/gamedata';
|
import { getGamedata } from '../../../util/gamedata';
|
||||||
import { EventRecordModel } from '../../../db/EventRecord';
|
import { EventRecordModel } from '../../../db/EventRecord';
|
||||||
import { RoleModel } from '../../../db/Role';
|
import { RoleModel } from '../../../db/Role';
|
||||||
import { genCode } from '../../../util/util';
|
import { genCode, decodeStr, decodeStrSingle, Reward } from '../../../util/util';
|
||||||
|
import { EVENT_STATUS, EVENT_RECORD_STATUS, EVENT_TYPE } from '../../../consts/consts';
|
||||||
|
|
||||||
export default function(app: Application) {
|
export default function(app: Application) {
|
||||||
return new EventBattleHandler(app);
|
return new EventBattleHandler(app);
|
||||||
@@ -13,19 +14,78 @@ export class EventBattleHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取关卡列表
|
// 获取关卡列表
|
||||||
async receiveEventReward(msg: { eventCode: string, isSuccess: boolean }, session: BackendSession) {
|
async receiveEventReward(msg: { eventId: number, eventCode: string, isSuccess: boolean }, session: BackendSession) {
|
||||||
|
const {eventId, eventCode, isSuccess} = msg;
|
||||||
|
let roleId = session.get('roleId');
|
||||||
|
let roleName = session.get('roleName');
|
||||||
|
let eventStatus = session.get('eventStatus');
|
||||||
|
|
||||||
|
let event = await EventRecordModel.getEventRecordByCode(roleId, eventCode);
|
||||||
|
if(!event) {
|
||||||
|
return { code: 202, data: '未找到记录' }
|
||||||
|
}
|
||||||
|
let { status, type, eventId: dataEventId } = event;
|
||||||
|
let flag; // 检查状态是否正确
|
||||||
|
if(type == EVENT_TYPE.BATTLE) {
|
||||||
|
if(status == EVENT_RECORD_STATUS.BATTLE_SUCCESS && isSuccess) {
|
||||||
|
flag = true;
|
||||||
|
} else if (status == EVENT_RECORD_STATUS.BATTLE_FAIL && !isSuccess) {
|
||||||
|
flag = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(status == EVENT_RECORD_STATUS.WAITING) {
|
||||||
|
flag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!flag) {
|
||||||
|
return { code: 202, data: '状态错误' }
|
||||||
|
}
|
||||||
|
if(dataEventId != eventId) {
|
||||||
|
return { code: 202, data: '事件id错误' }
|
||||||
|
}
|
||||||
|
let dicEvent = getGamedata('dic_zyz_event');
|
||||||
|
let curEvent = dicEvent.find(cur => cur.eventID == eventId);
|
||||||
|
if(!curEvent) {
|
||||||
|
return { code: 202, data: '未找到该事件' };
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存状态
|
||||||
|
let result = await EventRecordModel.setStatusByCode(roleId, eventCode, isSuccess?EVENT_RECORD_STATUS.SUCCESS_RECEIVED:EVENT_RECORD_STATUS.FAIL_RECEIVED);
|
||||||
|
// 保存奖励
|
||||||
|
let rewardStr = isSuccess?curEvent.winReward:curEvent.loseReward;
|
||||||
|
let rewards = decodeStr('fixReward', rewardStr);
|
||||||
|
let rewardObject = new Reward(roleId, roleName, rewards);
|
||||||
|
let goods = await rewardObject.saveReward();
|
||||||
|
if(eventStatus == EVENT_STATUS.STARTING) { // 如果是第一次开启的挑战,保存成开启状态
|
||||||
|
await RoleModel.setEventStatus(roleId, EVENT_STATUS.OPEN);
|
||||||
|
// 第一场时间挑战完,开始正常刷新事件,所以刷新时间也重置起来
|
||||||
|
session.set('eventStatus', EVENT_STATUS.OPEN);
|
||||||
|
session.push('eventStatus', () => {});
|
||||||
|
}
|
||||||
|
// 推送消息刷新
|
||||||
|
await checkEvent(this.app, session, true);
|
||||||
|
return {
|
||||||
|
code: 200,
|
||||||
|
data: {
|
||||||
|
eventCode: result.eventCode,
|
||||||
|
eventId: result.eventId,
|
||||||
|
status: result.status,
|
||||||
|
goods
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function setBattleStatus(roleId: string, battleId: number , isSuccess: boolean, battleCode: string, eventStatus: number = 0) {
|
export async function setBattleStatus(app: Application, session: FrontendOrBackendSession, roleId: string, battleId: number , isSuccess: boolean, battleCode: string) {
|
||||||
let now = new Date();
|
let now = new Date();
|
||||||
let refTime = eventStatus == 2? getEventTime(now): 0;
|
let eventStatus = session.get('eventStatus');
|
||||||
|
let refTime = eventStatus == EVENT_STATUS.OPEN? getEventTime(now): 0;
|
||||||
|
console.log('***setBattleStatus', eventStatus, refTime)
|
||||||
|
|
||||||
let result = await EventRecordModel.setBattleStatus(roleId, battleId, refTime, isSuccess?1:0, battleCode);
|
|
||||||
if(eventStatus == 1) {
|
let { BATTLE_SUCCESS, BATTLE_FAIL } = EVENT_RECORD_STATUS;
|
||||||
await RoleModel.setEventStatus(roleId, 2);
|
let result = await EventRecordModel.setBattleStatus(roleId, battleId, refTime, isSuccess?BATTLE_SUCCESS:BATTLE_FAIL, battleCode);
|
||||||
}
|
await checkEvent(app, session, true);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,19 +107,19 @@ export function getEventTime(now: Date) {
|
|||||||
|
|
||||||
export async function startEvent(app: Application, session: FrontendOrBackendSession) {
|
export async function startEvent(app: Application, session: FrontendOrBackendSession) {
|
||||||
|
|
||||||
|
// console.log('*******setEventStatus')
|
||||||
let roleId = session.get('roleId');
|
let roleId = session.get('roleId');
|
||||||
let roleName = session.get('roleName');
|
let roleName = session.get('roleName');
|
||||||
let channelName = roleId;
|
let channelName = roleId;
|
||||||
let event = await refreshEvent(1, roleId, roleName, 0);
|
let event = await refreshEvent(1, roleId, roleName, 0); // 刷新初始的一件
|
||||||
await RoleModel.setEventStatus(roleId, 1);
|
await RoleModel.setEventStatus(roleId, EVENT_STATUS.STARTING);
|
||||||
session.set('eventStatus', 1);
|
session.set('eventStatus', EVENT_STATUS.STARTING);
|
||||||
session.push('eventStatus', () => {});
|
session.push('eventStatus', () => {});
|
||||||
// console.log('*******setEventStatus')
|
|
||||||
pushEventMsg(app, roleId, channelName, { event }); // 推送
|
pushEventMsg(app, roleId, channelName, { event }); // 推送
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkEvent(app: Application, session: FrontendOrBackendSession) {
|
export async function checkEvent(app: Application, session: FrontendOrBackendSession, isForce:boolean = false) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
@@ -68,7 +128,7 @@ export async function checkEvent(app: Application, session: FrontendOrBackendSes
|
|||||||
|
|
||||||
let roleName = session.get('roleName');
|
let roleName = session.get('roleName');
|
||||||
let channelName = roleId;
|
let channelName = roleId;
|
||||||
let eventStatus = session.get('eventStatus')||0;
|
let eventStatus = session.get('eventStatus')||EVENT_STATUS.WAITING;
|
||||||
|
|
||||||
let eventTime = session.get('getEventTime')||0;
|
let eventTime = session.get('getEventTime')||0;
|
||||||
let now = new Date();
|
let now = new Date();
|
||||||
@@ -78,14 +138,14 @@ export async function checkEvent(app: Application, session: FrontendOrBackendSes
|
|||||||
let channel = app.get('channelService').getChannel(channelName, false);
|
let channel = app.get('channelService').getChannel(channelName, false);
|
||||||
console.log('****channel', channelName, !!channel, eventTime, t, eventStatus)
|
console.log('****channel', channelName, !!channel, eventTime, t, eventStatus)
|
||||||
|
|
||||||
if(!!channel && eventTime < t) { // 第一次登陆后可以刷新了
|
if(!!channel && (eventTime < t || isForce)) { // 第一次登陆后可以刷新了
|
||||||
session.set('getEventTime', t);
|
|
||||||
session.push('getEventTime', () => {});
|
|
||||||
|
|
||||||
if (eventStatus == 1) {
|
if (eventStatus == EVENT_STATUS.STARTING) {
|
||||||
let event = await EventRecordModel.getEventRecordByTime(roleId, 0);
|
let event = await EventRecordModel.getEventRecordByTime(roleId, 0);
|
||||||
pushEventMsg(app, roleId, channelName, { event }); // 推送
|
pushEventMsg(app, roleId, channelName, { event }); // 推送
|
||||||
} else if( eventStatus == 2 ) {
|
session.set('getEventTime', t);
|
||||||
|
session.push('getEventTime', () => {});
|
||||||
|
} else if( eventStatus == EVENT_STATUS.OPEN ) {
|
||||||
|
|
||||||
let event = await EventRecordModel.getEventRecordByTime(roleId, t);
|
let event = await EventRecordModel.getEventRecordByTime(roleId, t);
|
||||||
if(event.length == 0) { // 刷新
|
if(event.length == 0) { // 刷新
|
||||||
@@ -96,6 +156,8 @@ export async function checkEvent(app: Application, session: FrontendOrBackendSes
|
|||||||
console.log(event)
|
console.log(event)
|
||||||
// 推送
|
// 推送
|
||||||
pushEventMsg(app, roleId, channelName, { event });
|
pushEventMsg(app, roleId, channelName, { event });
|
||||||
|
session.set('getEventTime', t);
|
||||||
|
session.push('getEventTime', () => {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,16 +171,23 @@ export async function checkEvent(app: Application, session: FrontendOrBackendSes
|
|||||||
async function refreshEvent(num: number, roleId: string, roleName: string, t) {
|
async function refreshEvent(num: number, roleId: string, roleName: string, t) {
|
||||||
let event = new Array();
|
let event = new Array();
|
||||||
let dicEvent = getGamedata('dic_zyz_event');
|
let dicEvent = getGamedata('dic_zyz_event');
|
||||||
|
let role = await RoleModel.findByRoleId(roleId);
|
||||||
|
dicEvent = dicEvent.filter(cur => { // 筛选适合等级
|
||||||
|
let { suitLevel } = cur;
|
||||||
|
suitLevel = decodeStrSingle('eventSuitLevel', suitLevel);
|
||||||
|
return suitLevel.min <= role.lv && suitLevel.max >= role.lv
|
||||||
|
});
|
||||||
let historyRecord = await EventRecordModel.getHostoryEventRecord(roleId);
|
let historyRecord = await EventRecordModel.getHostoryEventRecord(roleId);
|
||||||
let {history, turn} = historyRecord;
|
let {history, turn} = historyRecord;
|
||||||
let randomList = dicEvent.filter(cur => {
|
let randomList = dicEvent.filter(cur => {
|
||||||
return history.find(ccur => {
|
return history.find(ccur => {
|
||||||
return ccur.eventId == cur.eventID;
|
return ccur.eventId != cur.eventID;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
console.log(JSON.stringify(randomList));
|
||||||
|
|
||||||
for(let i = 0; i < num; i++) {
|
for(let i = 0; i < num; i++) {
|
||||||
if(randomList.length == 0) { // 刷过新的一轮了
|
if(randomList.length == 0) { // 一轮刷新过,开始新的一轮,保证所有事件都能刷新一遍
|
||||||
turn ++;
|
turn ++;
|
||||||
randomList = [...dicEvent];
|
randomList = [...dicEvent];
|
||||||
}
|
}
|
||||||
@@ -128,7 +197,8 @@ async function refreshEvent(num: number, roleId: string, roleName: string, t) {
|
|||||||
let eventCode = genCode(8);
|
let eventCode = genCode(8);
|
||||||
let data = await EventRecordModel.saveEventRecord(eventCode, {
|
let data = await EventRecordModel.saveEventRecord(eventCode, {
|
||||||
roleId, refTime: t, eventId: dic.eventID,
|
roleId, refTime: t, eventId: dic.eventID,
|
||||||
roleName, turn, type: dic.eventType, battleId: dic.warId||0, quality: dic.quality
|
roleName, turn, type: dic.eventType, battleId: dic.warId||0, quality: dic.quality,
|
||||||
|
status: EVENT_RECORD_STATUS.WAITING
|
||||||
});
|
});
|
||||||
event.push(data)
|
event.push(data)
|
||||||
randomList.splice(index, 1);
|
randomList.splice(index, 1);
|
||||||
|
|||||||
@@ -131,9 +131,9 @@ export class NormalBattleHandler {
|
|||||||
return {code: 202, data: checkResult.msg}
|
return {code: 202, data: checkResult.msg}
|
||||||
}
|
}
|
||||||
dailyNum = { type: checkResult.type, count: checkResult.count, sum: checkResult.sum };
|
dailyNum = { type: checkResult.type, count: checkResult.count, sum: checkResult.sum };
|
||||||
} else if (warInfo.war_type == WAR_TYPE.EVENT) {
|
} else if (warInfo.warType == WAR_TYPE.EVENT) {
|
||||||
// 记录事件状态
|
// 记录事件状态
|
||||||
await setBattleStatus(roleId, battleId, isSuccess, battleCode, session.get('eventStatus'));
|
await setBattleStatus(this.app, session, roleId, battleId, isSuccess, battleCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
let warReward = new WarReward(roleId, roleName, battleId, isSuccess);
|
let warReward = new WarReward(roleId, roleName, battleId, isSuccess);
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
|
|
||||||
|
import { getWarById, getGoodById } from './gamedata';
|
||||||
|
import { CounterModel } from '../db/Counter';
|
||||||
|
import { EquipModel } from '../db/Equip';
|
||||||
|
import { GOOD_TYPE } from '../consts/consts';
|
||||||
|
|
||||||
export function genCode(len) {
|
export function genCode(len) {
|
||||||
const chars = '123456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijklmnopqrstuvwxyz';
|
const chars = '123456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijklmnopqrstuvwxyz';
|
||||||
@@ -11,29 +15,96 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function decodeStr(type, str) {
|
export function decodeStr(type, str) {
|
||||||
if(str == '&') {
|
if(str == '&'|| !str) {
|
||||||
return []
|
return []
|
||||||
} else {
|
} else {
|
||||||
return str.split('|').map(cur => {
|
return str.split('|').map(cur => {
|
||||||
let arr = cur.split('&');
|
return decodeStrSingle(type,cur);
|
||||||
let result = {};
|
|
||||||
switch (type) {
|
|
||||||
case 'fixReward': {
|
|
||||||
let [gid, count] = arr;
|
|
||||||
result = { gid: parseInt(gid), count: parseInt(count)};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'conditionReward': {
|
|
||||||
let [gid, count, condition] = arr;
|
|
||||||
result = { gid: parseInt(gid), count: parseInt(count), condition: parseInt(condition) };
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'randomReward': {
|
|
||||||
let [gid, count, frequency] = arr;
|
|
||||||
result = { gid: parseInt(gid), count: parseInt(count), frequency: parseInt(frequency) };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function decodeStrSingle(type, str) { //单层,返回对象而不是数组
|
||||||
|
if(str == '&'|| !str) {
|
||||||
|
return {}
|
||||||
|
} else {
|
||||||
|
let arr = str.split('&');
|
||||||
|
let result = {};
|
||||||
|
switch (type) {
|
||||||
|
case 'fixReward': {
|
||||||
|
let [gid, count] = arr;
|
||||||
|
if(isNaN(gid) || isNaN(count)) throw new Error('格式错误');
|
||||||
|
result = { gid: parseInt(gid), count: parseInt(count)};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'conditionReward': {
|
||||||
|
let [gid, count, condition] = arr;
|
||||||
|
if(isNaN(gid) || isNaN(count)) throw new Error('格式错误');
|
||||||
|
result = { gid: parseInt(gid), count: parseInt(count), condition: parseInt(condition) };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'randomReward': {
|
||||||
|
let [gid, count, frequency] = arr;
|
||||||
|
if(isNaN(gid) || isNaN(count)) throw new Error('格式错误');
|
||||||
|
result = { gid: parseInt(gid), count: parseInt(count), frequency: parseInt(frequency) };
|
||||||
|
}
|
||||||
|
case 'eventSuitLevel': {
|
||||||
|
let [min, max] = arr;
|
||||||
|
if(isNaN(min) || isNaN(max)) throw new Error('格式错误');
|
||||||
|
result = { min: parseInt(min), max: parseInt(max) };
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取物品
|
||||||
|
export class Reward {
|
||||||
|
roleId: string;
|
||||||
|
roleName: string;
|
||||||
|
rewards: Array<{type?: number, gid: number, count: number}>;
|
||||||
|
|
||||||
|
constructor(roleId: string, roleName: string, rewards: Array<{type?: number, gid: number, count: number}>) {
|
||||||
|
this.roleId = roleId;
|
||||||
|
this.roleName = roleName;
|
||||||
|
this.rewards = rewards;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async saveReward() {
|
||||||
|
|
||||||
|
let returnGoods = new Array();
|
||||||
|
for(let goods of this.rewards) {
|
||||||
|
let goodInfo = getGoodById(goods.gid);
|
||||||
|
if(goodInfo.goodType == GOOD_TYPE.EQUIP) { // 装备
|
||||||
|
let result = await this.rewardWeapons(goodInfo, {id: goods.gid, cnt: goods.count });
|
||||||
|
for(let obj of result) {
|
||||||
|
returnGoods.push({dropType: goods.type, ...obj})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnGoods;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async rewardWeapons (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: this.roleId,
|
||||||
|
roleName: this.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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -37,4 +37,27 @@ export const WAR_TYPE = {
|
|||||||
TOWER: 4
|
TOWER: 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 存于用户Role表,事件开启状态
|
||||||
|
export const EVENT_STATUS = {
|
||||||
|
WAITING: 0, // 未开启
|
||||||
|
STARTING: 1, // 初步触发,等到挑战完成
|
||||||
|
OPEN: 2 // 开启
|
||||||
|
};
|
||||||
|
|
||||||
|
// 奇遇事件状态
|
||||||
|
export const EVENT_RECORD_STATUS = {
|
||||||
|
WAITING: 0, // 初始状态
|
||||||
|
BATTLE_SUCCESS: 1, // 挑战成功,待领取成功奖励
|
||||||
|
BATTLE_FAIL: 2, // 挑战失败,可领取失败奖励
|
||||||
|
SUCCESS_RECEIVED: 3, // 领取成功奖励
|
||||||
|
FAIL_RECEIVED: 4 // 领取了失败奖励
|
||||||
|
};
|
||||||
|
|
||||||
|
// 奇遇事件类型
|
||||||
|
export const EVENT_TYPE = {
|
||||||
|
BOX: 1, // 宝箱
|
||||||
|
QUIZ: 2, // 答题
|
||||||
|
BATTLE: 3 // 战斗
|
||||||
|
};
|
||||||
|
|
||||||
export const EVENT_START_BATTLE = 101;
|
export const EVENT_START_BATTLE = 101;
|
||||||
@@ -4,7 +4,8 @@ import { index, getModelForClass, prop } from '@typegoose/typegoose';
|
|||||||
/**
|
/**
|
||||||
* 战斗记录接口
|
* 战斗记录接口
|
||||||
*/
|
*/
|
||||||
@index({ roleId: 1, type: 1 })
|
@index({ roleId: 1, eventId: 1 })
|
||||||
|
@index({ roleId: 1, eventCode: 1 })
|
||||||
|
|
||||||
export default class EventRecord extends BaseModel {
|
export default class EventRecord extends BaseModel {
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
@@ -17,15 +18,17 @@ export default class EventRecord extends BaseModel {
|
|||||||
eventId: number; // 事件 id
|
eventId: number; // 事件 id
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
type: number; // 事件类型
|
type: number; // 事件类型
|
||||||
|
@prop({ required: true })
|
||||||
|
quality: number; // 事件品质
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
status: number; // 状态 1-已达成 0-未达成 -1-失败
|
status: number; // 状态 0-初始状态 1-挑战成功 2-挑战失败 3-领取成功奖励 4-领取了失败奖励
|
||||||
@prop({ required: true, default: 0 })
|
|
||||||
battleStatus: number; // 状态 1-成功 -1-失败
|
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
refTime: number; // 刷新时间
|
refTime: number; // 刷新时间
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
battleId: number; // 关卡类型,关卡id
|
battleId: number; // 关卡类型,关卡id
|
||||||
@prop({ required: true, default: 0 })
|
@prop({ required: true, default: 0 })
|
||||||
|
battleCode: string; // 关卡类型,关卡code
|
||||||
|
@prop({ required: true, default: 0 })
|
||||||
turn: number; // 随机的轮数,保证每个event_id都能随机到一次再进行下一轮
|
turn: number; // 随机的轮数,保证每个event_id都能随机到一次再进行下一轮
|
||||||
|
|
||||||
|
|
||||||
@@ -34,6 +37,10 @@ export default class EventRecord extends BaseModel {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async getEventRecordByCode(roleId: string, eventCode: string, lean=true ) {
|
||||||
|
let data = await EventRecordModel.findOne({roleId, eventCode}).lean(lean);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
public static async getHostoryEventRecord(roleId: string, lean=true) {
|
public static async getHostoryEventRecord(roleId: string, lean=true) {
|
||||||
let latest = await EventRecordModel.findOne({roleId}).sort({turn: -1}).lean();
|
let latest = await EventRecordModel.findOne({roleId}).sort({turn: -1}).lean();
|
||||||
let {turn = 0} = latest||{};
|
let {turn = 0} = latest||{};
|
||||||
@@ -41,13 +48,18 @@ export default class EventRecord extends BaseModel {
|
|||||||
return {history: result, turn};
|
return {history: result, turn};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async saveEventRecord(eventCode: string, params: {roleId: string, refTime: number, eventId: number, roleName:string, turn: number, type: number, quality: number, battleId?: number } , lean=true ) {
|
public static async saveEventRecord(eventCode: string, params: {roleId: string, refTime: number, eventId: number, roleName:string, turn: number, type: number, quality: number, battleId?: number, status: number } , lean=true ) {
|
||||||
let data = await EventRecordModel.findOneAndUpdate({eventCode}, { $set: {...params, status: 0 } }, {upsert: true, new: true}).select('eventCode eventId type quality status battleId').lean(lean);
|
let data = await EventRecordModel.findOneAndUpdate({eventCode}, { $set: {...params } }, {upsert: true, new: true}).select('eventCode eventId type quality status battleId').lean(lean);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async setBattleStatus(roleId: string, battleId: number, refTime: number, battleStatus: number, battleCode: string , lean=true ) {
|
public static async setBattleStatus(roleId: string, battleId: number, refTime: number, status: number, battleCode: string , lean=true ) {
|
||||||
let result = await EventRecordModel.findOneAndUpdate({roleId, battleId, refTime}, {$set:{ battleStatus, battleCode }}).sort({turn: 1}).lean(lean);
|
let result = await EventRecordModel.findOneAndUpdate({roleId, battleId, refTime}, {$set:{ status, battleCode }}).sort({turn: 1}).lean(lean);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async setStatusByCode(roleId: string, eventCode: string, status: number , lean=true ) {
|
||||||
|
let result = await EventRecordModel.findOneAndUpdate({ roleId, eventCode }, {$set:{ status }}).lean(lean);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1,227 @@
|
|||||||
[{"eventID":1,"eventType":1,"quality":1,"name":"天降宝箱*铜币","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":0,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0},{"eventID":2,"eventType":1,"quality":1,"name":"天降宝箱*元宝","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":0,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0},{"eventID":3,"eventType":1,"quality":1,"name":"天降宝箱*材料","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":0,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0},{"eventID":4,"eventType":2,"quality":1,"name":"答题*体力","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":0,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0},{"eventID":5,"eventType":2,"quality":1,"name":"答题*将魂","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":0,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0},{"eventID":6,"eventType":2,"quality":1,"name":"答题*经验书","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":0,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0},{"eventID":7,"eventType":3,"quality":1,"name":"山贼拦路*待定","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":2001,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0},{"eventID":8,"eventType":3,"quality":1,"name":"救援村落*待定","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":2002,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0},{"eventID":9,"eventType":3,"quality":1,"name":"比武切磋*待定","sSpineInUI":0,"rScriptId":0,"winReward":0,"loseReward":0,"suitLevel":"1&20","warId":2003,"__EMPTY":0,"__EMPTY_1":0,"__EMPTY_2":0,"__EMPTY_3":0,"__EMPTY_4":0,"__EMPTY_5":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"starInfoInUI":0,"cost":0,"recommendedPower":0,"previousGk":0}]
|
[
|
||||||
|
{
|
||||||
|
"eventID": 1,
|
||||||
|
"eventType": 1,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "天降宝箱*铜币",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 0,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"eventID": 2,
|
||||||
|
"eventType": 1,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "天降宝箱*元宝",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 0,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"eventID": 3,
|
||||||
|
"eventType": 1,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "天降宝箱*材料",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 0,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"eventID": 4,
|
||||||
|
"eventType": 2,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "答题*体力",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 0,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"eventID": 5,
|
||||||
|
"eventType": 2,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "答题*将魂",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 0,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"eventID": 6,
|
||||||
|
"eventType": 2,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "答题*经验书",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 0,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"eventID": 7,
|
||||||
|
"eventType": 3,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "山贼拦路*待定",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 2001,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"eventID": 8,
|
||||||
|
"eventType": 3,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "救援村落*待定",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 2002,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"eventID": 9,
|
||||||
|
"eventType": 3,
|
||||||
|
"quality": 1,
|
||||||
|
"name": "比武切磋*待定",
|
||||||
|
"sSpineInUI": 0,
|
||||||
|
"rScriptId": 0,
|
||||||
|
"winReward": "1&2",
|
||||||
|
"loseReward": "1&1",
|
||||||
|
"suitLevel": "1&20",
|
||||||
|
"warId": 2003,
|
||||||
|
"__EMPTY": 0,
|
||||||
|
"__EMPTY_1": 0,
|
||||||
|
"__EMPTY_2": 0,
|
||||||
|
"__EMPTY_3": 0,
|
||||||
|
"__EMPTY_4": 0,
|
||||||
|
"__EMPTY_5": 0,
|
||||||
|
"fobiddenCharactor": 0,
|
||||||
|
"victoryInfoInUI": 0,
|
||||||
|
"loseInfoInUI": 0,
|
||||||
|
"starInfoInUI": 0,
|
||||||
|
"cost": 0,
|
||||||
|
"recommendedPower": 0,
|
||||||
|
"previousGk": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1 +1,56 @@
|
|||||||
[{"war_id":2001,"dispatchJsonId":2001,"bg_img_id":2001,"script_id":0,"fixReward":"&","warType":4,"gk_name":"奇遇&拦路山贼","kingExp":100,"lvLimted":1,"turnLimted":20,"forcedCharactor":"&","fobiddenCharactor":"&","victoryInfoInUI":"消失所有敌军","loseInfoInUI":"我方全部阵亡","cost":15,"recommendedPower":10008},{"war_id":2002,"dispatchJsonId":2002,"bg_img_id":2002,"script_id":0,"fixReward":"&","warType":4,"gk_name":"奇遇&比武切磋","kingExp":100,"lvLimted":1,"turnLimted":20,"forcedCharactor":"&","fobiddenCharactor":"&","victoryInfoInUI":"消失所有敌军","loseInfoInUI":"我方全部阵亡","cost":15,"recommendedPower":10008},{"war_id":2003,"dispatchJsonId":0,"bg_img_id":0,"script_id":0,"fixReward":0,"warType":0,"gk_name":0,"kingExp":0,"lvLimted":0,"turnLimted":0,"forcedCharactor":0,"fobiddenCharactor":0,"victoryInfoInUI":0,"loseInfoInUI":0,"cost":0,"recommendedPower":0}]
|
[
|
||||||
|
{
|
||||||
|
"war_id": 2001,
|
||||||
|
"dispatchJsonId": 2001,
|
||||||
|
"bg_img_id": 2001,
|
||||||
|
"script_id": 0,
|
||||||
|
"fixReward": "&",
|
||||||
|
"warType": 3,
|
||||||
|
"gk_name": "奇遇&拦路山贼",
|
||||||
|
"kingExp": 100,
|
||||||
|
"lvLimted": 1,
|
||||||
|
"turnLimted": 20,
|
||||||
|
"forcedCharactor": "&",
|
||||||
|
"fobiddenCharactor": "&",
|
||||||
|
"victoryInfoInUI": "消失所有敌军",
|
||||||
|
"loseInfoInUI": "我方全部阵亡",
|
||||||
|
"cost": 15,
|
||||||
|
"recommendedPower": 10008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"war_id": 2002,
|
||||||
|
"dispatchJsonId": 2002,
|
||||||
|
"bg_img_id": 2002,
|
||||||
|
"script_id": 0,
|
||||||
|
"fixReward": "&",
|
||||||
|
"warType": 3,
|
||||||
|
"gk_name": "奇遇&比武切磋",
|
||||||
|
"kingExp": 100,
|
||||||
|
"lvLimted": 1,
|
||||||
|
"turnLimted": 20,
|
||||||
|
"forcedCharactor": "&",
|
||||||
|
"fobiddenCharactor": "&",
|
||||||
|
"victoryInfoInUI": "消失所有敌军",
|
||||||
|
"loseInfoInUI": "我方全部阵亡",
|
||||||
|
"cost": 15,
|
||||||
|
"recommendedPower": 10008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"war_id": 2003,
|
||||||
|
"dispatchJsonId": 2003,
|
||||||
|
"bg_img_id": 2003,
|
||||||
|
"script_id": 0,
|
||||||
|
"fixReward": "&",
|
||||||
|
"warType": 3,
|
||||||
|
"gk_name": "奇遇&比武切磋",
|
||||||
|
"kingExp": 100,
|
||||||
|
"lvLimted": 1,
|
||||||
|
"turnLimted": 20,
|
||||||
|
"forcedCharactor": "&",
|
||||||
|
"fobiddenCharactor": "&",
|
||||||
|
"victoryInfoInUI": "消失所有敌军",
|
||||||
|
"loseInfoInUI": "我方全部阵亡",
|
||||||
|
"cost": 15,
|
||||||
|
"recommendedPower": 10008
|
||||||
|
}
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user