feat(gvg): 农庄

This commit is contained in:
luying
2023-01-12 20:50:36 +08:00
parent 54837f24b6
commit b2b9404684
30 changed files with 1192 additions and 104 deletions

View File

@@ -0,0 +1,296 @@
import { Application, BackendSession, ChannelService, HandlerService } from "pinus";
import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_ITEM_TYPE, GVG_PERIOD, GVG_RESOURCE_TYPE, ITEM_CHANGE_REASON, MAIL_TYPE, STATUS } from "../../../consts";
import { GVGLeagueModel } from "../../../db/GVGLeague";
import { GVGLeagueFarmModel, GVGLeagueFarmType } from "../../../db/GVGLeagueFarm";
import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare";
import { RoleModel } from "../../../db/Role";
import { LeagueFarmListInfo, LeagueFarmMember, LeagueField } from "../../../domain/gvgField/returnData";
import { gameData, getGVGResourceBasesByType } from "../../../pubUtils/data";
import { ItemInter, RewardInter } from "../../../pubUtils/interface";
import { nowSeconds } from "../../../pubUtils/timeUtil";
import { resResult } from "../../../pubUtils/util";
import { addGVGReward, getProduceCoinCnt, handleGVGCost } from "../../../services/gvg/gvgItemService";
import { addGVGActive, addResource, calFarmOutputs, getCostSeedReward, getItemIdOfSeedType, getLeagueFarmShowResult, getLockFieldCnt, getmyDistributeRank, rollbackUnPlantFields, unlockField } from "../../../services/gvg/gvgPrepareService";
import { getGVGConfig, getGVGPeriodData } from "../../../services/gvg/gvgService";
import { sendMailByContent } from "../../../services/mailService";
import { getAllServerName, getRoleOnlineInfo } from "../../../services/redisService";
export default function (app: Application) {
new HandlerService(app, {});
return new GVGProduceHandler(app);
}
export class GVGProduceHandler {
channelService: ChannelService;
constructor(private app: Application) {
this.channelService = app.get('channelService');
}
// 内政令兑换
async exchangeItem(msg: { id: number, count: number }, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const sid = session.get('sid');
const guildCode = session.get('guildCode');
const { id, count } = msg;
const dicGVGItem = gameData.gvgItem.get(id);
if(!dicGVGItem) return resResult(STATUS.DIC_DATA_NOT_FOUND);
if(dicGVGItem.type != GVG_ITEM_TYPE.SEED && dicGVGItem.type != GVG_ITEM_TYPE.SCOOP && dicGVGItem.type != GVG_ITEM_TYPE.AXE) {
return resResult(STATUS.GVG_ITEMS_NOT_PRODUCE);
}
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
const leagueItems = dicGVGItem.leagueConsume.map(cur => ({ id: cur.id, count: cur.count * count }));
const items = dicGVGItem.consume.map(cur => ({ id: cur.id, count: cur.count * count }));
const costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, leagueItems, items, ITEM_CHANGE_REASON.GVG_EXCHANGE_SEEDS);
if(!costResult) return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
const leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, [{ id, count }], [], ITEM_CHANGE_REASON.GVG_EXCHANGE_SEEDS);
return resResult(STATUS.SUCCESS, {
leagueGoods
});
}
// 获取农场/矿山/林场状态
async getProduceList(msg: { type: number }, session: BackendSession) {
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
const { type } = msg;
let { configId, period } = getGVGPeriodData();
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);
const leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
const leagueLv = leaguePrepare?.lv||0;
const leagueFarms = await GVGLeagueFarmModel.findByType(configId, myLeague.leagueCode, type);
const dicFarms = getGVGResourceBasesByType(type);
const result: LeagueFarmListInfo[] = [];
for(let { id, lv } of dicFarms) {
if(lv > leagueLv) continue;
const leagueFarm = leagueFarms.filter(cur => cur.farmId == id && cur.unlockTime >= nowSeconds()); // 已种植单位
const canHarvestFarms = leagueFarms.filter(cur => cur.farmId == id && cur.lockRoleId == roleId && cur.harvestTime > 0 && cur.harvestTime <= nowSeconds());
let obj = new LeagueFarmListInfo(id, leagueFarm.length, canHarvestFarms.length > 0);
result.push(obj);
}
return resResult(STATUS.SUCCESS, {
type,
list: result
});
}
// 不能进的农场,获取其他人的状态
async getOtherFarms(msg: { farmId: number }, session: BackendSession) {
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
const { farmId } = msg;
let { configId, period } = getGVGPeriodData();
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);
const leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
const fields = await GVGLeagueFarmModel.findPlantedByFarmId(configId, myLeague.leagueCode, farmId);
const roleIds: string[] = [], fieldByRoleId = new Map<string, GVGLeagueFarmType[]>();
for(let field of fields) {
if(roleIds.indexOf(field.lockRoleId) == -1) {
roleIds.push(field.lockRoleId);
fieldByRoleId.set(field.lockRoleId, []);
}
fieldByRoleId.get(field.lockRoleId).push(field);
}
const serverNames = await getAllServerName();
const roles = await RoleModel.findByRoleIds(roleIds);
const result: LeagueFarmMember[] = [];
for(let role of roles) {
let obj = new LeagueFarmMember(role, serverNames);
let myFields = fieldByRoleId.get(role.roleId)||[]
obj.setByFields(myFields);
const { foodSum } = await calFarmOutputs(myFields, myLeague, leaguePrepare);
obj.setOutput(foodSum);
result.push(obj);
}
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId, false),
members: result
});
}
// 小游戏界面
async getMyFarm(msg: { farmId: number }, session: BackendSession) {
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
const { farmId } = msg;
let { period } = getGVGPeriodData();
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);
await unlockField(myLeague.leagueCode, roleId, farmId);
const myRank = await getmyDistributeRank(myLeague.leagueCode, myLeague.members, roleId);
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId),
myRank,
});
}
// 种田
async plant(msg: { farmId: number, results: { fieldId: number, seedType: number }[] }, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const guildCode = session.get('guildCode');
const sid = session.get('sid');
const { farmId, results } = msg;
let { configId, period } = getGVGPeriodData();
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);
const cost: RewardInter[] = [], updateFields: { fieldId: number, seedType: number, time: number }[] = [];
for(let { fieldId, seedType } of results) {
let itemId = getItemIdOfSeedType(seedType);
let dicItem = gameData.gvgItem.get(itemId);
updateFields.push({ fieldId, seedType, time: dicItem.ripeTime });
// 算消耗的种子
let costObj = cost.find(({ id }) => id == itemId);
costObj? costObj.count++: cost.push({ id: itemId, count: 1 });
}
const costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, cost, [], ITEM_CHANGE_REASON.PLANT)
if(!costResult) return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
const plantResult = await GVGLeagueFarmModel.plant(configId, myLeague.leagueCode, farmId, updateFields, roleId);
await rollbackUnPlantFields(cost, plantResult, session, myLeague.leagueCode); // 可能会有田已经被其他人占领的情况,将种子还回去
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId)
});
}
// 收获
async harvest(msg: { farmId: number, fieldIds: number[] }, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const sid = session.get('sid');
const guildCode = session.get('guildCode');
const { farmId, fieldIds } = msg;
let { configId, period } = getGVGPeriodData();
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);
const leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
const myResultFields = await GVGLeagueFarmModel.harvest(configId, myLeague.leagueCode, farmId, fieldIds, roleId); // 解锁
if(myResultFields.length <= 0) return resResult(STATUS.GVG_CANNOT_HARVEST);
// 计算产量
const { foodSum, rewardSum, leagueRewardSum, activeSum } = await calFarmOutputs(myResultFields, myLeague, leaguePrepare);
// 资源
let resourceResult = await addResource(myLeague.leagueCode, roleId, GVG_RESOURCE_TYPE.FOOD, foodSum)||{};
// 相关物品
let leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueRewardSum, rewardSum, ITEM_CHANGE_REASON.HARVEST)
// 活跃
const active = await addGVGActive(myLeague.leagueCode, roleId, GVG_ACTIVE_TYPE.COST_PRODUCE_COIN, activeSum);
// 收获后再次预锁定一批田
await unlockField(myLeague.leagueCode, roleId, farmId);
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId),
leagueGoods,
active,
...resourceResult
});
}
// 关闭页面
async plantEnd(msg: { farmId: number }, session: BackendSession) {
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
const { farmId } = msg;
let { configId } = getGVGConfig();
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
await GVGLeagueFarmModel.releaseLock(configId, myLeague.leagueCode, farmId, roleId);
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId),
});
}
// 帮收
async helpHarvest(msg: { farmId: number, fieldId: number }, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const guildCode = session.get('guildCode');
const { farmId, fieldId } = msg;
let { configId, period } = getGVGPeriodData();
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);
const leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
const resultField = await GVGLeagueFarmModel.helpHarvest(configId, myLeague.leagueCode, farmId, fieldId); // 解锁
if(!resultField) return resResult(STATUS.GVG_CANNOT_HARVEST);
let targetRoleId = resultField.lockRoleId;
let targetOnlineInfo = await getRoleOnlineInfo(targetRoleId);
// 计算产量
const { foodSum, rewardSum, leagueRewardSum, activeSum } = await calFarmOutputs([resultField], myLeague, leaguePrepare);
// 资源
await addResource(myLeague.leagueCode, targetRoleId, GVG_RESOURCE_TYPE.FOOD, foodSum)||{};
await sendMailByContent(MAIL_TYPE.HELP_HARVEST, targetRoleId, { sendName: roleName, goods: rewardSum });
// 相关物品
await addGVGReward(targetRoleId, roleName, myLeague.leagueCode, targetOnlineInfo.sid, leagueRewardSum, [], ITEM_CHANGE_REASON.HARVEST)
// 活跃
await addGVGActive(myLeague.leagueCode, targetRoleId, GVG_ACTIVE_TYPE.COST_PRODUCE_COIN, activeSum);
return resResult(STATUS.SUCCESS, {
...await getLeagueFarmShowResult(myLeague.leagueCode, roleId, farmId),
});
}
// 获取资源
async debugAddResource(msg: { type: number, count: number }, session: BackendSession) {
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
const { type, count } = msg;
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let resourceResult = await addResource(myLeague.leagueCode, roleId, type, count);
if(!resourceResult) return resResult(STATUS.WRONG_PARMS);
return resResult(STATUS.SUCCESS, resourceResult);
}
}