主线:添加宝箱
This commit is contained in:
@@ -2,7 +2,7 @@ import { Application, BackendSession, HandlerService, } from 'pinus';
|
|||||||
import { BattleRecordModel } from '../../../db/BattleRecord';
|
import { BattleRecordModel } from '../../../db/BattleRecord';
|
||||||
import { BattleSweepRecordModel } from '../../../db/BattleSweepRecord';
|
import { BattleSweepRecordModel } from '../../../db/BattleSweepRecord';
|
||||||
import { genCode, getReasonByWarType, getWarTypeName } from '../../../pubUtils/util';
|
import { genCode, getReasonByWarType, getWarTypeName } from '../../../pubUtils/util';
|
||||||
import { WAR_TYPE, EVENT_STATUS, FUNC_OPT_TYPE, MSG_SOURCE, REDIS_KEY, TASK_TYPE, KING_EXP_RATIO_TYPE, TA_EVENT } from '../../../consts';
|
import { WAR_TYPE, EVENT_STATUS, FUNC_OPT_TYPE, MSG_SOURCE, REDIS_KEY, TASK_TYPE, KING_EXP_RATIO_TYPE, TA_EVENT, ITEM_CHANGE_REASON } from '../../../consts';
|
||||||
import { checkDaily, checkDailyAndIncrease } from '../../../services/dailyBattleService';
|
import { checkDaily, checkDailyAndIncrease } from '../../../services/dailyBattleService';
|
||||||
import { checkTowerWar, towerBattleEnd } from '../../../services/battleService';
|
import { checkTowerWar, towerBattleEnd } from '../../../services/battleService';
|
||||||
import { WarReward } from '../../../services/warRewardService';
|
import { WarReward } from '../../../services/warRewardService';
|
||||||
@@ -12,7 +12,7 @@ import { STATUS } from '../../../consts/statusCode';
|
|||||||
import { resResult } from '../../../pubUtils/util';
|
import { resResult } from '../../../pubUtils/util';
|
||||||
import { RoleModel } from '../../../db/Role';
|
import { RoleModel } from '../../../db/Role';
|
||||||
import { RScriptRecordModel } from '../../../db/RScriptRecord';
|
import { RScriptRecordModel } from '../../../db/RScriptRecord';
|
||||||
import { checkBattleHeroes, roleLevelup, getBattleList, calculateWarStar, getBattleListOfTypes } from '../../../services/normalBattleService';
|
import { checkBattleHeroes, roleLevelup, getBattleList, calculateWarStar, getBattleListOfTypes, getMainChapter, getStarOfChapter } from '../../../services/normalBattleService';
|
||||||
import { checkDungeonNum, checkDungeonAndIncrease, saveDungeonFirst } from '../../../services/dungeonService';
|
import { checkDungeonNum, checkDungeonAndIncrease, saveDungeonFirst } from '../../../services/dungeonService';
|
||||||
// import { switchOnFunc } from '../../../services/funcSwitchService';
|
// import { switchOnFunc } from '../../../services/funcSwitchService';
|
||||||
import { gameData } from '../../../pubUtils/data';
|
import { gameData } from '../../../pubUtils/data';
|
||||||
@@ -26,7 +26,9 @@ import { challengeDailyGK } from '../../../services/activity/dailyGKService';
|
|||||||
import { challengeNewHeroGK } from '../../../services/activity/newHeroGKService';
|
import { challengeNewHeroGK } from '../../../services/activity/newHeroGKService';
|
||||||
import { reportTAEvent } from '../../../services/sdkService';
|
import { reportTAEvent } from '../../../services/sdkService';
|
||||||
import { getVipRegretCnt } from '../../../services/activity/monthlyTicketService';
|
import { getVipRegretCnt } from '../../../services/activity/monthlyTicketService';
|
||||||
import { isNumber } from 'underscore';
|
import { isArray, isNumber } from 'underscore';
|
||||||
|
import { RewardInter } from '../../../pubUtils/interface';
|
||||||
|
import { addItems } from '../../../services/rewardService';
|
||||||
|
|
||||||
export default function (app: Application) {
|
export default function (app: Application) {
|
||||||
new HandlerService(app, {});
|
new HandlerService(app, {});
|
||||||
@@ -117,6 +119,8 @@ export class NormalBattleHandler {
|
|||||||
// 关卡列表
|
// 关卡列表
|
||||||
async getBattleList(msg: { types: number[] }, session: BackendSession) {
|
async getBattleList(msg: { types: number[] }, session: BackendSession) {
|
||||||
const { types } = msg;
|
const { types } = msg;
|
||||||
|
if(!isArray(types)) return resResult(STATUS.WRONG_PARMS);
|
||||||
|
|
||||||
let roleId = session.get('roleId');
|
let roleId = session.get('roleId');
|
||||||
|
|
||||||
let role = await RoleModel.findByRoleId(roleId);
|
let role = await RoleModel.findByRoleId(roleId);
|
||||||
@@ -422,4 +426,48 @@ export class NormalBattleHandler {
|
|||||||
|
|
||||||
return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt||0, maxRegretCnt });
|
return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt||0, maxRegretCnt });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getMainStarBox(msg: {}, session: BackendSession) {
|
||||||
|
let roleId = session.get('roleId');
|
||||||
|
let role = await RoleModel.findByRoleId(roleId, 'warStar receivedBox');
|
||||||
|
|
||||||
|
let result = getMainChapter(role);
|
||||||
|
return resResult(STATUS.SUCCESS, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关卡列表
|
||||||
|
async receiveChapterBox(msg: { chapter: number, id: number }, session: BackendSession) {
|
||||||
|
const { id, chapter } = msg;
|
||||||
|
if(!isNumber(id)) return resResult(STATUS.WRONG_PARMS);
|
||||||
|
|
||||||
|
let roleId = session.get('roleId');
|
||||||
|
let roleName = session.get('roleName');
|
||||||
|
let sid = session.get('sid');
|
||||||
|
|
||||||
|
let role = await RoleModel.findByRoleId(roleId, 'warStar receivedBox');
|
||||||
|
let ids: number[] = [];
|
||||||
|
let rewards: RewardInter[] = [];
|
||||||
|
let starOfChapter = getStarOfChapter(role.warStar);
|
||||||
|
|
||||||
|
let boxIds = id == 0? gameData.mainBoxByChapter.get(chapter): [id];
|
||||||
|
|
||||||
|
for(let id of boxIds) {
|
||||||
|
let dicBox = gameData.mainBox.get(id);
|
||||||
|
if(dicBox && dicBox.chapter == chapter) {
|
||||||
|
let star = starOfChapter.get(chapter)
|
||||||
|
if(star >= dicBox.star) {
|
||||||
|
rewards.push(...dicBox.reward);
|
||||||
|
ids.push(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ids.length <= 0) return resResult(STATUS.BATTLE_NO_BOX_CAN_RECEIVE);
|
||||||
|
role = await RoleModel.receivedBox(roleId, ids);
|
||||||
|
let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX)
|
||||||
|
|
||||||
|
let result = getMainChapter(role);
|
||||||
|
return resResult(STATUS.SUCCESS, {
|
||||||
|
...result, goods
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import { getGuildTrainInstance, getTrainBoxRewardsResult } from './guildTrainSer
|
|||||||
import { BossInstanceModel } from '../db/BossInstance';
|
import { BossInstanceModel } from '../db/BossInstance';
|
||||||
import { getBossInstanceInfo } from './guildBossService';
|
import { getBossInstanceInfo } from './guildBossService';
|
||||||
import { getEvent } from './eventSercive';
|
import { getEvent } from './eventSercive';
|
||||||
import { getBattleListOfMain } from './normalBattleService';
|
import { getBattleListOfMain, getMainChapter } from './normalBattleService';
|
||||||
import { GuildType } from '../db/Guild';
|
import { GuildType } from '../db/Guild';
|
||||||
import UserGuild, { UserGuildType } from '../db/UserGuild';
|
import UserGuild, { UserGuildType } from '../db/UserGuild';
|
||||||
import { setPreDayActiveData, getAllGuildActivityStatus } from './guildActivity/guildActivityService';
|
import { setPreDayActiveData, getAllGuildActivityStatus } from './guildActivity/guildActivityService';
|
||||||
@@ -154,7 +154,8 @@ async function getModuleData(type: string, data: { role: RoleType, session: Fron
|
|||||||
return await getBattleListOfMain(role);
|
return await getBattleListOfMain(role);
|
||||||
case 'guildActivity':
|
case 'guildActivity':
|
||||||
return getAllGuildActivityStatus();
|
return getAllGuildActivityStatus();
|
||||||
|
case 'chapter':
|
||||||
|
return getMainChapter(role);
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,3 +194,31 @@ export async function getBattleList(role: RoleType, type: number) {
|
|||||||
result = result.sort((a, b) => { return a.battleId - b.battleId });
|
result = result.sort((a, b) => { return a.battleId - b.battleId });
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getStarOfChapter(warStar: WarStar[]) {
|
||||||
|
let map = new Map<number, number>();
|
||||||
|
for(let { id, star } of warStar ) {
|
||||||
|
let dicWar = gameData.war.get(id);
|
||||||
|
if(dicWar.warType == WAR_TYPE.NORMAL && star > 0) {
|
||||||
|
if(!map.has(dicWar.chapter)) {
|
||||||
|
map.set(dicWar.chapter, star);
|
||||||
|
} else {
|
||||||
|
map.set(dicWar.chapter, map.get(dicWar.chapter) + star);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMainChapter(role: RoleType) {
|
||||||
|
let chapterMap = getStarOfChapter(role.warStar);
|
||||||
|
let chapterArr: { chapter: number, star: number }[] = [];
|
||||||
|
for(let [ chapter, star ] of chapterMap) {
|
||||||
|
chapterArr.push({ chapter, star });
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
star: chapterArr,
|
||||||
|
receivedBox: role.receivedBox||[],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -537,6 +537,7 @@ export const FILENAME = {
|
|||||||
DIC_JEWEL: 'dic_zyz_jewel',
|
DIC_JEWEL: 'dic_zyz_jewel',
|
||||||
DIC_STONE: 'dic_zyz_stone',
|
DIC_STONE: 'dic_zyz_stone',
|
||||||
DIC_JEWEL_CONDITION: 'dic_zyz_jewel_condition',
|
DIC_JEWEL_CONDITION: 'dic_zyz_jewel_condition',
|
||||||
|
DIC_MAIN_STAR_BOX: 'dic_zyz_main_star_reward',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const WAR_RELATE_TABLES = [
|
export const WAR_RELATE_TABLES = [
|
||||||
@@ -1006,6 +1007,7 @@ export enum ITEM_CHANGE_REASON {
|
|||||||
ACT_TASK_PASS = 142, // 活动-战令奖励
|
ACT_TASK_PASS = 142, // 活动-战令奖励
|
||||||
ACT_TASK_PASS_SPD_UP = 143, // 活动-战令加速
|
ACT_TASK_PASS_SPD_UP = 143, // 活动-战令加速
|
||||||
ACT_GUILD_PAY_REWARD = 144, // 活动-军团人数奖励
|
ACT_GUILD_PAY_REWARD = 144, // 活动-军团人数奖励
|
||||||
|
RECEIVE_CHAPTER_BOX = 145, // 领取主线章节宝箱
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum TA_EVENT {
|
export enum TA_EVENT {
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ export const STATUS = {
|
|||||||
// 主线 20100 - 20199
|
// 主线 20100 - 20199
|
||||||
BATTLE_INFO_VALIDATE_ERR: { code: 20101, simStr: '关卡信息不同' },
|
BATTLE_INFO_VALIDATE_ERR: { code: 20101, simStr: '关卡信息不同' },
|
||||||
BATTLE_SWEEP_CONDITION_STAR: { code: 20102, simStr: '需要3星通过关卡才可以扫荡' },
|
BATTLE_SWEEP_CONDITION_STAR: { code: 20102, simStr: '需要3星通过关卡才可以扫荡' },
|
||||||
|
BATTLE_NO_BOX_CAN_RECEIVE: { code: 20103, simStr: '宝箱不可领取' },
|
||||||
// 每日 20200 - 20299
|
// 每日 20200 - 20299
|
||||||
DAILY_WAR_NOT_FOUND: { code: 20201, simStr: '未找到该关卡' },
|
DAILY_WAR_NOT_FOUND: { code: 20201, simStr: '未找到该关卡' },
|
||||||
DAILY_TYPE_NOT_FOUND: { code: 20202, simStr: '未找到该类型' },
|
DAILY_TYPE_NOT_FOUND: { code: 20202, simStr: '未找到该类型' },
|
||||||
|
|||||||
@@ -326,6 +326,8 @@ export default class Role extends BaseModel {
|
|||||||
rankReceived: number[]; // 已领取奖励
|
rankReceived: number[]; // 已领取奖励
|
||||||
@prop({ required: true, default: [], type: Number })
|
@prop({ required: true, default: [], type: Number })
|
||||||
guide: number[]; // 引导
|
guide: number[]; // 引导
|
||||||
|
@prop({ required: true, default: [], type: Number })
|
||||||
|
receivedBox: number[]; // 引导
|
||||||
|
|
||||||
@prop({ required: true, default: false })
|
@prop({ required: true, default: false })
|
||||||
gachaHasGuide: boolean; // 是否进行过引导特殊招募
|
gachaHasGuide: boolean; // 是否进行过引导特殊招募
|
||||||
@@ -774,6 +776,10 @@ export default class Role extends BaseModel {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async receivedBox(roleId: string, ids: number[]) {
|
||||||
|
let rec: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $push: { receivedBox: { $each: ids } } }, { new: true }).lean();
|
||||||
|
return rec;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RoleModel = getModelForClass(Role);
|
export const RoleModel = getModelForClass(Role);
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ import { dicEquipStar, dicEquipStarIdByEquipId, loadEquipStar } from './dictiona
|
|||||||
import { dicEquipQualityExtra, loadEquipQualityExtra } from './dictionary/DicEquipQualityExtra';
|
import { dicEquipQualityExtra, loadEquipQualityExtra } from './dictionary/DicEquipQualityExtra';
|
||||||
import { dicEquipSuit, dicEquipSuitByJobClass, loadEquipSuit } from "./dictionary/DicEquipSuit";
|
import { dicEquipSuit, dicEquipSuitByJobClass, loadEquipSuit } from "./dictionary/DicEquipSuit";
|
||||||
import { dicJewelCondition, loadJewelCondition } from './dictionary/DicJewelCondition';
|
import { dicJewelCondition, loadJewelCondition } from './dictionary/DicJewelCondition';
|
||||||
|
import { dicMainStarBox, dicMainStarBoxByChapter, loadMainStarBox } from './dictionary/DicMainStarBox';
|
||||||
|
|
||||||
export const gameData = {
|
export const gameData = {
|
||||||
daily: dicDaily,
|
daily: dicDaily,
|
||||||
@@ -248,6 +249,8 @@ export const gameData = {
|
|||||||
blueprt: dicBlueprt,
|
blueprt: dicBlueprt,
|
||||||
blueprtByLv: dicBlueprtByLv,
|
blueprtByLv: dicBlueprtByLv,
|
||||||
heroIdByWar: dicHeroIdByWar,
|
heroIdByWar: dicHeroIdByWar,
|
||||||
|
mainBox: dicMainStarBox,
|
||||||
|
mainBoxByChapter: dicMainStarBoxByChapter,
|
||||||
};
|
};
|
||||||
|
|
||||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||||
@@ -1025,6 +1028,7 @@ function loadDatas() {
|
|||||||
loadJewel();
|
loadJewel();
|
||||||
loadStone();
|
loadStone();
|
||||||
loadJewelCondition();
|
loadJewelCondition();
|
||||||
|
loadMainStarBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重载dicParam
|
// 重载dicParam
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
// 主线星级宝箱
|
||||||
|
import {readFileAndParse, parseGoodStr} from '../util'
|
||||||
|
import { FILENAME } from '../../consts'
|
||||||
|
import { RewardInter } from '../interface';
|
||||||
|
|
||||||
|
export interface DicMainStarBox {
|
||||||
|
// id
|
||||||
|
readonly id: number;
|
||||||
|
// 章节id
|
||||||
|
readonly chapter: number;
|
||||||
|
// 星数
|
||||||
|
readonly star: number;
|
||||||
|
// 奖励
|
||||||
|
readonly reward: RewardInter[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const dicMainStarBox = new Map<number, DicMainStarBox>();
|
||||||
|
export const dicMainStarBoxByChapter = new Map<number, number[]>(); // chapter => ids;
|
||||||
|
export function loadMainStarBox() {
|
||||||
|
dicMainStarBox.clear();
|
||||||
|
dicMainStarBoxByChapter.clear();
|
||||||
|
|
||||||
|
let arr = readFileAndParse(FILENAME.DIC_MAIN_STAR_BOX);
|
||||||
|
|
||||||
|
arr.forEach(o => {
|
||||||
|
o.reward = parseGoodStr(o.reward);
|
||||||
|
dicMainStarBox.set(o.id, o);
|
||||||
|
if(!dicMainStarBoxByChapter.has(o.chapter)) {
|
||||||
|
dicMainStarBoxByChapter.set(o.chapter, []);
|
||||||
|
}
|
||||||
|
dicMainStarBoxByChapter.get(o.chapter).push(o.id);
|
||||||
|
});
|
||||||
|
arr = undefined;
|
||||||
|
}
|
||||||
@@ -17,6 +17,8 @@ export interface DicWar {
|
|||||||
readonly warType: number;
|
readonly warType: number;
|
||||||
// 关卡名
|
// 关卡名
|
||||||
readonly gk_name: string;
|
readonly gk_name: string;
|
||||||
|
// 章节id
|
||||||
|
readonly chapter: number;
|
||||||
// 胜利后获得的君主经验
|
// 胜利后获得的君主经验
|
||||||
readonly kingExp: number;
|
readonly kingExp: number;
|
||||||
// 进入战场所需的最低等级
|
// 进入战场所需的最低等级
|
||||||
|
|||||||
@@ -0,0 +1,146 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"chapter": 1,
|
||||||
|
"star": 3,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"chapter": 1,
|
||||||
|
"star": 12,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"chapter": 1,
|
||||||
|
"star": 18,
|
||||||
|
"reward": "22001&30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"chapter": 2,
|
||||||
|
"star": 6,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"chapter": 2,
|
||||||
|
"star": 12,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"chapter": 2,
|
||||||
|
"star": 18,
|
||||||
|
"reward": "22001&30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"chapter": 3,
|
||||||
|
"star": 6,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"chapter": 3,
|
||||||
|
"star": 12,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"chapter": 3,
|
||||||
|
"star": 18,
|
||||||
|
"reward": "22001&30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"chapter": 4,
|
||||||
|
"star": 6,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"chapter": 4,
|
||||||
|
"star": 12,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"chapter": 4,
|
||||||
|
"star": 18,
|
||||||
|
"reward": "22001&30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"chapter": 5,
|
||||||
|
"star": 7,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"chapter": 5,
|
||||||
|
"star": 14,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"chapter": 5,
|
||||||
|
"star": 21,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"chapter": 5,
|
||||||
|
"star": 28,
|
||||||
|
"reward": "22001&30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"chapter": 6,
|
||||||
|
"star": 7,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"chapter": 6,
|
||||||
|
"star": 14,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"chapter": 6,
|
||||||
|
"star": 21,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"chapter": 6,
|
||||||
|
"star": 28,
|
||||||
|
"reward": "22001&30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"chapter": 7,
|
||||||
|
"star": 7,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"chapter": 7,
|
||||||
|
"star": 14,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"chapter": 7,
|
||||||
|
"star": 21,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"chapter": 7,
|
||||||
|
"star": 28,
|
||||||
|
"reward": "22001&30"
|
||||||
|
}
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user