quests: temporary fix to users who have left a party mid-quest

This commit is contained in:
Tyler Renelle 2013-12-26 15:39:09 -07:00
parent aa3767afd9
commit 2a63dfe687
2 changed files with 65 additions and 61 deletions

View file

@ -204,12 +204,9 @@ api.cron = function(req, res, next) {
function(cb){
user.save(cb); // make sure to save the cron effects
},
function(saved, count, cb) {
Group.findOne({type: 'party', members: {'$in': [user._id]}}, cb);
},
function(group, cb){
function(saved, count, cb){
var type = quest.boss ? 'boss' : 'collect';
group[type+'Quest'](user,progress,cb);
Group[type+'Quest'](user,progress,cb);
},
function(){
var cb = arguments[arguments.length-1];

View file

@ -147,67 +147,74 @@ GroupSchema.methods.finishQuest = function(quest, cb) {
mongoose.models.User.update({_id:{$in:members}}, updates, {multi:true}, cb);
}
GroupSchema.methods.collectQuest = function(user, progress, cb) {
var group = this,
quest = shared.content.quests[group.quest.key];
_.each(progress.collect,function(v,k){
group.quest.progress.collect[k] += v;
});
var foundText = _.reduce(progress.collect, function(m,v,k){
m.push(v + ' ' + quest.collect[k].text);
return m;
}, []);
foundText = foundText ? foundText.join(', ') : 'nothing';
group.sendChat("`<" + user.profile.name + "> found "+foundText+".`");
group.markModified('quest.progress.collect');
// Still needs completing
if (_.find(shared.content.quests[group.quest.key].collect, function(v,k){
return group.quest.progress.collect[k] < v.count;
})) return group.save(cb);
async.series([
function(cb2){
group.finishQuest(quest,cb2);
},
function(cb2){
group.sendChat('`All items found! Party has received their rewards.`');
group.save(cb2);
}
],cb);
// FIXME this is a temporary measure, we need to remove quests from users when they traverse parties
function isOnQuest(user,group){
return group && user.party.quest.key && user.party.quest.key == group.quest.key;
}
GroupSchema.methods.bossQuest = function(user, progress, cb) {
var group = this;
var quest = shared.content.quests[group.quest.key];
if (!progress) progress = {down:0,up:0}; // FIXME why is this ever happening, progress should be defined at this point
var down = progress.down * quest.boss.str; // multiply by boss strength
GroupSchema.statics.collectQuest = function(user, progress, cb) {
this.findOne({type: 'party', members: {'$in': [user._id]}},function(err, group){
if (!isOnQuest(user,group)) return cb(null);
var quest = shared.content.quests[group.quest.key];
group.quest.progress.hp -= progress.up;
group.sendChat("`<" + user.profile.name + "> attacks <" + quest.boss.name + "> for " + (progress.up.toFixed(1)) + " damage, <" + quest.boss.name + "> attacks party for " + (down.toFixed(1)) + " damage.`");
//var hp = group.quest.progress.hp;
// Everyone takes damage
var series = [
function(cb2){
mongoose.models.User.update({_id:{$in: _.keys(group.quest.members)}}, {$inc:{'stats.hp':down, _v:1}}, {multi:true}, cb2);
}
]
// Boss slain, finish quest
if (group.quest.progress.hp <= 0) {
group.sendChat('`' + quest.boss.name + ' has been slain! Party has received their rewards.`');
// Participants: Grant rewards & achievements, finish quest
series.push(function(cb2){
group.finishQuest(quest,cb2);
_.each(progress.collect,function(v,k){
group.quest.progress.collect[k] += v;
});
}
series.push(function(cb2){group.save(cb2)});
async.series(series,cb);
//return hp;
var foundText = _.reduce(progress.collect, function(m,v,k){
m.push(v + ' ' + quest.collect[k].text);
return m;
}, []);
foundText = foundText ? foundText.join(', ') : 'nothing';
group.sendChat("`<" + user.profile.name + "> found "+foundText+".`");
group.markModified('quest.progress.collect');
// Still needs completing
if (_.find(shared.content.quests[group.quest.key].collect, function(v,k){
return group.quest.progress.collect[k] < v.count;
})) return group.save(cb);
async.series([
function(cb2){
group.finishQuest(quest,cb2);
},
function(cb2){
group.sendChat('`All items found! Party has received their rewards.`');
group.save(cb2);
}
],cb);
})
}
GroupSchema.statics.bossQuest = function(user, progress, cb) {
this.findOne({type: 'party', members: {'$in': [user._id]}},function(err, group){
if (!isOnQuest(user,group)) return cb(null);
var quest = shared.content.quests[group.quest.key];
if (!progress || !quest) return cb(null); // FIXME why is this ever happening, progress should be defined at this point
var down = progress.down * quest.boss.str; // multiply by boss strength
group.quest.progress.hp -= progress.up;
group.sendChat("`<" + user.profile.name + "> attacks <" + quest.boss.name + "> for " + (progress.up.toFixed(1)) + " damage, <" + quest.boss.name + "> attacks party for " + (down.toFixed(1)) + " damage.`");
// Everyone takes damage
var series = [
function(cb2){
mongoose.models.User.update({_id:{$in: _.keys(group.quest.members)}}, {$inc:{'stats.hp':down, _v:1}}, {multi:true}, cb2);
}
]
// Boss slain, finish quest
if (group.quest.progress.hp <= 0) {
group.sendChat('`' + quest.boss.name + ' has been slain! Party has received their rewards.`');
// Participants: Grant rewards & achievements, finish quest
series.push(function(cb2){
group.finishQuest(quest,cb2);
});
}
series.push(function(cb2){group.save(cb2)});
async.series(series,cb);
})
}
module.exports.schema = GroupSchema;