classes WIP

This commit is contained in:
Tyler Renelle
2013-11-16 02:22:12 -08:00
parent c2b8a62749
commit 83e3a6aff2
17 changed files with 351 additions and 39 deletions
+61
View File
@@ -482,6 +482,67 @@ api.deleteTag = function(req, res){
}
}
/*
------------------------------------------------------------------------
Spells
------------------------------------------------------------------------
*/
api.cast = function(req, res) {
var user = res.locals.user;
var type = req.body.type, target = req.body.target;
var spell = items.items.spells[user.stats.class][req.params.spell];
var done = function(){
var err = arguments[0];
var saved = _.size(arguments == 3) ? arguments[2] : arguments[1];
if (err) return res.json(500, {err:err});
res.json(saved);
}
switch (type) {
case 'task':
spell.cast(user, user.tasks[target.id]);
user.save(done);
break;
case 'self':
spell.cast(user);
user.save(done);
break;
case 'party':
async.waterfall([
function(cb){
Group.findOne({type: 'party', members: {'$in': [user._id]}}).populate('members').exec(cb);
},
function(group, cb) {
spell.cast(user, group.members);
var series = _.reduce(group.members, function(m,v){
m.push(function(cb2){v.save(cb2);})
return m;
}, []);
async.series(series, cb);
}
], done);
break;
case 'user':
async.waterfall([
function(cb) {
User.findById(target._id, cb);
},
function(member, cb) {
spell.cast(user, member);
member.save(cb); // not parallel because target could be user, which causes race condition when saving
},
function(saved, num, cb) {
user.save(cb);
}
], done);
break;
}
}
/*
------------------------------------------------------------------------
Batch Update
+27 -3
View File
@@ -188,12 +188,17 @@ var UserSchema = new Schema({
armorSet: String,
dayStart: {type:Number, 'default': 0},
gender: {type:String, 'default': 'm'},
hair: {type:String, 'default':'blond'},
hair: {
color: {type: String, 'default': 'blonde'},
base: {type: Number, 'default': 0},
bangs: {type: Number, 'default': 0}
},
hideHeader: {type:Boolean, 'default':false},
showHelm: {type:Boolean, 'default':true},
skin: {type:String, 'default':'white'},
timezoneOffset: Number,
language: String
language: String,
automaticAllocation: Boolean
},
profile: {
blurb: String,
@@ -202,9 +207,24 @@ var UserSchema = new Schema({
},
stats: {
hp: Number,
mp: Number,
exp: Number,
gp: Number,
lvl: Number
lvl: Number,
// Class System
'class': String,
points: {type: Number, 'default': 0},
str: {type: Number, 'default': 0},
def: {type: Number, 'default': 0},
int: {type: Number, 'default': 0},
per: {type: Number, 'default': 0},
buffs: {
str: Number,
def: Number,
per: Number,
stealth: Number
}
},
tags: [
{
@@ -264,6 +284,10 @@ UserSchema.pre('save', function(next) {
'Anonymous';
}
// FIXME handle this on level-up instead, and come up with how we're going to handle retroactively
// Actually, can this be used as an attr default? (schema {type: ..., 'default': function(){}})
this.stats.points = this.stats.lvl - (this.stats.def + this.stats.str + this.stats.per + this.stats.int);
var petCount = _.reduce(this.items.pets,function(m,v){return m+(v ? 1 : 0);},0);
this.achievements.beastMaster = petCount >= 90;
+1
View File
@@ -60,6 +60,7 @@ router.post('/user/buy-gems', auth.auth, user.buyGems);
router.post('/user/buy-gems/paypal-ipn', user.buyGemsPaypalIPN);
router.post('/user/unlock', auth.auth, cron, user.unlock);
router.post('/user/reset', auth.auth, user.reset);
router.post('/user/cast/:spell', auth.auth, user.cast);
router['delete']('/user', auth.auth, user['delete']);
/* Tags */