演武台:鼓舞,次数限制,掉落修改,结构修改

This commit is contained in:
luying
2021-09-23 20:17:22 +08:00
parent 15dc3029d9
commit 1501630d47
13 changed files with 403 additions and 281 deletions
+3 -2
View File
@@ -162,6 +162,7 @@ export const GUILD_ROUTE_OPERATE = [
{ route: 'guild.raceActivityHandler.getRace', operate: GUILD_OPERATE.RACE_ACTIVITY, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF_WITH_SESSION },
{ route: 'guild.raceActivityHandler.useItem', operate: GUILD_OPERATE.RACE_ACTIVITY, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF_WITH_SESSION },
{ route: 'guild.raceActivityHandler.battleEnd', operate: GUILD_OPERATE.RACE_ACTIVITY, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF_WITH_SESSION },
{ route: 'guild.guildBossHandler.encou', operate: GUILD_OPERATE.BOSS_BATTLE, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
];
@@ -217,10 +218,10 @@ export enum GUILD_REC_TYPE {
IMPEACH = 11, // 弹劾 roleName roleName
}
//1:等待团长开启,2:今日已开启,且boss通关,3:开启中
//1:等待团长开启,2:boss已通关,3:开启中
export enum GUILD_BOSS_STATUS {
WAIT_OPEN = 1,
OPENED = 2,
CLEAR = 2,
OPEN = 3,//开启中
}
+1
View File
@@ -201,6 +201,7 @@ export const STATUS = {
GUILD_TRAIN_BOX_IS_OVER_TIME: { code: 20971, simStr: '军团宝箱超时' },
GUILD_TRAIN_BOX_INDEX_IS_GOT: { code: 20972, simStr: '该位置试炼宝箱已经领取过,请重新选择' },
GUILD_TRAIN_BOX_IS_GOT: { code: 20973, simStr: '玩家已经领取该试炼宝箱' },
GUILD_SCRIPT_ENCOURGE_NOT_ENOUGH: { code: 20974, simStr: '鼓舞次数达到上限' },
GUILD_LOT_NOT_FOUND: { code: 21001, simStr: '拍品未找到' },
LOT_OFFER_SERIAL: { code: 21002, simStr: '不能连续出价' },
+16 -4
View File
@@ -20,10 +20,6 @@ class Record {
@prop({ required: false })
pos?: number; // pvp位置
@prop({ required: false })
recordNum?: number;
@prop({ required: false })
bossHp?: number;
@prop({ required: false })
trainId?:number;
@prop({ required: false })
trainLv?:number;
@@ -33,6 +29,12 @@ class Record {
guildCode?: string;
@prop({ required: false })
difficulty?: number;
@prop({ required: false })
bossInstanceCode?: string;
@prop({ required: false })
bossHp?: number;
@prop({ required: false })
bossDamage?: number; // boss本造成的伤害
}
export default class BattleRecord extends BaseModel {
@@ -57,6 +59,8 @@ export default class BattleRecord extends BaseModel {
@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;
@@ -81,6 +85,14 @@ export default class BattleRecord extends BaseModel {
let result = await BattleRecordModel.deleteMany({ roleId });
return result || {};
}
public static async incBossDamage(battleCode: string, damage: number, bossHp: number) {
if(bossHp < 0) { // 最后一击,被扣到负了
damage += bossHp;
}
let result: BattleRecordType = await BattleRecordModel.findOneAndUpdate({ battleCode }, { $inc: { 'record.bossDamage': damage } }, { new: true }).lean();
return result;
}
}
export const BattleRecordModel = getModelForClass(BattleRecord);
+45 -37
View File
@@ -1,7 +1,8 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { nowSeconds } from '../pubUtils/timeUtil';
import { getZeroPoint, nowSeconds } from '../pubUtils/timeUtil';
import { genCode } from '../pubUtils/util';
import { GUILD_BOSS_STATUS } from '../consts';
class Rank {
@prop({ required: true })
@@ -34,71 +35,73 @@ export default class BossInstance extends BaseModel {
@prop({ required: true, type: Rank, default:[]})
ranks:Array<Rank>;
@prop({ required: true })
@prop({ required: true, default: nowSeconds })
startTime: number;
@prop({ required: true, default: 0})
num: number; //重置次数
@prop({ required: true, default: 0 })
killTime: number;
@prop({ required: true, default: 0 })
encourageCnt: number; // 鼓舞次数
@prop({ required: true, default:[], type: String, _id: false})
roleIdRecords: Array<string>; //记录提示过胜利boss关的玩家
@prop({ required: true })
winWarId: number; //记录上一次通关的关卡,boss被压制成功后,首次点开boss界面会提示文字,boss已被压制
status: GUILD_BOSS_STATUS; // 状态 1:等待团长开启,2:今日已开启,且boss通关,3:开启中
@prop({ required: true })
winBossLv: number; //记录上一次通关的boss等级
@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 findBossInstance(guildCode: string, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOne({ guildCode }).lean(lean);
public static async findByCode(code: string) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOne({ code }).lean();
return bossInstance;
}
public static async openBossInstance(guildCode: string, bossHp: number, warId: number, bossLv: number, lean = true) {
public static async findBossInstance(guildCode: string) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOne({ guildCode, status: GUILD_BOSS_STATUS.OPEN }).lean();
return bossInstance;
}
public static async findLastOverBossInstance(guildCode: string) {
let today = getZeroPoint();
const bossInstance: BossInstanceType = await BossInstanceModel.findOne({ guildCode, status: GUILD_BOSS_STATUS.CLEAR, killTime: { $gt: today } }).sort({ _id: -1 }).lean();
return bossInstance;
}
public static async openBossInstance(guildCode: string, bossHp: number, warId: number, bossLv: number) {
let code = genCode(10);
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ guildCode },{ $setOnInsert: { code }, ranks:[], time: nowSeconds(), bossHp, bossLv, warId, $inc: { num: 1 }}, {new: true, upsert: true}).lean(lean);
let doc = new BossInstanceModel();
let update = Object.assign(doc.toJSON(), { guildCode, bossHp, bossLv, warId });
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code },{ $set: update }, {new: true, upsert: true}).lean();
return bossInstance;
}
//记录玩家boss通关后首次查看boss关卡
public static async recordRoleIdWhenCheck(guildCode: string, roleId: string, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ guildCode }, { $push:{ roleIdRecords: roleId } }, { new: true }).lean(lean);
public static async recordRoleIdWhenCheck(code: string, roleId: string, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code }, { $push:{ roleIdRecords: roleId } }, { new: true }).lean(lean);
return bossInstance;
}
public static async pushRecordRanks(guildCode: string, recordRank: Rank, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ guildCode }, { $push:{ recordRanks: recordRank } }, { new: true }).lean(lean);
public static async pushRecordRanks(code: string, recordRank: Rank, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code }, { $push:{ recordRanks: recordRank } }, { new: true }).lean(lean);
return bossInstance;
}
public static async pushRanks(guildCode: string, rank: Rank, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ guildCode }, { $push:{ ranks: rank } }, { new: true }).lean(lean);
public static async pushRanks(code: string, rank: Rank, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code }, { $push:{ ranks: rank } }, { new: true }).lean(lean);
return bossInstance;
}
public static async updateBossInstance(guildCode: string, update:BossInstanceTypeParam, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ guildCode }, { $set:update }, { new: true }).lean(lean);
public static async updateBossInstance(code: string, update:BossInstanceTypeParam, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code }, { $set:update }, { new: true }).lean(lean);
return bossInstance;
}
public static async updateBossHp(guildCode: string, hp: number, roleId: string, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ guildCode, 'ranks.roleId': roleId, bossHp: { $gte: hp } }, { $inc: { bossHp: - hp ,'ranks.$.score': hp}, }, { new: true }).lean(lean);
public static async updateBossHp(code: string, hp: number, roleId: string, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code, 'ranks.roleId': roleId, bossHp: { $gte: hp } }, { $inc: { bossHp: - hp ,'ranks.$.score': hp}, }, { new: true }).lean(lean);
return bossInstance;
}
public static async updateRank(guildCode: string, roleId: string, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ guildCode, 'ranks.roleId': roleId }, { $set:{ 'ranks.$.time': nowSeconds() } }, { new: true }).lean(lean);
public static async updateRank(code: string, roleId: string, lean = true) {
const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code, 'ranks.roleId': roleId }, { $set:{ 'ranks.$.time': nowSeconds() } }, { new: true }).lean(lean);
return bossInstance;
}
@@ -109,9 +112,14 @@ export default class BossInstance extends BaseModel {
}
public static async findBySourceCode(guildCode: string, sourceCode: string) {
const rec = await BossInstanceModel.findOne({ guildCode, code: sourceCode }).select('ranks').lean();
const rec: BossInstanceType = await BossInstanceModel.findOne({ guildCode, code: sourceCode }).select('ranks').lean();
return rec;
}
public static async encourage(code: string, count: number, maxCount: number) {
const rec: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code, encourageCnt: { $lte: maxCount - count } }, { $inc: { encourageCnt: count } }).lean();
return rec
}
}
export const BossInstanceModel = getModelForClass(BossInstance);
+10 -2
View File
@@ -103,6 +103,12 @@ export default class Guild extends BaseModel {
@prop({ required: true, default: () => { return getZeroPoint(SHOP_REFRESH_TYPE.WEEKLY) } })
resetTrainTime: number;//上次刷新挑战训练场次数的时间
@prop({ required: true, default: getZeroPoint })
refOpenBossTime: Date; // 开启boss本刷新时间
@prop({ required: true, default: 0 })
openBossCnt: number; // 开启boss本次数
public static async createGuild(params: { name: string, icon: number, notice: string }, role: RoleType, serverId: number) {
const doc = new GuildModel();
const update = Object.assign(doc.toJSON(), params, { leader: role._id, members: [role.roleId], guildCe: role.ce, serverId, lvUpdateTime: nowSeconds() });
@@ -162,8 +168,10 @@ export default class Guild extends BaseModel {
return guildList;
}
public static async findByCode(code: string, serverId: number, select?: string) {
const result: GuildType = await GuildModel.findOne({ code, status: GUILD_STATUS.RUNNING, serverId })
public static async findByCode(code: string, serverId?: number, select?: string) {
let condition: any = { code, status: GUILD_STATUS.RUNNING };
if(serverId) condition.serverId = serverId;
const result: GuildType = await GuildModel.findOne(condition)
.select(select)
.populate('leader', {roleId: 1, roleName: 1, frame: 1, head: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, _id: 0}, 'Role')
.lean({ getters: true, virtuals: true });
+11 -2
View File
@@ -91,6 +91,15 @@ export default class UserGuild extends BaseModel {
@prop({ required: true, default: 0 })
wishDntCnt: number;//今天许愿池捐献次数
@prop({ required: true, default: new Date(), select: false })
refBossTime: Date;
@prop({ required: true, default: 0 })
encourageCnt: number; //今天鼓舞次数
@prop({ required: true, default: 0 })
bossChallengeCnt: number;//今天挑战演舞台次数
public static async getMyGuild(roleId: string, select?: string) {
const myGuild: UserGuildType = await UserGuildModel.findOne({ roleId, status: USER_GUILD_STATUS.ON })
@@ -118,12 +127,12 @@ export default class UserGuild extends BaseModel {
public static async createUserGuild(guildCode: string, role: RoleType, isLeader: boolean) {
const lastGuild = await UserGuildModel.findMyLastGuild(role.roleId);
let { receiveBoxs = [], donateCnt = 0, receivedActive = [] } = lastGuild||{};
let { receiveBoxs = [], donateCnt = 0, receivedActive = [], encourageCnt = 0, bossChallengeCnt = 0 } = lastGuild||{};
const doc = new UserGuildModel();
let job = isLeader? GUILD_JOB.DAJIANGJUN: GUILD_JOB.SHIBING;
let auth = isLeader? GUILD_AUTH.LEADER: GUILD_AUTH.MEMBER;
const update = Object.assign(doc.toJSON(), { guildCode, roleId: role.roleId, role: role._id, job, auth, receiveBoxs, donateCnt, receivedActive });
const update = Object.assign(doc.toJSON(), { guildCode, roleId: role.roleId, role: role._id, job, auth, receiveBoxs, donateCnt, receivedActive, encourageCnt, bossChallengeCnt });
delete update._id;
const result: UserGuildType = await UserGuildModel.findOneAndUpdate({ roleId: role.roleId, guildCode, status: USER_GUILD_STATUS.ON }, update, { upsert: true, new: true })
.select('activeDaily activeRecord activeWeekly activeUpdateTime job auth receivedActive guildCode')
+17 -3
View File
@@ -55,10 +55,18 @@ export interface DicBossBase {
readonly wars: Array<{warId:number, bossHp:number}>;
// 掉落的拍卖行奖励
readonly rewards: number;
//
readonly consume: number;
// 团长开启的奖励
readonly opencost: number;
// 击杀奖励
readonly killReward: RewardInter[];
// 伤害加成奖励
readonly damageReward: RewardInter[];
// 伤害加成系数
readonly ratio: number;
// 鼓舞次数
readonly encourageSum: number;
}
const DicBossKeys: KeysEnum<DicBossBase> = {
@@ -68,7 +76,11 @@ const DicBossKeys: KeysEnum<DicBossBase> = {
wars: true,
rewards: true,
consume: true,
opencost: true
opencost: true,
killReward: true,
damageReward: true,
ratio: true,
encourageSum: true
};
// 练兵场
@@ -191,6 +203,8 @@ export function loadStructure() {
let warArr = warStrs.split('&');
return { warId: parseInt(warArr[0]), bossHp: parseInt(warArr[1])}
});
o.killReward = parseGoodStr(o.killReward);
o.damageReward = parseGoodStr(o.damageReward);
dicBossBase.set(o.level, _.pick(o, Object.keys(DicBossKeys)));
dicBossBaseByBossLv.set(o.bossLevel, _.pick(o, Object.keys(DicBossKeys)));
});