diff --git a/game-server/app/servers/guild/handler/gvgHandler.ts b/game-server/app/servers/guild/handler/gvgHandler.ts index e8cf5f80e..5b24852bc 100644 --- a/game-server/app/servers/guild/handler/gvgHandler.ts +++ b/game-server/app/servers/guild/handler/gvgHandler.ts @@ -1,5 +1,5 @@ import { Application, BackendSession, ChannelService, HandlerService, pinus } from "pinus"; -import { GVG_ITEM, DATA_NAME, GVG_ACTIVE_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, ITEM_CHANGE_REASON, LEAGUE_JOB, LEAGUE_MANAGE_TYPE, STATUS } from "../../../consts"; +import { GVG_ITEM, DATA_NAME, GVG_ACTIVE_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, ITEM_CHANGE_REASON, LEAGUE_JOB, LEAGUE_MANAGE_TYPE, STATUS, GVG_REC_TYPE } from "../../../consts"; import { GVGLeagueModel } from "../../../db/GVGLeague"; import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare"; import { GVGMainData, LeagueDistributeInfo, LeagueMemberDistributeInfo, LeagueMemberListInfo } from "../../../domain/gvgField/returnData"; @@ -19,6 +19,7 @@ import { lockLeagueData } from "../../../services/redLockService"; import { addGVGReward, handleGVGCost } from "../../../services/gvg/gvgItemService"; import { RewardInter } from "../../../pubUtils/interface"; import { getGVGCities } from "../../../services/gvg/gvgBattleService"; +import { GVGRecModel } from "../../../db/GVGRec"; export default function (app: Application) { new HandlerService(app, {}); @@ -73,10 +74,15 @@ export class GVGHandler { return resResult(STATUS.SUCCESS, data) } - // TODO 获取动态 + // 获取动态 async getRec(msg: {}, session: BackendSession) { - const roleId = session.get('roleId'); - return resResult(STATUS.SUCCESS, { recs: [] }); + const guildCode = session.get('guildCode'); + + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + const recs = await GVGRecModel.findByLeague(myLeague.leagueCode, GVG_REC_TYPE.PREPARE); + return resResult(STATUS.SUCCESS, { recs }); } // 选择职能 diff --git a/game-server/app/servers/guild/handler/gvgManageHandler.ts b/game-server/app/servers/guild/handler/gvgManageHandler.ts index 646314d2a..1d6d30288 100644 --- a/game-server/app/servers/guild/handler/gvgManageHandler.ts +++ b/game-server/app/servers/guild/handler/gvgManageHandler.ts @@ -17,6 +17,7 @@ import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare"; import { createGroupMsg, pushGroupMsgToRoom } from "../../../services/chatService"; import { sendMailToGuildByContent } from "../../../services/mailService"; import { getGVGCities } from "../../../services/gvg/gvgBattleService"; +import { guildQuitLeagueRecord } from "../../../services/gvg/gvgRecService"; export default function (app: Application) { new HandlerService(app, {}); @@ -408,7 +409,8 @@ export class GVGManageHandler { myLeague = await GVGLeagueModel.quitGuild(myLeague.leagueCode, guild); // 发送消息 - await sendMessageToGuildWithSuc(targetGuildCode, PUSH_ROUTE.LEAGUE_KICK, { leagueCode: myLeague.leagueCode }) + await sendMessageToGuildWithSuc(targetGuildCode, PUSH_ROUTE.LEAGUE_KICK, { leagueCode: myLeague.leagueCode }); + guildQuitLeagueRecord(myLeague.leagueCode, guild.name); // 返回 return resResult(STATUS.SUCCESS, { @@ -447,7 +449,8 @@ export class GVGManageHandler { // 更新联军信息 myLeague = await GVGLeagueModel.quitGuild(myLeague.leagueCode, guild); // 发送消息 - await sendMessageToGuildWithSuc(targetGuildCode, PUSH_ROUTE.LEAGUE_KICK, { leagueCode: myLeague.leagueCode }) + await sendMessageToGuildWithSuc(targetGuildCode, PUSH_ROUTE.LEAGUE_KICK, { leagueCode: myLeague.leagueCode }); + guildQuitLeagueRecord(myLeague.leagueCode, guild.name); // 返回 return resResult(STATUS.SUCCESS, { diff --git a/game-server/app/servers/guild/handler/gvgProduceHandler.ts b/game-server/app/servers/guild/handler/gvgProduceHandler.ts index 3c1bd316e..a72333f92 100644 --- a/game-server/app/servers/guild/handler/gvgProduceHandler.ts +++ b/game-server/app/servers/guild/handler/gvgProduceHandler.ts @@ -135,6 +135,7 @@ export class GVGProduceHandler { // 小游戏界面 async getMyFarm(msg: { farmId: number }, session: BackendSession) { const roleId = session.get('roleId'); + const roleName = session.get('roleName'); const guildCode = session.get('guildCode'); const { farmId } = msg; @@ -145,7 +146,7 @@ export class GVGProduceHandler { let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); - await lockField(myLeague.leagueCode, roleId, farmId); + await lockField(myLeague.leagueCode, roleId, roleName, farmId); const myRank = await getmyDistributeRank(myLeague.leagueCode, myLeague.members, roleId); return resResult(STATUS.SUCCESS, { @@ -220,13 +221,13 @@ export class GVGProduceHandler { // 计算产量 const { foodSum, rewardSum, leagueRewardSum, activeSum } = await sumOutputByResults(myResultFields); // 资源 - let resourceResult = await addResource(myLeague.leagueCode, roleId, GVG_RESOURCE_TYPE.FOOD, foodSum)||{}; + let resourceResult = await addResource(myLeague.leagueCode, roleId, roleName, 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 lockField(myLeague.leagueCode, roleId, farmId); + await lockField(myLeague.leagueCode, roleId, roleName, farmId); await GVGLeagueFarmRecModel.updateRecs(myResultFields, roleId); return resResult(STATUS.SUCCESS, { @@ -276,7 +277,7 @@ export class GVGProduceHandler { // 计算产量 const { foodSum, rewardSum, leagueRewardSum, activeSum } = await sumOutputByResults([resultField]); // 资源 - await addResource(myLeague.leagueCode, targetRoleId, GVG_RESOURCE_TYPE.FOOD, foodSum)||{}; + await addResource(myLeague.leagueCode, targetRoleId, resultField.lockRoleName, 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) @@ -361,7 +362,7 @@ export class GVGProduceHandler { let { reward, leagueReward, leagueConsume } = dicGVGItem; let produceCoin = getProduceCoinCnt(leagueConsume); // 资源 - let resourceResult = await addResource(myLeague.leagueCode, roleId, GVG_RESOURCE_TYPE.MINERAL, output)||{}; + let resourceResult = await addResource(myLeague.leagueCode, roleId, roleName, GVG_RESOURCE_TYPE.MINERAL, output)||{}; // 相关物品 let leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueReward, reward, ITEM_CHANGE_REASON.HARVEST) // 活跃 @@ -480,7 +481,7 @@ export class GVGProduceHandler { let { reward, leagueReward, leagueConsume } = dicGVGItem; let produceCoin = getProduceCoinCnt(leagueConsume); // 资源 - let resourceResult = await addResource(myLeague.leagueCode, roleId, GVG_RESOURCE_TYPE.WOOD, output)||{}; + let resourceResult = await addResource(myLeague.leagueCode, roleId, roleName, GVG_RESOURCE_TYPE.WOOD, output)||{}; // 相关物品 let leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueReward, reward, ITEM_CHANGE_REASON.HARVEST) // 活跃 @@ -497,13 +498,14 @@ export class GVGProduceHandler { // 获取资源 async debugAddResource(msg: { type: number, count: number }, session: BackendSession) { const roleId = session.get('roleId'); + const roleName = session.get('roleName'); 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); + let resourceResult = await addResource(myLeague.leagueCode, roleId, roleName, type, count); if(!resourceResult) return resResult(STATUS.WRONG_PARMS); return resResult(STATUS.SUCCESS, resourceResult); diff --git a/game-server/app/services/gvg/gvgPrepareService.ts b/game-server/app/services/gvg/gvgPrepareService.ts index ea8c85b96..2586c37b0 100644 --- a/game-server/app/services/gvg/gvgPrepareService.ts +++ b/game-server/app/services/gvg/gvgPrepareService.ts @@ -15,6 +15,7 @@ import { addGVGReward } from "./gvgItemService"; import { getGVGConfig } from "./gvgService"; import { getProduceCoinCnt } from "./gvgItemService"; import { GVGLeagueFarmRecModel } from "../../db/GVGLeagueFarmRec"; +import { addResourceRecord } from "./gvgRecService"; export function checkPreTech(techId: number, activeQueue: number[], techQueue: Tech[]) { const dicTech = gameData.gvgTech.get(techId); @@ -106,7 +107,7 @@ export function getMyDistribute(userDailyData: GVGUserDailyDataType) { * @param count 数量 * @returns */ -export async function addResource(leagueCode: string, roleId: string, resourceType: GVG_RESOURCE_TYPE, count: number) { +export async function addResource(leagueCode: string, roleId: string, roleName: string, resourceType: GVG_RESOURCE_TYPE, count: number) { let { configId } = getGVGConfig(); let resources = getResourceCnt(resourceType, count); if(!resources) return false; @@ -123,6 +124,7 @@ export async function addResource(leagueCode: string, roleId: string, resourceTy let userDailyData = await GVGUserDailyDataModel.addResource(configId, leagueCode, roleId, food, mineral, wood); let myDistribute = getMyDistribute(userDailyData); + addResourceRecord(roleId, roleName, leagueCode, resourceType, count); return { resource: league.resources, lv: league.lv, myDistribute } } @@ -138,7 +140,7 @@ function getResourceCnt(resourceType: GVG_RESOURCE_TYPE, count: number) { } } -export async function lockField(leagueCode: string, roleId: string, farmId: number) { +export async function lockField(leagueCode: string, roleId: string, roleName: string, farmId: number) { let { configId } = getGVGConfig(); const produceCoinCnt = await getLockFieldCnt(leagueCode, roleId); if(produceCoinCnt == 0) return @@ -162,7 +164,7 @@ export async function lockField(leagueCode: string, roleId: string, farmId: numb lands.push({ fieldId, addType }); } // 更新田 - await GVGLeagueFarmModel.lockFields(configId, leagueCode, farmId, roleId, lands); + await GVGLeagueFarmModel.lockFields(configId, leagueCode, farmId, roleId, roleName, lands); return await GVGLeagueFarmModel.findByFarmIdAndRoleId(configId, leagueCode, farmId, roleId); } @@ -321,7 +323,7 @@ export function calFarmOutput(seedType: number, addType: number, farmId: number, let { value: foodBase } = dicGVGItem; let addRatio = seedType == addType? GVG.GVG_SP_FIELD_ADD: 0; let farmRatio = dicFarm.fieldAdd; - let cityRatio = getCitiesAdd(cities); + let cityRatio = getCitiesAdd(cities, GVG_RESOURCE_TYPE.FOOD); let techRatio = getTechAdd(activeTech); return { @@ -371,7 +373,7 @@ export function calMineOutput(farmId: number, result: [{ type: number, count: nu output += dic.output * count; addStrArr.push(`${dic.output}*${count}`); } - let cityRatio = getCitiesAdd(cities); + let cityRatio = getCitiesAdd(cities, GVG_RESOURCE_TYPE.MINERAL); let techRatio = getTechAdd(activeTech); return { output: Math.floor(output * (1 + (cityRatio + techRatio)/100)), @@ -392,7 +394,7 @@ export function calForestryOutput(farmId: number, result: number, cities: number let dicForestry = gameData.gvgResource.get(farmId); if(!dicForestry) return { output: 0, outputStr: '' }; let base = dicForestry.woodOutput; - let cityRatio = getCitiesAdd(cities); + let cityRatio = getCitiesAdd(cities, GVG_RESOURCE_TYPE.WOOD); let techRatio = getTechAdd(activeTech); return { output: Math.floor( base * (1 + (cityRatio + techRatio)/100) * result), @@ -401,9 +403,22 @@ export function calForestryOutput(farmId: number, result: number, cities: number } -// TODO 城池加成,多城池取最大加成 -function getCitiesAdd(cities: number[]) { - return 0 +// 城池加成,多城池取最大加成 +function getCitiesAdd(cities: number[], resourceType: number) { + let outputAdds: number[] = [0]; + for(let cityId of cities) { + let dicCity = gameData.gvgCity.get(cityId); + let dicCityAdd = gameData.gvgCityAdd.get(dicCity?.cityType); + if(!dicCity || !dicCityAdd) continue; + if(resourceType == GVG_RESOURCE_TYPE.FOOD) { + outputAdds.push(dicCityAdd.foodAdd); + } else if (resourceType == GVG_RESOURCE_TYPE.MINERAL) { + outputAdds.push(dicCityAdd.mineralAdd); + } else if (resourceType == GVG_RESOURCE_TYPE.WOOD) { + outputAdds.push(dicCityAdd.woodAdd); + } + } + return Math.max(...outputAdds); } // 科技树加成 叠加 diff --git a/game-server/app/services/gvg/gvgRecService.ts b/game-server/app/services/gvg/gvgRecService.ts new file mode 100644 index 000000000..af22bf02b --- /dev/null +++ b/game-server/app/services/gvg/gvgRecService.ts @@ -0,0 +1,37 @@ + +// 动态 +import { GVG_REC_ID, GVG_REC_TYPE, GVG_RESOURCE_TYPE } from "../../consts"; +import { GVGRecModel } from "../../db/GVGRec"; +import { nowSeconds } from "../../pubUtils/timeUtil"; +import { getGVGConfig } from "./gvgService"; + +// 加入军团 +export async function guildJoinLeagueRecord(leagueCode: string, guildName: string) { + await leagueJoinOrQuitGuild(leagueCode, guildName, GVG_REC_ID.LEAGUE_JOIN_GUILD); +} + +// 退出军团 +export async function guildQuitLeagueRecord(leagueCode: string, guildName: string) { + await leagueJoinOrQuitGuild(leagueCode, guildName, GVG_REC_ID.LEAGUE_QUIT_GUILD); +} + +async function leagueJoinOrQuitGuild(leagueCode: string, guildName: string, recId: GVG_REC_ID.LEAGUE_JOIN_GUILD|GVG_REC_ID.LEAGUE_QUIT_GUILD) { + let { configId } = getGVGConfig(); + let params = [guildName]; + await GVGRecModel.addRec({ leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId, createTime: nowSeconds(), params }) +} + +// 获得资源 +export async function addResourceRecord(roleId: string, roleName: string, leagueCode: string, resourceType: GVG_RESOURCE_TYPE, output: number) { + let { configId } = getGVGConfig(); + let params = [roleName, getResourceNameByType(resourceType), `${output}`]; + await GVGRecModel.addRec({ roleId, leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.ADD_RESOURCE, createTime: nowSeconds(), params }) +} + +function getResourceNameByType(resourceType: GVG_RESOURCE_TYPE) { + switch(resourceType) { + case GVG_RESOURCE_TYPE.FOOD: return '粮食'; + case GVG_RESOURCE_TYPE.MINERAL: return '矿物'; + case GVG_RESOURCE_TYPE.WOOD: return '木堆'; + } +} \ No newline at end of file diff --git a/game-server/app/services/gvg/gvgService.ts b/game-server/app/services/gvg/gvgService.ts index b417b0b21..0b7d7b3e5 100644 --- a/game-server/app/services/gvg/gvgService.ts +++ b/game-server/app/services/gvg/gvgService.ts @@ -196,4 +196,4 @@ export async function calLeagueCe(league: GVGLeagueType) { const guildCodes = league?.guildCodes||[]; const guilds = await GuildModel.findByCodes(guildCodes); return guilds.reduce((pre, guild) => pre + guild.guildCe, 0); -} \ No newline at end of file +} diff --git a/game-server/app/services/gvg/gvgTeamService.ts b/game-server/app/services/gvg/gvgTeamService.ts index 40821ebaa..cd3450fbc 100644 --- a/game-server/app/services/gvg/gvgTeamService.ts +++ b/game-server/app/services/gvg/gvgTeamService.ts @@ -12,6 +12,7 @@ import { GVG } from "../../pubUtils/dicParam"; import { getZeroPointD } from "../../pubUtils/timeUtil"; import { resResult } from "../../pubUtils/util"; import { sendMessageToUserWithSuc } from "../pushService"; +import { guildJoinLeagueRecord } from "./gvgRecService"; import { calLeagueCe, getCurPeriod, getGVGConfig, getGVGPeriodData, getGVGServerType } from "./gvgService"; /** @@ -136,6 +137,7 @@ export async function joinGuildToLeague(league: GVGLeagueType, targetGuildCode: league = await GVGLeagueModel.joinGuild(league.leagueCode, targetGuild); await GuildModel.joinLeague(targetGuildCode, league.leagueCode); + guildJoinLeagueRecord(league.leagueCode, targetGuild.name); return resResult(STATUS.SUCCESS, league); } diff --git a/shared/consts/constModules/gvgConst.ts b/shared/consts/constModules/gvgConst.ts index c030d63f9..ea72ce696 100644 --- a/shared/consts/constModules/gvgConst.ts +++ b/shared/consts/constModules/gvgConst.ts @@ -95,4 +95,23 @@ export enum GVG_TECH_TYPE { BATTLE_REVIVE_GAP = 4, // 激战期复活间隔减少 BATTLE_ITEM_CATAPULT = 5, // 成员获得投石车(箭塔) BATTLE_ITEM_KNIFE = 6, // 成员活动匕首(攻城车) +} + +// 动态类型 +export enum GVG_REC_TYPE { + PREPARE = 1, // 备战期战报 + BATTLE_BY_ROLE = 2, // 个人战报 + BATTLE_BY_CITY = 3, // 城池战报 + BATTLE_BY_LEAGUE = 4, // 联军战报 +} + +// 动态具体id +export enum GVG_REC_ID { + ADD_RESOURCE = 1, // 成员贡献粮食、铁矿、木材 + SETTLE_POINT = 2, // 成员成功占领驻扎点 + POINT_BE_GRAB = 3, // 成员占领的驻扎点被其他联军抢占 + SEND_ITEM = 4, // 战备道具发放 + VESTIGE_RANK = 5, // 联军每日的征战排名 + LEAGUE_JOIN_GUILD = 6, // 军团加入联军 + LEAGUE_QUIT_GUILD = 7, // 军团退出联军 } \ No newline at end of file diff --git a/shared/db/GVGLeagueFarm.ts b/shared/db/GVGLeagueFarm.ts index 679a89692..38ee1a59c 100644 --- a/shared/db/GVGLeagueFarm.ts +++ b/shared/db/GVGLeagueFarm.ts @@ -32,6 +32,9 @@ export default class GVGLeagueFarm extends BaseModel { @prop({ required: true }) lockRoleId: string; // 锁定的人 + @prop({ required: true }) + lockRoleName: string; + @prop({ required: true }) harvestTime: number; // 收获时间,农庄:种植下去后将时间更新,收获之后设为0,林场&矿场:小游戏结束时更新 @@ -85,13 +88,13 @@ export default class GVGLeagueFarm extends BaseModel { * @param lands [{fieldId: number, time: number, addType: number}] fieldId:田地id, time: 锁定时间 addType: 种子加成 * @returns */ - public static async lockFields(configId: number, leagueCode: string, farmId: number, roleId: string, lands: { fieldId: number, addType: number }[]) { + 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} } })); const result = await GVGLeagueFarmModel.bulkWrite(lands.map(({ fieldId, addType }) => { - return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, $or:[{ unlockTime: { $lt: nowSeconds() }}, {lockRoleId: roleId} ] }, update: { $set: { addType, unlockTime: nowSeconds() + GVG.GVG_FARM_LOCK_TIME, lockRoleId: roleId } } } } + 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; } @@ -114,7 +117,7 @@ export default class GVGLeagueFarm extends BaseModel { public static async harvest(configId: number, leagueCode: string, farmId: number, fieldIds: number[], roleId: string) { const batchCode = genCode(10); const result = await GVGLeagueFarmModel.bulkWrite(fieldIds.map(fieldId => { - return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, lockRoleId: roleId, harvestTime: { $lt: nowSeconds() } }, update: { $set: { unlockTime: 0, harvestTime: 0, lockRoleId: '', batchCode }} } } + return { updateOne: { filter: { configId, leagueCode, farmId, fieldId, lockRoleId: roleId, harvestTime: { $lt: nowSeconds() } }, update: { $set: { unlockTime: 0, harvestTime: 0, lockRoleId: '', lockRoleName: '', batchCode }} } } })); if(result.modifiedCount == 0) return []; const fieldResult: GVGLeagueFarmType[] = await GVGLeagueFarmModel.find({ batchCode }).sort({ fieldId: 1 }).select('-_id -createdAt -updatedAt -__v -configId -leagueCode').lean(); @@ -124,12 +127,12 @@ export default class GVGLeagueFarm extends BaseModel { public static async helpHarvest(configId: number, leagueCode: string, farmId: number, fieldId: number) { const result: GVGLeagueFarmType = await GVGLeagueFarmModel.findOneAndUpdate( { configId, leagueCode, farmId, fieldId, harvestTime: { $lt: nowSeconds() }, unlockTime: { $gt: nowSeconds() } }, - { $set: { unlockTime: 0, harvestTime: 0, lockRoleId: '' }}, { new: true }).lean(); + { $set: { unlockTime: 0, harvestTime: 0, lockRoleId: '', lockRoleName: '' }}, { new: true }).lean(); return result } public static async releaseLock(configId: number, leagueCode: string, farmId: number, roleId: string) { - await GVGLeagueFarmModel.updateMany({ configId, leagueCode, farmId, lockRoleId: roleId }, { $set: { unlockTime: 0, lockRoleId: '' } }); + await GVGLeagueFarmModel.updateMany({ configId, leagueCode, farmId, lockRoleId: roleId }, { $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/GVGRec.ts b/shared/db/GVGRec.ts new file mode 100644 index 000000000..fe92c7279 --- /dev/null +++ b/shared/db/GVGRec.ts @@ -0,0 +1,52 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose'; +import { GVG_REC_TYPE } from '../consts'; + +@index({ leagueCode: 1, guildCode: 1, configId: 1 }) +@index({ createTime: -1 }) +export default class GVGRec extends BaseModel { + + @prop({ required: true, default: '' }) + leagueCode: string; // 联军id + + @prop({ required: false, default: '' }) + roleId: string; // 玩家id + + @prop({ required: false, default: '' }) + cityId: number; // 所处城池 + + @prop({ required: true, default: 0 }) + configId: number; // 赛期 + + @prop({ required: true, default: 0 }) + type: number; // 1-备战期联军动态 2-激战期我的战报 3-激战期城池战报 4-激战期军团战报 + + @prop({ required: true, default: 0 }) + recId: number; // 配在动态策划表中的id + + @prop({ required: true, default: [], type: String }) + params: string[]; // 显示的参数问题,替代%d的 + + @prop({ required: true, default: 0 }) + createTime: number; // 时间 + + public static async addRec(param: GVGRecUpdate) { + await GVGRecModel.insertMany([param]); + } + + public static async addRecs(params: GVGRecUpdate[]) { + await GVGRecModel.insertMany(params); + } + + public static async findByLeague(leagueCode: string, type: GVG_REC_TYPE) { + const result: GVGRecType[] = await GVGRecModel.find({ leagueCode, type }, { _id: 0, recId: 1, params: 1, createTime: 1 }).sort({ createTime: -1 }).limit(50).lean(); + return result; + } +} + +export const GVGRecModel = getModelForClass(GVGRec); + +export interface GVGRecType extends Pick, keyof GVGRec> { + id: number; +}; +export type GVGRecUpdate = Partial; // 将所有字段变成可选项 diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 9610f3ca5..13e3ed1b5 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -1122,7 +1122,6 @@ export function getGVGResourceBaseByTypeAndLv(type: number, lv: number) { return gameData.gvgResource.get(id); } - // 获取农庄小游戏最多能有多少特殊加成田 export function getFieldMaxAddType(farmId: number) { let add = new Map(); diff --git a/shared/pubUtils/dictionary/DicGVGCityAdd.ts b/shared/pubUtils/dictionary/DicGVGCityAdd.ts index 5f1da1713..149d00956 100644 --- a/shared/pubUtils/dictionary/DicGVGCityAdd.ts +++ b/shared/pubUtils/dictionary/DicGVGCityAdd.ts @@ -5,21 +5,21 @@ import { readFileAndParse } from '../util' export interface DicGVGCityAdd { // 城池类型 1-大城 2-中城 3-小城 cityType: number; - // dic_zyz_GVGResourceBase的type - resourceType: number; - // 联盟币的加成 - coinAdd: number; - // 产量加成 - outputAdd: number; + // 粮食加成 + foodAdd: number; + // 矿物加成 + mineralAdd: number; + // 木头加成 + woodAdd: number; } -export const dicGVGCityAdd = new Map(); +export const dicGVGCityAdd = new Map(); export function loadGVGCityAdd() { dicGVGCityAdd.clear(); let arr = readFileAndParse(FILENAME.DIC_GVG_CITY_ADD); arr.forEach(o => { - dicGVGCityAdd.set(`${o.cityType}_${o.resourceType}`, o); + dicGVGCityAdd.set(o.cityType, o); }); arr = undefined; } \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_GVGCityAdd.json b/shared/resource/jsons/dic_zyz_GVGCityAdd.json index f734c7a4b..d064aea15 100644 --- a/shared/resource/jsons/dic_zyz_GVGCityAdd.json +++ b/shared/resource/jsons/dic_zyz_GVGCityAdd.json @@ -1,8 +1,20 @@ [ { "cityType": 1, - "resourceType": 1, - "coinAdd": 0.1, - "outputAdd": 0.1 + "foodAdd": 0.1, + "mineralAdd": 0.1, + "woodAdd": 0.1 + }, + { + "cityType": 2, + "foodAdd": 0.3, + "mineralAdd": 0.3, + "woodAdd": 0.3 + }, + { + "cityType": 3, + "foodAdd": 0.5, + "mineralAdd": 0.5, + "woodAdd": 0.5 } ] \ No newline at end of file diff --git a/shared/resource/jsons/server_const.json b/shared/resource/jsons/server_const.json index 8a7d9bb03..e9d1ce6c6 100644 --- a/shared/resource/jsons/server_const.json +++ b/shared/resource/jsons/server_const.json @@ -33,6 +33,6 @@ "DEBUG_TIME": 1, "CHECK_WORD": 1, "CAN_PAY": 1, - "SKIP_ENCODE": 1, + "SKIP_ENCODE": 0, "NEED_REBATE": 0 } \ No newline at end of file