var SkillData = angular.module('SkillsList', ['ui.bootstrap', 'ngSanitize', 'angularBootstrapNavTree', 'lvl.directives.dragdrop']); SkillData.controller('SkillMainDataController', ['$scope', '$http', function ($scope, $http) { $scope.skills = [] $scope.rawSkills = [] $scope.rawLineData = {} $scope.rawSkillData = {} $scope.skillNames = [] $scope.buildSkillList = function(skillTable) { $scope.rawSkillData = skillTable; $scope.rawSkills = []; for( v in skillTable) { $scope.rawSkills.push(skillTable[v]); } } $scope.setSkills = function() { $scope.skillNames = this.data.skills } $http.get('skilldata.json') .then(function(res) { $scope.buildSkillList(res.data.skills); $scope.rawLineData = res.data.lines; }); }]); SkillData.controller('SkillListController', ['$scope', function($scope) { $scope.currentPage=1 $scope.numPerPage=5 $scope.maxSize=5 $scope.$watch("currentPage + numPerPage", function() { var begin = (($scope.currentPage - 1) * $scope.numPerPage), end = begin + $scope.numPerPage; $scope.skills = $scope.rawSkills.slice(begin, end); }); $scope.$watch("skillNames", function(names) { if(names.length == 0) return; var skillObjs = [] var obj for(k in names) { skillObjs.push($scope.rawSkillData[names[k]]); } $scope.skills = skillObjs; }); }]); SkillData.controller('SkillLineController', ['$scope', function ($scope) { $scope.skillLineTree = [] $scope.linesTree = {}; $scope.$watch("rawLineData", function() { var data = $scope.rawLineData $scope.skillLineTree = [] for(i in data) { var skillLines = data[i] line = { onSelect: $scope.openBranch, label: i, children: [] } for(j in skillLines) { line.children.push({ label: j.replace("'",""), onSelect: $scope.setSkills, data: { skills: skillLines[j] } }) } $scope.skillLineTree.push(line) } }); $scope.openBranch = function(branch) { $scope.linesTree.collapse_all() branch.expanded = true } }]); SkillData.controller('LoadoutController', ['$scope', function ($scope) { $scope.emptySkill = { name: "", description: "", cost: 0, target: "", mechanic: "", castTime: 0, channelTime: 0, durationMS: 0, distance: 0, maxRange: 0, radius: 0, fit: [] } $scope.skills = [] $scope.updaters = [] for(var i=0; i<12; ++i) { $scope.skills[i] = angular.copy($scope.emptySkill) } $scope.dropped = function(dragID, index, dropID) { index = Number(index) var drag = angular.element(document.getElementById(dragID)); var targetSkill = $scope.skills[index] angular.copy($scope.rawSkillData[drag.attr("data-skill")], targetSkill) $scope.$apply() //var scope = document.getElementById(dropID).getElementsByTagName("skill-info-full")[0].scope() //angular.copy($scope.rawSkillData[drag.text()], scope.skill) }; $scope.defined = function(v) { return v.name != "" } $scope.haveValues = true $scope.magicka = 15000 $scope.stamina = 15000 $scope.health = 15000 $scope.spellpower = 1200 $scope.weaponpower = 1200 $scope.calc = function(fit, type) { var main = 0 var power = 0 switch(type) { case 'Magicka': main = $scope.magicka power = $scope.spellpower break case 'Stamina': main = $scope.stamina power = $scope.weaponpower break case 'Ultimate': main = Math.max($scope.magicka, $scope.stamina) power = Math.max($scope.spellpower, $scope.weaponpower) } return Math.round(main*fit.mainCoef + power*fit.powerCoef + $scope.health*fit.healthCoef + fit.intercept) } }]); SkillData.filter('fitQualityClass', function() { return function(input) { input == input || 0 if(input > 0.999) { return 'label-success'; } else if(input > 0.9) { return 'label-warning'; } else { return 'label-danger'; } } }); SkillData.filter('resource',function() { return function(input, label, suffix) { if(input == '' || input == 0) { return ''; } switch(input) { case 'Stamina': return '<span class="stam">Stamina</span>'; case 'Magicka': return '<span class="magk">Magicka</span>'; case 'Ultimate': return '<span class="ultm">Ultimate</span>'; case 'Health': return '<span class="health">Health</span>'; default: return input; } } }); SkillData.filter('fID', function() { return function(input) { input = input || ''; return input.replace(/(##f[0-9]+##)/g,'<span class="formulaID">$1</span>'); } }); SkillData.filter('divide', function() { return function(input, amount) { return Number(input) / Number(amount); } }); SkillData.filter('nl2br', function() { return function(input) { input = input || ''; return input.replace(/\n/g,'<br />'); } }); SkillData.directive('skillDesc', function() { return { restrict: 'E', controller: function($scope, $element) { $scope.$watch("skill.description", function(newVal) { var desc = newVal desc = desc.replace(/\n/g,'<br />') desc = desc.replace(/(##f[0-9]+##)/g,'<span class="formulaID">$1</span>'); desc = desc.replace(/Flame Damage/g, '<span class="label dmg-flame">Flame Damage</span>') desc = desc.replace(/Magic Damage/g, '<span class="label dmg-magic">Magic Damage</span>') desc = desc.replace(/Ice Damage/g, '<span class="label dmg-ice">Ice Damage</span>') desc = desc.replace(/Cold Damage/g, '<span class="label dmg-ice">Cold Damage</span>') desc = desc.replace(/Shock Damage/g, '<span class="label dmg-shock">Shock Damage</span>') desc = desc.replace(/Poison Damage/g, '<span class="label dmg-poison">Poison Damage</span>') desc = desc.replace(/Disease Damage/g, '<span class="label dmg-disease">Disease Damage</span>') desc = desc.replace(/Physical Damage/g, '<span class="label dmg-physical">Physical Damage</span>') $element.html(desc) }) } }; }); SkillData.directive('skillFull', function() { return { restrict: 'E', scope: { skill: '=info', }, templateUrl: 'skill-template.html', link: function(scope, element, attrs) { scope.description = scope.skill.description scope.calc = scope.$parent.calc } } }); SkillData.directive('formulaPart', function() { return { restrict: 'E', scope: { label: '@', value: '@' }, template: '<span ng-show="{{value > 0.0001}}"><span class="coef">{{value}}</span> × <span class="var">{{label}}</span> +</span>' } }) SkillData.directive("rsq", function() { return { scope: { rsqValue: '=value', }, template: '<span class="rsq label {{fitQualityClass}}">{{rsqValue|number:4}}</span>' } }); SkillData.directive('skillInfo', function() { return { restrict: 'E', scope: { label: '@', value: '@', suffix: '@' }, template: '<div class="info" ng-show="value > 0"><b>{{label}}:</b> {{value}}{{suffix}}</div>' } })