feat(dilatory): model updates for tavern bosses

This commit is contained in:
Tyler Renelle 2014-06-06 18:30:10 -06:00
parent 7107f2d323
commit fad4e5bb02
2 changed files with 57 additions and 7 deletions

View file

@ -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

View file

@ -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();