// Generated by CoffeeScript 1.3.3
var MODIFIER, content, cron, expModifier, helpers, hpModifier, model, score, setModel, setupNotifications, tally, updateStats, user;
content = require('./content');
helpers = require('./helpers');
MODIFIER = .03;
user = void 0;
model = void 0;
setModel = function(m) {
model = m;
user = model.at('_user');
return setupNotifications();
};
setupNotifications = function() {
var statsNotification;
statsNotification = function(html, type) {
if (user.get('stats.lvl') === 0) {
return;
}
return $.bootstrapGrowl(html, {
type: type,
top_offset: 20,
align: 'right',
width: 250,
delay: 3000,
allow_dismiss: true,
stackup_spacing: 10
});
};
user.on('set', 'stats.hp', function(captures, args, out, isLocal, passed) {
var num, rounded;
num = captures - args;
rounded = Math.abs(num.toFixed(1));
if (num < 0) {
return statsNotification("HP -" + rounded, 'error');
}
});
user.on('set', 'stats.money', function(captures, args, out, isLocal, passed) {
var num, rounded;
num = captures - args;
rounded = Math.abs(num.toFixed(1));
if (num < 0) {
return statsNotification("GP -" + rounded, 'success');
} else if (num > 0) {
num = Math.abs(num);
return statsNotification("Exp,GP +" + rounded, 'success');
}
});
return user.on('set', 'stats.lvl', function(captures, args, out, isLocal, passed) {
if (captures > args) {
return statsNotification(' Level Up!', 'info');
}
});
};
expModifier = function(value) {
var dmg, modified;
dmg = user.get('items.weapon') * MODIFIER;
dmg += user.get('stats.lvl') * MODIFIER;
modified = value + (value * dmg);
return modified;
};
hpModifier = function(value) {
var ac, modified;
ac = user.get('items.armor') * MODIFIER;
ac += user.get('stats.lvl') * MODIFIER;
modified = value - (value * ac);
return modified;
};
updateStats = function(stats) {
var money, tnl;
if (user.get('stats.lvl') === 0) {
return;
}
if (stats.hp != null) {
if (stats.hp <= 0) {
user.set('stats.lvl', 0);
user.set('stast.hp', 0);
return;
} else {
user.set('stats.hp', stats.hp);
}
}
if (stats.exp != null) {
tnl = user.get('_tnl');
if (stats.exp >= tnl) {
stats.exp -= tnl;
user.set('stats.lvl', user.get('stats.lvl') + 1);
user.set('stats.hp', 50);
}
if (!user.get('items.itemsEnabled') && stats.exp >= 15) {
user.set('items.itemsEnabled', true);
$('ul.items').popover({
title: content.items.unlockedMessage.title,
placement: 'left',
trigger: 'manual',
html: true,
content: "

" + content.items.unlockedMessage.content + "
[Close] "
});
$('ul.items').popover('show');
}
user.set('stats.exp', stats.exp);
}
if (stats.money != null) {
if (!(typeof money !== "undefined" && money !== null) || money < 0) {
money = 0.0;
}
return user.set('stats.money', stats.money);
}
};
score = function(spec) {
var adjustvalue, cron, delta, direction, exp, hp, lvl, modified, money, num, sign, task, type, value, _ref, _ref1, _ref2;
if (spec == null) {
spec = {
task: null,
direction: null,
cron: null
};
}
_ref = [spec.task, spec.direction, spec.cron], task = _ref[0], direction = _ref[1], cron = _ref[2];
if (!task) {
_ref1 = [user.get('stats.money'), user.get('stats.hp'), user.get('stats.exp')], money = _ref1[0], hp = _ref1[1], exp = _ref1[2];
if (direction === "up") {
modified = expModifier(1);
money += modified;
exp += modified;
} else {
modified = hpModifier(1);
hp -= modified;
}
updateStats({
hp: hp,
exp: exp,
money: money
});
return;
}
sign = direction === "up" ? 1 : -1;
value = task.get('value');
delta = value < 0 ? (-0.1 * value + 1) * sign : (Math.pow(0.9, value)) * sign;
type = task.get('type');
adjustvalue = type !== 'reward';
if ((type === 'habit') && (task.get("up") === false || task.get("down") === false)) {
adjustvalue = false;
}
if (adjustvalue) {
value += delta;
}
if (type === 'habit') {
if (task.get('value') !== value) {
task.push('history', {
date: new Date(),
value: value
});
}
}
task.set('value', value);
_ref2 = [user.get('stats.money'), user.get('stats.hp'), user.get('stats.exp'), user.get('stats.lvl')], money = _ref2[0], hp = _ref2[1], exp = _ref2[2], lvl = _ref2[3];
if (type === 'reward') {
money -= task.get('value');
num = parseFloat(task.get('value')).toFixed(2);
if (money < 0) {
hp += money;
money = 0;
}
}
if ((delta > 0 || (type === 'daily' || type === 'todo')) && !cron) {
modified = expModifier(delta);
exp += modified;
money += modified;
} else if (type !== 'reward' && type !== 'todo') {
modified = hpModifier(delta);
hp += modified;
}
updateStats({
hp: hp,
exp: exp,
money: money
});
return delta;
};
cron = function() {
var daysPassed, lastCron, today;
today = new Date();
user.setNull('lastCron', today);
lastCron = user.get('lastCron');
daysPassed = helpers.daysBetween(lastCron, today);
if (daysPassed > 0) {
user.set('lastCron', today);
return _(daysPassed).times(function(n) {
var tallyFor;
tallyFor = moment(lastCron).add('d', n);
return tally(tallyFor);
});
}
};
tally = function(momentDate) {
var expTally, lvl, todoTally;
todoTally = 0;
_.each(user.get('tasks'), function(taskObj, taskId, list) {
var absVal, completed, dayMapping, dueToday, repeat, task, type, value, _ref;
if (taskObj.id == null) {
return;
}
_ref = [taskObj.type, taskObj.value, taskObj.completed, taskObj.repeat], type = _ref[0], value = _ref[1], completed = _ref[2], repeat = _ref[3];
task = user.at("tasks." + taskId);
if (type === 'todo' || type === 'daily') {
if (!completed) {
dayMapping = {
0: 'su',
1: 'm',
2: 't',
3: 'w',
4: 'th',
5: 'f',
6: 's',
7: 'su'
};
dueToday = repeat && repeat[dayMapping[momentDate.day()]] === true;
if (dueToday || type === 'todo') {
score({
task: task,
direction: 'down',
cron: true
});
}
}
if (type === 'daily') {
task.push("history", {
date: new Date(momentDate),
value: value
});
} else {
absVal = completed ? Math.abs(value) : value;
todoTally += absVal;
}
if (type === 'daily') {
return task.pass({
cron: true
}).set('completed', false);
}
}
});
user.push('history.todos', {
date: new Date(momentDate),
value: todoTally
});
expTally = user.get('stats.exp');
lvl = 0;
while (lvl < (user.get('stats.lvl') - 1)) {
lvl++;
expTally += (lvl * 100) / 5;
}
return user.push('history.exp', {
date: new Date(),
value: expTally
});
};
module.exports = {
MODIFIER: MODIFIER,
setModel: setModel,
score: score,
cron: cron
};