feat(gvg): 准备期征战中原初始

This commit is contained in:
luying
2023-01-30 10:24:54 +08:00
parent 3a71d7da97
commit 3c8ac3c9e5
11 changed files with 244 additions and 16 deletions

View File

@@ -5,6 +5,7 @@ import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoo
import { getFutureTime, nowSeconds } from '../pubUtils/timeUtil';
import { genCode } from '../pubUtils/util';
import { GVG } from '../pubUtils/dicParam';
import { GVG_RESOURCE_TYPE } from '../consts';
@index({ leagueCode: 1, configId: 1 })
@index({ fieldId: 1 })
@@ -138,9 +139,10 @@ export default class GVGLeagueFarm extends BaseModel {
public static async lockMineOrForestry(configId: number, leagueCode: string, farmId: number, type: number, roleId: string, fieldId: number, itemId: number) {
// 先创建
await GVGLeagueFarmModel.findOneAndUpdate({ configId, leagueCode, farmId, fieldId }, { $setOnInsert: { unlockTime: 0, itemId: 0, type } }, { upsert: true });
let unlockTime = nowSeconds() + type == GVG_RESOURCE_TYPE.MINERAL? GVG.GVG_MINE_LOCK_TIME: GVG.GVG_FORESTRY_LOCK_TIME;
const result: GVGLeagueFarmType = await GVGLeagueFarmModel.findOneAndUpdate(
{ configId, leagueCode, farmId, fieldId, $or:[{ unlockTime: { $lt: nowSeconds() } }, {lockRoleId: roleId}] },
{ $set: { unlockTime: nowSeconds() + GVG.GVG_FARM_LOCK_TIME, lockRoleId: roleId, itemId } },
{ $set: { unlockTime, lockRoleId: roleId, itemId } },
{ new: true }).lean();
return result;
}

View File

@@ -4,7 +4,7 @@ import { getZeroPointD } from '../pubUtils/timeUtil';
import { TASK_FUN_TYPE } from '../consts';
import { UpdateTaskParam } from '../domain/roleField/task';
@index({ leagueCode: 1, roleId: 1, configId: 1, status: 1 })
@index({ leagueCode: 1, roleId: 1, configId: 1 })
export default class GVGUserTask extends BaseModel {
@prop({ required: true, default: '' })

46
shared/db/GVGVestige.ts Normal file
View File

@@ -0,0 +1,46 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { getZeroPoint } from '../pubUtils/timeUtil';
class Vestige {
@prop({ required: true })
vestigeId: number; // 遗迹点
@prop({ required: true })
position: string; // 遗迹点位置
}
@index({ groupId: 1, day: 1 })
export default class GVGVestige extends BaseModel {
@prop({ required: true })
groupId: number; // 战区id
@prop({ required: true })
type: number; // 1-单服 2-跨服
@prop({ required: true, type: Vestige, _id: false })
vestiges: Vestige[]; // 今天的遗迹点
@prop({ required: true })
day: number; // 每天5点
public static async getVestigate(groupId: number) {
let day = getZeroPoint();
let result: GVGVestigeType = await GVGVestigeModel.findOne({ groupId, day }).lean();
return result;
}
public static async initTodayVestigate(groupId: number, type: number, vestiges: Vestige[]) {
let day = getZeroPoint();
let result: GVGVestigeType = await GVGVestigeModel.findOneAndUpdate({ groupId, day }, { $setOnInsert: { type, vestiges } }, { new: true, upsert: true }).lean();
return result;
}
}
export const GVGVestigeModel = getModelForClass(GVGVestige);
export interface GVGVestigeType extends Pick<DocumentType<GVGVestige>, keyof GVGVestige> {
id: number;
};
export type GVGVestigeUpdate = Partial<GVGVestigeType>; // 将所有字段变成可选项

View File

@@ -0,0 +1,44 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typegoose/typegoose';
import Role from './Role';
@index({ groupId: 1, vestigeId: 1 })
export default class GVGVestige extends BaseModel {
@prop({ required: true })
configId: number; // 赛期
@prop({ required: true })
day: number; // 每天5点
@prop({ required: true })
groupId: number; // 战区id
@prop({ required: true })
vestigeId: number; // 遗迹id
@prop({ required: true })
roleId: string; // 玩家
@prop({ ref: 'Role', type: mongoose.Schema.Types.ObjectId })
role: Ref<Role>;
@prop({ required: true, default: 0 })
rank: number; // 排名
@prop({ required: true, default: 0 })
oldRank: number; // 交换前排名
@prop({ required: true, default: 0 })
historyRank: number; // 历史最高排名
@prop({ required: true, default: 0 })
locked: number; // 是否被挑战
}
export const GVGVestigeModel = getModelForClass(GVGVestige);
export interface GVGVestigeType extends Pick<DocumentType<GVGVestige>, keyof GVGVestige> {
id: number;
};
export type GVGVestigeUpdate = Partial<GVGVestigeType>; // 将所有字段变成可选项

View File

@@ -384,12 +384,13 @@ export const GVG = {
GVG_SERVICETYPE_VESTIGE: '1&1|2&3', // 单服和跨服随机出几个遗迹点
GVG_ARMY_LEAGUE_TIME: 3, // GVG开启军团等级开启限制
GVG_ROLE_TYPE: '1&贤臣|2&猛将', // GVG中职能选择
GVG_SP_FIELD_ADD: 0.2,
GVG_FIELD_TYPE_RATIO: '1&10|2&20|3&10',
GVG_SP_FIELD_RATIO: '30&60',
GVG_FARM_LOCK_TIME: 180,
GVG_MINE_LOCK_TIME: 180,
GVG_TEAM_NUMBER: '1&1&100|2&50&100|3&80&100', // GVG编队index&lv&durability
GVG_CATAPULT: '3000&30&10', // 科技树投石车的耐久&单次伤害&间隔时间
GVG_CITY_OCCUPIED_NUMBER: 2, // 一个联军最多可以占领的城池数量
GVG_SP_FIELD_ADD: 0.2, // 农田特殊格子上种植对应的植物的加成
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 填最大最小百分比即可
};