-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCode 1-21.js
177 lines (171 loc) · 4.45 KB
/
Code 1-21.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/**
Ship power on function
*/
let powerOn = () => {
if (!ship.powerOn) ship.powerOn = true;
};
/**
* @return the number of modules that can be used
*/
let countModules = () => {
return availableModules.length;
};
/**
* filters the essential modules using boolean test function based on Array.filter prototype
* @return number
*/
let countEssential = () => {
return availableModules.filter(function(module) {
return module.essential;
}).length;
};
/**
* Loads specified module whether it's essential or not
* @param index - The module index in array
* @param essential - essential flag value (optional)
*/
let loadModule = (index, essential) => {
//Its good practice to do some parameters assertions
if (index < 0) throw new Error("Index must be positive");
let modCount = countModules();
if (index > modCount) throw new Error("Index must wthin 0 and " + modCount);
//Get the module that is at specified index and enable it
let module = availableModules[index];
module.enabled = true;
// check if essential parameter was provided, is so, set the module property to it
if (essential !== undefined) module.essential = essential;
ship.modules.push(module);
};
let findModuleIndex = (moduleName) => {
return availableModules.findIndex(function(module) {
return module.name == moduleName;
});
};
/**
* Encapsulate the module loading process
* @param name - What module to load
* @param essential - flag that determine if module is absolutely required
*/
let loadModuleByName = (name, essential) => {
loadModule(findModuleIndex(name, essential));
};
/** reset Larry by making it quack 10 time
*
*/
let resetLARRY = () => {
for (let i = 0; i < 10; i++) LARRY.quack();
/*
if performance was an issue in context, we could have done without the for loop like so:
LARRY.quack();
LARRY.quack();
LARRY.quack();
LARRY.quack();
LARRY.quack();
LARRY.quack();
LARRY.quack();
LARRY.quack();
LARRY.quack();
LARRY.quack(); <- The 10th call
*/
};
/**
* set the radio message for later broadcast
* @param message - the message to set the radio to
*/
let setMessage = (message) => {
radio.message = message;
};
/**
* Activate the radio beacon prior to any broadcast
*/
let activateBeacon = () => {
radio.beacon = true;
};
let setFrequency = () => {
let range = radio.range;
radio.frequency = (range.low + range.high) / 2;
};
let initialize = () => {
navigation.x = 0;
navigation.y = 0;
navigation.z = 0;
};
let calibrateX = () => {
for (let i = 1; i <= 12; i++) {
let signal = checkSignal();
if (signal !== undefined) {
navigation.x = signal;
break;
}
}
};
let calibrateY = () => {
for (let i = 1; i <= 60; i++) {
let signal = checkSignal();
if (signal !== undefined) {
navigation.y = signal;
break;
}
}
};
let calibrateZ = () => {
for (let i = 1; i <= 60; i++) {
let signal = checkSignal();
if (signal !== undefined) {
navigation.z = signal;
break;
}
}
};
let calibrate = () => {
calibrateX();
calibrateY();
calibrateZ();
};
let setSpeed = (speed) => {
if (!isNaN(speed)) {
let lSpeed = parseInt(speed);
if (lSpeed >= 0) navigation.speed = lSpeed;
}
};
let activateAntenna = () => {
ship.antenna.active = true;
};
let sendBroadcast = () => {
let i = 0;
while (i < 100) {
broadcast();
i++;
}
};
let configureBroadcast = () => {
setFrequency();
activateAntenna();
sendBroadcast();
};
let decodeMessage = (message) => {
message = message.replace(/0/g, "o");
message = message.replace(/1/g, "i");
message = message.replace(/2/g, "u");
message = message.replace(/3/g, "e");
message = message.replace(/4/g, "a");
message = message.replace(/5/g, "y");
return message;
}
let returnToEarth = () => {
let x = broadcast("x");
let y = broadcast("y");
let z = broadcast("z");
navigation.x = parseInt(decodeMessage(x), 16);
navigation.y = parseInt(decodeMessage(y), 16);
navigation.z = parseInt(decodeMessage(z), 16);
}
loadModuleByName("life-support");
loadModuleByName("propulsion", true);
loadModuleByName("navigation", true);
loadModuleByName("communication", true);
resetLARRY();
setMessage(JSON.stringify(navigation));
activateBeacon();
configureBroadcast();
returnToEarth();