✨ feat(稷下学宫): 修改每周学分进度奖励
This commit is contained in:
@@ -1160,7 +1160,10 @@ export class RougeHandler {
|
|||||||
let sid: string = session.get('sid');
|
let sid: string = session.get('sid');
|
||||||
let roleName: string = session.get('roleName');
|
let roleName: string = session.get('roleName');
|
||||||
let { index } = msg;
|
let { index } = msg;
|
||||||
let dicScore = gameData.rougeScoreReward.get(index);
|
const lastMaxLv = await RougelikeRecordModel.getLastMaxLv(roleId);
|
||||||
|
const rougeScoreRewardByLvData = gameData.rougeScoreRewardByLv.get(lastMaxLv);
|
||||||
|
if (!rougeScoreRewardByLvData) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||||
|
let dicScore = rougeScoreRewardByLvData.get(index);
|
||||||
if (!dicScore) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
if (!dicScore) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||||
|
|
||||||
let scoreData = await RougelikeScoreModel.findByRoleId(roleId);
|
let scoreData = await RougelikeScoreModel.findByRoleId(roleId);
|
||||||
|
|||||||
@@ -13,11 +13,10 @@ import { DicRougeQuestionMarkPlan } from "../../pubUtils/dictionary/DicRougeQues
|
|||||||
import { DicRougeRandomEventPlan } from "../../pubUtils/dictionary/DicRougeRandomEventPlan";
|
import { DicRougeRandomEventPlan } from "../../pubUtils/dictionary/DicRougeRandomEventPlan";
|
||||||
import * as util from 'util';
|
import * as util from 'util';
|
||||||
import { RougelikeCollectionModel, } from "../../db/RougelikeCollection";
|
import { RougelikeCollectionModel, } from "../../db/RougelikeCollection";
|
||||||
import { RougelikeScoreModel } from "../../db/RougelikeScore";
|
import { RougelikeScoreModel, RougelikeScorePara } from "../../db/RougelikeScore";
|
||||||
import { getTechData } from "./rougeTechService";
|
import { getTechData } from "./rougeTechService";
|
||||||
import { getZeroPointOfTimeD } from "../../pubUtils/timeUtil";
|
import { getZeroPointOfTimeD } from "../../pubUtils/timeUtil";
|
||||||
import { sendMailByContent } from "../mailService";
|
import { sendMailByContent } from "../mailService";
|
||||||
import { DicRougeCharaCardPlan } from "../../pubUtils/DicRougeCharaCardPlan";
|
|
||||||
import { MAIL_TYPE, PUSH_ROUTE } from "../../consts";
|
import { MAIL_TYPE, PUSH_ROUTE } from "../../consts";
|
||||||
import { sendMessageToUserWithSuc } from "../pushService";
|
import { sendMessageToUserWithSuc } from "../pushService";
|
||||||
import { RougeEffect, getAddChoosePassive, getAddPassiveWeight, getChooseQualityPassives, getShopDiscount } from "./rougeEffectService";
|
import { RougeEffect, getAddChoosePassive, getAddPassiveWeight, getChooseQualityPassives, getShopDiscount } from "./rougeEffectService";
|
||||||
@@ -25,6 +24,7 @@ import { formateCharasOrCards } from "./rougeCollectService";
|
|||||||
import { errlogger } from "../../util/logger";
|
import { errlogger } from "../../util/logger";
|
||||||
import { RougelikeExtendModel } from "../../db/RougelikeExtend";
|
import { RougelikeExtendModel } from "../../db/RougelikeExtend";
|
||||||
import { isDevelopEnv } from "../utilService";
|
import { isDevelopEnv } from "../utilService";
|
||||||
|
import { DicRougeCharaCardPlan } from "../../pubUtils/dictionary/DicRougeCharaCardPlan";
|
||||||
|
|
||||||
export async function getRougeData(roleId: string) {
|
export async function getRougeData(roleId: string) {
|
||||||
|
|
||||||
@@ -41,8 +41,8 @@ export async function getRougeData(roleId: string) {
|
|||||||
|
|
||||||
const dbExtends = await RougelikeExtendModel.findByRoleId(roleId);
|
const dbExtends = await RougelikeExtendModel.findByRoleId(roleId);
|
||||||
const limitIds = dbExtends.map(cur => cur.limitId);
|
const limitIds = dbExtends.map(cur => cur.limitId);
|
||||||
|
const lastMaxLv = await RougelikeRecordModel.getLastMaxLv(roleId);
|
||||||
return { isPlaying, gameCode, weeklyScore: dbScore?.score || 0, receivedScore: dbScore?.received || [], ...techData, collections, limitIds, takeoutRewardCnt: dbScore?.takeoutRewardCnt }
|
return { isPlaying, gameCode, weeklyScore: dbScore?.score || 0, receivedScore: dbScore?.received || [], ...techData, collections, limitIds, takeoutRewardCnt: dbScore?.takeoutRewardCnt, lastMaxLv }
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -899,19 +899,24 @@ export function getAuthorTypeCardNum(authorType: number, cards: Card[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function repaireSendScoreReward() {
|
export async function repaireSendScoreReward() {
|
||||||
let maxNum = gameData.rougeScoreNum.num || 0;
|
let refTime = new Date(getZeroPointOfTimeD(Date.now() - 86400000, SHOP_REFRESH_TYPE.WEEKLY).getTime() - (86400000 * 7));
|
||||||
let refTime = getZeroPointOfTimeD(Date.now() - 86400000, SHOP_REFRESH_TYPE.WEEKLY);
|
let allRewards = await RougelikeScoreModel.findByRefTime(refTime);
|
||||||
let allRewards = await RougelikeScoreModel.findByReceiveNum(refTime, maxNum);
|
let updateArr: RougelikeScorePara[] = [];
|
||||||
let _ids: string[] = [];
|
|
||||||
for (let { roleId, received, _id, score } of allRewards) {
|
const roleIds = allRewards.map(cur => { return cur.roleId });
|
||||||
|
const lastMaxLvMap = await RougelikeRecordModel.getLastMaxLvMap(roleIds);
|
||||||
|
for (let { roleId, received, score, receiveNum } of allRewards) {
|
||||||
|
if (!lastMaxLvMap.has(roleId)) continue;
|
||||||
let goods: RewardInter[] = [];
|
let goods: RewardInter[] = [];
|
||||||
for (let [index, { reward, score: targetScore }] of gameData.rougeScoreReward) {
|
const rougeScoreRewardByLvData = gameData.rougeScoreRewardByLv.get(lastMaxLvMap.get(roleId));
|
||||||
if (score >= targetScore && !received.includes(index)) goods.push(...reward);
|
if (receiveNum >= rougeScoreRewardByLvData.size) continue;
|
||||||
|
for (let [index, { reward, score: targetScore }] of rougeScoreRewardByLvData) {
|
||||||
|
if (score >= targetScore && !received.includes(index)) { goods.push(...reward); }
|
||||||
}
|
}
|
||||||
await sendMailByContent(MAIL_TYPE.ROUGE_SCORE_REPAIRE, roleId, { goods });
|
await sendMailByContent(MAIL_TYPE.ROUGE_SCORE_REPAIRE, roleId, { goods });
|
||||||
_ids.push(_id);
|
updateArr.push({ roleId, refTime, receiveNum: rougeScoreRewardByLvData.size });
|
||||||
}
|
}
|
||||||
await RougelikeScoreModel.receiveAll(_ids, maxNum + 1);
|
await RougelikeScoreModel.bulkWriteUpdate(updateArr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ export default class RougelikeChara extends BaseModel {
|
|||||||
await RougelikeCharaModel.bulkWrite(updateArr.map((param) => {
|
await RougelikeCharaModel.bulkWrite(updateArr.map((param) => {
|
||||||
delete param._id;
|
delete param._id;
|
||||||
const { gameCode, charaCode } = param
|
const { gameCode, charaCode } = param
|
||||||
return { updateOne: { filter: { gameCode, charaCode }, update: { $set: { ...param } } } }
|
return { updateOne: { filter: { gameCode, charaCode }, update: { $set: { ...param } }, upsert: true } }
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ export default class RougelikeExtend extends BaseModel {
|
|||||||
const result: RougelikeExtendType = await RougelikeExtendModel.findOne({ roleId, limitId }).lean(lean);
|
const result: RougelikeExtendType = await RougelikeExtendModel.findOne({ roleId, limitId }).lean(lean);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RougelikeExtendModel = getModelForClass(RougelikeExtend);
|
export const RougelikeExtendModel = getModelForClass(RougelikeExtend);
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
import { SHOP_REFRESH_TYPE } from '../consts';
|
||||||
|
import { gameData } from '../pubUtils/data';
|
||||||
|
import { getZeroPointOfTimeD } from '../pubUtils/timeUtil';
|
||||||
import BaseModel from './BaseModel';
|
import BaseModel from './BaseModel';
|
||||||
import { getModelForClass, prop, DocumentType, index } from '@typegoose/typegoose';
|
import { getModelForClass, prop, DocumentType, index } from '@typegoose/typegoose';
|
||||||
|
|
||||||
@@ -103,6 +106,30 @@ export default class RougelikeRecord extends BaseModel {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async getLastMaxLv(roleId: string) {
|
||||||
|
let endTime = getZeroPointOfTimeD(Date.now() - 86400000, SHOP_REFRESH_TYPE.WEEKLY);
|
||||||
|
let startTime = new Date(endTime.getTime() - (86400000 * 7));
|
||||||
|
const result: RougelikeRecordType[] = await RougelikeRecordModel.find({ roleId, updatedAt: { $gt: startTime, $lt: endTime } }).lean(true);
|
||||||
|
let lastMaxLv = 1;
|
||||||
|
for (const { grade = 1 } of result) {
|
||||||
|
lastMaxLv = Math.max(lastMaxLv, grade);
|
||||||
|
}
|
||||||
|
return lastMaxLv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getLastMaxLvMap(roleIds: string[]) {
|
||||||
|
let endTime = getZeroPointOfTimeD(Date.now() - 86400000, SHOP_REFRESH_TYPE.WEEKLY);
|
||||||
|
let startTime = new Date(endTime.getTime() - (86400000 * 7));
|
||||||
|
const result: RougelikeRecordType[] = await RougelikeRecordModel.find({ roleId: { $in: roleIds }, updatedAt: { $gt: startTime, $lt: endTime } }).lean(true);
|
||||||
|
let lastMaxLvMap = new Map<string, number>();
|
||||||
|
for (const { roleId, grade } of result) {
|
||||||
|
if (!grade) continue;
|
||||||
|
let tempLv = lastMaxLvMap.has(roleId) ? lastMaxLvMap.get(roleId) : 1;
|
||||||
|
lastMaxLvMap.set(roleId, Math.max(tempLv, grade));
|
||||||
|
}
|
||||||
|
return lastMaxLvMap;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
export const RougelikeRecordModel = getModelForClass(RougelikeRecord);
|
export const RougelikeRecordModel = getModelForClass(RougelikeRecord);
|
||||||
export interface RougelikeRecordType extends Pick<DocumentType<RougelikeRecord>, keyof RougelikeRecord> { };
|
export interface RougelikeRecordType extends Pick<DocumentType<RougelikeRecord>, keyof RougelikeRecord> { };
|
||||||
|
|||||||
@@ -48,6 +48,11 @@ export default class RougelikeScore extends BaseModel {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async findByRefTime(refTime: Date) {
|
||||||
|
let result: RougelikeScoreType[] = await RougelikeScoreModel.find({ refTime }).lean();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public static async receiveAll(_ids: string[], maxNum: number) {
|
public static async receiveAll(_ids: string[], maxNum: number) {
|
||||||
await RougelikeScoreModel.updateMany({ _id: { $in: _ids } }, { $set: { receiveNum: maxNum } });
|
await RougelikeScoreModel.updateMany({ _id: { $in: _ids } }, { $set: { receiveNum: maxNum } });
|
||||||
}
|
}
|
||||||
@@ -59,6 +64,16 @@ export default class RougelikeScore extends BaseModel {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async bulkWriteUpdate(updateArr: RougelikeScorePara[]) {
|
||||||
|
if (updateArr.length == 0) return;
|
||||||
|
await RougelikeScoreModel.bulkWrite(updateArr.map((param) => {
|
||||||
|
delete param._id;
|
||||||
|
const { roleId, refTime } = param
|
||||||
|
return { updateOne: { filter: { roleId, refTime }, update: { $set: { ...param } }, upsert: true } }
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RougelikeScoreModel = getModelForClass(RougelikeScore);
|
export const RougelikeScoreModel = getModelForClass(RougelikeScore);
|
||||||
|
|||||||
@@ -159,20 +159,19 @@ import { dicRougeChallenge, loadRougeChallenge } from "./dictionary/DicRougeChal
|
|||||||
import { dicRougeChallengePlan, loadRougeChallengePlan } from "./dictionary/DicRougeChallengePlan";
|
import { dicRougeChallengePlan, loadRougeChallengePlan } from "./dictionary/DicRougeChallengePlan";
|
||||||
import { dicRougeQuestionMarkPlan, loadRougeQuestionMarkPlan } from "./dictionary/DicRougeQuestionMarkPlan";
|
import { dicRougeQuestionMarkPlan, loadRougeQuestionMarkPlan } from "./dictionary/DicRougeQuestionMarkPlan";
|
||||||
import { dicRougeRandomEventPlan, loadRougeRandomEventPlan } from "./dictionary/DicRougeRandomEventPlan";
|
import { dicRougeRandomEventPlan, loadRougeRandomEventPlan } from "./dictionary/DicRougeRandomEventPlan";
|
||||||
import { dicRougeCharaCardPlan, loadRougeCharaCardPlan } from "./DicRougeCharaCardPlan";
|
|
||||||
import { dicRougeHolyCardPlan, loadRougeHolyCardPlan } from "./DicRougeHolyCardPlan";
|
|
||||||
import { dicRougeEventOption, loadRougeEventOption } from "./dictionary/DicRougeEventOption";
|
import { dicRougeEventOption, loadRougeEventOption } from "./dictionary/DicRougeEventOption";
|
||||||
|
|
||||||
import { dicRougeTech, loadRougeTech, dicRougeTechIdByRow } from "./dictionary/DicRougeTech";
|
import { dicRougeTech, loadRougeTech, dicRougeTechIdByRow } from "./dictionary/DicRougeTech";
|
||||||
import { dicRougeTechCircle, dicRougeTechCircleByTechId, loadRougeTechCircle } from "./dictionary/DicRougeTechCircle";
|
import { dicRougeTechCircle, dicRougeTechCircleByTechId, loadRougeTechCircle } from "./dictionary/DicRougeTechCircle";
|
||||||
import { dicRougeTechLevel, loadRougeTechLevel } from "./dictionary/DicRougeTechLevel";
|
import { dicRougeTechLevel, loadRougeTechLevel } from "./dictionary/DicRougeTechLevel";
|
||||||
import { dicRougeOptionGroup, loadRougeOptionGroup } from "./dictionary/DicRougeOptionGroup";
|
import { dicRougeOptionGroup, loadRougeOptionGroup } from "./dictionary/DicRougeOptionGroup";
|
||||||
import { dicRougePassiveCollect, loadRougePassiveCollect } from "./dictionary/DicRougePassiveCollect";
|
import { dicRougePassiveCollect, loadRougePassiveCollect } from "./dictionary/DicRougePassiveCollect";
|
||||||
import { dicRougeScoreNum, dicRougeScoreReward, loadRougeScoreReward } from "./dictionary/DicRougeScoreReward";
|
import { dicRougeScoreRewardByLv, loadRougeScoreReward } from "./dictionary/DicRougeScoreReward";
|
||||||
import { dicRougeEffect, loadRougeEffect } from "./dictionary/DicRougeEffect";
|
import { dicRougeEffect, loadRougeEffect } from "./dictionary/DicRougeEffect";
|
||||||
import { dicRougeEffectType, loadRougeEffectType } from "./dictionary/DicRougeEffectType";
|
import { dicRougeEffectType, loadRougeEffectType } from "./dictionary/DicRougeEffectType";
|
||||||
import { dicSpiritPlan, loadSpiritPlan } from "./dictionary/DicSpiritPlan";
|
import { dicSpiritPlan, loadSpiritPlan } from "./dictionary/DicSpiritPlan";
|
||||||
import { dicRougePassiveWeight, loadRougePassiveWeight } from "./dictionary/DicRougePassiveWeight";
|
import { dicRougePassiveWeight, loadRougePassiveWeight } from "./dictionary/DicRougePassiveWeight";
|
||||||
|
import { dicRougeCharaCardPlan, loadRougeCharaCardPlan } from "./dictionary/DicRougeCharaCardPlan";
|
||||||
|
import { dicRougeHolyCardPlan, loadRougeHolyCardPlan } from "./dictionary/DicRougeHolyCardPlan";
|
||||||
|
|
||||||
export const gameData = {
|
export const gameData = {
|
||||||
daily: dicDaily,
|
daily: dicDaily,
|
||||||
@@ -423,8 +422,7 @@ export const gameData = {
|
|||||||
rougeEventOption: dicRougeEventOption,
|
rougeEventOption: dicRougeEventOption,
|
||||||
rougeOptionGroup: dicRougeOptionGroup,
|
rougeOptionGroup: dicRougeOptionGroup,
|
||||||
rougePassiceCollect: dicRougePassiveCollect,
|
rougePassiceCollect: dicRougePassiveCollect,
|
||||||
rougeScoreReward: dicRougeScoreReward,
|
rougeScoreRewardByLv: dicRougeScoreRewardByLv,
|
||||||
rougeScoreNum: dicRougeScoreNum,
|
|
||||||
rougeEffect: dicRougeEffect,
|
rougeEffect: dicRougeEffect,
|
||||||
rougeEffectType: dicRougeEffectType,
|
rougeEffectType: dicRougeEffectType,
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
* 角色卡奖励卡池方案
|
* 角色卡奖励卡池方案
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { FILENAME } from "../consts";
|
import { FILENAME } from "../../consts";
|
||||||
import { readFileAndParse } from "./util";
|
import { readFileAndParse } from "../util";
|
||||||
|
|
||||||
export interface DicRougeCharaCardPlan {
|
export interface DicRougeCharaCardPlan {
|
||||||
readonly id: number;
|
readonly id: number;
|
||||||
@@ -2,8 +2,10 @@
|
|||||||
* 圣物卡奖励卡池方案
|
* 圣物卡奖励卡池方案
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { FILENAME } from "../consts";
|
import { FILENAME } from "../../consts";
|
||||||
import { readFileAndParse } from "./util";
|
import { readFileAndParse } from "../util";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export interface DicRougeHolyCardPlan {
|
export interface DicRougeHolyCardPlan {
|
||||||
@@ -10,18 +10,19 @@ export interface DicRougeScoreReward {
|
|||||||
readonly index: number;
|
readonly index: number;
|
||||||
readonly score: number; // 积分
|
readonly score: number; // 积分
|
||||||
readonly reward: RewardInter[]; // 图鉴收集奖励(同Group只领取一次奖励)
|
readonly reward: RewardInter[]; // 图鉴收集奖励(同Group只领取一次奖励)
|
||||||
|
readonly level: number; // 难度等级
|
||||||
}
|
}
|
||||||
export const dicRougeScoreReward = new Map<number, DicRougeScoreReward>();
|
export const dicRougeScoreRewardByLv = new Map<number, Map<number, DicRougeScoreReward>>();
|
||||||
export const dicRougeScoreNum = { num: 0 }
|
|
||||||
export function loadRougeScoreReward() {
|
export function loadRougeScoreReward() {
|
||||||
dicRougeScoreReward.clear();
|
dicRougeScoreRewardByLv.clear();
|
||||||
|
|
||||||
let arr = readFileAndParse(FILENAME.DIC_ROUGE_SCORE_REWARD);
|
let arr = readFileAndParse(FILENAME.DIC_ROUGE_SCORE_REWARD);
|
||||||
|
|
||||||
arr.forEach(o => {
|
arr.forEach(o => {
|
||||||
o.reward = parseGoodStr(o.reward);
|
o.reward = parseGoodStr(o.reward);
|
||||||
dicRougeScoreReward.set(o.index, o);
|
|
||||||
dicRougeScoreNum.num++;
|
if (!dicRougeScoreRewardByLv.has(o.level)) dicRougeScoreRewardByLv.set(o.level, new Map);
|
||||||
|
dicRougeScoreRewardByLv.get(o.level).set(o.index, o);
|
||||||
});
|
});
|
||||||
arr = undefined;
|
arr = undefined;
|
||||||
}
|
}
|
||||||
@@ -1,44 +1,247 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
|
"level": 1,
|
||||||
"index": 1,
|
"index": 1,
|
||||||
"score": 10,
|
"score": 10,
|
||||||
"reward": "31002&50"
|
"reward": "31002&50"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
|
"level": 1,
|
||||||
"index": 2,
|
"index": 2,
|
||||||
"score": 20,
|
"score": 20,
|
||||||
"reward": "31002&60"
|
"reward": "31002&60"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
|
"level": 1,
|
||||||
"index": 3,
|
"index": 3,
|
||||||
"score": 30,
|
"score": 30,
|
||||||
"reward": "31002&70"
|
"reward": "31002&70"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 4,
|
"id": 4,
|
||||||
|
"level": 1,
|
||||||
"index": 4,
|
"index": 4,
|
||||||
"score": 40,
|
"score": 40,
|
||||||
"reward": "31002&80"
|
"reward": "31002&80"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 5,
|
"id": 5,
|
||||||
|
"level": 1,
|
||||||
"index": 5,
|
"index": 5,
|
||||||
"score": 50,
|
"score": 50,
|
||||||
"reward": "31002&90"
|
"reward": "31002&90"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 6,
|
"id": 6,
|
||||||
|
"level": 1,
|
||||||
"index": 6,
|
"index": 6,
|
||||||
"score": 60,
|
"score": 60,
|
||||||
"reward": "31002&100"
|
"reward": "31002&100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 7,
|
"id": 7,
|
||||||
|
"level": 1,
|
||||||
"index": 7,
|
"index": 7,
|
||||||
"score": 70,
|
"score": 70,
|
||||||
"reward": "31002&110"
|
"reward": "31002&110"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"level": 2,
|
||||||
|
"index": 1,
|
||||||
|
"score": 10,
|
||||||
|
"reward": "31002&100"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"level": 2,
|
||||||
|
"index": 2,
|
||||||
|
"score": 20,
|
||||||
|
"reward": "31002&200"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"level": 2,
|
||||||
|
"index": 3,
|
||||||
|
"score": 30,
|
||||||
|
"reward": "31002&300"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"level": 2,
|
||||||
|
"index": 4,
|
||||||
|
"score": 40,
|
||||||
|
"reward": "31002&400"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"level": 2,
|
||||||
|
"index": 5,
|
||||||
|
"score": 50,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"level": 2,
|
||||||
|
"index": 6,
|
||||||
|
"score": 60,
|
||||||
|
"reward": "31002&600"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"level": 2,
|
||||||
|
"index": 7,
|
||||||
|
"score": 70,
|
||||||
|
"reward": "31002&700"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"level": 3,
|
||||||
|
"index": 1,
|
||||||
|
"score": 10,
|
||||||
|
"reward": "31002&200"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"level": 3,
|
||||||
|
"index": 2,
|
||||||
|
"score": 20,
|
||||||
|
"reward": "31002&300"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"level": 3,
|
||||||
|
"index": 3,
|
||||||
|
"score": 30,
|
||||||
|
"reward": "31002&400"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"level": 3,
|
||||||
|
"index": 4,
|
||||||
|
"score": 40,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"level": 3,
|
||||||
|
"index": 5,
|
||||||
|
"score": 50,
|
||||||
|
"reward": "31002&600"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"level": 3,
|
||||||
|
"index": 6,
|
||||||
|
"score": 60,
|
||||||
|
"reward": "31002&700"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"level": 3,
|
||||||
|
"index": 7,
|
||||||
|
"score": 70,
|
||||||
|
"reward": "31002&800"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"level": 4,
|
||||||
|
"index": 1,
|
||||||
|
"score": 10,
|
||||||
|
"reward": "31002&300"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"level": 4,
|
||||||
|
"index": 2,
|
||||||
|
"score": 20,
|
||||||
|
"reward": "31002&400"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"level": 4,
|
||||||
|
"index": 3,
|
||||||
|
"score": 30,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"level": 4,
|
||||||
|
"index": 4,
|
||||||
|
"score": 40,
|
||||||
|
"reward": "31002&600"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"level": 4,
|
||||||
|
"index": 5,
|
||||||
|
"score": 50,
|
||||||
|
"reward": "31002&700"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"level": 4,
|
||||||
|
"index": 6,
|
||||||
|
"score": 60,
|
||||||
|
"reward": "31002&800"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"level": 4,
|
||||||
|
"index": 7,
|
||||||
|
"score": 70,
|
||||||
|
"reward": "31002&900"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"level": 5,
|
||||||
|
"index": 1,
|
||||||
|
"score": 10,
|
||||||
|
"reward": "31002&300"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"level": 5,
|
||||||
|
"index": 2,
|
||||||
|
"score": 20,
|
||||||
|
"reward": "31002&400"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"level": 5,
|
||||||
|
"index": 3,
|
||||||
|
"score": 30,
|
||||||
|
"reward": "31002&500"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"level": 5,
|
||||||
|
"index": 4,
|
||||||
|
"score": 40,
|
||||||
|
"reward": "31002&600"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"level": 5,
|
||||||
|
"index": 5,
|
||||||
|
"score": 50,
|
||||||
|
"reward": "31002&700"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"level": 5,
|
||||||
|
"index": 6,
|
||||||
|
"score": 60,
|
||||||
|
"reward": "31002&800"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"level": 5,
|
||||||
|
"index": 7,
|
||||||
|
"score": 70,
|
||||||
|
"reward": "31002&900"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
Reference in New Issue
Block a user