diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index e041bccc1..69ea41721 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -2,7 +2,7 @@ import { Application, BackendSession, HandlerService, } from 'pinus'; import { BattleRecordModel } from '../../../db/BattleRecord'; import { BattleSweepRecordModel } from '../../../db/BattleSweepRecord'; 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 { checkTowerWar, towerBattleEnd } from '../../../services/battleService'; import { WarReward } from '../../../services/warRewardService'; @@ -12,7 +12,7 @@ import { STATUS } from '../../../consts/statusCode'; import { resResult } from '../../../pubUtils/util'; import { RoleModel } from '../../../db/Role'; 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 { switchOnFunc } from '../../../services/funcSwitchService'; import { gameData } from '../../../pubUtils/data'; @@ -26,7 +26,9 @@ import { challengeDailyGK } from '../../../services/activity/dailyGKService'; import { challengeNewHeroGK } from '../../../services/activity/newHeroGKService'; import { reportTAEvent } from '../../../services/sdkService'; 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) { new HandlerService(app, {}); @@ -117,6 +119,8 @@ export class NormalBattleHandler { // 关卡列表 async getBattleList(msg: { types: number[] }, session: BackendSession) { const { types } = msg; + if(!isArray(types)) return resResult(STATUS.WRONG_PARMS); + let roleId = session.get('roleId'); let role = await RoleModel.findByRoleId(roleId); @@ -422,4 +426,48 @@ export class NormalBattleHandler { 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 + }); + } } diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index 9718bc96d..94d88a3d4 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -28,7 +28,7 @@ import { getGuildTrainInstance, getTrainBoxRewardsResult } from './guildTrainSer import { BossInstanceModel } from '../db/BossInstance'; import { getBossInstanceInfo } from './guildBossService'; import { getEvent } from './eventSercive'; -import { getBattleListOfMain } from './normalBattleService'; +import { getBattleListOfMain, getMainChapter } from './normalBattleService'; import { GuildType } from '../db/Guild'; import UserGuild, { UserGuildType } from '../db/UserGuild'; import { setPreDayActiveData, getAllGuildActivityStatus } from './guildActivity/guildActivityService'; @@ -154,7 +154,8 @@ async function getModuleData(type: string, data: { role: RoleType, session: Fron return await getBattleListOfMain(role); case 'guildActivity': return getAllGuildActivityStatus(); - + case 'chapter': + return getMainChapter(role); default: return null; } diff --git a/game-server/app/services/normalBattleService.ts b/game-server/app/services/normalBattleService.ts index ccf951fc6..e603dc818 100644 --- a/game-server/app/services/normalBattleService.ts +++ b/game-server/app/services/normalBattleService.ts @@ -193,4 +193,32 @@ export async function getBattleList(role: RoleType, type: number) { } result = result.sort((a, b) => { return a.battleId - b.battleId }); return result; -} \ No newline at end of file +} + +export function getStarOfChapter(warStar: WarStar[]) { + let map = new Map(); + 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||[], + } +} diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index ef64bed73..67b9b14e7 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -537,6 +537,7 @@ export const FILENAME = { DIC_JEWEL: 'dic_zyz_jewel', DIC_STONE: 'dic_zyz_stone', DIC_JEWEL_CONDITION: 'dic_zyz_jewel_condition', + DIC_MAIN_STAR_BOX: 'dic_zyz_main_star_reward', } export const WAR_RELATE_TABLES = [ @@ -1006,6 +1007,7 @@ export enum ITEM_CHANGE_REASON { ACT_TASK_PASS = 142, // 活动-战令奖励 ACT_TASK_PASS_SPD_UP = 143, // 活动-战令加速 ACT_GUILD_PAY_REWARD = 144, // 活动-军团人数奖励 + RECEIVE_CHAPTER_BOX = 145, // 领取主线章节宝箱 } export enum TA_EVENT { diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 133dbe59d..4aab80868 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -57,6 +57,7 @@ export const STATUS = { // 主线 20100 - 20199 BATTLE_INFO_VALIDATE_ERR: { code: 20101, simStr: '关卡信息不同' }, BATTLE_SWEEP_CONDITION_STAR: { code: 20102, simStr: '需要3星通过关卡才可以扫荡' }, + BATTLE_NO_BOX_CAN_RECEIVE: { code: 20103, simStr: '宝箱不可领取' }, // 每日 20200 - 20299 DAILY_WAR_NOT_FOUND: { code: 20201, simStr: '未找到该关卡' }, DAILY_TYPE_NOT_FOUND: { code: 20202, simStr: '未找到该类型' }, diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 53bb851a4..02b515dd5 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -326,6 +326,8 @@ export default class Role extends BaseModel { rankReceived: number[]; // 已领取奖励 @prop({ required: true, default: [], type: Number }) guide: number[]; // 引导 + @prop({ required: true, default: [], type: Number }) + receivedBox: number[]; // 引导 @prop({ required: true, default: false }) gachaHasGuide: boolean; // 是否进行过引导特殊招募 @@ -774,6 +776,10 @@ export default class Role extends BaseModel { 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); diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index afe7b43f7..16d9f5541 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -100,6 +100,7 @@ import { dicEquipStar, dicEquipStarIdByEquipId, loadEquipStar } from './dictiona import { dicEquipQualityExtra, loadEquipQualityExtra } from './dictionary/DicEquipQualityExtra'; import { dicEquipSuit, dicEquipSuitByJobClass, loadEquipSuit } from "./dictionary/DicEquipSuit"; import { dicJewelCondition, loadJewelCondition } from './dictionary/DicJewelCondition'; +import { dicMainStarBox, dicMainStarBoxByChapter, loadMainStarBox } from './dictionary/DicMainStarBox'; export const gameData = { daily: dicDaily, @@ -248,6 +249,8 @@ export const gameData = { blueprt: dicBlueprt, blueprtByLv: dicBlueprtByLv, heroIdByWar: dicHeroIdByWar, + mainBox: dicMainStarBox, + mainBoxByChapter: dicMainStarBoxByChapter, }; // 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据 @@ -1025,6 +1028,7 @@ function loadDatas() { loadJewel(); loadStone(); loadJewelCondition(); + loadMainStarBox(); } // 重载dicParam diff --git a/shared/pubUtils/dictionary/DicMainStarBox.ts b/shared/pubUtils/dictionary/DicMainStarBox.ts new file mode 100644 index 000000000..8cb729f3e --- /dev/null +++ b/shared/pubUtils/dictionary/DicMainStarBox.ts @@ -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(); +export const dicMainStarBoxByChapter = new Map(); // 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; +} \ No newline at end of file diff --git a/shared/pubUtils/dictionary/DicWar.ts b/shared/pubUtils/dictionary/DicWar.ts index 49c91b931..23cb9dc1f 100644 --- a/shared/pubUtils/dictionary/DicWar.ts +++ b/shared/pubUtils/dictionary/DicWar.ts @@ -17,6 +17,8 @@ export interface DicWar { readonly warType: number; // 关卡名 readonly gk_name: string; + // 章节id + readonly chapter: number; // 胜利后获得的君主经验 readonly kingExp: number; // 进入战场所需的最低等级 diff --git a/shared/resource/jsons/dic_zyz_main_star_reward.json b/shared/resource/jsons/dic_zyz_main_star_reward.json new file mode 100644 index 000000000..11cb59e5c --- /dev/null +++ b/shared/resource/jsons/dic_zyz_main_star_reward.json @@ -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" + } +] \ No newline at end of file