diff --git a/server/game2006service/constant.js b/server/game2006service/constant.js index d6d9e9f5..3e17ec37 100644 --- a/server/game2006service/constant.js +++ b/server/game2006service/constant.js @@ -1 +1,31 @@ exports.TIME_ZONE = 0; + +exports.NORMAL_HERO_FRAGMENT = [ + 110101, + 110111, + 110121, + 110131, + 110141, + 110151, + 110161, + 110171 +]; + +exports.SPEC_HERO_FRAGMENT = 110181; + +exports.ALL_HERO_FRAGMENT = exports.NORMAL_HERO_FRAGMENT.concat([exports.SPEC_HERO_FRAGMENT]); + +exports.NORMAL_GUN_FRAGMENT = [ + 110201, + 110211, + 110221, + 110231, + 110241, + 110251, + 110261, + 110271 +]; + +exports.SPEC_GUN_FRAGMENT = 110281; + +exports.ALL_GUN_FRAGMENT = exports.NORMAL_GUN_FRAGMENT.concat([exports.SPEC_GUN_FRAGMENT]); diff --git a/server/game2006service/tasks/fragment.js b/server/game2006service/tasks/fragment.js index b21865f9..b3bc5cea 100644 --- a/server/game2006service/tasks/fragment.js +++ b/server/game2006service/tasks/fragment.js @@ -6,6 +6,14 @@ const constant = require('../constant'); const YESTERDAY_HERO_NUM = 1000; const YESTERDAY_GUN_NUM = 1000; +const PVP_TYPE = 0; +const PVE_TYPE = 1; + +const PVP_RATIO = 0.6; +const PVE_RATIO = 0.4; + +const ITEM_PRE = 'item_'; + class Fragment { async start() { @@ -64,12 +72,12 @@ class Fragment { return; } const allocedFragments = new Map(); - allocedFragments.set(0, new Map()); - allocedFragments.set(1, new Map()); + allocedFragments.set(PVP_TYPE, new Map()); + allocedFragments.set(PVE_TYPE, new Map()); rows.forEach( (element) => { - if (element['type'] == 0 || - element['type'] == 1) { + if (element['type'] == PVP_TYPE || + element['type'] == PVE_TYPE) { const data = allocedFragments.get(element['type']); if (data) { const num = Math.max(0, element['alloc_num'] - element['fragment_num']); @@ -89,6 +97,106 @@ class Fragment { } async realloc(conn, daySeconds, nowTime, hourSeconds, allocedFragments) { + const hour = Math.floor(hourSeconds / 3600); + const remainHour = Math.min(24, Math.max(1, 24 - hour)); + + const remainData = this.getRemainData(daySeconds, nowTime, hourSeconds, allocedFragments); + } + + async getRemainData(daySeconds, nowTime, hourSeconds, allocedFragments) { + const totalHeroNum = this.getYesterDayHeroNum(); + const totalGunNum = this.getYesterDayGunNum(); + + const normalHeroNum = Math.floor(totalHeroNum * 0.06 * 8); + const specHeroNum = Math.floor(totalHeroNum * 0.02); + const normalGunNum = Math.floor(totalGunNum * 0.06 * 8); + const specGunNum = Math.floor(totalGunNum * 0.02); + + const remainData = new Map(); + remainData.set(PVP_TYPE, new Map()); + remainData.set(PVE_TYPE, new Map()); + remainData.forEach( + (value, key) => { + switch (key) { + case PVP_TYPE: + { + value.set('normalHeroNum', Math.floor(normalHeroNum * PVP_RATIO)); + value.set('specHeroNum', Math.floor(specHeroNum * PVP_RATIO)); + value.set('normalGunNum', Math.floor(normalGunNum * PVP_RATIO)); + value.set('specGunNum', Math.floor(specGunNum * PVP_RATIO)); + value.set('remainHeroNum', 0); + value.set('remainGunNum', 0); + } + break; + case PVE_TYPE: + { + value.set('normalHeroNum', Math.floor(normalHeroNum * PVE_RATIO)); + value.set('specHeroNum', Math.floor(specHeroNum * PVE_RATIO)); + value.set('normalGunNum', Math.floor(normalGunNum * PVE_RATIO)); + value.set('specGunNum', Math.floor(specGunNum * PVE_RATIO)); + value.set('remainHeroNum', 0); + value.set('remainGunNum', 0); + } + break; + default: + { + return; + } + break; + }//end switch + const data = allocedFragments.get(key); + constant.ALL_HERO_FRAGMENT.forEach( + (element) => { + if (element == constant.SPEC_HERO_FRAGMENT) { + const allocedNum = data.get(element); + let remainNum = value.get('specHeroNum'); + if (allocedNum) { + remainNum = Math.max(0, remainNum - allocedNum); + } + value.set(element, remainNum); + } else { + const allocedNum = data.get(element); + let remainNum = Math.floor(value.get('normalHeroNum') / 8); + if (allocedNum) { + remainNum = Math.max(0, remainNum - allocedNum); + } + value.set(element, remainNum); + } + } + );//end forEach + + constant.ALL_GUN_FRAGMENT.forEach( + (element) => { + if (element == constant.SPEC_GUN_FRAGMENT) { + const allocedNum = data.get(element); + let remainNum = value.get('specGunNum'); + if (allocedNum) { + remainNum = Math.max(0, remainNum - allocedNum); + } + value.set(ITEM_PRE + element, remainNum); + } else { + const allocedNum = data.get(element); + let remainNum = Math.floor(value.get('normalGunNum') / 8); + if (allocedNum) { + remainNum = Math.max(0, remainNum - allocedNum); + } + value.set(ITEM_PRE + element, remainNum); + } + } + );//end forEach + + } + );//end forEach + + return remainData; + } + + getYesterDayHeroNum() { + return YESTERDAY_HERO_NUM; + } + + getYesterDayGunNum() { + return YESTERDAY_GUN_NUM; } }