mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-05-18 19:58:42 +00:00
feat(dilatory): model updates for tavern bosses
This commit is contained in:
parent
7107f2d323
commit
fad4e5bb02
2 changed files with 57 additions and 7 deletions
|
|
@ -226,8 +226,10 @@ api.cron = function(req, res, next) {
|
|||
ranCron = user.isModified(),
|
||||
quest = shared.content.quests[user.party.quest.key];
|
||||
|
||||
|
||||
if (ranCron) res.locals.wasModified = true;
|
||||
if (!ranCron) return next(null,user);
|
||||
Group.tavernBoss(user,progress);
|
||||
if (!quest) return user.save(next);
|
||||
|
||||
// If user is on a quest, roll for boss & player, or handle collections
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ var Schema = mongoose.Schema;
|
|||
var shared = require('habitrpg-shared');
|
||||
var _ = require('lodash');
|
||||
var async = require('async');
|
||||
var logging = require('../logging');
|
||||
|
||||
var GroupSchema = new Schema({
|
||||
_id: {type: String, 'default': shared.uuid},
|
||||
|
|
@ -90,12 +91,11 @@ GroupSchema.methods.toJSON = function(){
|
|||
return doc;
|
||||
}
|
||||
|
||||
GroupSchema.methods.sendChat = function(message, user){
|
||||
var group = this;
|
||||
var chatDefaults = function(message,user){
|
||||
var message = {
|
||||
id: shared.uuid(),
|
||||
text: message,
|
||||
timestamp: +(new Date),
|
||||
timestamp: +new Date,
|
||||
likes: {}
|
||||
};
|
||||
if (user) {
|
||||
|
|
@ -108,9 +108,12 @@ GroupSchema.methods.sendChat = function(message, user){
|
|||
} else {
|
||||
message.uuid = 'system';
|
||||
}
|
||||
group.chat.unshift(message);
|
||||
return message;
|
||||
}
|
||||
GroupSchema.methods.sendChat = function(message, user){
|
||||
var group = this;
|
||||
group.chat.unshift(chatDefaults(message,user));
|
||||
group.chat.splice(200);
|
||||
|
||||
// Kick off chat notifications in the background.
|
||||
var lastSeenUpdate = {$set:{}, $inc:{_v:1}};
|
||||
lastSeenUpdate['$set']['newMessages.'+group._id] = {name:group.name,value:true};
|
||||
|
|
@ -173,9 +176,9 @@ GroupSchema.methods.finishQuest = function(quest, cb) {
|
|||
break;
|
||||
}
|
||||
})
|
||||
var members = _.keys(group.quest.members);
|
||||
var q = group._id === 'habitrpg' ? {} : {_id:{$in:_.keys(group.quest.members)}};
|
||||
group.quest = {};group.markModified('quest');
|
||||
mongoose.models.User.update({_id:{$in:members}}, updates, {multi:true}, cb);
|
||||
mongoose.model('User').update(q, updates, {multi:true}, cb);
|
||||
}
|
||||
|
||||
// FIXME this is a temporary measure, we need to remove quests from users when they traverse parties
|
||||
|
|
@ -217,6 +220,49 @@ GroupSchema.statics.collectQuest = function(user, progress, cb) {
|
|||
})
|
||||
}
|
||||
|
||||
// initialize tavernBoss as "not active". We check every 100 crons if there is an active tavern boss. If so,
|
||||
// we keep him up as a global variable so we don't have to load him on every cron. Every 100 crons, we'll refresh him
|
||||
// to set a boss: `db.groups.update({_id:'habitrpg'},{$set:{quest:{key:'dilatory',active:true,progress:{hp:1000}}}})`
|
||||
var tavernBoss = null;
|
||||
var _refreshTavernBoss = function(){
|
||||
mongoose.model('Group').findById('habitrpg',function(err,tavern){
|
||||
if (err) return logging.error(err);
|
||||
tavernBoss = tavern.quest;
|
||||
});
|
||||
};
|
||||
var refreshTavernBoss = _.after(100,_refreshTavernBoss);
|
||||
GroupSchema.statics.tavernBoss = function(user,progress) {
|
||||
refreshTavernBoss();
|
||||
if (tavernBoss) {
|
||||
tavernBoss.progress.hp -= progress.up;
|
||||
tavernBoss.progress.breaker += progress.down;
|
||||
// TODO stats for scene damage (progress.down)
|
||||
if (tavernBoss.progress.hp <= 0) {
|
||||
async.waterfall([
|
||||
function(cb){
|
||||
mongoose.model('Group').findById('habitrpg',cb);
|
||||
}, function(group,cb){
|
||||
var quest = shared.content.quests[group.quest.key];
|
||||
group.sendChat('`Congratulations Habiticans, you have slain ' + quest.boss.name('en') + '! Everyone has received their rewards.`');
|
||||
group.finishQuest(quest,null);
|
||||
group.save(cb);
|
||||
}
|
||||
],function(err,result){
|
||||
if (err) return logging.error(err);
|
||||
tavernBoss = null;
|
||||
});
|
||||
} else {
|
||||
mongoose.model('Group').update(
|
||||
{_id:'habitrpg'},
|
||||
{$inc:{
|
||||
'quest.progress.hp':-progress.up,
|
||||
'quest.progress.breaker':progress.down
|
||||
}}
|
||||
).exec();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GroupSchema.statics.bossQuest = function(user, progress, cb) {
|
||||
this.findOne({type: 'party', members: {'$in': [user._id]}},function(err, group){
|
||||
if (!isOnQuest(user,progress,group)) return cb(null);
|
||||
|
|
@ -250,3 +296,5 @@ GroupSchema.statics.bossQuest = function(user, progress, cb) {
|
|||
|
||||
module.exports.schema = GroupSchema;
|
||||
module.exports.model = mongoose.model("Group", GroupSchema);
|
||||
|
||||
_refreshTavernBoss();
|
||||
|
|
|
|||
Loading…
Reference in a new issue