diff --git a/src/controllers/user.js b/src/controllers/user.js index 4731a106c7..5242319ff1 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -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 diff --git a/src/models/group.js b/src/models/group.js index 454048c734..4fc90396e1 100644 --- a/src/models/group.js +++ b/src/models/group.js @@ -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();