Completed
Push — master ( 3d05ad...4fbfdd )
by Andres
28s
created

angular.controller(ꞌct_fusionꞌ)   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
nc 1
dl 0
loc 7
rs 9.4285
nop 1
1
/**
2
 fusion
3
 Component that handles the fusion of isotopes to create new ones.
4
5
 @namespace Components
6
 */
7
'use strict';
8
9
angular.module('game').component('fusion', {
10
  templateUrl: 'views/fusion.html',
11
  controller:  'ct_fusion',
12
  controllerAs: 'ct'
13
});
14
15
angular.module('game').controller('ct_fusion', ['state', 'format', 'visibility', 'data', 'util',
16
  function (state, format, visibility, data, util) {
17
    let ct = this;
18
    ct.state = state;
19
    ct.data = data;
20
    ct.util = util;
21
    ct.format = format;
22
23
    ct.getReactorArea = function(player) {
24
      let level = player.global_upgrades.fusion_area;
25
      let upgrade = data.global_upgrades.fusion_area;
26
      let basePower = upgrade.power;
27
      let multiplier = upgrade.power_mult;
28
      return basePower * Math.floor(multiplier * level);
29
    };
30
31
    ct.getBandwidth = function(player){
32
        let level = player.global_upgrades.fusion_bandwidth;
33
        let upgrade = data.global_upgrades.fusion_bandwidth;
34
        let basePower = upgrade.power;
35
        let exp = upgrade.power_exp;
36
        return basePower * Math.pow(exp, level);
37
    }
38
39
    function getRadius(resource) {
40
      let isotope = data.resources[resource];
41
      let A = isotope.energy/data.constants.U_TO_EV;
42
      return data.constants.FERMI_RADIUS * Math.pow(A, 0.3333);
43
    }
44
45
    function getZ(resource){
46
      let isotope = data.resources[resource];
47
      let element = Object.keys(isotope.elements)[0];
48
      return data.elements[element].number;
49
    }
50
51
    ct.getCapacity = function(resource, player) {
52
      let r = getRadius(resource);
53
      let area = Math.PI*r*r;
54
      return ct.getReactorArea(player)/area;
55
    };
56
57
    ct.getProductIsotope = function(beam, target) {
58
      if(!beam || !target) {
59
        return false;
60
      }
61
62
      let beamN = parseInt(beam, 10);
63
      let targetN = parseInt(target, 10);
64
65
      let beamZ = getZ(beam);
66
      let targetZ = getZ(target);
67
68
      let productN = beamN+targetN;
69
      let productZ = beamZ+targetZ;
70
71
      return data.resource_matrix[productZ][productN];
72
    };
73
74
    ct.getProductEnergy = function(beam, target) {
75
      let product = ct.getProductIsotope(beam, target);
76
      if(!product){
77
        return 0;
78
      }
79
      let beamBE = data.resources[beam].binding_energy;
80
      let targetBE = data.resources[target].binding_energy;
81
      let productBE = data.resources[product].binding_energy;
82
83
      return productBE - (beamBE + targetBE);
84
    };
85
86
    ct.getCoulombBarrier = function(beam, target) {
87
      let beamZ = getZ(beam);
88
      let beamR = getRadius(beam);
89
90
      let targetZ = getZ(target);
91
      let targetR = getRadius(target);
92
93
      let coulombBarrier = data.constants.COULOMB_CONSTANT*beamZ*targetZ*
94
              Math.pow(data.constants.ELECTRON_CHARGE, 2)/(beamR+targetR);
95
      return coulombBarrier * data.constants.JOULE_TO_EV;
96
    };
97
98
    ct.getYieldPercent = function(beam, target, player) {
99
      let beamR = getRadius(beam);
100
      let targetR = getRadius(target);
101
      let beamArea = Math.PI*beamR*beamR;
102
      let targetArea = Math.PI*targetR*targetR;
103
104
      let beamPercentArea = beamArea*ct.state.beam.number/ct.getReactorArea(player);
105
      let targetPercentArea = targetArea*ct.state.target.number/ct.getReactorArea(player);
106
107
      return beamPercentArea*targetPercentArea;
108
    };
109
110
    ct.getYield = function(beam, target, player){
111
      let percentYield = ct.getYieldPercent(beam, target, player);
112
      return Math.floor(percentYield*ct.state.target.number);
113
    };
114
115
    ct.getFusionReaction = function(player) {
116
      let reaction =  {
117
        reactant: {},
118
        product: {}
119
      };
120
121
      let beam = ct.state.beam.name;
122
      let target = ct.state.target.name;
123
124
      reaction.reactant[beam] = ct.state.beam.number;
125
      reaction.reactant[target] = ct.state.target.number;
126
127
      let coulombBarrier = ct.getCoulombBarrier(beam, target);
128
      reaction.reactant.eV = coulombBarrier*ct.state.beam.number;
129
130
      let product = ct.getProductIsotope(beam, target);
131
      let numberYield = ct.getYield(beam, target, player);
132
133
      reaction.product[product] = numberYield;
134
135
      let energyExchange = ct.getProductEnergy(beam, target);
136
      if(energyExchange < 0){
137
        reaction.reactant.eV += energyExchange*numberYield;
138
      }else if(energyExchange > 0){
139
        reaction.product.eV = energyExchange*numberYield;
140
      }
141
142
      return reaction;
143
    };
144
145
    function update(player){
0 ignored issues
show
introduced by
The function update does not seem to be used and can be removed.
Loading history...
146
      let source1 = '2H';
147
      let source2 = '2H';
148
149
      let coulombBarrier = ct.getCoulombBarrier(source1, source2);
150
151
      let quantity1 = ct.state.beam.number;
152
      let quantity2 = ct.state.target.number;
0 ignored issues
show
Unused Code introduced by
The variable quantity2 seems to be never used. Consider removing it.
Loading history...
153
154
      let numberYield = ct.getYield(source1, source2, player);
155
156
      let totalCoulomb = coulombBarrier*quantity1;
157
158
      let product = ct.getProductIsotope(source1, source2);
159
160
      // console.log(product);
161
      // console.log("capacity "+capacity1);
162
      // console.log("coulomb "+totalCoulomb);
163
      // console.log("yield "+percentYield+" "+numberYield);
164
      if(!product) return;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
165
166
      let energyExchange = ct.getProductEnergy(source1, source2);
167
      // console.log(energyExchange);
168
      if(energyExchange < 0){
169
        totalCoulomb += energyExchange*numberYield;
0 ignored issues
show
Unused Code introduced by
The assignment to variable totalCoulomb seems to be never used. Consider removing it.
Loading history...
170
      }else{
171
        // console.log("produced energy "+energyExchange*numberYield);
172
      }
173
    }
174
  }
175
]);
176