军团:试炼表修改

This commit is contained in:
luying
2021-09-22 15:12:13 +08:00
parent fae02d2083
commit 7df7de4bed
13 changed files with 24365 additions and 224 deletions

View File

@@ -10,7 +10,7 @@ import { lockData } from '../../../services/redLockService';
import { GUILD_REPORT_NUM, GUILD_POINT_WAYS } from '../../../consts/constModules/guildConst';
import { UserGuildModel } from '../../../db/UserGuild';
import { GuildModel } from '../../../db/Guild';
import { getArmyTrainJuDian, getTrainSoloReward, getTrainBaseByLv } from '../../../pubUtils/data';
import { getArmyTrainJuDian, getTrainSoloReward, getTrainBaseByLv, gameData } from '../../../pubUtils/data';
import { CURRENCY_BY_TYPE, CURRENCY_TYPE } from '../../../consts/constModules/itemConst';
import { handleCost, addItems } from '../../../services/rewardService';
import { ARMY } from '../../../pubUtils/dicParam';
@@ -21,6 +21,7 @@ import { pushGuildTrainSucMsg } from '../../../services/chatService';
import { checkActivityTask, checkTask } from '../../../services/taskService';
import { sendPopUpActivityData } from '../../../services/guildActivityService';
import { guildInter } from '../../../pubUtils/interface';
import { getGuildTrainGkInfo } from '../../../pubUtils/data';
export default function (app: Application) {
new HandlerService(app, {});
@@ -99,7 +100,7 @@ export class GuildTrainHandler {
const { guildCode: code } = userGuild;
if (userGuild.trainCount <= 0)
return resResult(STATUS.GUILD_TRAIN_BATTLE_COUNT_NOT_ENOUGH);
let { trainId: curTeainId } = await GuildModel.findGuild(code, serverId, 'trainId');
let { trainId: curTeainId, trainLv } = await GuildModel.findGuild(code, serverId, 'trainId');
if (curTeainId !== trainId)
return resResult(STATUS.GUILD_TRAIN_LEVEL_IS_COMPLETE);
let guildTrain = await GuildTrainModel.findTrainByTrainIdNotLock(code, trainId, 'trainId isComplete trainInstances');
@@ -120,7 +121,7 @@ export class GuildTrainHandler {
$set: {
roleId, roleName, battleId,
status: 0,
record: { heroes: [], trainId, hid, guildCode: code, difficulty },
record: { heroes: [], trainId, hid, guildCode: code, difficulty, trainLv },
}
}, true);
return resResult(STATUS.SUCCESS, { battleCode });
@@ -161,8 +162,8 @@ export class GuildTrainHandler {
$set: { status: isSuccess ? 1 : 2 }
}, true);//设置战斗状态
let trainId = battleRecord.record.trainId;
let hid = battleRecord.record.hid;
let { trainId, trainLv, hid, difficulty } = battleRecord.record;
let maxTrainId = gameData.lastGuildTrainIdOfLv.get(trainLv);
let res: any = await lockData(serverId, DATA_NAME.TRAIN, code + '_' + trainId);//加锁
if (!!res.err)
return resResult(STATUS.REDLOCK_ERR);
@@ -183,7 +184,7 @@ export class GuildTrainHandler {
res.releaseCallback();//解锁
return resResult(STATUS.WRONG_PARMS);
}
let trainSoloReward = getTrainSoloReward(battleRecord.record.difficulty);
let trainSoloReward = getTrainSoloReward(difficulty);
if (!trainSoloReward) {//获得个人奖励信息
res.releaseCallback();//解锁
return resResult(STATUS.WRONG_PARMS);
@@ -200,7 +201,7 @@ export class GuildTrainHandler {
// ranks.push({ score: addScore, roleId });//新增排名
// }
let needLockNext = false;
let report = { roleName, trainId, hid, score: addScore, time: nowSeconds(), type: isSuccess ? 2 : 1, difficulty: battleRecord.record.difficulty };//type 1失败 2成功3表示系统战报即被成功压制
let report = { roleName, trainId, hid, score: addScore, time: nowSeconds(), type: isSuccess ? 2 : 1, difficulty };//type 1失败 2成功3表示系统战报即被成功压制
reports.push(report);
if (trainInstance.progress < instance.progress) {
if (trainInstance.progress + addScore >= instance.progress) {
@@ -220,10 +221,10 @@ export class GuildTrainHandler {
guildTrain = await GuildTrainModel.updateGuildTrainProgress(code, trainId, hid, progress, ranks, isComplete);
//type 1失败 2成功3表示系统战报即被成功压制
reports.push({ type: 3, time: nowSeconds(), score: addScore, roleName, trainId, hid, difficulty: battleRecord.record.difficulty });
reports.push({ type: 3, time: nowSeconds(), score: addScore, roleName, trainId, hid, difficulty });
pushGuildTrainSucMsg(roleId, roleName, code, hid);
if (needLockNext) {
if (needLockNext && maxTrainId > trainId) {
guildTrain = await unlockTrain(code, trainId + 1);
}
res.releaseCallback();//解锁
@@ -279,8 +280,8 @@ export class GuildTrainHandler {
if (!!res.err)
return resResult(STATUS.REDLOCK_ERR);
let { shilianRewardRatio } = getTrainBaseByLv(trainLv);
let { heroRewards, trainInstances } = getArmyTrainJuDian(trainId);
let { trainInstances } = getArmyTrainJuDian(trainId);
let trainInfo = getGuildTrainGkInfo(trainId, hid);
let { progress } = findWhere(trainInstances, { hid });
console.log('progress = ' + progress);
let guildTrain = await GuildTrainModel.findTrainInstanceBoxByIndex(code, trainId, hid, progress);
@@ -304,8 +305,7 @@ export class GuildTrainHandler {
res.releaseCallback();//解锁
return resResult(STATUS.GUILD_TRAIN_BOX_IS_GOT);
}
let good = getRandSingleEelm(heroRewards);
good.count = Math.floor((100 + shilianRewardRatio) * good.count / 100);
let good = getRandSingleEelm(trainInfo.heroRewards);
let goods = await addItems(roleId, roleName, sid, [good]);
let resGuildTrain = await GuildTrainModel.receiveBoxByIndex(code, roleId, trainId, hid, index, good);

View File

@@ -1,5 +1,5 @@
import { UserGuildModel, UserGuildType } from '../db/UserGuild';
import { getArmyTrainJuDian, getTrainBaseByLv } from '../pubUtils/data';
import { getArmyTrainJuDian, getGuildTrainGkInfo, getTrainBaseByLv } from '../pubUtils/data';
import { nowSeconds, getZeroPoint } from '../pubUtils/timeUtil';
import { GUILD_STRUCTURE } from '../consts';
import { GuildTrainType, GuildTrainModel, TrainInstance } from '../db/GuildTrain';
@@ -150,19 +150,15 @@ export async function resetTrain(code: string, serverId: number) {
const userGuildList = await UserGuildModel.getListByGuild(code, 'trainRewards', {});
const guildTrains = await GuildTrainModel.getGuildTrainBoxs(code);
let { shilianRewardRatio } = getTrainBaseByLv(GUILD_STRUCTURE.TRAIN);
//结算未领取的宝箱奖励发送到邮件中
userGuildList.forEach(async function ({roleId, trainRewards}) {
let goods: { id: number, count: number }[] = [];
guildTrains.forEach(guildTrain=>{
guildTrain.trainInstances.forEach(({ trainBoxs })=>{
guildTrain.trainInstances.forEach(({ trainBoxs, hid })=>{
if (!findWhere(trainBoxs, {roleId})) {
let { heroRewards } = getArmyTrainJuDian(guildTrain.trainId);
let { heroRewards } = getGuildTrainGkInfo(guildTrain.trainId, hid);
let good = getRandSingleEelm(heroRewards);
goods.push({
id: good.id,
count: Math.floor((100 + shilianRewardRatio) * good.count/100)
});
goods.push(good);
}
})
});

View File

@@ -378,6 +378,7 @@ export const FILENAME = {
DIC_GK_MAIN_ELITE: 'dic_zyz_gk_mainElite',
DIC_GK_TOWER: 'dic_zyz_gk_tower',
DIC_GK_TREASURE: 'dic_zyz_gk_Treasure',
DIC_GK_ARMY_TRAIN: 'dic_zyz_gk_armytrain',
DIC_HERO: 'dic_zyz_hero',
DIC_HERO_QUALITY_UP: 'dic_zyz_hero_quality_up',
DIC_HERO_STAR: 'dic_zyz_hero_star',
@@ -422,6 +423,7 @@ export const FILENAME = {
DIC_MAIL: 'dic_email_content',
DIC_ARMY_TRAIN_JU_DIAN: 'dic_army_trainJuDian',
DIC_ARMY_TRAIN_SOLO_REWARD: 'dic_army_trainSoloReward',
DIC_ARMY_TRAIN_INFO: 'dic_army_trainGk_info',
DIC_ARMY_ACTIVE_POINT_WAYS: 'dic_army_activePointWays',
DIC_ARMY_DEVELOPMENTCONSUME: 'dic_army_developmentConsume',
DIC_ARMY_BOSS_RANK_REWARD: 'dic_army_bossrankReward',
@@ -487,7 +489,8 @@ export const WAR_RELATE_TABLES = [
FILENAME.DIC_GK_MJSD,
FILENAME.DIC_GK_FES,
FILENAME.DIC_GK_NEWHERO,
FILENAME.DIC_GK_PROBATION
FILENAME.DIC_GK_PROBATION,
FILENAME.DIC_GK_ARMY_TRAIN
]
// 装备栏强化类型

View File

@@ -10,11 +10,11 @@ import { LineupParam } from '../domain/rank';
class Record {
@prop({ required: true, type: Number })
heroes: Array<number>; // 武将id
heroes?: Array<number>; // 武将id
@prop({ required: true, type: Number })
seqIds: Array<number>; // 武将seqid
seqIds?: Array<number>; // 武将seqid
@prop({ required: true, type: () => LineupParam, _id: false })
lineup: Array<LineupParam>; // 武将详细信息
lineup?: Array<LineupParam>; // 武将详细信息
@prop({ required: false })
oppRoleId?: string; // pvp对手
@prop({ required: false })
@@ -26,11 +26,13 @@ class Record {
@prop({ required: false })
trainId?:number;
@prop({ required: false })
trainLv?:number;
@prop({ required: false })
hid?:number;
@prop({ required: false })
guildCode?: string;
@prop({ required: false })
difficulty: number;
difficulty?: number;
}
export default class BattleRecord extends BaseModel {
@@ -70,7 +72,7 @@ export default class BattleRecord extends BaseModel {
return result;
}
public static async updateBattleRecordByCode(battleCode: string, params: object, lean = true) {
public static async updateBattleRecordByCode(battleCode: string, params: { $set: BattleRecordParam }, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOneAndUpdate({ battleCode }, params, { new: true, upsert: true }).lean(lean);
return result;
}
@@ -83,4 +85,5 @@ export default class BattleRecord extends BaseModel {
export const BattleRecordModel = getModelForClass(BattleRecord);
export interface BattleRecordType extends Pick<DocumentType<BattleRecord>, keyof BattleRecord> { }
export interface BattleRecordType extends Pick<DocumentType<BattleRecord>, keyof BattleRecord> { }
export type BattleRecordParam = Partial<BattleRecordType>; // 将所有字段变成可选项

View File

@@ -5,6 +5,7 @@ import { genCode } from '../pubUtils/util';
import { GUILD_STRUCTURE, GUILD_STATUS, GUILD_PER_PAGE, GUILD_SELECT, REDIS_KEY, SHOP_REFRESH_TYPE } from '../consts';
import { getZeroPoint, nowSeconds } from '../pubUtils/timeUtil';
import { reduceCe } from '../pubUtils/util';
import { gameData } from '../pubUtils/data';
class Structure {
@prop({ required: true })
@@ -237,7 +238,8 @@ export default class Guild extends BaseModel {
*/
public static async resetGuildTrain(code: string, serverId: number, trainLv: number, lean = true) {
const time = getZeroPoint(SHOP_REFRESH_TYPE.WEEKLY);//每周一5点刷新
const result = await GuildModel.findOneAndUpdate({ code, status: GUILD_STATUS.RUNNING, serverId, resetTrainTime:{$ne:time}},{$set: {trainId: 1, resetTrainTime: time, trainLv}}, {new: true}).lean(lean);
const newTrainId = gameData.firstGuildTrainIdOfLv.get(trainLv);
const result = await GuildModel.findOneAndUpdate({ code, status: GUILD_STATUS.RUNNING, serverId, resetTrainTime:{$ne:time}},{$set: {trainId: newTrainId, resetTrainTime: time, trainLv}}, {new: true}).lean(lean);
return result;
}

View File

@@ -49,7 +49,7 @@ import { dicGuildActiveWeekReward, loadGuildActiveWeekReward } from './dictionar
import { dicGuildActiveWays, loadGuildActiveWays } from './dictionary/DicGuildActiveWays';
import { dicGuildPosition, loadGuildPosition } from "./dictionary/DicGuildPosition";
import { dicMail, loadMail } from "./dictionary/DicMail";
import { dicArmyTrainJuDian, loadArmyTrainJuDian } from './dictionary/DicArmyTrainJuDian';
import { dicArmyTrainJuDian, loadArmyTrainJuDian, dicLastGuildTrainIdOfLv, dicFirstGuildTrainIdOfLv } from './dictionary/DicArmyTrainJuDian';
import { dicTrainSoloReward, loadTrainSoloReward } from './dictionary/DicTrainSoloReward';
import { RewardInter } from "./interface";
import { dicArmyDevelopConsume, loadArmyDevelopConsume } from './dictionary/DicArmyDevelopConsume';
@@ -93,6 +93,7 @@ import { dicQuenchConsume, loadQuenchConsume } from './dictionary/DicQuenchConsu
import { dicHoliday, loadHoliday } from './dictionary/DicHoliday';
import { dicExpeditionSubAttr, loadExpeditionSubAttr } from './dictionary/DicExpeditionSubAttr';
import { dicAuctionPool, loadAuctionReward } from './dictionary/DicAuctionReward';
import { dicGuildTrainInfo, loadGuildTrainInfo } from './dictionary/DicGuildTrainInfo';
import { pick } from "underscore";
export const gameData = {
@@ -166,11 +167,14 @@ export const gameData = {
donateBase: dicDonateBase,
armyWishPool: dicWishPoolBase,
storeBase: dicStoreBase,
guildTrainInfo: dicGuildTrainInfo,
structureConsume: dicStructureConsume,
guildActiveDayReward: dicGuildActiveDayReward,
guildActiveWeekReward: dicGuildActiveWeekReward,
guildPosition: dicGuildPosition,
armyTrainJuDian: dicArmyTrainJuDian,
lastGuildTrainIdOfLv: dicLastGuildTrainIdOfLv,
firstGuildTrainIdOfLv: dicFirstGuildTrainIdOfLv,
trainSoloReward: dicTrainSoloReward,
mail: dicMail,
guildActiveWays: dicGuildActiveWays,
@@ -779,6 +783,15 @@ export function getQuenchConsume(lvLimited: number, quality: number) {
return gameData.quenchConsume.get(`${lvLimited}_${quality}`);
}
/**
* 根据TrainJuDian的id和武将id获得信息包括多个难度
* @param trainId 据点id
* @param heroId 武将id
*/
export function getGuildTrainGkInfo(trainId: number, heroId: number) {
return gameData.guildTrainInfo.get(`${trainId}_${heroId}`);
}
function loadEquipAttributeRatio() {
let arr = decodeArrayListStr(param.ATTRIBUTE.ATTRIBUTE_EQUIP_RATIO);
for(let [id, ratio] of arr) {
@@ -894,6 +907,7 @@ function loadDatas() {
loadHoliday();
loadExpeditionSubAttr();
loadAuctionReward();
loadGuildTrainInfo();
}
// 重载dicParam

View File

@@ -4,40 +4,58 @@ type KeysEnum<T> = { [P in keyof Required<T>]: true };
import { RewardInter } from '../interface';
const _ = require('lodash');
export interface DicArmyTrainJuDian {
readonly id: number;
// 目标品质
readonly trainInstances: Array<{hid: number, warId: number, progress: number}>;
readonly heroRewards: Array<{id: number, count: number}>;
// 进阶奖励
readonly trainLv: number;
// 训练场多个难度组成的gk每个难度一个warId而这个gkId指trainGk_info这张表的id
readonly trainInstances: Array<{hid: number, gkId: number, progress: number}>;
// 进阶奖励
readonly jinjieReward: RewardInter[];
readonly soloRewardRatio: number;
}
const DicArmyTrainJuDianKeys: KeysEnum<DicArmyTrainJuDian> = {
id: true,
trainLv: true,
trainInstances: true,
heroRewards: true,
jinjieReward: true,
soloRewardRatio: true
};
export const dicArmyTrainJuDian = new Map<number, DicArmyTrainJuDian>();
export const dicLastGuildTrainIdOfLv = new Map<number, number>(); // 每级试炼场等级的最后据点id
export const dicFirstGuildTrainIdOfLv = new Map<number, number>(); // 每级试炼场等级的最先据点id
export function loadArmyTrainJuDian() {
dicLastGuildTrainIdOfLv.clear();
dicFirstGuildTrainIdOfLv.clear();
let arr = readFileAndParse(FILENAME.DIC_ARMY_TRAIN_JU_DIAN);
arr.forEach(o => {
o.trainInstances = o.gkid.split('|').map(element => {
let arr = element.split('&');
return {hid: parseInt(arr[0]), warId: parseInt(arr[1]), progress: parseInt(arr[2])};
return {hid: parseInt(arr[0]), gkId: parseInt(arr[1]), progress: parseInt(arr[2])};
});
o.jinjieReward = parseGoodStr(o.jinjieReward);
o.heroRewards = parseGoodStr(o.shilianReward);
dicArmyTrainJuDian.set(o.id,_.pick(o, Object.keys(DicArmyTrainJuDianKeys)));
if(!dicLastGuildTrainIdOfLv.has(o.trainLv)) {
dicLastGuildTrainIdOfLv.set(o.trainLv, o.id);
} else {
if(dicLastGuildTrainIdOfLv.get(o.trainLv) < o.id) {
dicLastGuildTrainIdOfLv.set(o.trainLv, o.id);
}
}
if(!dicFirstGuildTrainIdOfLv.has(o.trainLv)) {
dicFirstGuildTrainIdOfLv.set(o.trainLv, o.id);
} else {
if(dicFirstGuildTrainIdOfLv.get(o.trainLv) > o.id) {
dicLastGuildTrainIdOfLv.set(o.trainLv, o.id);
}
}
});
arr = undefined;
}

View File

@@ -0,0 +1,38 @@
import { readFileAndParse, parseGoodStr } from '../util'
import { FILENAME } from '../../consts'
type KeysEnum<T> = { [P in keyof Required<T>]: true };
import { RewardInter } from '../interface';
const _ = require('lodash');
// 训练场关卡信息(按攻击的武将区分)
export interface DicGuildTrainInfo {
readonly id: number;
readonly trainId: number;
readonly trainLv: number; // 试炼场等级
readonly heroId: number;
readonly heroRewards: RewardInter[]; // 翻牌子的奖励,随机其中一个
}
const DicGuildTrainInfoKeys: KeysEnum<DicGuildTrainInfo> = {
id: true,
trainId: true,
trainLv: true,
heroId: true,
heroRewards: true
};
export const dicGuildTrainInfo = new Map<string, DicGuildTrainInfo>();
export function loadGuildTrainInfo() {
let arr = readFileAndParse(FILENAME.DIC_ARMY_TRAIN_INFO);
arr.forEach(o => {
o.heroId = o.heroid;
o.heroRewards = parseGoodStr(o.shilianReward); // TODO 这个改到
dicGuildTrainInfo.set(`${o.trainId}_${o.heroId}`,_.pick(o, Object.keys(DicGuildTrainInfoKeys)));
});
arr = undefined;
}

View File

@@ -83,8 +83,6 @@ export interface DicTrainBase {
readonly difficultyRatio: number;
// 据点奖励增长系数
readonly judianRewardRatio: number;
readonly shilianRewardRatio: number;
}
const DicTrainKeys: KeysEnum<DicTrainBase> = {
@@ -92,8 +90,7 @@ const DicTrainKeys: KeysEnum<DicTrainBase> = {
level: true,
trainLevel: true,
difficultyRatio: true,
judianRewardRatio: true,
shilianRewardRatio: true
judianRewardRatio: true
};
// 捐献所

30
shared/resource/jsons/dic_army_trainBase.json Executable file → Normal file
View File

@@ -9,7 +9,8 @@
"shilianRewardRatio": 0,
"consume": 5000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "1&2&3&4&5&6&7&8&9&10"
},
{
"id": 2,
@@ -21,7 +22,8 @@
"shilianRewardRatio": 10,
"consume": 6000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "11&12&13&14&15&16&17&18&19&20"
},
{
"id": 3,
@@ -33,7 +35,8 @@
"shilianRewardRatio": 20,
"consume": 7000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "21&22&23&24&25&26&27&28&29&30"
},
{
"id": 4,
@@ -45,7 +48,8 @@
"shilianRewardRatio": 30,
"consume": 8000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "31&32&33&34&35&36&37&38&39&40"
},
{
"id": 5,
@@ -57,7 +61,8 @@
"shilianRewardRatio": 40,
"consume": 9000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "41&42&43&44&45&46&47&48&49&50"
},
{
"id": 6,
@@ -69,7 +74,8 @@
"shilianRewardRatio": 50,
"consume": 10000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "51&52&53&54&55&56&57&58&59&60"
},
{
"id": 7,
@@ -81,7 +87,8 @@
"shilianRewardRatio": 60,
"consume": 11000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "61&62&63&64&65&66&67&68&69&70"
},
{
"id": 8,
@@ -93,7 +100,8 @@
"shilianRewardRatio": 70,
"consume": 12000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "71&72&73&74&75&76&77&78&79&80"
},
{
"id": 9,
@@ -105,7 +113,8 @@
"shilianRewardRatio": 80,
"consume": 13000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "81&82&83&84&85&86&87&88&89&90"
},
{
"id": 10,
@@ -117,6 +126,7 @@
"shilianRewardRatio": 100,
"consume": 15000,
"buildWords": "&",
"imageID": "jttubiao_4"
"imageID": "jttubiao_4",
"shilianId": "91&92&93&94&95&96&97&98&99&100"
}
]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff