🐞 fix(gvg): 修复农田特殊种子加成逻辑

This commit is contained in:
luying
2023-02-17 10:58:47 +08:00
parent eb5808dfb1
commit f21fd2dfa8
7 changed files with 78 additions and 75 deletions
@@ -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);
+4 -3
View File
@@ -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;
}
@@ -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<number, number>, maxAddTypeCntMap: Map<number, number>, count: number) {
let result = new Map<number, number>(); // 加成类型, 数量
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;
}