// 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 };