Completed
Push — master ( f5e321...3d05ad )
by Andres
31s
created

src/scripts/component/fusion.js   A

Complexity

Total Complexity 17
Complexity/F 1.42

Size

Lines of Code 153
Function Count 12

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 0
wmc 17
c 1
b 0
f 0
nc 1
mnd 2
bc 17
fnc 12
dl 0
loc 153
rs 10
bpm 1.4166
cpm 1.4166
noi 5

1 Function

Rating   Name   Duplication   Size   Complexity  
B angular.controller(ꞌct_fusionꞌ) 0 143 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) {
0 ignored issues
show
Unused Code introduced by
The parameter player is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
24
      return 1;
25
    };
26
27
    function getRadius(resource) {
28
      let isotope = data.resources[resource];
29
      let A = isotope.energy/data.constants.U_TO_EV;
30
      return data.constants.FERMI_RADIUS * Math.pow(A, 0.3333);
31
    }
32
33
    function getZ(resource){
34
      let isotope = data.resources[resource];
35
      let element = Object.keys(isotope.elements)[0];
36
      return data.elements[element].number;
37
    }
38
39
    ct.getCapacity = function(resource, player) {
40
      let r = getRadius(resource);
41
      let area = Math.PI*r*r;
42
      return ct.getReactorArea(player)/area;
43
    };
44
45
    ct.getProductIsotope = function(beam, target) {
46
      let beamN = parseInt(beam, 10);
47
      let targetN = parseInt(target, 10);
48
49
      let beamZ = getZ(beam);
50
      let targetZ = getZ(target);
51
52
      let productN = beamN+targetN;
53
      let productZ = beamZ+targetZ;
54
55
      return data.resource_matrix[productZ][productN];
56
    };
57
58
    ct.getProductEnergy = function(beam, target) {
59
      let product = ct.getProductIsotope(beam, target);
60
      if(!product){
61
        return 0;
62
      }
63
      let beamBE = data.resources[beam].binding_energy;
64
      let targetBE = data.resources[target].binding_energy;
65
      let productBE = data.resources[product].binding_energy;
66
67
      return productBE - (beamBE + targetBE);
68
    };
69
70
    ct.getCoulombBarrier = function(beam, target) {
71
      let beamZ = getZ(beam);
72
      let beamR = getRadius(beam);
73
74
      let targetZ = getZ(target);
75
      let targetR = getRadius(target);
76
77
      let coulombBarrier = data.constants.COULOMB_CONSTANT*beamZ*targetZ*
78
              Math.pow(data.constants.ELECTRON_CHARGE, 2)/(beamR+targetR);
79
      return coulombBarrier * data.constants.JOULE_TO_EV;
80
    };
81
82
    ct.getYieldPercent = function(beam, target, player) {
83
      let beamR = getRadius(beam);
84
      let targetR = getRadius(target);
85
      let beamArea = Math.PI*beamR*beamR;
86
      let targetArea = Math.PI*targetR*targetR;
87
88
      let beamPercentArea = beamArea*ct.state.beam.number/ct.getReactorArea(player);
89
      let targetPercentArea = targetArea*ct.state.target.number/ct.getReactorArea(player);
90
91
      return beamPercentArea*targetPercentArea;
92
    };
93
94
    ct.getYield = function(beam, target, player){
95
      let percentYield = ct.getYieldPercent(beam, target, player);
96
      return Math.floor(percentYield*ct.state.target.number);
97
    };
98
99
    ct.getFusionReaction = function(player) {
100
      let reaction =  {
101
        reactant: {},
102
        product: {}
103
      };
104
105
      let beam = ct.state.beam.name;
106
      let target = ct.state.target.name;
107
108
      reaction.reactant[beam] = ct.state.beam.number;
109
      reaction.reactant[target] = ct.state.target.number;
110
111
      let coulombBarrier = ct.getCoulombBarrier(beam, target);
112
      reaction.reactant.eV = coulombBarrier*ct.state.beam.number;
113
114
      let product = ct.getProductIsotope(beam, target);
115
      let numberYield = ct.getYield(beam, target, player);
116
117
      reaction.product[product] = numberYield;
118
119
      let energyExchange = ct.getProductEnergy(beam, target);
120
      if(energyExchange < 0){
121
        reaction.reactant.eV += energyExchange*numberYield;
122
      }else if(energyExchange > 0){
123
        reaction.product.eV = energyExchange*numberYield;
124
      }
125
126
      return reaction;
127
    };
128
129
    function update(player){
0 ignored issues
show
introduced by
The function update does not seem to be used and can be removed.
Loading history...
130
      let source1 = '2H';
131
      let source2 = '2H';
132
133
      let coulombBarrier = ct.getCoulombBarrier(source1, source2);
134
135
      let quantity1 = ct.state.beam.number;
136
      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...
137
138
      let numberYield = ct.getYield(source1, source2, player);
139
140
      let totalCoulomb = coulombBarrier*quantity1;
141
142
      let product = ct.getProductIsotope(source1, source2);
143
144
      // console.log(product);
145
      // console.log("capacity "+capacity1);
146
      // console.log("coulomb "+totalCoulomb);
147
      // console.log("yield "+percentYield+" "+numberYield);
148
      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...
149
150
      let energyExchange = ct.getProductEnergy(source1, source2);
151
      // console.log(energyExchange);
152
      if(energyExchange < 0){
153
        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...
154
      }else{
155
        // console.log("produced energy "+energyExchange*numberYield);
156
      }
157
    }
158
  }
159
]);
160