秘境本挑战次数

This commit is contained in:
luying
2020-11-13 18:06:53 +08:00
parent 9574bada4f
commit ada3cfe849
18 changed files with 439 additions and 82 deletions

View File

@@ -93,7 +93,8 @@ export const WAR_TYPE = {
PVP: 9, // PVP
GUILD_TIMER: 10, // 军团定时副本
GUILD_WEEKLY: 11, // 军团周副本
MAIN_ELITE: 12 // 主线精英
MAIN_ELITE: 12, // 主线精英
MYSTERY_ELITE: 13 // 秘境精英
};
// 事件,是否开启保存随机记录方式
@@ -144,15 +145,21 @@ export const HANG_UP_CONSTS = {
}
export const TOWER_TASK_CONST = {
REFRESH_TIME: 5,
RAND_CNT: 8,
MAX_TASK_REF_CNT: 8, // 完成的派遣数最多
MAX_HEROES_NUM: 3,
COST_GOLD: 50
REFRESH_TIME: 5, // 每天几点刷新
RAND_CNT: 8, // 每次刷新多少个任务
MAX_TASK_REF_CNT: 8, // 完成的派遣任务数最多多少个
MAX_HEROES_NUM: 3, // 每个任务最大派遣武将数
COST_GOLD: 50 // 每次刷新花费的元宝
}
export const DAILY_CONST = {
REFRESH_TIME: 5
REFRESH_TIME: 5 // 每天加点刷新
}
export const DUNGEON_CONST = {
REFRESH_TIME: 5, // 每天加点刷新
MAX_CNT: 10, // 最大挑战次数
MAX_BUY_CNT: 10 // 最大购买次数
}
export const EXPEDITION_CONST = {
@@ -198,7 +205,8 @@ export const GONGSHI = {
* 公式: A * num + B
*/
export const GOLD_COST_RATIO = {
"TOWER_HANG_SPDUP": { "A": 0, "B": 50 },
"TPWER_TASK_REF": { "A": 0, "B": 200 },
"DAILY_REF_NUM": { "A": 50, "B": 0 }
"TOWER_HANG_SPDUP": { "A": 0, "B": 50 }, // 天梯挂机加速花费
"TPWER_TASK_REF": { "A": 0, "B": 200 }, // 天梯派遣刷新花费
"DAILY_REF_NUM": { "A": 50, "B": 0 }, // 每日购买次数花费
"DUNGRON_BUY_NUM": { "A": 0, "B": 50 } // 秘境购买次数花费
}

View File

@@ -28,7 +28,7 @@ export const STATUS = {
DAILY_WAR_NOT_FOUND: { code: 20201, simStr: '未找到该关卡' },
DAILY_TYPE_NOT_FOUND: { code: 20202, simStr: '未找到该类型' },
DAILY_TIMES_LACK: { code: 20203, simStr: '次数不足' },
DAILY_REFRESH_TIMES_LACK: { code: 20203, simStr: '刷新次数不足' },
DAILY_REFRESH_TIMES_LACK: { code: 20203, simStr: '购买次数不足' },
DAILY_REFRESH_GOLD_LACK: { code: 20204, simStr: '元宝不足' },
// 奇遇 20300 - 20399
EVENT_RECORD_NOT_FOUND: { code: 20301, simStr: '未找到记录' },
@@ -71,6 +71,9 @@ export const STATUS = {
TOWER_REF_CNT_NOT_ENOUGH: { code: 20518, simStr: '派遣次数不足' },
// 共斗 20600 - 20699
COM_BATTLE_DUP_ENTER: { code: 20601, simStr: '不能重复加入' },
// 秘境 20700 - 20799
DUNGEON_REFRESH_TIMES_LACK: { code: 20701, simStr: '购买次数不足' },
DUNGEON_TIMES_LACK: { code: 20701, simStr: '挑战次数不足' },
// 养成相关状态 30000 - 39999
// 社交相关状态 40000 - 49999
// 运营模块相关状态 50000 - 59999

View File

@@ -110,6 +110,13 @@ export default class Hero extends BaseModel {
return heroes;
}
public static async updateCe(roleId: string, hid: number, ce: number, oldCe: number, historyCe: number, lean = true) {
let distance = ce - oldCe;
let historyDistance = ce > historyCe ?ce - historyCe: 0;
let result = await HeroModel.findOneAndUpdate({roleId, hid}, {$inc:{ce: distance, historyCe: historyDistance}}).lean(lean);
return result||{};
}
public static async deleteAccount(roleId: string, lean = true) {
let result = await HeroModel.deleteMany({roleId}).lean(lean);
return result||{};

View File

@@ -71,6 +71,12 @@ export default class PvpDefense extends BaseModel {
}
public static async updateCe(roleId: string, hid: number, ce: number, oldCe: number, lean = true) {
let distance = ce - oldCe;
const rec = await PvpDefenseModel.findOneAndUpdate({roleId, 'heroes.actorId': hid}, {$inc: {ce: distance}}).lean(lean);
return rec
}
public static async deleteAccount(roleId: string, lean = true) {
let result = await PvpDefenseModel.deleteMany({roleId}).lean(lean);
return result||{};

View File

@@ -3,6 +3,7 @@ import BaseModel from './BaseModel';
import { index, getModelForClass, prop } from '@typegoose/typegoose';
import User from './User';
import { shouldRefresh } from '../pubUtils/util';
import { HeroModel } from './Hero';
class TopHero {
@prop({ required: true })
@@ -137,6 +138,13 @@ export default class Role extends BaseModel {
@prop({ required: true, default: new Date() })
expeditionResetRefTime: Date; // 远征重置次数刷新时间
// 秘境相关
@prop({ required: true, default: 0 })
dungeonCnt: number; // 秘境挑战次数
@prop({ required: true, default: 0 })
dungeonBuyCnt: number; // 秘境购买次数
@prop({ required: true, default: new Date() })
dungeonRefTime: Date; // 秘境刷新时间
public static async findByUid(uid: number, serverId: number, lean = true) {
const role = await RoleModel.findOne({ 'userInfo.uid': uid, serverId }).lean(lean);
@@ -285,6 +293,30 @@ export default class Role extends BaseModel {
return role;
}
// 购买次数
public static async buyCnt(roleId: string, needRefresh: boolean, inc: number, curTime: Date, lean = true) { console.log('&*&*&*&*&')
let role = null;
if (needRefresh) {
role = await RoleModel.findOneAndUpdate({roleId}, {dungeonCnt: 0, dungeonRefTime: curTime, dungeonBuyCnt: inc}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {dungeonBuyCnt: inc}}, {new: true}).lean(lean);
}
return role;
}
// 增加次数
public static async increaseDungeonCnt(roleId: string, needRefresh: boolean, inc: number, curTime: Date, lean = true) {
let role = null;
if (needRefresh) {
role = await RoleModel.findOneAndUpdate({roleId}, {dungeonCnt: inc, dungeonRefTime: curTime, dungeonBuyCnt: 0}, {new: true}).lean(lean);
} else {
role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {dungeonCnt: inc}}, {new: true}).lean(lean);
}
return role;
}
// 获取排行榜
public static async getRank(type: string, fields: Array<string>, page = 1, limit = 100, lean = true) {
let sortBy = {};
@@ -295,6 +327,42 @@ export default class Role extends BaseModel {
const ranks = await RoleModel.find().select(fields.join(' ')).sort(sortBy).limit(limit).skip((page - 1) * limit).lean(lean);
return ranks;
}
public static async updateSumCe(roleId: string, hid: number, ce: number, oldCe: number, lean = true) {
let role = await RoleModel.findByRoleId(roleId);
let topFive = role?.topFive||new Array();
let distance = ce - oldCe;
topFive.sort((a, b) => {return b.ce - a.ce}); // 0-5最大-最小
let index = topFive.findIndex(cur => cur.hid == hid);
if(index == -1) { // 不在最强列表
if(topFive.length < 5) { // 不满5人
topFive.push({hid, ce});
} else if(topFive.length == 5){
if(ce > topFive[topFive.length - 1].ce) { // 跻身最强6人
topFive.pop();
topFive.push({hid, ce});
} else {
topFive[index].ce = ce;
}
} else {
topFive.splice(5, topFive.length - 5);
}
} else { // 原来就是最强5人
if(ce < topFive[topFive.length - 1].ce) { // 滑出最强
let heroes = await HeroModel.getTopHero(roleId, 5);
topFive = heroes.map(cur => {return {hid: cur.hid, ce: cur.ce}});
} else {
topFive[index].ce = ce;
}
}
let topFiveCe = topFive.reduce((pre, cur) => {
return pre + cur.ce
}, 0);
await RoleModel.findOneAndUpdate({roleId}, { topFive, topFiveCe, $inc: {ce: distance} }).lean(lean);
}
}
export const RoleModel = getModelForClass(Role);

View File

@@ -3,7 +3,7 @@ import path = require('path');
import { ABI_TYPE } from '../consts/abilityConst';
let gamedata = {};
const wars = ['dic_zyz_gk_main', 'dic_zyz_gk_mainElite', 'dic_zyz_gk_daily', 'dic_zyz_gk_event', 'dic_zyz_gk_tower', 'dic_zyz_gk_expedition']; // 关卡相关的表
const wars = ['dic_zyz_gk_main', 'dic_zyz_gk_mainElite', 'dic_zyz_gk_daily', 'dic_zyz_gk_event', 'dic_zyz_gk_tower', 'dic_zyz_gk_expedition', 'dic_zyz_gk_dungeon','dic_zyz_gk_dungeonElite']; // 关卡相关的表
const allWarInfos = new Map<number, any>();
const towerInfos = new Map<number, any>();
const towerTaskInfos = new Map<number, any>();

View File

@@ -333,38 +333,10 @@ export async function updateCe(roleId: string, hero: any ) {
let ce = actor.calculateCE();
if(ce != oldCe) {
// 更新总战力&最强五人战力
let role = await RoleModel.findByRoleId(roleId);
let distance = ce - oldCe;
let historyDistance = ce > historyCe ?ce - historyCe: 0;
let topFive = role?.topFive||new Array();
topFive.sort((a, b) => {return b.ce - a.ce}); // 0-5最大-最小
let index = topFive.findIndex(cur => cur.hid == hid);
if(index == -1) { // 不在最强列表
if(topFive.length < 5) { // 不满5人
topFive.push({hid, ce});
} else if(topFive.length == 5){
if(ce > topFive[topFive.length - 1].ce) { // 跻身最强6人
topFive.pop();
topFive.push({hid, ce});
} else {
topFive[index].ce = ce;
}
} else {
topFive.splice(5, topFive.length - 5);
}
} else { // 原来就是最强5人
if(ce < topFive[topFive.length - 1].ce) { // 滑出最强
let heroes = await HeroModel.getTopHero(roleId, 5);
topFive = heroes.map(cur => {return {hid: cur.hid, ce: cur.ce}});
} else {
topFive[index].ce = ce;
}
}
let topFiveCe = topFive.reduce((pre, cur) => {
return pre + cur.ce
}, 0);
await RoleModel.findOneAndUpdate({roleId}, { topFive, topFiveCe, $inc: {ce: distance} });
await PvpDefenseModel.findOneAndUpdate({roleId, 'heroes.actorId': hid}, {$inc: {ce: distance}});
await HeroModel.findOneAndUpdate({roleId, hid}, {$inc:{ce: distance, historyCe: historyDistance}})
await RoleModel.updateSumCe(roleId, hid, ce, oldCe);
// 更新pvp防守阵容战力
await PvpDefenseModel.updateCe(roleId, hid, ce, oldCe);
// 更新武将战力,历史最高战力
await HeroModel.updateCe(roleId, hid, ce, oldCe, historyCe);
}
}

View File

@@ -0,0 +1,40 @@
[
{
"war_id": 3001,
"dispatchJsonId": 3001,
"bg_img_id": 501,
"script_id": 0,
"fixReward": "10205&1|17001&10|17005&2|17006&3",
"warType": 6,
"gk_name": "秘境&怒狼洞穴1",
"kingExp": 100,
"turnLimted": 20,
"forcedCharactor": "&",
"fobiddenCharactor": "&",
"victoryInfoInUI": "消灭所有敌军",
"loseInfoInUI": "我方全部阵亡",
"starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利",
"cost": 0,
"recommendedPower": 10008,
"previousGk": 127
},
{
"war_id": 3002,
"dispatchJsonId": 3002,
"bg_img_id": 501,
"script_id": 0,
"fixReward": "10005&1|17002&10|17007&2|17008&3",
"warType": 6,
"gk_name": "秘境&怒狼洞穴2",
"kingExp": 100,
"turnLimted": 20,
"forcedCharactor": "&",
"fobiddenCharactor": "&",
"victoryInfoInUI": "消灭所有敌军",
"loseInfoInUI": "我方全部阵亡",
"starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利",
"cost": 0,
"recommendedPower": 10008,
"previousGk": 3001
}
]

View File

@@ -0,0 +1,40 @@
[
{
"war_id": 3010,
"dispatchJsonId": 3010,
"bg_img_id": 501,
"script_id": 0,
"fixReward": "10205&1|17001&10|17005&2|17006&3",
"warType": 13,
"gk_name": "秘境&怒狼洞穴1",
"kingExp": 100,
"lvLimted": 10,
"forcedCharactor": "&",
"fobiddenCharactor": "&",
"victoryInfoInUI": "消灭所有敌军",
"loseInfoInUI": "我方全部阵亡",
"starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利",
"cost": 0,
"recommendedPower": 10008,
"previousGk": 3001
},
{
"war_id": 3011,
"dispatchJsonId": 3011,
"bg_img_id": 501,
"script_id": 0,
"fixReward": "10005&1|17002&10|17007&2|17008&3",
"warType": 13,
"gk_name": "秘境&怒狼洞穴2",
"kingExp": 100,
"lvLimted": 10,
"forcedCharactor": "&",
"fobiddenCharactor": "&",
"victoryInfoInUI": "消灭所有敌军",
"loseInfoInUI": "我方全部阵亡",
"starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利",
"cost": 0,
"recommendedPower": 10008,
"previousGk": 3002
}
]