mirror of
https://github.com/sudoxnym/habitica.git
synced 2026-08-04 01:29:21 +00:00
quests: temporary fix to users who have left a party mid-quest
This commit is contained in:
parent
aa3767afd9
commit
2a63dfe687
2 changed files with 65 additions and 61 deletions
|
|
@ -204,12 +204,9 @@ api.cron = function(req, res, next) {
|
||||||
function(cb){
|
function(cb){
|
||||||
user.save(cb); // make sure to save the cron effects
|
user.save(cb); // make sure to save the cron effects
|
||||||
},
|
},
|
||||||
function(saved, count, cb) {
|
function(saved, count, cb){
|
||||||
Group.findOne({type: 'party', members: {'$in': [user._id]}}, cb);
|
|
||||||
},
|
|
||||||
function(group, cb){
|
|
||||||
var type = quest.boss ? 'boss' : 'collect';
|
var type = quest.boss ? 'boss' : 'collect';
|
||||||
group[type+'Quest'](user,progress,cb);
|
Group[type+'Quest'](user,progress,cb);
|
||||||
},
|
},
|
||||||
function(){
|
function(){
|
||||||
var cb = arguments[arguments.length-1];
|
var cb = arguments[arguments.length-1];
|
||||||
|
|
|
||||||
|
|
@ -147,67 +147,74 @@ GroupSchema.methods.finishQuest = function(quest, cb) {
|
||||||
mongoose.models.User.update({_id:{$in:members}}, updates, {multi:true}, cb);
|
mongoose.models.User.update({_id:{$in:members}}, updates, {multi:true}, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupSchema.methods.collectQuest = function(user, progress, cb) {
|
// FIXME this is a temporary measure, we need to remove quests from users when they traverse parties
|
||||||
var group = this,
|
function isOnQuest(user,group){
|
||||||
quest = shared.content.quests[group.quest.key];
|
return group && user.party.quest.key && user.party.quest.key == 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupSchema.methods.bossQuest = function(user, progress, cb) {
|
GroupSchema.statics.collectQuest = function(user, progress, cb) {
|
||||||
var group = this;
|
this.findOne({type: 'party', members: {'$in': [user._id]}},function(err, group){
|
||||||
var quest = shared.content.quests[group.quest.key];
|
if (!isOnQuest(user,group)) return cb(null);
|
||||||
if (!progress) progress = {down:0,up:0}; // FIXME why is this ever happening, progress should be defined at this point
|
var quest = shared.content.quests[group.quest.key];
|
||||||
var down = progress.down * quest.boss.str; // multiply by boss strength
|
|
||||||
|
|
||||||
group.quest.progress.hp -= progress.up;
|
_.each(progress.collect,function(v,k){
|
||||||
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.`");
|
group.quest.progress.collect[k] += v;
|
||||||
//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);
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
series.push(function(cb2){group.save(cb2)});
|
var foundText = _.reduce(progress.collect, function(m,v,k){
|
||||||
async.series(series,cb);
|
m.push(v + ' ' + quest.collect[k].text);
|
||||||
//return hp;
|
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;
|
module.exports.schema = GroupSchema;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue