🐞 fix(gvg): gvg个人排行

This commit is contained in:
luying
2023-02-18 19:22:01 +08:00
parent 8065a81988
commit 96cbc19391
8 changed files with 156 additions and 56 deletions

View File

@@ -3,16 +3,17 @@ import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_PERIOD, ITEM_CHANGE_REASON, REDIS_KEY, R
import { BattleRecordModel } from "../../../db/BattleRecord";
import { GVGLeagueModel } from "../../../db/GVGLeague";
import { GVGUserItemModel } from "../../../db/GVGUserItem";
import GVGVestigeLeagueRank, { GVGVestigeLeagueRankModel } from "../../../db/GVGVestigeLeagueRank";
import { GVGVestigeLeagueRankModel } from "../../../db/GVGVestigeLeagueRank";
import { GVGVestigeLockModel } from "../../../db/GVGVestigeLock";
import { GVGVestigeRankModel } from "../../../db/GVGVestigeRank";
import { GVGVestigeRecModel, GVGVestigeRecUpdate } from "../../../db/GVGVestigeRec";
import { GVGVestigeSumRankModel } from "../../../db/GVGVestigeSumRank";
import { HeroModel } from "../../../db/Hero";
import { RoleModel } from "../../../db/Role";
import { GVGVestigeOppLineup, VestigeRank } from "../../../domain/gvgField/returnData";
import { RoleRankInfo } from "../../../domain/rank";
import { getRemoteRplFilePath, getRemoteRplPrefix } from "../../../pubUtils/battleUtils";
import { gameData, getGVGVestigeLeagueRank } from "../../../pubUtils/data";
import { gameData } from "../../../pubUtils/data";
import { GVG } from "../../../pubUtils/dicParam";
import { RewardInter } from "../../../pubUtils/interface";
import { resResult } from "../../../pubUtils/util";
@@ -351,9 +352,9 @@ export class GVGProduceHandler {
// 更新battleRecord
await BattleRecordModel.updateBattleRecordByCode(battleCode, { $set: { status: isSuccess? 1: 2 } });
// 突破排名奖励
let { rewards, leagueRewards } = calBreakGoods(rec.vestigeId, historyRank, atkData.rank);
let breakGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueRewards, rewards, ITEM_CHANGE_REASON.GVG_VESTIGE_END);
// 取消突破排名奖励
// let { rewards, leagueRewards } = calBreakGoods(rec.vestigeId, historyRank, atkData.rank);
// let breakGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueRewards, rewards, ITEM_CHANGE_REASON.GVG_VESTIGE_END);
await saveScoreToRank(rec);
addVestigeBattleEndRec(rec);
@@ -367,7 +368,7 @@ export class GVGProduceHandler {
historyRank: atkData.historyRank,
...getVestigeRecStatus(rec),
oppPlayers: await getOppPlayerByRanks(serverId, rec.groupId, rec.serverType, rec.vestigeId, atkData.oppRanks),
breakGoods,
// breakGoods,
lineup: atkData.lineup,
lineupCe: atkData.lineup.reduce((pre, cur) => pre + cur.ce, 0),
});
@@ -417,6 +418,7 @@ export class GVGProduceHandler {
async getLeagueDetailRank(msg: {}, session: BackendSession) {
const serverId = session.get('serverId');
const guildCode = session.get('guildCode');
const roleId = session.get('roleId');
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
@@ -427,13 +429,16 @@ export class GVGProduceHandler {
let { configId } = getGVGPeriodData();
const { ranks, myRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_LEAGUE, false, { groupId, serverType, day: getDayKeyInfo() }, { leagueCode: myLeague.leagueCode }, serverNames);
const { ranks: memberRank, myRank: myMemberRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, false, { groupId, serverType, day: getDayKeyInfo() }, { roleId }, serverNames);
let yesterdayRank = await GVGVestigeLeagueRank.getYesterdayRank(myLeague.leagueCode);
let canReceiveRanks = await GVGVestigeLeagueRank.getCanReceiveRanks(configId, myLeague.leagueCode);
let { canReceiveBox, boxPreview } = calVestigeLeagueBoxRewards(canReceiveRanks);
let yesterdayRank = await GVGVestigeLeagueRankModel.getYesterdayRank(myLeague.leagueCode);
let canReceiveLeagueRanks = await GVGVestigeLeagueRankModel.getCanReceiveRanks(configId, myLeague.leagueCode);
let canReceivePlayerRanks = await GVGVestigeSumRankModel.getCanReceiveRanks(configId, roleId);
let { canReceiveBox, boxPreview } = calVestigeLeagueBoxRewards(canReceiveLeagueRanks, canReceivePlayerRanks);
return resResult(STATUS.SUCCESS, {
ranks, myRank,
memberRank, myMemberRank,
latestRank: yesterdayRank?.rank||0,
canReceiveBox, boxPreview
})
@@ -453,12 +458,12 @@ export class GVGProduceHandler {
let vestigeRanks = await GVGVestigeRankModel.findRankByVestige(groupId, serverType, vestigeId);
let r = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER, { groupId, serverType, vestigeId });
let ranks: VestigeRank[] = [], myRank: VestigeRank;
for(let { roleId, rank, lineup } of vestigeRanks) {
let param = <RoleRankInfo>await r.getParam(rank, roleId, [rank]);
for(let { roleId: targetRoleId, rank, lineup } of vestigeRanks) {
let param = <RoleRankInfo>await r.getParam(rank, targetRoleId, [rank]);
if(!param) {
let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.RANK);
await r.generParamAndSet(REDIS_KEY.USER_INFO, { roleId }, { role });
param = <RoleRankInfo>await r.getParam(rank, roleId, [rank]);
let role = await RoleModel.findByRoleId(targetRoleId, ROLE_SELECT.RANK);
await r.generParamAndSet(REDIS_KEY.USER_INFO, { roleId: targetRoleId }, { role });
param = <RoleRankInfo>await r.getParam(rank, targetRoleId, [rank]);
}
let lineupCe = lineup.reduce((pre, cur) => pre + cur.ce, 0);
let serverName = serverNames[param.serverId];
@@ -493,12 +498,14 @@ export class GVGProduceHandler {
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let { configId } = getGVGPeriodData();
let canReceiveRanks = await GVGVestigeLeagueRankModel.getCanReceiveRanks(configId, myLeague.leagueCode);
if(canReceiveRanks.length <= 0) return resResult(STATUS.GVG_RECEIVE_NO_RANK_REWARD);
let canReceiveLeagueRanks = await GVGVestigeLeagueRankModel.getCanReceiveRanks(configId, myLeague.leagueCode);
let canReceivePlayerRanks = await GVGVestigeSumRankModel.getCanReceiveRanks(configId, roleId);
if(canReceiveLeagueRanks.length <= 0 && canReceivePlayerRanks.length <= 0) return resResult(STATUS.GVG_RECEIVE_NO_RANK_REWARD);
let { leagueReward, rewards } = calVestigeLeagueBoxRewards(canReceiveRanks);
let { leagueReward, rewards } = calVestigeLeagueBoxRewards(canReceiveLeagueRanks, canReceivePlayerRanks);
let leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueReward, rewards, ITEM_CHANGE_REASON.GVG_VESTIGE_RECEIVE_RANK)
await GVGVestigeLeagueRankModel.receiveRanks(canReceiveRanks.map(cur => cur._id));
await GVGVestigeLeagueRankModel.receiveRanks(canReceiveLeagueRanks.map(cur => cur._id));
await GVGVestigeSumRankModel.receiveRanks(canReceivePlayerRanks.map(cur => cur._id));
return resResult(STATUS.SUCCESS, {
leagueGoods,

View File

@@ -11,13 +11,13 @@ import { GVGVestigeLeagueRankModel, GVGVestigeLeagueRankType } from "../../db/GV
import { GVGVestigeLockModel } from "../../db/GVGVestigeLock";
import { GVGVestigeRankModel, GVGVestigeRankType, GVGVestigeRankUpdate } from "../../db/GVGVestigeRank";
import { GVGVestigeRecType } from "../../db/GVGVestigeRec";
import { GVGVestigeSumRankModel } from "../../db/GVGVestigeSumRank";
import { GVGVestigeSumRankModel, GVGVestigeSumRankType } from "../../db/GVGVestigeSumRank";
import { HeroModel, HeroType } from "../../db/Hero";
import { RoleModel } from "../../db/Role";
import { OppDetailData, OppPlayerHeroInfo, OppPlayerInfo } from "../../domain/gvgField/gvgDb";
import { GVGVestigeOppPlayer } from "../../domain/gvgField/returnData";
import { KeyNameParam, LeagueRankInfo, myIdInter, RoleRankInfo } from "../../domain/rank";
import { gameData, getGVGVestigeLeagueRank, getGVGVestigeRange } from "../../pubUtils/data";
import { gameData, getGVGVestigeLeagueRank, getGVGVestigePlayerRank, getGVGVestigeRange } from "../../pubUtils/data";
import { GVG } from "../../pubUtils/dicParam";
import { RewardInter } from "../../pubUtils/interface";
import { getTimeFun, nowSeconds } from "../../pubUtils/timeUtil";
@@ -344,7 +344,7 @@ export async function savePlayerRank(configId: number, groupId: number, serverTy
let dicRankMap = gameData.gvgVestige.get(vestigeId);
let newRank = dicRankMap?.get(playerInfo.newRank)?.score||0;
let oldRank = dicRankMap?.get(playerInfo.oldRank)?.score||0;
let myScore = await GVGVestigeSumRankModel.incScore(playerInfo.roleId, playerInfo.leagueCode, groupId, serverType, newRank - oldRank);
let myScore = await GVGVestigeSumRankModel.incScore(playerInfo.roleId, playerInfo.leagueCode, configId, groupId, serverType, newRank - oldRank);
let r1 = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, { serverType, groupId, day: getDayKeyInfo() });
await r1.setRankWithRoleInfo(playerInfo.roleId, myScore.score, myScore.updatedAt.getTime());
let leagueScore = await GVGVestigeLeagueRankModel.incScore(configId, playerInfo.leagueCode, groupId, serverType, newRank - oldRank);
@@ -355,8 +355,12 @@ export async function savePlayerRank(configId: number, groupId: number, serverTy
export async function getVestigeRank(redisKey: REDIS_KEY, isSimple: boolean, keyParam: KeyNameParam, myId: myIdInter, serverNames?: any) {
let r = new Rank(redisKey, keyParam);
r.setGenerFieldsFun((obj => {
if(redisKey == REDIS_KEY.GVG_VESTIGE_MEMBER_ALL && isSimple && obj instanceof RoleRankInfo) {
return { rank: obj.rank, name: obj.roleName, serverName: serverNames[obj.serverId], score: obj.num }
if(redisKey == REDIS_KEY.GVG_VESTIGE_MEMBER_ALL && obj instanceof RoleRankInfo) {
if(isSimple) {
return { rank: obj.rank, name: obj.roleName, serverName: serverNames[obj.serverId], score: obj.num }
} else {
return { ...obj, serverName: serverNames[obj.serverId], score: obj.num }
}
}
if(redisKey == REDIS_KEY.GVG_VESTIGE_LEAGUE && obj instanceof LeagueRankInfo) {
if(isSimple) {
@@ -394,22 +398,39 @@ export async function saveVestigeRankSchedule() {
await addVestigeLeagueRankRec(config.configId, ranks);
}
let memberKeys = await findKeys(`${REDIS_KEY.GVG_VESTIGE_MEMBER_ALL}:${day}:`);
for(let key of memberKeys) {
let [,, _groupId, _serverType] = key.split(':');
let groupId = parseInt(_groupId);
let serverType = parseInt(_serverType);
let r = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, { groupId, serverType, day});
let ranks = await r.getRankByRangeRaw();
await GVGVestigeSumRankModel.saveRank(groupId, serverType, ranks);
}
let playerSumRanks = await GVGVestigeSumRankModel.findAllScores();
await GVGUserDataModel.addVestigeScores(config.configId, playerSumRanks);
}
export function calVestigeLeagueBoxRewards(canReceiveRanks: GVGVestigeLeagueRankType[]) {
export function calVestigeLeagueBoxRewards(canReceiveRanks: GVGVestigeLeagueRankType[], canReceivePlayerRanks: GVGVestigeSumRankType[]) {
let rewards: RewardInter[] = [], leagueReward: RewardInter[] = [];
for(let { rank } of canReceiveRanks) {
let dicRank = getGVGVestigeLeagueRank(rank);
if(!dicRank) { console.error('dic_zyz_GVGVestigeLeagueRank error'); continue; }
console.log('###### league', rank, dicRank)
combinePushItem(rewards, dicRank.rankReward);
combinePushItem(leagueReward, dicRank.rankLeagueReward);
}
for(let { rank } of canReceivePlayerRanks) {
let dicRank = getGVGVestigePlayerRank(rank);
if(!dicRank) { console.error('dic_zyz_GVGVestigPlayerRank error'); continue; }
console.log('###### player', rank, dicRank)
combinePushItem(rewards, dicRank.rankPlayerReward);
combinePushItem(leagueReward, dicRank.rankPlayerLeagueReward);
}
let boxPreview: { id: number, count: number, itemType: number }[] = [];
for(let { id, count } of rewards) boxPreview.push({ id, count, itemType: GVG_RETURN_ITEM_TYPE.NORMAL_ITEM });
for(let { id, count } of leagueReward) boxPreview.push({ id, count, itemType: GVG_RETURN_ITEM_TYPE.GVG_ITEM });
return {
leagueReward, rewards, boxPreview, canReceiveBox: canReceiveRanks.length > 0
leagueReward, rewards, boxPreview, canReceiveBox: canReceiveRanks.length > 0 || canReceivePlayerRanks.length > 0
}
}

View File

@@ -610,6 +610,7 @@ export const FILENAME = {
DIC_GVG_AREA_POINT: 'dic_zyz_GVGAreaPoint',
DIC_GVG_BATTLE_RANK_REWARD: 'dic_zyz_GVGBattleRankReward',
DIC_GK_GVGBATTLE: 'dic_zyz_gk_GVGBattle',
DIC_GVG_VESTIGE_PLAYER_RANK: 'dic_zyz_GVGVestigePlayerRank',
}
export const WAR_RELATE_TABLES = [

View File

@@ -6,6 +6,9 @@ import { getZeroPoint } from '../pubUtils/timeUtil';
@index({ roleId: 1 })
export default class GVGVestigeSumRank extends BaseModel {
@prop({ required: true })
configId: number; // 赛期
@prop({ required: true })
day: number; // 每天5点
@@ -24,11 +27,17 @@ export default class GVGVestigeSumRank extends BaseModel {
@prop({ required: true })
score: number; // 得分
public static async incScore(roleId: string, leagueCode: string, groupId: number, serverType: number, inc: number) {
@prop({ required: true })
rank: number; // 最后的排名每天22点定格
@prop({ required: true })
isReceived: boolean; // 是否领取过
public static async incScore(roleId: string, leagueCode: string, configId: number, groupId: number, serverType: number, inc: number) {
let today = getZeroPoint();
let result: GVGVestigeSumRankType = await GVGVestigeSumRankModel.findOneAndUpdate({
day: today, groupId, serverType, roleId, leagueCode
}, { $inc: { score: inc } }, { new: true, upsert: true }).lean();
configId, day: today, groupId, serverType, roleId, leagueCode
}, { $inc: { score: inc } , $setOnInsert: { rank: 0, isReceived: false } }, { new: true, upsert: true }).lean();
return result;
}
@@ -54,6 +63,23 @@ export default class GVGVestigeSumRank extends BaseModel {
]);
return ranks;
}
public static async saveRank(groupId: number, serverType: number, ranks: { rank: number, field: string }[]) {
let today = getZeroPoint();
await GVGVestigeSumRankModel.bulkWrite(ranks.map(({ field, rank }) => {
return { updateOne: { filter: { day: today, groupId, serverType, roleId: field }, update: { $set: { rank } }} }
}));
}
public static async getCanReceiveRanks(configId: number, roleId: string) {
console.log(configId, roleId)
let result: GVGVestigeSumRankType[] = await GVGVestigeSumRankModel.find({ configId, roleId, rank: { $gt: 0 }, isReceived: false }).lean();
return result;
}
public static async receiveRanks(_ids: string[]) {
await GVGVestigeSumRankModel.updateMany({ _id: { $in: _ids } }, { $set: { isReceived: true } });
}
}
export const GVGVestigeSumRankModel = getModelForClass(GVGVestigeSumRank);

View File

@@ -131,6 +131,7 @@ import { dicGVGVestigeByType, dicGVGVestigeName, loadGVGVestigeType } from './di
import { dicGVGVestige, loadGVGVestige } from './dictionary/DicGVGVestige';
import { DicGVGVestigeRange, dicGVGVestigeRange, loadGVGVestigeRange } from './dictionary/DicGVGVestigeRange';
import { DicGVGVestigeLeagueRank, dicGVGVestigeLeagueRank, loadGVGVestigeLeagueRank } from "./dictionary/DicGVGVestigeLeagueRank";
import { DicGVGVestigePlayerRank, dicGVGVestigePlayerRank, loadGVGVestigePlayerRank } from "./dictionary/DicGVGVestigePlayerRank";
import { dicGVGAreaPoint, loadGVGAreaPoint, dicGVGPointsByAreaId } from "./dictionary/DicGVGAreaPoint";
import { DicGVGBattleRankReward, dicGVGBattleRankReward, loadGVGBattleRankReward } from './dictionary/DicGVGBattleRankReward';
@@ -331,6 +332,7 @@ export const gameData = {
gvgVestige: dicGVGVestige,
gvgVestigeRange: dicGVGVestigeRange,
gvgVestigeLeagueRank: dicGVGVestigeLeagueRank,
gvgVestigePlayerRank: dicGVGVestigePlayerRank,
gvgVestigeName: dicGVGVestigeName,
gvgAreaPoint: dicGVGAreaPoint,
gvgBattleRankReward: dicGVGBattleRankReward,
@@ -1197,7 +1199,19 @@ export function getGVGVestigeLeagueRank(myLeagueRank: number) {
for(let dic of gameData.gvgVestigeLeagueRank) {
lastRank = dic;
let { rankMin, rankMax } = dic;
if(rankMin < myLeagueRank && (rankMax >= myLeagueRank || rankMax == 0)) {
if(rankMin <= myLeagueRank && (rankMax >= myLeagueRank || rankMax == 0)) {
return dic;
}
}
return lastRank
}
export function getGVGVestigePlayerRank(myRank: number) {
let lastRank: DicGVGVestigePlayerRank;
for(let dic of gameData.gvgVestigePlayerRank) {
lastRank = dic;
let { rankMin, rankMax } = dic;
if(rankMin <= myRank && (rankMax >= myRank || rankMax == 0)) {
return dic;
}
}
@@ -1460,6 +1474,7 @@ function loadDatas() {
loadGVGVestige();
loadGVGVestigeRange();
loadGVGVestigeLeagueRank();
loadGVGVestigePlayerRank();
loadGVGAreaPoint();
loadGVGBattleRankReward();
}

View File

@@ -0,0 +1,30 @@
// GVG遗迹
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
import { parseGoodStr, readFileAndParse } from '../util'
export interface DicGVGVestigePlayerRank {
// id
readonly id: number;
// 最低排名
readonly rankMin: number;
// 最高排名
readonly rankMax: number;
// 普通奖励
readonly rankPlayerReward: RewardInter[];
// gvg内奖励
readonly rankPlayerLeagueReward: RewardInter[];
}
export const dicGVGVestigePlayerRank: DicGVGVestigePlayerRank[] = [];
export function loadGVGVestigePlayerRank() {
dicGVGVestigePlayerRank.splice(0, dicGVGVestigePlayerRank.length);
let arr = readFileAndParse(FILENAME.DIC_GVG_VESTIGE_PLAYER_RANK);
arr.forEach(o => {
o.rankPlayerReward = parseGoodStr(o.rankPlayerReward);
o.rankPlayerLeagueReward = parseGoodStr(o.rankPlayerLeagueReward);
dicGVGVestigePlayerRank.push(o);
});
arr = undefined;
}

View File

@@ -4,167 +4,167 @@
"type": 1,
"min": 1,
"max": 1,
"reward": "71058&20|71068&1|71067&5|40016&5000|31002&1000"
"reward": "71061&20|71069&20|40016&1000|31002&1000|31001&1600000"
},
{
"id": 102,
"type": 1,
"min": 2,
"max": 3,
"reward": "71058&15|71068&1|71067&4|40016&4000|31002&800"
"reward": "71061&15|71069&18|40016&900|31002&800|31001&1500000"
},
{
"id": 103,
"type": 1,
"min": 4,
"max": 10,
"reward": "71058&12|71068&1|71067&3|40016&3500|31002&700"
"reward": "71061&12|71069&16|40016&800|31002&700|31001&1300000"
},
{
"id": 104,
"type": 1,
"min": 11,
"max": 20,
"reward": "71058&10|71068&1|71067&3|40016&3000|31002&600"
"reward": "71061&10|71069&12|40016&600|31002&600|31001&1000000"
},
{
"id": 105,
"type": 1,
"min": 21,
"max": 50,
"reward": "71058&5|82003&1|71067&3|40016&2500|31002&600"
"reward": "71061&5|71069&10|40016&500|31002&600|31001&800000"
},
{
"id": 106,
"type": 1,
"min": 51,
"max": 100,
"reward": "71058&1|82003&1|71067&2|40016&2000|31002&500"
"reward": "71069&9|40016&400|31002&500|31001&700000"
},
{
"id": 107,
"type": 1,
"min": 101,
"max": 200,
"reward": "82002&8|71067&1|40016&2000|31002&500"
"reward": "71069&6|40016&300|31002&500|31001&500000"
},
{
"id": 108,
"type": 1,
"min": 201,
"max": -1,
"reward": "82002&6|71067&1|40016&2000|31002&500"
"reward": "71069&5|40016&200|31002&500|31001&300000"
},
{
"id": 201,
"type": 2,
"min": 1,
"max": 1,
"reward": "71067&5|71066&5|40005&20000|31001&3000000"
"reward": "&"
},
{
"id": 202,
"type": 2,
"min": 2,
"max": 2,
"reward": "71067&4|71066&4|40005&15000|31001&2700000"
"reward": "&"
},
{
"id": 203,
"type": 2,
"min": 3,
"max": 3,
"reward": "71067&3|71066&3|40005&14000|31001&2400000"
"reward": "&"
},
{
"id": 204,
"type": 2,
"min": 4,
"max": 5,
"reward": "71067&2|71066&3|40005&12000|31001&2100000"
"reward": "&"
},
{
"id": 205,
"type": 2,
"min": 6,
"max": 10,
"reward": "71067&2|71066&2|40005&10000|31001&1800000"
"reward": "&"
},
{
"id": 206,
"type": 2,
"min": 11,
"max": 20,
"reward": "71067&2|71066&1|40005&8000|31001&1500000"
"reward": "&"
},
{
"id": 207,
"type": 2,
"min": 21,
"max": 50,
"reward": "71067&1|71066&1|40005&6000|31001&1200000"
"reward": "&"
},
{
"id": 208,
"type": 2,
"min": 51,
"max": -1,
"reward": "71067&1|71066&1|40005&3000|31001&800000"
"reward": "&"
},
{
"id": 301,
"type": 3,
"min": 1,
"max": 1,
"reward": "71067&8|71066&9|17053&25|40016&3000|31002&800"
"reward": "71069&30|17053&50|40016&2000|40005&20000|31002&800"
},
{
"id": 302,
"type": 3,
"min": 2,
"max": 2,
"reward": "71067&6|71066&8|17053&20|40016&2500|31002&600"
"reward": "71069&26|17053&40|40016&1800|40005&18000|31002&600"
},
{
"id": 303,
"type": 3,
"min": 3,
"max": 3,
"reward": "71067&6|71066&7|17053&16|40016&2200|31002&500"
"reward": "71069&24|17053&32|40016&1600|40005&16000|31002&500"
},
{
"id": 304,
"type": 3,
"min": 4,
"max": 5,
"reward": "71067&5|71066&6|17053&12|40016&2000|31002&500"
"reward": "71069&20|17053&24|40016&1200|40005&12000|31002&500"
},
{
"id": 305,
"type": 3,
"min": 6,
"max": 10,
"reward": "71067&4|71066&5|17053&10|40016&1800|31002&400"
"reward": "71069&16|17053&20|40016&1000|40005&10000|31002&400"
},
{
"id": 306,
"type": 3,
"min": 11,
"max": 20,
"reward": "71067&3|71066&4|17053&10|40016&1600|31002&400"
"reward": "71069&12|17053&20|40016&800|40005&8000|31002&400"
},
{
"id": 307,
"type": 3,
"min": 21,
"max": 50,
"reward": "71067&2|71066&3|17053&8|40016&1400|31002&300"
"reward": "71069&8|17053&16|40016&600|40005&6000|31002&300"
},
{
"id": 308,
"type": 3,
"min": 51,
"max": -1,
"reward": "71067&1|71066&2|17053&6|40016&1000|31002&300"
"reward": "71069&5|17053&12|40016&300|40005&5000|31002&300"
}
]

View File

@@ -5,7 +5,7 @@
"foodAdd": 30,
"mineralAdd": 30,
"woodAdd": 30,
"occupyReward": "71067&3|40016&6000|40005&10000"
"occupyReward": "71061&10|71070&20|40016&6000"
},
{
"id": 2,
@@ -13,7 +13,7 @@
"foodAdd": 60,
"mineralAdd": 60,
"woodAdd": 60,
"occupyReward": "71067&2|40016&3000|40005&8000"
"occupyReward": "71061&6|71070&15|40016&3000"
},
{
"id": 3,
@@ -21,6 +21,6 @@
"foodAdd": 100,
"mineralAdd": 100,
"woodAdd": 100,
"occupyReward": "71067&1|40016&2000|40005&5000"
"occupyReward": "71061&3|71070&10|40016&2000"
}
]