Completed
Push — master ( a14198...1b9c43 )
by Andres
27s
created

src/scripts/component/upgrades.js   A

Complexity

Total Complexity 20
Complexity/F 2.22

Size

Lines of Code 100
Function Count 9

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 0
wmc 20
c 1
b 0
f 0
nc 1
mnd 4
bc 19
fnc 9
dl 0
loc 100
rs 10
bpm 2.1111
cpm 2.2222
noi 1

1 Function

Rating   Name   Duplication   Size   Complexity  
B upgrades.js ➔ upgrades 0 92 1
1
/**
2
 upgrades
3
 Component that handles upgrades.
4
5
 @namespace Components
6
 */
7
'use strict';
8
9
angular.module('game').component('upgrades', {
10
  templateUrl: 'views/upgrades.html',
11
  controller: ['state', 'visibility', 'upgrade', 'data', upgrades],
12
  controllerAs: 'ct'
13
});
14
15
function upgrades(state, visibility, upgrade, data) {
16
  let ct = this;
17
  ct.state = state;
18
  ct.data = data;
19
  ct.hideBought = false;
20
21
  // tries to buy all the upgrades it can, starting from the cheapest
22
  ct.buyAll = function (element) {
23
    let currency = data.elements[element].main;
24
    let cheapest;
25
    let cheapestPrice;
26
    do{
27
      cheapest = null;
28
      cheapestPrice = Infinity;
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name Infinity as cheapestPrice. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
29
      for(let up of ct.visibleUpgrades(element, data.upgrades)){
30
        let price = data.upgrades[up].price;
31
        if(!state.player.elements[element].upgrades[up] &&
32
          price <= state.player.resources[currency].number){
33
          if(price < cheapestPrice){
34
            cheapest = up;
35
            cheapestPrice = price;
36
          }
37
        }
38
      }
39
      if(cheapest){
40
        let upgrades = state.player.elements[element].upgrades;
41
        upgrade.buyUpgrade(state.player,
42
          upgrades,
43
          cheapest,
44
          cheapestPrice,
45
          currency);
46
      }
47
    }while(cheapest);
48
  };
49
50
  ct.buyUpgrade = function (name, element) {
51
    let upgrades = state.player.elements[element].upgrades;
52
    let price = data.upgrades[name].price;
53
    let currency = data.elements[element].main;
54
    upgrade.buyUpgrade(state.player,
55
      upgrades,
56
      name,
57
      price,
58
      currency);
59
  };
60
61
  /* Global upgrades are non-resource specific, repeatable upgrades */
62
  ct.buyGlobalUpgrade = function (name) {
63
    if (!ct.canBuyGlobalUpgrade(name)) {
64
      return;
65
    }
66
67
    let up = data.global_upgrades[name];
68
    for (let currency in up.price) {
69
      let value = up.price[currency] * ct.priceMultiplier(name);
70
      state.player.resources[currency].number -= value;
71
    }
72
73
    state.player.global_upgrades[name]++;
74
  };
75
76
  ct.canBuyGlobalUpgrade = function (name) {
77
    let up = data.global_upgrades[name];
78
    for (let currency in up.price) {
79
      let value = up.price[currency] * ct.priceMultiplier(name);
80
      if (state.player.resources[currency].number < value) {
81
        return false;
82
      }
83
    }
84
85
    return true;
86
  };
87
88
  ct.priceMultiplier = function (name) {
89
    let level = state.player.global_upgrades[name];
90
    return Math.ceil(Math.pow(data.global_upgrades[name].price_exp, level));
91
  };
92
93
  ct.visibleUpgrades = function(currentElement, source) {
94
    return visibility.visible(source, createVisibleFunction(source), currentElement);
95
  };
96
97
  function createVisibleFunction(source){
98
    return function isBasicUpgradeVisible(name, currentElement) {
99
      let isVisible = visibility.isUpgradeVisible(name, currentElement, source[name]);
100
      if(source === data.upgrades){
101
        return isVisible && (!ct.hideBought || !state.player.elements[currentElement].upgrades[name]);
102
      }
103
      return isVisible;
104
    };
105
  }
106
}
107