quests: add collection quests, incl. polar bear pt 2, and quest arks, and achievements
This commit is contained in:
+4
-12
@@ -28,12 +28,6 @@ api.auth = function(req, res, next) {
|
||||
if (err) return res.json(500, {err: err});
|
||||
if (_.isEmpty(user)) return res.json(401, NO_USER_FOUND);
|
||||
|
||||
// Remove this after a few days. Users aren't refreshing after the pets roll out, which is required
|
||||
if (_.find(req.body, function(v){return v && v.data && _.isArray(v.data['items.pets'])})) {
|
||||
// simply discard the update. Unfortunately, sending an error will keep their set ops in the sync queue.
|
||||
return res.json(200, {_v: user._v-1});
|
||||
}
|
||||
|
||||
res.locals.wasModified = req.query._v ? +user._v !== +req.query._v : true;
|
||||
res.locals.user = user;
|
||||
req.session.userId = user._id;
|
||||
@@ -42,16 +36,14 @@ api.auth = function(req, res, next) {
|
||||
};
|
||||
|
||||
api.authWithSession = function(req, res, next) { //[todo] there is probably a more elegant way of doing this...
|
||||
var uid;
|
||||
uid = req.session.userId;
|
||||
if (!(req.session && req.session.userId)) {
|
||||
var uid = req.session.userId;
|
||||
if (!(req.session && req.session.userId))
|
||||
return res.json(401, NO_SESSION_FOUND);
|
||||
}
|
||||
return User.findOne({_id: uid,}, function(err, user) {
|
||||
User.findOne({_id: uid}, function(err, user) {
|
||||
if (err) return res.json(500, {err: err});
|
||||
if (_.isEmpty(user)) return res.json(401, NO_USER_FOUND);
|
||||
res.locals.user = user;
|
||||
return next();
|
||||
next();
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -409,8 +409,12 @@ questStart = function(req, res) {
|
||||
})
|
||||
}
|
||||
|
||||
var parallel = [], questMembers = {};
|
||||
var key = group.quest.key;
|
||||
var parallel = [],
|
||||
questMembers = {},
|
||||
key = group.quest.key,
|
||||
quest = shared.content.quests[key],
|
||||
collectTally = quest.collect ? _.transform(quest.collect, function(m,v,k){m[k]=0}) : {};
|
||||
|
||||
// TODO will this handle appropriately when people leave/join party between quest invite?
|
||||
_.each(group.members, function(m){
|
||||
var updates = {$set:{},$inc:{'_v':1}};
|
||||
@@ -418,10 +422,11 @@ questStart = function(req, res) {
|
||||
updates['$inc']['items.quests.'+key] = -1;
|
||||
if (group.quest.members[m] == true) {
|
||||
updates['$set']['party.quest.key'] = key;
|
||||
updates['$set']['party.quest.tally'] = {up:0,down:0,collect:collectTally};
|
||||
questMembers[m] = true;
|
||||
} else {
|
||||
updates['$unset'] = {'party.quest.key':undefined};
|
||||
updates['$set']['party.quest.collection'] = {};
|
||||
updates['$unset'] = {'party.quest.key':1};
|
||||
updates['$set']['party.quest.tally'] = {};
|
||||
}
|
||||
parallel.push(function(cb2){
|
||||
User.update({_id:m},updates,cb2);
|
||||
@@ -429,8 +434,12 @@ questStart = function(req, res) {
|
||||
})
|
||||
|
||||
group.quest.active = true;
|
||||
group.quest.progress.hp = shared.content.quests[group.quest.key].stats.hp;
|
||||
if (quest.boss)
|
||||
group.quest.progress.hp = quest.boss.hp;
|
||||
else
|
||||
group.quest.progress.collect = collectTally;
|
||||
group.quest.members = questMembers;
|
||||
group.markModified('quest'); // members & progress.collect are both Mixed types
|
||||
parallel.push(function(cb2){group.save(cb2)});
|
||||
|
||||
async.parallel(parallel,function(err, results){
|
||||
@@ -491,12 +500,14 @@ api.questAbort = function(req, res, next){
|
||||
async.parallel([
|
||||
function(cb){
|
||||
User.update({_id:{$in: _.keys(group.quest.members)}},{
|
||||
$set:{'party.quest.key':undefined,'party.quest.tally.collection':{}},
|
||||
$inc:{_v:1}
|
||||
$unset: {'party.quest.key':1},
|
||||
$set: {'party.quest.tally.collect':{}},
|
||||
$inc: {_v:1}
|
||||
},cb);
|
||||
},
|
||||
function(cb) {
|
||||
group.quest = {};
|
||||
group.markModified('quest');
|
||||
group.save(cb);
|
||||
}
|
||||
], function(err){
|
||||
|
||||
+30
-24
@@ -193,32 +193,38 @@ api.update = function(req, res, next) {
|
||||
};
|
||||
|
||||
api.cron = function(req, res, next) {
|
||||
var user = res.locals.user;
|
||||
tally = user.fns.cron();
|
||||
if (user.isModified()) res.locals.wasModified = true;
|
||||
var user = res.locals.user,
|
||||
tally = user.fns.cron(),
|
||||
ranCron = user.isModified(),
|
||||
quest = shared.content.quests[user.party.quest.key];
|
||||
|
||||
// If user is on a quest, roll for boss & player
|
||||
if (user.party.quest.key && tally && (tally.up || tally.down)) {
|
||||
async.waterfall([
|
||||
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){
|
||||
group.bossAttack(user,tally,cb);
|
||||
},
|
||||
function(updated,cb){
|
||||
// User has been updated in boss-grapple, reload
|
||||
User.findById(user._id,cb);
|
||||
}
|
||||
], function(err, saved) {
|
||||
user = res.locals.user = saved;
|
||||
next(err,saved);
|
||||
});
|
||||
if (ranCron) res.locals.wasModified = true;
|
||||
if (!ranCron) return next(null,user);
|
||||
if (!quest) return user.save(next);
|
||||
|
||||
// If user is on a quest, roll for boss & player, or handle collections
|
||||
// FIXME this saves user, runs db updates, loads user. Is there a better way to handle this?
|
||||
async.waterfall([
|
||||
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){
|
||||
var type = quest.boss ? 'boss' : 'collect';
|
||||
group[type+'Quest'](user,tally,cb);
|
||||
},
|
||||
function(){
|
||||
var cb = arguments[arguments.length-1];
|
||||
// User has been updated in boss-grapple, reload
|
||||
User.findById(user._id, cb);
|
||||
}
|
||||
], function(err, saved) {
|
||||
user = res.locals.user = saved;
|
||||
next(err,saved);
|
||||
});
|
||||
|
||||
} else {
|
||||
user.save(next);
|
||||
}
|
||||
};
|
||||
|
||||
// api.reroll // Shared.ops
|
||||
|
||||
Reference in New Issue
Block a user