演武场和练兵场

This commit is contained in:
mamengke01
2021-01-22 09:44:13 +08:00
parent 7efcc637b3
commit 5da371a17d
17 changed files with 887 additions and 69 deletions
+10
View File
@@ -6,6 +6,8 @@ export const STATUS = {
INTERNAL_ERR: { code: 3, simStr: '内部错误' },
CONNECTOR_ERR: { code: 4, simStr: '连接服配置错误'},
LOGIN_ERR: { code: 5, simStr: '检测到您的账号异地登录,已被迫下线'},
REDLOCK_ERR: { code: 6, simStr: 'redlock错误' },
// 账号相关状态 10000 - 19999
SMS_IN_60S: { code: 10001, simStr: '60秒内只能发送一次' },
SMS_CNT_LIMIT: { code: 10002, simStr: '今日短信条数已达上限' },
@@ -208,6 +210,14 @@ export const STATUS = {
ROLE_SCHOOL_POSITION_UNLOCK_NOT_NEED: {code: 30605, simStr: '该位置已解锁'},
ROLE_SCROLL_REACH_MAX: {code: 30606, simStr: '已经升到可以升的最高等级'},
//军团30800-30899
GUILD_SCRIPT_IS_OPENED_TODAY: {code: 30800, simStr: '今日演武场已开启'},
GUILD_SCRIPT_NOT_OPENED: {code: 30801, simStr: '演武场未开启'},
GUILD_SCRIPT_IS_BATTLED: {code: 30802, simStr: '今日已挑战过演武场'},
GUILD_SCRIPT_IS_COMPLETE: {code: 30803, simStr: '演武场已挑战完成'},
GUILD_TRAIN_SCRIPT_NOT_OPENED: {code: 30910, simStr: '试炼关卡未开启'},
GUILD_TRAIN_BATTLE_COUNT_NOT_ENOUGH: {code: 30911, simStr: '试炼挑战次数已用完'},
GUILD_TRAIN_IS_COMPLETE: {code: 30912, simStr: '试炼关卡已经被压制'},
// 社交相关状态 40000 - 49999
// 运营模块相关状态 50000 - 59999
// GM后台相关状态 60000 - 69999
+53 -45
View File
@@ -8,62 +8,70 @@ import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoos
@index({ battleCode: 1 })
class Record {
@prop({ required: true, type: Number })
heroes: Array <number>; // 武将id
@prop({ required: false })
oppRoleId?: string; // pvp对手
@prop({ required: false })
pos?: number; // pvp位置
@prop({ required: true, type: Number })
heroes: Array<number>; // 武将id
@prop({ required: false })
oppRoleId?: string; // pvp对手
@prop({ required: false })
pos?: number; // pvp位置
@prop({ required: false })
recordNum?: number;
@prop({ required: false })
bossHp?: number;
@prop({ required: false })
trainId?:number;
@prop({ required: false })
hid?:number;
}
export default class BattleRecord extends BaseModel {
@prop({ required: true })
roleId: string; // 角色 id
@prop({ required: true })
roleName: string; // 角色名称
@prop({ required: true })
roleId: string; // 角色 id
@prop({ required: true })
roleName: string; // 角色名称
@prop({ required: true })
battleCode: string; // 关卡记录唯一标识
@prop({ required: true })
battleId: number; // 关卡 id
@prop({ required: true })
warName: string; // 关卡 名
@prop({ required: true })
warType: number; // 关卡 类型
@prop({ required: true })
battleCode: string; // 关卡记录唯一标识
@prop({ required: true })
battleId: number; // 关卡 id
@prop({ required: true })
warName: string; // 关卡 名
@prop({ required: true })
warType: number; // 关卡 类型
@prop({ required: true, default: 0 })
status: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败
@prop({ required: true, default: 0 })
star: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败
@prop({ required: true, _id: false })
record: Record; // 使用的武将等记录
@prop({ required: true, default: 0 })
status: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败
@prop({ required: true, default: 0 })
star: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败
@prop({ required: true, _id: false })
record: Record; // 使用的武将等记录
public static async getBattleRecordByCode(battleCode: string, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOne({ battleCode }).lean(lean);
return result;
}
public static async getBattleRecordByCode(battleCode: string, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOne({ battleCode }).lean(lean);
return result;
}
public static async getBattleRecordByIdAndStatus(roleId: string, battleId: number, status: number, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOne({ roleId, battleId, status }).lean(lean);
return result;
}
public static async getBattleRecordByIdAndStatus(roleId: string, battleId: number, status: number, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOne({ roleId, battleId, status }).lean(lean);
return result;
}
public static async getBattleRecordByIdAndStar(roleId: string, battleId: number, star: number, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOne({ roleId, battleId, star: {$lte: star} }).lean(lean);
return result;
}
public static async getBattleRecordByIdAndStar(roleId: string, battleId: number, star: number, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOne({ roleId, battleId, star: { $lte: star } }).lean(lean);
return result;
}
public static async updateBattleRecordByCode( battleCode: string, params: object, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOneAndUpdate({ battleCode }, params, {new: true, upsert: true}).lean(lean);
return result;
}
public static async updateBattleRecordByCode(battleCode: string, params: object, lean = true) {
const result: BattleRecordType = await BattleRecordModel.findOneAndUpdate({ battleCode }, params, { new: true, upsert: true }).lean(lean);
return result;
}
public static async deleteAccount(roleId: string) {
let result = await BattleRecordModel.deleteMany({roleId});
return result||{};
}
public static async deleteAccount(roleId: string) {
let result = await BattleRecordModel.deleteMany({ roleId });
return result || {};
}
}
export const BattleRecordModel = getModelForClass(BattleRecord);
export interface BattleRecordType extends Pick<DocumentType<BattleRecord>, keyof BattleRecord>{}
export interface BattleRecordType extends Pick<DocumentType<BattleRecord>, keyof BattleRecord> { }
+97
View File
@@ -0,0 +1,97 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { nowSeconds } from '../pubUtils/timeUtil';
class Rank {
@prop({ required: true })
roleId: string;
@prop({ required: true })
score: number;
@prop({ required: true })
time: number;
}
class LastRecord {
@prop({ required: true, default: 0 })
warId: number;
@prop({ required: true})
roleIds: Array<string>;
}
@index({ guildCode: 1 })
export default class BossScript extends BaseModel {
@prop({ required: true })
guildCode: string;
@prop({ required: true })
warId: number;
@prop({ required: true })
bossHp: number;
@prop({ required: true, type: Rank, default:[]})
ranks:Array<Rank>;
@prop({ required: true })
time: number;
@prop({ required: true, default: 0})
num: number;
@prop({ required: true, default:[]})
roleIdRecords: Array<string>; //记录提示过胜利boss关的玩家
@prop({ required: true })
winWarId: number; //记录上一次通关的关卡
@prop({ required: true })
winTime: number; //记录上一次通关的时间
@prop({ required: true, default: 0})
winNum: number;
@prop({ required: true, type: Rank, default:[]})
recordRanks:Array<Rank>;
@prop({ required: true, default: false })
winSettled: boolean; //胜利是否结算过
public static async findBossScript(guildCode: string, lean = true) {
const bossScript: BossScriptType = await BossScriptModel.findOne({ guildCode }).lean(lean);
return bossScript;
}
public static async openBossScript(guildCode: string, bossHp: number, warId: number, lean = true) {
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode },{ranks:[], time: nowSeconds(), bossHp, warId, $inc: { recordNum: 1 }}, {new: true, upsert: true}).lean(lean);
return bossScript;
}
//记录玩家boss通关后首次查看boss关卡
public static async recordRoleIdWhenCheck(guildCode: string, roleId: string, lean = true) {
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ roleIdRecords: roleId } }).lean(lean);
return bossScript;
}
public static async pushRecordRanks(guildCode: string, recordRank: Rank, lean = true) {
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ recordRanks: recordRank } }).lean(lean);
return bossScript;
}
public static async pushRanks(guildCode: string, rank: Rank, lean = true) {
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ recordRanks: rank } }).lean(lean);
return bossScript;
}
public static async updateBossScript(guildCode: string, update:BossScriptTypeParam, lean = true) {
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $set:update }).lean(lean);
return bossScript;
}
public static async updateBossHp(guildCode: string, hp: number, roleId: string, lean = true) {
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode, 'ranks.roleId': roleId, bossHp: { $gt: 0 } }, { $inc: { bossHp: - hp ,'ranks.$.score': hp}, }).lean(lean);
return bossScript;
}
}
export const BossScriptModel = getModelForClass(BossScript);
export interface BossScriptType extends Pick<DocumentType<BossScript>, keyof BossScript> {};
export type BossScriptTypeParam = Partial<BossScriptType>; // 将所有字段变成可选项
+1 -1
View File
@@ -11,7 +11,7 @@ class Structure {
lv: number;
}
@index({ roleId: 1 })
@index({ code: 1 })
export default class Guild extends BaseModel {
@prop({ required: true })
+90
View File
@@ -0,0 +1,90 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
class TrainBox {
}
class TrainScript {
@prop({ required: true })
hid: number;
@prop({ required: true })
progress: number;
@prop({ required: true })
time: number;
@prop({ required: true, default: [], type: TrainBox})
trainBoxs: Array<TrainBox>;
}
class Rank {
@prop({ required: true })
roleId: string;
@prop({ required: true })
score: number;
}
class Report {
@prop({ required: true })
roleId: string;
@prop({ required: true })
trainId: number;//挑战的试炼关
@prop({ required: true })
hid: number;//据点
@prop({ required: true })
score: number;
@prop({ required: true })
time: number;
@prop({ required: true })
isSuccessed: boolean;
@prop({ required: true })
type: number;//1表示普通战报, 2表示系统战报即:被成功压制
}
@index({guildCode:1, trainId:1})
export default class GuildTrain extends BaseModel {
@prop({ required: true })
guildCode: string;
@prop({ required: true })
trainId: number;
@prop({ required: true })
isComplete: boolean;
@prop({ required: true, default: [], type: TrainScript})
trainScripts: Array<TrainScript>;
@prop({ required: true, default: [], type: Rank })
ranks: Array<Rank>;
@prop({ required: true, default: [], type: Report })
reports: Array<Report>;
@prop({ required: true, default: false})
locked: boolean;
public static async findGuildTrain(guildCode: string, locked = false, lean = true) {
const guildTrain: GuildTrainType[] = await GuildTrainModel.findOne({ guildCode, locked }).lean(lean);
return guildTrain;
}
public static async findTrainByTrainIdNotLock(guildCode: string, trainId: number, locked = false, lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOne({ guildCode, trainId, locked }).lean(lean);
return guildTrain;
}
public static async updateGuildTrain(guildCode: string, trainId: number, update: GuildTrainTypeParam, lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId}, { $set: update }).lean(lean);
return guildTrain;
}
public static async updateGuildTrainProgress(guildCode: string, trainId: number, hid:number, progress: number, ranks:Array<Rank>, reports: Array<Report>, isComplete: boolean,lean = true) {
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId, 'trainScripts.hid':hid},
{ $set: {'trainScripts.$.progress': progress, ranks, reports, isComplete} }).lean(lean);
return guildTrain;
}
public static async openGuildTrain() {
// const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode },{ranks:[], time: nowSeconds(), bossHp, warId, $inc: { recordNum: 1 }}, {new: true, upsert: true}).lean(lean);
}
}
export const GuildTrainModel = getModelForClass(GuildTrain);
export interface GuildTrainType extends Pick<DocumentType<GuildTrain>, keyof GuildTrain> { };
export type GuildTrainTypeParam = Partial<GuildTrainType>; // 将所有字段变成可选项
+1 -16
View File
@@ -81,22 +81,7 @@ export default class Item extends BaseModel {
return { hasError: false, result }
}
}
// public static async decreaseItems(roleId: string, items: Array<{ id: number, count: number, ratio?: number}>, lean = true) {
// const transaction = new Transaction();
// let hasError: boolean = false, result = new Array();
// try {
// for (let { id, count, ratio } of items) {
// if (!ratio) ratio = -1;
// await transaction.update("Item", { roleId, id, count: { $gte: count } }, { $inc: { count: ratio * count } }, { new: true});
// }
// await transaction.run();
// return {hasError, result};
// } catch (error) {
// await transaction.rollback().catch(console.error);
// transaction.clean();
// return {error};
// }
// }
public static async deleteAccount(roleId: string) {
let result = await ItemModel.deleteMany({ roleId });
+4 -1
View File
@@ -23,11 +23,14 @@ export default class Mail extends BaseModel {
@prop({ required: true })
sendName: string;
@prop({ required: true })
content: string;
public static async addMails( mails: Array<MailType>) {
await MailModel.insertMany(mails);
}
public static async addMail(params:{roleId: string, goods: Array<RewardInter>, sendName: string, mailId: number, sendTime?: number}) {
public static async addMail(params:{roleId: string, goods: Array<RewardInter>, sendName: string, mailId: number, sendTime?: number, content?:string}) {
const doc = new MailModel();
const mail = Object.assign(doc.toJSON(), params);
await MailModel.create(mail);
+9
View File
@@ -42,6 +42,15 @@ export default class UserGuild extends BaseModel {
@prop({ required: true, default: new Date() })
refTimeWeekly: number;
@prop({ required: true, default: 0 })
trainCount: number;//每日挑战训练场的次数
@prop({ required: true, default: 0 })
trainTime: number;//上次刷新挑战训练场次数的时间
@prop({ required: true, default: [] })
trainRewards: Array<number>;//领取过的进阶等级
public static async getMyAuth(roleId: string, guildCode?: string, userGuild?: UserGuildType) {
let myGuild: UserGuildType;
if(!userGuild) {