✨ feat(gvg): 矿场
This commit is contained in:
@@ -10,13 +10,11 @@ import { calLeagueLv, gameData, getFieldMaxAddType } from "../../pubUtils/data";
|
||||
import { GVG } from "../../pubUtils/dicParam";
|
||||
import { RewardInter } from "../../pubUtils/interface";
|
||||
import { nowSeconds } from "../../pubUtils/timeUtil";
|
||||
import { getArrayOfNumber, getRandEelm, getRandValueByMinMax, parseGoodStr, sortArrRandom } from "../../pubUtils/util";
|
||||
import { arrToMap, getArrayOfNumber, getRandEelm, getRandValueByMinMax, parseGoodStr, sortArrRandom } from "../../pubUtils/util";
|
||||
import { addGVGReward } from "./gvgItemService";
|
||||
import { getGVGConfig } from "./gvgService";
|
||||
import { getProduceCoinCnt } from "./gvgItemService";
|
||||
import { GVGLeagueType } from "../../db/GVGLeague";
|
||||
import { getCities } from "../guildActivity/guildActivityService";
|
||||
import { getGVGCities } from "./gvgBattleService";
|
||||
import { GVGLeagueFarmRecModel } from "../../db/GVGLeagueFarmRec";
|
||||
|
||||
export function checkPreTech(techId: number, activeQueue: number[], techQueue: Tech[]) {
|
||||
const dicTech = gameData.gvgTech.get(techId);
|
||||
@@ -136,7 +134,7 @@ function getResourceCnt(resourceType: GVG_RESOURCE_TYPE, count: number) {
|
||||
}
|
||||
}
|
||||
|
||||
export async function unlockField(leagueCode: string, roleId: string, farmId: number) {
|
||||
export async function lockField(leagueCode: string, roleId: string, farmId: number) {
|
||||
let { configId } = getGVGConfig();
|
||||
const produceCoinCnt = await getLockFieldCnt(leagueCode, roleId);
|
||||
if(produceCoinCnt == 0) return
|
||||
@@ -160,7 +158,7 @@ export async function unlockField(leagueCode: string, roleId: string, farmId: nu
|
||||
lands.push({ fieldId, addType });
|
||||
}
|
||||
// 更新田
|
||||
let result = await GVGLeagueFarmModel.lockFields(configId, leagueCode, farmId, roleId, lands);
|
||||
await GVGLeagueFarmModel.lockFields(configId, leagueCode, farmId, roleId, lands);
|
||||
return await GVGLeagueFarmModel.findByFarmIdAndRoleId(configId, leagueCode, farmId, roleId);
|
||||
}
|
||||
|
||||
@@ -242,13 +240,11 @@ export async function rollbackUnPlantFields(cost: RewardInter[], plantResult: GV
|
||||
for(let { id, count } of cost) add.push({ id, count });
|
||||
for(let { seedType } of plantResult) {
|
||||
let index = add.findIndex(({ id }) => id == getItemIdOfSeedType(seedType));
|
||||
console.log('#### index', index);
|
||||
if(index != -1) {
|
||||
add[index].count --;
|
||||
if(add[index].count <= 0) add.splice(index);
|
||||
}
|
||||
}
|
||||
console.log('rollbackUnPlantFields', add, 'plantResult', plantResult)
|
||||
await addGVGReward(roleId, roleName, leagueCode, sid, add, [], ITEM_CHANGE_REASON.PLANT_ROLLBACK);
|
||||
return add;
|
||||
}
|
||||
@@ -312,11 +308,32 @@ export async function getLeagueFarmShowResult(leagueCode: string, roleId: string
|
||||
return { farmId, count: leagueFarms.length, fields: result }
|
||||
}
|
||||
|
||||
export async function calFarmOutputs(myResultFields: GVGLeagueFarmType[], league: GVGLeagueType, leaguePrepare: GVGLeaguePrepareType) {
|
||||
let cities = await getGVGCities(league);
|
||||
export function calFarmOutput(seedType: number, addType: number, farmId: number, cities: number[], activeTech: number[]) {
|
||||
// 种子基础产量 * ( 1 + 格子加成 + 农庄等级加成 + 战力城池加成 + 科技树加成)
|
||||
let itemId = getItemIdOfSeedType(seedType);
|
||||
let dicGVGItem = gameData.gvgItem.get(itemId);
|
||||
let dicFarm = gameData.gvgResource.get(farmId);
|
||||
if(!dicGVGItem || !dicFarm) return { output: 0, outputStr: '' };
|
||||
let { value: foodBase } = dicGVGItem;
|
||||
let addRatio = seedType == addType? GVG.GVG_SP_FIELD_ADD: 0;
|
||||
let farmRatio = dicFarm.fieldAdd;
|
||||
let cityRatio = getCitiesAdd(cities);
|
||||
let techRatio = getTechAdd(activeTech);
|
||||
|
||||
return {
|
||||
output: Math.floor(foodBase * (1 + (addRatio + farmRatio + cityRatio + techRatio)/100)),
|
||||
outputStr: `Math.floor(${foodBase} * (1 + (${addRatio} + ${farmRatio} + ${cityRatio} + ${techRatio})/100))`
|
||||
}
|
||||
}
|
||||
|
||||
export async function sumOutputByResults(myResultFields: GVGLeagueFarmType[]) {
|
||||
let [foodSum = 0, rewardSum = new Array<RewardInter>(), leagueRewardSum = new Array<RewardInter>(), activeSum = 0] = [];
|
||||
for(let { seedType, addType, farmId } of myResultFields) {
|
||||
let { food, reward, leagueReward, active } = calResourceResult(seedType, addType, farmId, cities||[], leaguePrepare?.activeTech||[]);
|
||||
for(let { seedType, output: food } of myResultFields) {
|
||||
let itemId = getItemIdOfSeedType(seedType);
|
||||
let dicGVGItem = gameData.gvgItem.get(itemId);
|
||||
if(!dicGVGItem) continue;
|
||||
let { reward, leagueReward, leagueConsume } = dicGVGItem;
|
||||
let produceCoin = getProduceCoinCnt(leagueConsume);
|
||||
foodSum += food;
|
||||
for(let { id, count } of reward) {
|
||||
let rewardObj = rewardSum.find(cur => cur.id == id);
|
||||
@@ -326,31 +343,60 @@ export async function calFarmOutputs(myResultFields: GVGLeagueFarmType[], league
|
||||
let rewardObj = leagueRewardSum.find(cur => cur.id == id);
|
||||
rewardObj? rewardObj.count += count: leagueRewardSum.push({id, count});
|
||||
}
|
||||
activeSum += active;
|
||||
activeSum += produceCoin;
|
||||
}
|
||||
return { foodSum, rewardSum, leagueRewardSum, activeSum }
|
||||
}
|
||||
|
||||
function calResourceResult(seedType: number, addType: number, farmId: number, cities: number[], activeTech: number[]) {
|
||||
// 种子基础产量 * ( 1 + 格子加成 + 农庄等级加成 + 战力城池加成 + 科技树加成)
|
||||
let itemId = getItemIdOfSeedType(seedType);
|
||||
let dicGVGItem = gameData.gvgItem.get(itemId);
|
||||
let dicFarm = gameData.gvgResource.get(farmId);
|
||||
if(!dicGVGItem || !dicFarm) return {};
|
||||
let { value: foodBase, reward, leagueReward, leagueConsume } = dicGVGItem;
|
||||
let addRatio = seedType == addType? GVG.GVG_SP_FIELD_ADD: 0;
|
||||
let farmRatio = dicFarm.fieldAdd;
|
||||
/**
|
||||
* 计算挖矿产量
|
||||
* @param farmId 矿场id
|
||||
* @param result 小游戏的结果
|
||||
* @param cities 上周占领城镇加成
|
||||
* @param activeTech 千机阁加成
|
||||
* @returns
|
||||
*/
|
||||
export function calMineOutput(farmId: number, result: [{ type: number, count: number }], cities: number[], activeTech: number[]) {
|
||||
// =(100*1.5【中铁块单块产量倍数】*4【可挖出的中铁块数量】+100*2【大铁块单块产量倍数】*8【可挖出的大铁块数量】+100*3【特大铁块单块产量倍数】*8【可挖出的特大铁块数量】)*(1+0.5【大城产量加成】)
|
||||
let dicMine = gameData.gvgResource.get(farmId);
|
||||
if(!dicMine) return { output: 0, outputStr: '' };
|
||||
let output = 0, addStrArr = [];
|
||||
for(let { type, count } of result) {
|
||||
let dic = dicMine.mineralValue.find(cur => cur.type == type);
|
||||
if(!dic) continue;
|
||||
output += dic.output * count;
|
||||
addStrArr.push(`${dic.output}*${count}`);
|
||||
}
|
||||
let cityRatio = getCitiesAdd(cities);
|
||||
let techRatio = getTechAdd(activeTech);
|
||||
let produceCoin = getProduceCoinCnt(leagueConsume);
|
||||
|
||||
return {
|
||||
food: Math.floor(foodBase * (1 + (addRatio + farmRatio + cityRatio + techRatio)/100)),
|
||||
reward, leagueReward,
|
||||
active: produceCoin
|
||||
output: Math.floor(output * (1 + (cityRatio + techRatio)/100)),
|
||||
outputStr: `Math.floor(${addStrArr.join('+')} * (1 + (${cityRatio} + ${techRatio})/100))`
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算木块产量
|
||||
* @param farmId 林场id
|
||||
* @param result 小游戏的结果
|
||||
* @param cities 上周占领城镇加成
|
||||
* @param activeTech 千机阁加成
|
||||
* @returns
|
||||
*/
|
||||
export function calForestryOutput(farmId: number, result: number, cities: number[], activeTech: number[]) {
|
||||
// =100*2【10级木堆木块单块基础产量倍数】*(1+0.3【城镇加成倍数】)*40【使用铁斧头最大分块】
|
||||
let dicForestry = gameData.gvgResource.get(farmId);
|
||||
if(!dicForestry) return { output: 0, outputStr: '' };
|
||||
let base = dicForestry.woodOutput;
|
||||
let cityRatio = getCitiesAdd(cities);
|
||||
let techRatio = getTechAdd(activeTech);
|
||||
return {
|
||||
output: Math.floor( base * (1 + (cityRatio + techRatio)/100) * result),
|
||||
outputStr: `Math.floor(${base} * (1 + (${cityRatio} + ${techRatio})/100) * ${result})`
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// TODO 城池加成,多城池取最大加成
|
||||
function getCitiesAdd(cities: number[]) {
|
||||
return 0
|
||||
@@ -366,4 +412,39 @@ function getTechAdd(activeTech: number[]) {
|
||||
}
|
||||
}
|
||||
return ratio;
|
||||
}
|
||||
|
||||
// 锁定
|
||||
export async function lockMineOrForestry(leagueCode: string, roleId: string, farmId: number, itemId: number) {
|
||||
let { configId } = getGVGConfig();
|
||||
const leagueFarms = await GVGLeagueFarmModel.findByFarmId(configId, leagueCode, farmId);
|
||||
// 查询现有的田
|
||||
let fieldId = getUnlockedMine(farmId, leagueFarms);
|
||||
if(!fieldId) return null;
|
||||
|
||||
let dicFarm = gameData.gvgResource.get(farmId);
|
||||
|
||||
let lockResult = await GVGLeagueFarmModel.lockMineOrForestry(configId, leagueCode, farmId, dicFarm?.type, roleId, fieldId, itemId);
|
||||
if(!lockResult) return null;
|
||||
|
||||
return lockResult;
|
||||
}
|
||||
|
||||
function getUnlockedMine(farmId: number, leagueFarms: GVGLeagueFarmType[]) {
|
||||
let leagueFarmMap = arrToMap(leagueFarms, obj => obj.fieldId);
|
||||
let fieldId = 0;
|
||||
let sum = gameData.gvgResource.get(farmId)?.sum??0;
|
||||
for(let i = 1; i <= sum; i++) {
|
||||
if(!leagueFarmMap.has(i)) {
|
||||
fieldId = i; break;
|
||||
}
|
||||
}
|
||||
return fieldId;
|
||||
}
|
||||
|
||||
export function checkItemCanUserInFarm(farmId: number, itemId: number) {
|
||||
let dicFarm = gameData.gvgResource.get(farmId);
|
||||
let dicGVGItem = gameData.gvgItem.get(itemId);
|
||||
if(!dicFarm || !dicGVGItem) return false;
|
||||
return dicFarm.type == dicGVGItem.type;
|
||||
}
|
||||
Reference in New Issue
Block a user