From f21fd2dfa8d1b0c721d2f803c2307a01f83681fd Mon Sep 17 00:00:00 2001 From: luying Date: Tue, 7 Feb 2023 18:05:21 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20fix(gvg):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=86=9C=E7=94=B0=E7=89=B9=E6=AE=8A=E7=A7=8D=E5=AD=90=E5=8A=A0?= =?UTF-8?q?=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guild/handler/gvgProduceHandler.ts | 34 ++++++------- game-server/app/services/checkParam.ts | 7 +-- .../app/services/gvg/gvgPrepareService.ts | 51 +++++++------------ shared/db/GVGLeagueFarm.ts | 35 +++++++++---- shared/db/GVGLeagueFarmRec.ts | 7 +-- shared/pubUtils/data.ts | 13 ++--- shared/pubUtils/dicParam.ts | 6 ++- 7 files changed, 78 insertions(+), 75 deletions(-) diff --git a/game-server/app/servers/guild/handler/gvgProduceHandler.ts b/game-server/app/servers/guild/handler/gvgProduceHandler.ts index 6e0303536..539bb08f5 100644 --- a/game-server/app/servers/guild/handler/gvgProduceHandler.ts +++ b/game-server/app/servers/guild/handler/gvgProduceHandler.ts @@ -69,7 +69,7 @@ export class GVGProduceHandler { const { type } = msg; let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -102,7 +102,7 @@ export class GVGProduceHandler { const { farmId } = msg; let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -142,7 +142,7 @@ export class GVGProduceHandler { const { farmId } = msg; let { period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -160,7 +160,7 @@ export class GVGProduceHandler { } // 种田 - async plant(msg: { farmId: number, seeds: { fieldId: number, seedType: number }[] }, session: BackendSession) { + async plant(msg: { farmId: number, seeds: { fieldId: number, seedType: number, index: number }[] }, session: BackendSession) { const roleId = session.get('roleId'); const serverId = session.get('serverId'); const guildCode = session.get('guildCode'); @@ -168,7 +168,7 @@ export class GVGProduceHandler { const { farmId, seeds } = msg; let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -182,14 +182,14 @@ export class GVGProduceHandler { const cities = await getGVGCities(myLeague); const leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode); - const cost: RewardInter[] = [], updateFields: { fieldId: number, seedType: number, time: number, output: number, outputStr: string }[] = []; - for(let { fieldId, seedType } of seeds) { + const cost: RewardInter[] = [], updateFields: { fieldId: number, seedType: number, index: number, time: number, output: number, outputStr: string }[] = []; + for(let { fieldId, seedType, index } of seeds) { let itemId = getItemIdOfSeedType(seedType); let dicItem = gameData.gvgItem.get(itemId); - let field = fields.find(cur => cur.fieldId == field); + let field = fields.find(cur => cur.fieldId == fieldId); if(!field) continue; let output = calFarmOutput(seedType, field.addType, farmId, cities, leaguePrepare?.activeTech||[]); - updateFields.push({ fieldId, seedType, time: dicItem.ripeTime, ...output }); + updateFields.push({ fieldId, seedType, index, time: dicItem.ripeTime, ...output }); // 算消耗的种子 let costObj = cost.find(({ id }) => id == itemId); costObj? costObj.count++: cost.push({ id: itemId, count: 1 }); @@ -199,7 +199,7 @@ export class GVGProduceHandler { const plantResult = await GVGLeagueFarmModel.plant(configId, myLeague.leagueCode, farmId, updateFields, roleId); await rollbackUnPlantFields(cost, plantResult, session, myLeague.leagueCode); // 可能会有田已经被其他人占领的情况,将种子还回去 - await GVGLeagueFarmRecModel.insertRecs(plantResult); + await GVGLeagueFarmRecModel.insertRecs(GVG_RESOURCE_TYPE.FOOD, plantResult); checkGVGTask(serverId, roleId, sid, configId, myLeague.leagueCode, TASK_TYPE.GVG_FARM, { count: 1 }); return resResult(STATUS.SUCCESS, { @@ -216,7 +216,7 @@ export class GVGProduceHandler { const { farmId, fieldIds } = msg; let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -268,7 +268,7 @@ export class GVGProduceHandler { const { farmId, fieldId } = msg; let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -303,7 +303,7 @@ export class GVGProduceHandler { if(!checkItemCanUserInFarm(farmId, itemId)) return resResult(STATUS.GVG_ITEM_CANNOT_USE); let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -333,7 +333,7 @@ export class GVGProduceHandler { const { farmId, fieldId, result } = msg; let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -390,7 +390,7 @@ export class GVGProduceHandler { const { farmId } = msg; let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -430,7 +430,7 @@ export class GVGProduceHandler { if(!checkItemCanUserInFarm(farmId, itemId)) return resResult(STATUS.GVG_ITEM_CANNOT_USE); let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -460,7 +460,7 @@ export class GVGProduceHandler { const { farmId, fieldId, result } = msg; let { configId, period } = getGVGPeriodData(); - // if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); + if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); diff --git a/game-server/app/services/checkParam.ts b/game-server/app/services/checkParam.ts index 4c01b0540..dc0ddb20a 100644 --- a/game-server/app/services/checkParam.ts +++ b/game-server/app/services/checkParam.ts @@ -1,5 +1,5 @@ import { isArray, isBoolean, isNumber, isString } from "underscore"; -import { BLOCK_OPEATE, DEBUG_MAGIC_WORD, GM_MAIL_TYPE, GUILD_AUTH, GUILD_STRUCTURE, GVG_RESOURCE_TYPE, LEAGUE_JOB, LINEUP_NUM, MSG_TYPE } from "../consts"; +import { BLOCK_OPEATE, DEBUG_MAGIC_WORD, GM_MAIL_TYPE, GUILD_AUTH, GUILD_STRUCTURE, GVG_RESOURCE_TYPE, GVG_SEED_TYPE, LEAGUE_JOB, LINEUP_NUM, MSG_TYPE } from "../consts"; import { pvpEndParamInter } from "../pubUtils/interface"; import { isDevelopEnv } from "./utilService"; @@ -1356,8 +1356,9 @@ export function checkRouteParam(route: string, msg: any) { { if(!checkNaturalNumbers(msg.farmId)) return false; if(!checkArrayCanEmpty(msg.seeds)) return false; - for(let { fieldId, seedType } of msg.seeds) { - if(!checkNaturalNumbers(fieldId, seedType)) return false; + for(let { fieldId, seedType, index } of msg.seeds) { + if(!checkNaturalNumbers(fieldId, seedType, index)) return false; + if(!checkIsInEnum(GVG_SEED_TYPE, seedType)) return false; } break; } diff --git a/game-server/app/services/gvg/gvgPrepareService.ts b/game-server/app/services/gvg/gvgPrepareService.ts index 2586c37b0..eee5c7e3c 100644 --- a/game-server/app/services/gvg/gvgPrepareService.ts +++ b/game-server/app/services/gvg/gvgPrepareService.ts @@ -126,7 +126,7 @@ export async function addResource(leagueCode: string, roleId: string, roleName: let myDistribute = getMyDistribute(userDailyData); addResourceRecord(roleId, roleName, leagueCode, resourceType, count); - return { resource: league.resources, lv: league.lv, myDistribute } + return { resource: league.resources, leagueLv: league.lv, myDistribute } } function getResourceCnt(resourceType: GVG_RESOURCE_TYPE, count: number) { @@ -144,6 +144,7 @@ export async function lockField(leagueCode: string, roleId: string, roleName: st let { configId } = getGVGConfig(); const produceCoinCnt = await getLockFieldCnt(leagueCode, roleId); if(produceCoinCnt == 0) return + const leagueFarms = await GVGLeagueFarmModel.findByFarmId(configId, leagueCode, farmId); // 查询现有的田 let { maxAddTypeCntMap, myAddTypeCntMap, allLands, myFieldCnt, myLockField } = calCntFromFarms(farmId, leagueFarms, roleId); @@ -175,19 +176,21 @@ function calCntFromFarms(farmId: number, leagueFarms: GVGLeagueFarmType[], roleI let myLockField = 0; // 玩家没有种只是锁住了的田 let allLands = getArrayOfNumber(gameData.gvgResource.get(farmId)?.sum??0); // 全部可使用的田 for(let leagueFarm of leagueFarms) { - // 全联军 - if(leagueFarm.addType) maxAddTypeCntMap.set(leagueFarm.addType, maxAddTypeCntMap.get(leagueFarm.addType) - 1); + // 加成 + for(let {addType, roleId: addTypeRoleId} of leagueFarm.addTypes) { + maxAddTypeCntMap.set(addType, maxAddTypeCntMap.get(addType) - 1); + if(addTypeRoleId == roleId) { + if(!myAddTypeCntMap.has(addType)) myAddTypeCntMap.set(addType, 0); + myAddTypeCntMap.set(addType, myAddTypeCntMap.get(addType) + 1); + } + } if(leagueFarm.unlockTime >= nowSeconds()) { let index = allLands.indexOf(leagueFarm.fieldId); - if(index > -1) allLands.splice(index); + if(index > -1) allLands.splice(index, 1); } // 玩家数据 if(leagueFarm.lockRoleId == roleId && leagueFarm.unlockTime >= nowSeconds()) { - if(leagueFarm.addType) { - if(!myAddTypeCntMap.has(leagueFarm.addType)) myAddTypeCntMap.set(leagueFarm.addType, 0); - myAddTypeCntMap.set(leagueFarm.addType, myAddTypeCntMap.get(leagueFarm.addType) + 1); - } myFieldCnt++; if(leagueFarm.harvestTime == 0) myLockField++; } @@ -205,36 +208,18 @@ function calCntFromFarms(farmId: number, leagueFarms: GVGLeagueFarmType[], roleI */ function calAddType(myFieldCnt: number, myAddTypeCntMap: Map, maxAddTypeCntMap: Map, count: number) { let result = new Map(); // 加成类型, 数量 - let minSpField = Math.floor((myFieldCnt + count) * gameData.gvgSpFieldRatio.min / 100); // 最少需要这么多个特殊田 - let maxSpField = Math.floor((myFieldCnt + count) * gameData.gvgSpFieldRatio.max / 100); // 最多可以有这么多个特殊田 - let myAllAddFieldCnt = 0; - for(let [_, cnt] of myAddTypeCntMap) myAllAddFieldCnt += cnt; - if(myAllAddFieldCnt >= maxSpField) return result; - let randCnt = getRandValueByMinMax(minSpField, maxSpField); - - for(let [addType, ratio] of gameData.gvgFieldAddType) { // 按比例加田 + for(let [addType, ratio] of gameData.gvgPlayerFieldAddType) { // 按比例加田 let maxCnt = maxAddTypeCntMap.get(addType)||0; if(maxCnt == 0) continue; - let cnt = Math.ceil(randCnt * ratio / 100); - let resultCnt = maxCnt > cnt? cnt: maxCnt; - myAllAddFieldCnt += resultCnt; - maxAddTypeCntMap.set(addType, maxAddTypeCntMap.get(addType) - 1); + let needCnt = Math.floor((myFieldCnt + count) * ratio / 100); // 玩家按照比例需要的加成数量 + let cnt = myAddTypeCntMap.get(addType)||0; // 我当前的加成数量 + let resultCnt = needCnt - cnt; + if(resultCnt < 0) resultCnt = 0; + if(resultCnt > maxCnt) resultCnt = maxCnt; + maxAddTypeCntMap.set(addType, maxAddTypeCntMap.get(addType) - resultCnt); result.set(addType, resultCnt); } - if(myAllAddFieldCnt < minSpField) { - for(let [addType, addCnt] of result) { // 如果还有多的塞一塞 - let maxCnt = maxAddTypeCntMap.get(addType)||0; - if(maxCnt > addCnt) { - let inc = maxCnt - addCnt > minSpField - myAllAddFieldCnt? minSpField - myAllAddFieldCnt: maxCnt - addCnt; - result.set(addType, count + inc); - myAllAddFieldCnt += inc; - if(myAllAddFieldCnt >= minSpField) break; - } else { - break; - } - } - } return result; } diff --git a/shared/db/GVGLeagueFarm.ts b/shared/db/GVGLeagueFarm.ts index f8ebbe27d..7a81f7ef4 100644 --- a/shared/db/GVGLeagueFarm.ts +++ b/shared/db/GVGLeagueFarm.ts @@ -7,6 +7,13 @@ import { genCode } from '../pubUtils/util'; import { GVG } from '../pubUtils/dicParam'; import { GVG_RESOURCE_TYPE } from '../consts'; +class AddType { + @prop({ required: true }) + addType: number; // 加成类型 + @prop({ required: true }) + roleId: string; // 加成玩家 +} + @index({ leagueCode: 1, configId: 1 }) @index({ fieldId: 1 }) @index({ batchCode: 1 }) @@ -43,7 +50,10 @@ export default class GVGLeagueFarm extends BaseModel { seedType: number; // 仅农庄使用,实际种的种子类型 @prop({ required: true }) - addType: number; // 仅农庄使用,种子加成 + addType: number; // 仅农庄使用,当前种子加成 + + @prop({ required: true, type: AddType, _id: false }) + addTypes: AddType[]; // 仅农庄使用,历史种子加成 @prop({ required: true }) batchCode: string; // 批量号 @@ -57,6 +67,9 @@ export default class GVGLeagueFarm extends BaseModel { @prop({ required: true }) outputStr: string; // 产量计算公式 + @prop({ required: true }) + index: number; // 种植位置 + public static async findByType(configId: number, leagueCode: string, type: number) { const result: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ configId, leagueCode, type }).select('-_id').lean(); return result; @@ -92,26 +105,30 @@ export default class GVGLeagueFarm extends BaseModel { public static async lockFields(configId: number, leagueCode: string, farmId: number, roleId: string, roleName: string, lands: { fieldId: number, addType: number }[]) { // 先创建 await GVGLeagueFarmModel.bulkWrite(lands.map(({ fieldId }) => { - return { updateOne: { filter: { configId, leagueCode, farmId, fieldId }, update: { $setOnInsert: { unlockTime: 0, harvestTime: 0, seedType: 0, addType: 0 } }, upsert: true} } + return { updateOne: { filter: { configId, leagueCode, farmId, fieldId }, update: { $setOnInsert: { unlockTime: 0, harvestTime: 0, seedType: 0, addType: 0, addTypes: [] } }, upsert: true} } })); const result = await GVGLeagueFarmModel.bulkWrite(lands.map(({ fieldId, addType }) => { - return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, $or:[{ unlockTime: { $lt: nowSeconds() }}, {lockRoleId: roleId, lockRoleName: roleName} ] }, update: { $set: { addType, unlockTime: nowSeconds() + GVG.GVG_FARM_LOCK_TIME, lockRoleId: roleId } } } } + if(addType > 0) { + return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, $or:[{ unlockTime: { $lt: nowSeconds() }}, {lockRoleId: roleId, lockRoleName: roleName} ] }, update: { $set: { addType, unlockTime: nowSeconds() + GVG.GVG_FARM_LOCK_TIME, lockRoleId: roleId }, $push: { addTypes: { addType, roleId } } } } } + } else { + return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, $or:[{ unlockTime: { $lt: nowSeconds() }}, {lockRoleId: roleId, lockRoleName: roleName} ] }, update: { $set: { addType, unlockTime: nowSeconds() + GVG.GVG_FARM_LOCK_TIME, lockRoleId: roleId } } } } + } })); return result; } public static async findByFarmIdAndRoleId(configId: number, leagueCode: string, farmId: number, roleId: string) { - const result: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ configId, leagueCode, farmId, lockRoleId: roleId, unlockTime: { $gte: nowSeconds() } }).sort({ fieldId: 1 }).select('-_id -createdAt -updatedAt -__v -leagueCode -configId -roleId').lean(); + const result: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ configId, leagueCode, farmId, lockRoleId: roleId, unlockTime: { $gte: nowSeconds() } }).sort({ index: -1, fieldId: 1 }).select('-_id -createdAt -updatedAt -__v -leagueCode -configId -roleId').lean(); return result; } - public static async plant(configId: number, leagueCode: string, farmId: number, fields: { fieldId: number, seedType: number, time: number, output: number, outputStr: string }[], roleId: string) { + public static async plant(configId: number, leagueCode: string, farmId: number, fields: { fieldId: number, seedType: number, time: number, output: number, outputStr: string, index: number }[], roleId: string) { const batchCode = genCode(10); - const result = await GVGLeagueFarmModel.bulkWrite(fields.map(({ fieldId, seedType, time, output, outputStr }) => { - return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, lockRoleId: roleId }, update: { $set: { seedType, unlockTime: getFutureTime(), harvestTime: nowSeconds() + time, batchCode, output, outputStr }} } } + const result = await GVGLeagueFarmModel.bulkWrite(fields.map(({ fieldId, seedType, time, output, outputStr, index }) => { + return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, lockRoleId: roleId }, update: { $set: { seedType, unlockTime: getFutureTime(), harvestTime: nowSeconds() + time, batchCode, output, outputStr, index }} } } })); if(result.modifiedCount == 0) return []; - const fieldResult: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ batchCode }).sort({ fieldId: 1 }).select('-_id -createdAt -updatedAt -__v -configId -leagueCode').lean(); + const fieldResult: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ batchCode }).sort({ fieldId: 1 }).select('-_id -createdAt -updatedAt -__v').lean(); return fieldResult; } @@ -133,7 +150,7 @@ export default class GVGLeagueFarm extends BaseModel { } public static async releaseLock(configId: number, leagueCode: string, farmId: number, roleId: string) { - await GVGLeagueFarmModel.updateMany({ configId, leagueCode, farmId, lockRoleId: roleId }, { $set: { unlockTime: 0, lockRoleId: '', lockRoleName: '' } }); + await GVGLeagueFarmModel.updateMany({ configId, leagueCode, farmId, lockRoleId: roleId, index: 0 }, { $set: { unlockTime: 0, lockRoleId: '', lockRoleName: '' } }); } public static async lockMineOrForestry(configId: number, leagueCode: string, farmId: number, type: number, roleId: string, fieldId: number, itemId: number) { diff --git a/shared/db/GVGLeagueFarmRec.ts b/shared/db/GVGLeagueFarmRec.ts index 14c64bb7b..edb0958f3 100644 --- a/shared/db/GVGLeagueFarmRec.ts +++ b/shared/db/GVGLeagueFarmRec.ts @@ -3,6 +3,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose'; import { GVGLeagueFarmType } from './GVGLeagueFarm'; +import { GVG_RESOURCE_TYPE } from '../consts'; @index({ leagueCode: 1, configId: 1, farmId: 1, fieldId: 1 }) export default class GVGLeagueFarmRec extends BaseModel { @@ -47,11 +48,11 @@ export default class GVGLeagueFarmRec extends BaseModel { output: number; // 产量 @prop({ required: false }) - outputStr: number; // 产量计算公式 + outputStr: string; // 产量计算公式 - public static async insertRecs(params: GVGLeagueFarmType[]) { + public static async insertRecs(type: GVG_RESOURCE_TYPE,params: GVGLeagueFarmType[]) { let insertParams = params.map(field => { - return { ...field, startRoleId: field.lockRoleId, startTime: new Date() } + return { ...field, startRoleId: field.lockRoleId, startTime: new Date(), type } }) await GVGLeagueFarmRecModel.insertMany(insertParams); } diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 755f272e6..4ff278f8a 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -317,7 +317,7 @@ export const gameData = { gvgResourceBaseByType: dicGVGResourceBaseByType, gvgResourceBaseByLv: dicGVGResourceBaseByLv, gvgFieldAddType: new Map(), - gvgSpFieldRatio: { min: 0, max: 0}, + gvgPlayerFieldAddType: new Map(), gvgContributeBox: dicGVGContributeBox, gvgArea: dicGVGArea, gvgCity: dicGVGCity, @@ -1151,12 +1151,10 @@ function parseGVGFieldAdd() { for(let [type, ratio] of arr) { gameData.gvgFieldAddType.set(parseInt(type), parseFloat(ratio)); } -} - -function parseGVGSpFieldRatio() { - let arr = param.GVG.GVG_SP_FIELD_RATIO.split('&'); - gameData.gvgSpFieldRatio.min = parseFloat(arr[0]); - gameData.gvgSpFieldRatio.max = parseFloat(arr[0]); + let arr2 = decodeArrayListStr(param.GVG.GVG_SP_FIELD_RATIO); + for(let [type, ratio] of arr2) { + gameData.gvgPlayerFieldAddType.set(parseInt(type), parseFloat(ratio)); + } } export function getGVGTasksByType(taskType: number) { @@ -1220,7 +1218,6 @@ function parseDicParam() { parseComBattleRewardTime(); parseGVGActive(); parseGVGFieldAdd(); - parseGVGSpFieldRatio(); parseGVGVestigeCnt(); } diff --git a/shared/pubUtils/dicParam.ts b/shared/pubUtils/dicParam.ts index 697134de5..32f506ba9 100644 --- a/shared/pubUtils/dicParam.ts +++ b/shared/pubUtils/dicParam.ts @@ -391,12 +391,14 @@ export const GVG = { GVG_FARM_LOCK_TIME: 300, // 农田锁定时间(秒) GVG_MINE_LOCK_TIME: 300, // 矿山锁定时间(秒) GVG_FORESTRY_LOCK_TIME: 300, // 林场锁定时间(秒) - GVG_FIELD_TYPE_RATIO: '1&5%|2&10%|3&10%', // 全联盟的特殊格子上限百分比(a%的格子为小麦这个)1&a|2&b|3&c - GVG_SP_FIELD_RATIO: '10%&30%', // 分配给玩家的时候有多少特殊格子 min&max 填最大最小百分比即可 + GVG_FIELD_TYPE_RATIO: '1&5%|2&10%|3&10%', // 全联盟的 + GVG_SP_FIELD_RATIO: '1&5%|2&10%|3&10%', // 分配给玩家的时候特殊格子上限百分比(a%的格子为小麦这个)1&a|2&b|3&c GVG_REFRESH_TIME: 5, // 0 GVG_ROBOT_NAME: '遗迹守卫', // 0 GVG_SINGLE_SERVICE_CITY: '1&2&3', // 单服城池 GVG_CROSS_SERVICE_CITY: '4&5&6&7&8&9&10&11&12&13', // 跨服城池 GVG_VESTIGE_PREPARE_COUNTDOWN: 120, // 遗迹准备界面倒计时(s) GVG_VESTIGE_BATTLE_COUNTDOWN: 300, // 遗迹战斗界面倒计时(s) + GVG_VESTIGE_BGMAP_GKID: 80001, // GVG备战期遗迹防守阵容地图所用的关卡id + GVG_CITY_BGMAP_GKID: 85001, // GVG激战期防守阵容地图所用的关卡id };