Move stat calc scripts to angular service

This commit is contained in:
Blade Barringer
2015-07-18 12:57:54 -05:00
parent 3926a6e95a
commit f9304bd28f
6 changed files with 81 additions and 61 deletions

View File

@@ -33,8 +33,6 @@ api.planGemLimits =
convRate: 20 #how much does a gem cost?
convCap: 25 #how many gems can be converted / month?
api.statCalc = require('./methods/statCalculations')
###
------------------------------------------------------
Time / Day

View File

@@ -1,53 +0,0 @@
'use strict';
var Content = require('../content.coffee');
function levelBonus(level) {
// Level bonus is derived by taking the level, subtracting one,
// taking the smaller of it or maxLevel (100),
// dividing that by two and then raising it to a whole number
// TODO: 100 is a magic number, extract from script.index into own module and call here
var levelOrMaxLevel = Math.min((level - 1), 100)
var levelDividedByTwo = levelOrMaxLevel / 2
var statBonus = Math.ceil(levelDividedByTwo )
return statBonus;
}
function equipmentStatBonus(stat, equipped) {
var gear = Content.gear.flat;
var total = 0;
var equipmentTypes = ['weapon', 'armor', 'head', 'shield'];
_(equipmentTypes).each(function(type) {
var equippedItem = equipped[type]
if(gear[equippedItem]) {
var equipmentStat = gear[equippedItem][stat];
total += equipmentStat;
}
});
return total;
}
function classBonus(user, stat) {
var computedStats = user._statsComputed;
if(computedStats) {
var bonus = computedStats[stat]
- user.stats.buffs[stat]
- levelBonus(user.stats.lvl)
- equipmentStatBonus(stat, user.items.gear.equipped)
- user.stats[stat]
return bonus;
}
}
module.exports = {
classBonus: classBonus,
equipmentStatBonus: equipmentStatBonus,
levelBonus: levelBonus
}

View File

@@ -55,6 +55,7 @@ module.exports = function(config) {
"website/public/js/services/taskServices.js",
"website/public/js/services/paymentServices.js",
"website/public/js/services/questServices.js",
"website/public/js/services/statServices.js",
"website/public/js/filters/money.js",
"website/public/js/filters/roundLargeNumbers.js",

View File

@@ -1,12 +1,20 @@
'use strict';
var sinon = require('sinon');
var chai = require("chai");
chai.use(require("sinon-chai"));
var expect = chai.expect;
var statCalc = require('../../common/script/methods/statCalculations');
describe('Stats Service', function() {
var scope, statCalc, user;
beforeEach(function() {
user = specHelper.newUser();
module(function($provide) {
$provide.value('User', {user: user});
});
inject(function($rootScope, $controller, Stats) {
statCalc = Stats;
});
});
describe('stat calculation functions', function() {
describe('levelBonus', function() {
it('calculates bonus as half of level for even numbered level under 100', function() {
var level = 50;

View File

@@ -0,0 +1,65 @@
'use strict';
(function(){
angular
.module('habitrpg')
.factory('Stats', statsFactory);
statsFactory.$inject = [
'Content',
'Shared'
];
function statsFactory(Content, Shared) {
function levelBonus(level) {
// Level bonus is derived by taking the level, subtracting one,
// taking the smaller of it or maxLevel (100),
// dividing that by two and then raising it to a whole number
var levelOrMaxLevel = Math.min((level - 1), Shared.maxLevel);
var levelDividedByTwo = levelOrMaxLevel / 2;
var bonus = Math.ceil(levelDividedByTwo );
return bonus;
}
function equipmentStatBonus(stat, equipped) {
var gear = Content.gear.flat;
var total = 0;
var equipmentTypes = ['weapon', 'armor', 'head', 'shield'];
_(equipmentTypes).each(function(type) {
var equippedItem = equipped[type];
if(gear[equippedItem]) {
var equipmentStat = gear[equippedItem][stat];
total += equipmentStat;
}
});
return total;
}
function classBonus(user, stat) {
var computedStats = user._statsComputed;
if(computedStats) {
var bonus = computedStats[stat]
- user.stats.buffs[stat]
- levelBonus(user.stats.lvl)
- equipmentStatBonus(stat, user.items.gear.equipped)
- user.stats[stat];
return bonus;
}
}
return {
classBonus: classBonus,
equipmentStatBonus: equipmentStatBonus,
levelBonus: levelBonus
}
}
}());

View File

@@ -52,6 +52,7 @@
"js/services/challengeServices.js",
"js/services/paymentServices.js",
"js/services/questServices.js",
"js/services/statServices.js",
"js/filters/money.js",
"js/filters/roundLargeNumbers.js",