-
Notifications
You must be signed in to change notification settings - Fork 1
/
init_reupload.js
228 lines (220 loc) · 6.02 KB
/
init_reupload.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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
var initSchedule = null;
/* =========================================================================
* A NOTE TO ALL CODE DIGGERS
* -------------------------------------------------------------------------
* I am perfectly fine with you going through the code and I will also
* upload the code for this once it's over. However, for the time that this
* is going on I would like to request to keep any spoilers you find out
* about in this way out of the Discord discussion. I am fine with educated
* guesses about future days utilizing Information already given through the
* publicly available days. But I would appreciate if you didn't go:
*
* I looked at the code and saw that Day 60 is called "Blackjack and Hookers"
*
* Thank You! -Joshua
*/
addOnLoadEvent(() => {
// Base Path where all scripts are located
const basePath = "js/";
// List of all scripts and their dependencies
let scriptList = {
pageElements : {
name: "pageElements.js",
dependencies: [],
},
mobileMode : {
name: "mobileMode.js",
dependencies: [],
},
compression : {
name: "compression.js",
dependencies: [],
},
coreLogic : {
name: "coreLogic.js",
dependencies: [],
},
b64: {
name: "b64.js",
dependencies: [],
},
loadStatus: {
name: "loadStatus.js",
dependencies: ["pageElements",],
},
settings : {
name : "settings_reupload.js",
dependencies: ["mobileMode"],
},
textures: {
name: "textures.js",
dependencies: ["b64"],
},
maketextures : {
name: "makeTextures.js",
dependencies: ["textures"],
},
days : {
name: "days.js",
dependencies: ["compression", "textures"]
},
board : {
name : "board.js",
dependencies: ["coreLogic"],
},
mySettings : {
name: "mySettings.js",
dependencies: ["days", "board"]
},
entities : {
name : "entities.js",
dependencies: ["board", "textures"],
},
render : {
name : "render.js",
dependencies: ["board", "textures", "entities"],
},
};
// Run this script last to start the game
// Depends on everything else being done
let startScript = "minesveeperMain_reupload.js";
// = = = = = = = = = = = = = = = = = = = = = = = = = =
const loadMetadata = document.getElementById("loadMetadata");
const fileVersion = loadMetadata.getAttribute("version");
// = = = = = = = = = = = = = = = = = = = = = = = = = =
for(let key in scriptList){
scriptList[key].key = key;
}
// Count how many scripts there are to load
let orderedScripts = [];
let toLoad = 0;
for(let i in scriptList){
toLoad++;
scriptList[i].loadState = 0;
}
// Go through all scripts
// Recursively go thorugh there dependencies until the script can be loaded
const loadRecursive = (i) => {
switch(scriptList[i].loadState){
case 0:
// Check if this can be loaded
// Mark that this script is about to be loaded
let script_i = scriptList[i];
script_i.loadState = 2;
let script = scriptList[i];
for(let j in script_i.dependencies){
if(scriptList[script_i.dependencies[j]] === undefined){
console.log("Script " + i + " depends on " + script_i.dependencies[j] + " which does not exist!");
return -1;
}
let retVal = loadRecursive(script_i.dependencies[j]);
if(retVal === -1) return -1;
if(retVal !== 0){
if(script_i.loadState == 3){
console.log("Cyclic dependency: " + i + retVal);
return -1;
}else{
return " -> " + i + retVal;
}
}
}
// Script can be loaded at this point
orderedScripts.push(script_i);
// Mark as loaded
scriptList[i].loadState = 1;
return 0;
case 1:
return 0;
case 2:
// Cyclic dependency
// Backwards exit condition
scriptList[i].loadState = 3;
return " -> " + i;
case 3:
return -1;
}
}
// Make sure that no matter how the browser
// sorts scripts the load status gets added
// as soon as possible
/*if(loadRecursive('loadStatus') !== 0){
console.log("Could not load all scripts!");
return;
}*/
// Go through all scripts
for(let i in scriptList){
if(loadRecursive(i) !== 0){
console.log("Could not load all scripts!");
return;
}
}
// Use this to make sure scripts can load images
initSchedule = {
name: null,
completed: 0,
tasks: 0,
claim: function(){
this.tasks++;
},
finish: function(){
this.tasks--;
this.completed++;
if(this.tasks == 0){ this.next(); };
},
next: () => {},
};
// Loads a script
const headElement = document.getElementsByTagName('head')[0];
const addScript = (scriptName, loadNext) => {
let newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = basePath + scriptName + "?v=" + fileVersion;
newScript.onload = loadNext;
newScript.onerror = function(){console.log(scriptName + " could not be loaded!");};
headElement.appendChild(newScript);
};
let position = 0;
let loadLowest = () => {
initSchedule.claim();
if(position == orderedScripts.length){
initSchedule.next = () => { addScript(startScript, () => {initSchedule = undefined;}); };
initSchedule.finish();
return;
}
let start = position;
let stop = position + 1;
for(let i = stop; i < orderedScripts.length; i++){
let loadable = true;
for(let d of orderedScripts[i].dependencies){
for(let j = start; j < i; j++){
if(orderedScripts[j].key == d){
loadable = false;
break;
}
}
if(!loadable) break;
}
if(loadable){
stop = i + 1;
//console.log("could load: " + orderedScripts[i].name);
}else{
break;
}
}
//console.log(start + " to " + stop);
for(let i = start; i < stop; i++){
initSchedule.claim();
initSchedule.name = orderedScripts[i];
addScript(orderedScripts[i].name, ()=>{initSchedule.finish();});
}
position = stop;
initSchedule.finish();
};
// After loading some script check which we can load next
initSchedule.next = loadLowest;
// Start with loading the first script
loadLowest();
// Nothing should happen after this!
// Anything that should happen after needs
// to be specified as the final onload function
});