diff --git a/game-server/app/servers/activity/handler/activityHandler.ts b/game-server/app/servers/activity/handler/activityHandler.ts index 6679cb1a9..51b4d64f2 100644 --- a/game-server/app/servers/activity/handler/activityHandler.ts +++ b/game-server/app/servers/activity/handler/activityHandler.ts @@ -42,6 +42,8 @@ export class ActivityHandler { const { } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); + const sid: string = session.get('sid'); + const funcs: number[] = session.get('funcs'); let test = true; let playerActivityArray = []; @@ -436,7 +438,7 @@ export class ActivityHandler { let heroNum = 1; // await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_QUALITY, heroNum, { heroes: [{ quality: 3 }] }) // await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_QUALITY_TO_QUALITY_COUNT, 1, { oldQuality: 1, quality: 2 }) - // await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_WAKE_UP_STAR_UP_COUNT, 1, { quality: 1, star: 1 }) + // await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_WAKE_UP_STAR_UP_COUNT, 1, { quality: 1, colorStar: 1 }) // await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.BATTLE_MAIN_ELITE, 1, { mainEliteWarId: 9001 }) // await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.BATTLE_DUNGEON_WAR, 1, { warId: 5001 }) // await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.BATTLE_EXPEDITION_BOX, 1) diff --git a/game-server/app/servers/activity/handler/gachaHandler.ts b/game-server/app/servers/activity/handler/gachaHandler.ts index 6fd74c92f..5c0ba3ded 100644 --- a/game-server/app/servers/activity/handler/gachaHandler.ts +++ b/game-server/app/servers/activity/handler/gachaHandler.ts @@ -121,6 +121,7 @@ export class GachaHandler { await checkTask(roleId, sid, funcs, TASK_TYPE.GASHA, count, true, {}); //活动统计 await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.GASHA, count) + await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.GACHA_QUALITY_COUNT, count, { heroes }) let resultRefFreeTime = 0; if (dicGacha.free.count > 0) { diff --git a/game-server/app/servers/battle/handler/guildTrainHandler.ts b/game-server/app/servers/battle/handler/guildTrainHandler.ts index 35120efc9..363a9e520 100644 --- a/game-server/app/servers/battle/handler/guildTrainHandler.ts +++ b/game-server/app/servers/battle/handler/guildTrainHandler.ts @@ -260,6 +260,7 @@ export class GuildTrainHandler { // 任务 if (isSuccess) { await checkTask(roleId, sid, funcs, TASK_TYPE.GUILD_TRAIN_SUCESS, 1, true, {}); + await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.GUILD_TRAIN_COUNT, 1, { trainId: trainId }) } await checkTask(roleId, sid, funcs, TASK_TYPE.GUILD_TRAIN, 1, true, {}); //成长任务 diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 444a6ca55..505de9bb1 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -228,9 +228,7 @@ export class HeroHandler { await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.HERO_QUALITY_STAR_UP, hero); //成长任务 await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_QUALITY_STAR_UP, 1, { quality: dicHero.quality, star: hero.star }); - if (hero.colorStar) {//觉醒升星 - await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_WAKE_UP_STAR_UP_COUNT, 1, { quality: dicHero.quality, star: hero.star }); - } + } const curHero = { @@ -349,7 +347,11 @@ export class HeroHandler { // 任务 await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.HERO_STAR_UP, hero); await checkTask(roleId, sid, funcs, TASK_TYPE.HERO_WAKE_UP, 1, true, {}); - await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_WAKE_UP_COUNT, 1, { quality: hero.quality }); + await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_QUALITY_WAKE_UP_COUNT, 1, { quality: hero.quality }); + await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_WAKE_UP_COUNT, 1, { hid: hid }); + if (isWakeUp) {//觉醒升星 + await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.HERO_WAKE_UP_STAR_UP_COUNT, 1, { quality: dicHero.quality, colorStar: update.colorStar }); + } } const curHero = { hid, diff --git a/game-server/app/servers/role/handler/roleHandler.ts b/game-server/app/servers/role/handler/roleHandler.ts index f850a4f19..729d73b5b 100644 --- a/game-server/app/servers/role/handler/roleHandler.ts +++ b/game-server/app/servers/role/handler/roleHandler.ts @@ -153,6 +153,8 @@ export class RoleHandler { let { id } = msg; let roleId = session.get('roleId'); let sid: string = session.get('sid'); + const serverId = session.get('serverId'); + let funcs: number[] = session.get('funcs'); let role = await RoleModel.findByRoleId(roleId); let teraphs = role.teraphs; @@ -183,6 +185,10 @@ export class RoleHandler { return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); role = await calAllHeroCe(HERO_SYSTEM_TYPE.TERAPH_UP, sid, roleId, { teraphs }, [id]); + + // 神像进阶,进阶一次就触发一次礼包弹框 + await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.ROLE_TERAPH_STAGE_UP, 1) + return resResult(STATUS.SUCCESS, { roleId, teraphs: role.teraphs }); } diff --git a/game-server/app/services/rewardService.ts b/game-server/app/services/rewardService.ts index 2147d7410..fdf83d9f9 100644 --- a/game-server/app/services/rewardService.ts +++ b/game-server/app/services/rewardService.ts @@ -1,4 +1,4 @@ -import { ITID, CONSUME_TYPE, getCurNameById, ITEM_TABLE, HERO_SYSTEM_TYPE, CURRENCY_BY_TYPE, FIGURE_UNLOCK_CONDITION, REDIS_KEY } from './../consts'; +import { ITID, CONSUME_TYPE, getCurNameById, ITEM_TABLE, HERO_SYSTEM_TYPE, CURRENCY_BY_TYPE, FIGURE_UNLOCK_CONDITION, REDIS_KEY, TASK_TYPE } from './../consts'; import { EquipModel } from './../db/Equip'; import { resResult } from '../pubUtils/util'; import { RoleModel, RoleType } from '../db/Role'; @@ -14,7 +14,7 @@ import { uniq, indexOf, findIndex } from 'underscore'; import { HeroModel, HeroType } from '../db/Hero'; import { Figure } from '../domain/dbGeneral'; import { Rank } from './rankService'; -import { pushTaskUpdate } from './taskService'; +import { checkActivityTask, pushTaskUpdate } from './taskService'; import { CreateHeroParam } from '../domain/roleField/hero'; export async function handleCost(roleId: string, sid: string, goods: Array) { @@ -64,7 +64,7 @@ export async function handleCost(roleId: string, sid: string, goods: Array, bags: Array, currencysMap: any, equips: Array) { for (let good of goods) { - if(good.count == 0) continue; + if (good.count == 0) continue; let goodInfo = gameData.goods.get(good.id); let { type, table } = ITID.get(goodInfo.itid); @@ -120,6 +120,12 @@ export async function addItems(roleId: string, roleName: string, sid: string, go pushTaskUpdate(roleId, sid, null, taskPushMessage); + //统计装备 + if (equipInfos.length > 0) { + let { serverId } = await RoleModel.findByRoleId(roleId); + await checkActivityTask(serverId, sid, [], roleId, TASK_TYPE.EQUIP_QUALITY_COUNT, equipInfos.length, { equips: equipInfos }) + } + //货币推送 if (!!Object.keys(currencysMap).length) { let role = await RoleModel.findByRoleId(roleId); @@ -310,7 +316,7 @@ export async function createHeroes(roleId: string, roleName: string, sid: string let newHeroInfo: CreateHeroParam[] = [], pieces: ItemInter[] = []; for (let h of heroInfo) { - let heroCount = h.count||1; + let heroCount = h.count || 1; if (userHeroesMap.has(h.hid)) { let { pieceId, count } = transPiece(h.hid); pieces.push({ id: pieceId, count: count * heroCount }); diff --git a/game-server/app/services/signInService.ts b/game-server/app/services/signInService.ts index eff0a90ca..6ddf820e5 100644 --- a/game-server/app/services/signInService.ts +++ b/game-server/app/services/signInService.ts @@ -71,9 +71,16 @@ export async function signInVIPActivity(serverId: number, roleId: string) { */ export async function newPlayerSignInActivity(serverId: number, roleId: string) { let { createTime } = await RoleModel.findByRoleId(roleId); - let betinTime = moment(createTime * 1000).startOf('d').toDate(); - let endTime = moment(betinTime).add(NEW_PLAYER_SIGIN_DAYS - 1, 'd').endOf('d').toDate() - let curDate = new Date() + let betinTime = null; + let endTime = null + let curDate = moment(createTime * 1000); + if (curDate.hour() < REFRESH_TIME) { + betinTime = moment(createTime * 1000).startOf('d').add(-1, 'd').add(REFRESH_TIME, 'h').toDate(); + endTime = moment(betinTime).add(NEW_PLAYER_SIGIN_DAYS, 'd').toDate() + } else { + betinTime = moment(createTime * 1000).startOf('d').add(REFRESH_TIME, 'h').toDate(); + endTime = moment(betinTime).add(NEW_PLAYER_SIGIN_DAYS, 'd').toDate() + } if (curDate > endTime) { return null; } diff --git a/game-server/app/services/thirtyDaysService.ts b/game-server/app/services/thirtyDaysService.ts index d36ba706b..c2d62ab15 100644 --- a/game-server/app/services/thirtyDaysService.ts +++ b/game-server/app/services/thirtyDaysService.ts @@ -6,6 +6,7 @@ import { RoleModel } from '../db/Role'; import moment = require('moment'); import { deltaDays } from '../pubUtils/util'; import { ServerlistModel } from '../db/Serverlist'; +import { HeroModel } from '../db/Hero'; /** * 获取活动数据 @@ -41,9 +42,15 @@ export async function getPlayerThirtyDaysData(activityId: number, serverId: numb let playerRecords: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.findData(serverId, activityId, roleId); let playerPointRecords: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.findData(activityId, roleId); + let playerData = new ThirtyDaysData(activityData); playerData.setPlayerRecords(playerRecords); playerData.setPlayerPointRecords(playerPointRecords); + + // let playerHeroes = await HeroModel.findByRole(roleId); + // let colorStarHeroes = playerHeroes.filter(obj => { return obj && obj.colorStar > 0 }) + // playerData.setColorStarCount(colorStarHeroes.length); + return playerData; } diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index cc65e17b1..cb3c4d141 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -622,10 +622,16 @@ export enum TASK_TYPE { GUILD_JOIN = 72, // 加入军团 BATTLE_MAIN_ELITE = 73, // 精英通关 HERO_QUALITY_TO_QUALITY_COUNT = 74,// *名武将*品升*品 - HERO_WAKE_UP_COUNT = 75, // *名武将*品觉醒 + HERO_QUALITY_WAKE_UP_COUNT = 75, // *名武将*品觉醒 HERO_WAKE_UP_STAR_UP_COUNT = 76, // *名武将升至觉醒*星 EQUIP_REFINE_LV = 77, // *件装备成功精炼到*级 EQUIP_SUIT_JEWEL_STAGE = 78, // *次触发,一个武将满装备情况下,必须都镶嵌有相同阶的宝石(阶数大于等于x情况下都算达成) + GUILD_TRAIN_COUNT = 79, // 练兵场通关x关x次 + HERO_UNLOCK = 80, // 名将谱x阵营全部激活 + GACHA_QUALITY_COUNT = 81, // 抽到*次品质*武将 + ROLE_TERAPH_STAGE_UP = 82, // 神像进阶 + EQUIP_QUALITY_COUNT = 83, // 获得*件品质的*装备 + HERO_WAKE_UP_COUNT = 84, // *名武将觉醒 } // 卡池类型 diff --git a/shared/db/ActivityPopUpShop.ts b/shared/db/ActivityPopUpShop.ts index b8a41e874..06e4e58ea 100644 --- a/shared/db/ActivityPopUpShop.ts +++ b/shared/db/ActivityPopUpShop.ts @@ -99,6 +99,13 @@ export default class Activity_Pop_Up_Shop extends BaseModel { return result; } + //添加数据并标记push消息 + public static async addTaskPushMessage(serverId: number, activityId: number, roleId: string, id: number, type: number, addCount: number, beginTime: Date, endTime: Date) { + let result: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOneAndUpdate({ serverId, roleId, activityId, id, type, addCount, beginTime, endTime }, + { $set: { isPush: true } }, { upsert: true, new: true }).lean(true); + return result; + } + //删除活动领取记录 public static async deleteActivity(serverId: number, activityId: number, roleId: string, id: number) { diff --git a/shared/domain/activityField/monthlyTicketField.ts b/shared/domain/activityField/monthlyTicketField.ts index cf0852504..117729447 100644 --- a/shared/domain/activityField/monthlyTicketField.ts +++ b/shared/domain/activityField/monthlyTicketField.ts @@ -16,6 +16,7 @@ export class MonthlyTicketData extends ActivityBase { baseReward: string = '';//每天领取的奖励 firstReward: string = '';//首次购买获得的奖励 imageName: string = ''; + rebet: number = 0;//返利倍数 endTime: number = 0;//结束时间 dayIndex: number = 0;//已经领取了几天 @@ -47,6 +48,7 @@ export class MonthlyTicketData extends ActivityBase { this.baseReward = dataObj.baseReward; this.firstReward = dataObj.firstReward; this.imageName = dataObj.imageName; + this.rebet = dataObj.rebet; this.isOpen = false; this.todayIndex = 0; diff --git a/shared/domain/activityField/thirtyDaysField.ts b/shared/domain/activityField/thirtyDaysField.ts index ef80395ac..6c19b4414 100644 --- a/shared/domain/activityField/thirtyDaysField.ts +++ b/shared/domain/activityField/thirtyDaysField.ts @@ -1,3 +1,4 @@ +import { TASK_TYPE } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; import { ActivityThirtyDaysModelType } from '../../db/ActivityThirtyDays'; import { ActivityThirtyDaysPointRewardModelType } from '../../db/ActivityThirtyDaysPointReward'; diff --git a/shared/pubUtils/itemUtils.ts b/shared/pubUtils/itemUtils.ts index 1aaf8d52c..b60957459 100644 --- a/shared/pubUtils/itemUtils.ts +++ b/shared/pubUtils/itemUtils.ts @@ -240,11 +240,12 @@ export async function createHeroes(roleId: string, roleName: string, serverId: n let heroNum = 0; let skinIds = new Array(); let conditions = new Array<{ type: number, paramHid?: number, paramFavourLv?: number, paramSkinId?: number }>(); - let heroes: HeroType[] = [], calHeroResults = [], calAllHeroResults = []; + let heroes: HeroType[] = [], calHeroResults = [], calAllHeroResults = [], dicHeroes = []; for (let heroInfo of heroInfos) { let dicHero = gameData.hero.get(heroInfo.hid); let { quality, initialStars: star, jobid: job, name: hName, initialSkin } = dicHero; + dicHeroes.push(dicHero); let info = { roleId, roleName, serverId, quality, star, job, hName, skins: [{ id: initialSkin, enable: true }] }; let curHero = await HeroModel.createHero(Object.assign(info, heroInfo)); @@ -270,6 +271,7 @@ export async function createHeroes(roleId: string, roleName: string, serverId: n //成长任务 await accomplishTask(serverId, roleId, TASK_TYPE.HERO_NUM, heroNum) await accomplishTask(serverId, roleId, TASK_TYPE.HERO_QUALITY, heroNum, { heroes }) + await accomplishTask(serverId, roleId, TASK_TYPE.HERO_UNLOCK, heroNum, { dicHeroes }) return { role, figureInfo, heroes, calHeroResults, calAllHeroResults, taskPushMessage } } diff --git a/shared/pubUtils/taskUtil.ts b/shared/pubUtils/taskUtil.ts index 7dce4145c..31265df8b 100644 --- a/shared/pubUtils/taskUtil.ts +++ b/shared/pubUtils/taskUtil.ts @@ -539,7 +539,7 @@ export async function accomplishTask(serverId: number, roleId: string, taskType: //30天任务统计 if (taskType === TASK_TYPE.HERO_QUALITY_STAR_UP || taskType === TASK_TYPE.HERO_QUALITY_TO_QUALITY_COUNT || - taskType === TASK_TYPE.HERO_WAKE_UP_COUNT || + taskType === TASK_TYPE.HERO_QUALITY_WAKE_UP_COUNT || taskType === TASK_TYPE.HERO_WAKE_UP_STAR_UP_COUNT || taskType === TASK_TYPE.HERO_QUALITY || @@ -605,6 +605,13 @@ export async function accomplishTask(serverId: number, roleId: string, taskType: popShopData.setPlayerRecords(playerRecord) pushMessage = pushMessage.concat(popShopData); } + } else if (taskType == TASK_TYPE.ROLE_TERAPH_STAGE_UP) {//只要触发就弹出礼包商店 + //推送 + // let playerRecord = await ActivityPopUpShopModel.addTaskPushMessage(serverId, activity.activityId, roleId, task.id, task.taskType, addCount, beginTime, endTime); + // popShopData.setPlayerRecords(playerRecord) + // pushMessage = pushMessage.concat(popShopData); + } else if (taskType == TASK_TYPE.EQUIP_QUALITY_COUNT) {//每天统计 + } else { let playerRecord = await ActivityPopUpShopModel.addTaskCount(serverId, activity.activityId, roleId, task.id, task.taskType, addCount); //推送 @@ -712,11 +719,11 @@ export function isComplete(roleId: string, taskType: TASK_TYPE, taskParam: strin case TASK_TYPE.HERO_QUALITY_TO_QUALITY_COUNT://herocount&quality&star& {oldQuality, quality: hero.quality} addCount = (param[1] == paramObj.oldQuality) && (param[2] == paramObj.quality) ? count : 0; break; - case TASK_TYPE.HERO_WAKE_UP_COUNT://herocount&quality + case TASK_TYPE.HERO_QUALITY_WAKE_UP_COUNT://herocount&quality addCount = (param[1] == paramObj.quality) ? count : 0; break; - case TASK_TYPE.HERO_WAKE_UP_STAR_UP_COUNT://herocount&star& - addCount = (param[1] == paramObj.star) ? count : 0; + case TASK_TYPE.HERO_WAKE_UP_STAR_UP_COUNT://herocount&colorStar& colorStar:彩星 1表示觉醒 + addCount = (param[1] == paramObj.colorStar) ? count : 0; break; case TASK_TYPE.HERO_STAGE_UP://herocount&star& addCount = (param[1] == paramObj.job) ? count : 0; @@ -854,11 +861,8 @@ export function isComplete(roleId: string, taskType: TASK_TYPE, taskParam: strin case TASK_TYPE.BATTLE_TOWER_LV://{towerLv} { let towerLv = paramObj.towerLv; - console.log('dddddddd', recordData, towerLv) if (recordData) { - console.log('dddddddd22', recordData) if (recordData >= towerLv) { - console.log('dddddddd22333', recordData) break; } } @@ -890,11 +894,56 @@ export function isComplete(roleId: string, taskType: TASK_TYPE, taskParam: strin addCount = count; break; } + case TASK_TYPE.GUILD_TRAIN_COUNT://trainId count&wardId& + { + if (paramObj.trainId == param[1]) { + addCount = count; + } + break; + } + case TASK_TYPE.HERO_UNLOCK:// + { + let camp = param[1] + let heroes = paramObj.dicHeroes.filter(hero => { return hero.camp == camp }) + addCount = heroes.length; + break; + } + case TASK_TYPE.GACHA_QUALITY_COUNT://count&quality& + { + let quality = param[1] + let heroes = paramObj.heroes.filter(hero => { return hero.quality == quality }) + addCount = heroes.length; + break; + } + case TASK_TYPE.ROLE_TERAPH_STAGE_UP:// + { + addCount = count; + break; + } + + case TASK_TYPE.HERO_WAKE_UP_COUNT: + { + + let hid = paramObj.hid; + if (recordData) { + record = recordData; + if (recordData.indexOf(hid) != -1) { + break; + } + } else { + record = []; + } + + addCount = count; + record.push(hid) + break; + } default: addCount = 0; break; } + console.log('dddddddddddd', addCount, record) return { addCount, record }; } diff --git a/shared/resource/jsons/dic_zyz_taskType.json b/shared/resource/jsons/dic_zyz_taskType.json index d6391f0b7..70738c6cc 100644 --- a/shared/resource/jsons/dic_zyz_taskType.json +++ b/shared/resource/jsons/dic_zyz_taskType.json @@ -1168,5 +1168,95 @@ "__EMPTY_3": 0, "__EMPTY_4": 0, "__EMPTY_5": 0 + }, + { + "id": 79, + "name": "练兵场", + "info": "练兵场通关x关x次", + "param": "count&wardId&", + "string": "发生次数&关卡Id&", + "content": 0, + "condition": "count", + "__EMPTY": 0, + "__EMPTY_1": 0, + "__EMPTY_2": 0, + "__EMPTY_3": 0, + "__EMPTY_4": 0, + "__EMPTY_5": 0 + }, + { + "id": 80, + "name": "名将谱激活", + "info": "名将谱x阵营全部激活", + "param": "count&camp&", + "string": "数量&阵营类型&", + "content": 0, + "condition": "count", + "__EMPTY": 0, + "__EMPTY_1": 0, + "__EMPTY_2": 0, + "__EMPTY_3": 0, + "__EMPTY_4": 0, + "__EMPTY_5": 0 + }, + { + "id": 81, + "name": "抽卡", + "info": "抽到*次品质*武将", + "param": "count&quality&", + "string": "数量&武将品质&", + "content": 0, + "condition": "count", + "__EMPTY": 0, + "__EMPTY_1": 0, + "__EMPTY_2": 0, + "__EMPTY_3": 0, + "__EMPTY_4": 0, + "__EMPTY_5": 0 + }, + { + "id": 82, + "name": "神像进阶", + "info": "神像进阶", + "param": "count&", + "string": "次数&", + "content": 0, + "condition": "count", + "__EMPTY": 0, + "__EMPTY_1": 0, + "__EMPTY_2": 0, + "__EMPTY_3": 0, + "__EMPTY_4": 0, + "__EMPTY_5": 0 + }, + { + "id": 83, + "name": "装备", + "info": "获得*件品质的*装备", + "param": "count&quality&", + "string": "次数&装备品质&", + "content": 0, + "condition": "count", + "__EMPTY": 0, + "__EMPTY_1": 0, + "__EMPTY_2": 0, + "__EMPTY_3": 0, + "__EMPTY_4": 0, + "__EMPTY_5": 0 + }, + { + "id": 84, + "name": "武将", + "info": "x名武将觉醒", + "param": "herocount&", + "string": "武将数量&", + "content": 0, + "condition": "herocount", + "__EMPTY": 0, + "__EMPTY_1": 0, + "__EMPTY_2": 0, + "__EMPTY_3": 0, + "__EMPTY_4": 0, + "__EMPTY_5": 0 } ] \ No newline at end of file