Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
loeasy68
GitHub Repository: loeasy68/loeasy68.github.io
Path: blob/main/website/GAUSS/js/script-manager.js
2941 views
1
var editorScriptList = { };
2
3
var ScriptTree = function(scriptElement)
4
{
5
this.children = new Array();
6
this.scriptElement = scriptElement;
7
this.type = null;
8
};
9
10
var Script = function(code, scriptTriggerers)
11
{
12
//this.scriptTree = scriptTree;
13
this.code = code;
14
this.scriptTriggerers = scriptTriggerers;
15
};
16
17
var ScriptElement = function(f, params)
18
{
19
this.f = f;
20
this.params = params;
21
this.execute = function(abort, callback) {
22
window[f].apply(this, params.concat([abort]).concat([callback]));
23
};
24
};
25
26
var ScriptTriggerer = function(type, params)
27
{
28
this.type = type;
29
this.params = params;
30
};
31
32
var Aggregator = function(type, body, cond)
33
{
34
this.body = body;
35
this.type = type;
36
this.processIdx = 0;
37
this.execute = function(check, callback)
38
{
39
if(this.type == 'Parallel')
40
{
41
var interruptibleCount = 0;
42
var completedInterruptible = 0;
43
for(var i = 0; i < body.length; i++)
44
{
45
if(body[i].type == 'atomic')
46
body[i].f();
47
if(body[i].type == 'interruptible')
48
{
49
interruptibleCount++;
50
var dfd = $.Deferred();
51
dfd.done(function()
52
{
53
completedInterruptible++;
54
if(completedInterruptible == interruptibleCount)
55
callback.resolve();
56
});
57
body[i].f(dfd);
58
}
59
}
60
if(interruptibleCount == 0)
61
callback.resolve();
62
return;
63
}
64
if(this.type == 'If' && check == true)
65
{
66
if(!eval(cond))
67
return;
68
}
69
for (var i = this.processIdx; i < body.length; i++)
70
if(body[i].type == 'atomic')
71
body[i].f();
72
else if(body[i].type == 'interruptible' || body[i].type == 'Parallel')
73
{
74
var dfd = $.Deferred();
75
var that = this;
76
dfd.done(function()
77
{
78
that.processIdx = i + 1;
79
if(that.processIdx == that.body.length)
80
{
81
that.processIdx = 0;
82
if(callback)
83
callback.resolve();
84
}
85
else
86
that.execute(false, callback);
87
});
88
if(body[i].type == 'interruptible')
89
body[i].f(dfd);
90
else
91
body[i].execute(false, dfd);
92
return;
93
}
94
else if(body[i].type == 'If')
95
{
96
body[i].execute(true, callback);
97
}
98
this.processIdx = 0;
99
if(callback)
100
callback.resolve();
101
}
102
};
103
104
var scriptTreeInterpreter = function(scriptTree)
105
{
106
if(!scriptTree)
107
return null;
108
109
if (scriptTree.type == 'game-controllers') {
110
if (scriptTree.scriptElement.f == 'Aggregator') {
111
var body = [];
112
113
for (var i = 0; i < scriptTree.children.length; i++)
114
body.push(scriptTreeInterpreter(scriptTree.children[i]));
115
116
return new Aggregator(scriptTree.scriptElement.params[0], body, true);
117
}
118
else if (scriptTree.scriptElement.f == 'If')
119
{
120
var expr = new Parser().parse(scriptTree.scriptElement.params[0]);
121
if(expr.valid == false)
122
throwError('Bad if-guard: \"' + scriptTree.scriptElement.params[0] + '\"')();
123
var body = [];
124
125
for (var i = 0; i < scriptTree.children.length; i++)
126
body.push(scriptTreeInterpreter(scriptTree.children[i]));
127
return new Aggregator('If', body, scriptTree.scriptElement.params[0]);
128
129
}
130
else
131
{
132
throwError('Error: bad scriptTree.')();
133
}
134
}
135
else if (scriptTree.type == 'game-side-effects') {
136
//if (scriptTree.scriptElement.f === 'waitEvent')
137
// return evreact.expr.simple({});//events[scriptTree.scriptElement.params[0]]);
138
if (scriptTree.scriptElement.f in atomicEffects)
139
return {type : 'atomic', f : function() {
140
atomicEffects[scriptTree.scriptElement.f].apply(null, scriptTree.scriptElement.params) }};
141
if (scriptTree.scriptElement.f in interruptibleEffects)
142
return {type : 'interruptible', f : function(dfd) {
143
interruptibleEffects[scriptTree.scriptElement.f].apply(null, scriptTree.scriptElement.params.concat([[], dfd])) }};
144
(function() { var errMsg = "Unknown side effect: " + scriptTree.scriptElement.f; alert(errMsg); throw errMsg; })();
145
146
return null;
147
}
148
149
150
};
151
152
var scriptTriggererInterpreter = function(triggerer)
153
{
154
var definedTriggerer = { type : triggerer.type };
155
156
switch(triggerer.type)
157
{
158
case 'user-trigger':
159
definedTriggerer.action = triggerer.params[0];
160
definedTriggerer.obj1 = triggerer.params[1];
161
definedTriggerer.sentence = triggerer.params[4];
162
163
if(triggerer.params[2])
164
{
165
definedTriggerer.obj2 = triggerer.params[3];
166
}
167
break;
168
case 'event-trigger':
169
definedTriggerer.eventName = triggerer.params[0];
170
break;
171
case 'timer-trigger':
172
break;
173
case 'enter-room-trigger':
174
case 'exit-room-trigger':
175
definedTriggerer.roomId = triggerer.params[0];
176
break;
177
}
178
return definedTriggerer;
179
};
180
181
var scriptInterpreter = function(script, scriptMap)
182
{
183
if(!script)
184
return null;
185
//var scriptBody = scriptTreeInterpreter(script.scriptTree);
186
var scriptHeader = scriptTriggerersInterpreter(script.scriptTriggerers);
187
188
for(var i = 0; i < scriptHeader.length; i++)
189
{
190
switch(scriptHeader[i].type)
191
{
192
case 'user-trigger':
193
if
194
(scriptHeader[i].obj2)
195
{
196
if (!scriptMap[scriptHeader[i].action][scriptHeader[i].obj1])
197
scriptMap[scriptHeader[i].action][scriptHeader[i].obj1] = {};
198
scriptMap[scriptHeader[i].action][scriptHeader[i].obj1][scriptHeader[i].obj2] = { code: script.code, sentence: scriptHeader[i].sentence};
199
}
200
else
201
switch (scriptHeader[i].action)
202
{
203
case 'Mouse click':
204
testMapIdItem[scriptHeader[i].obj1].onClick = { code: script.code, sentence: null };
205
break;
206
case 'Mouse hover':
207
testMapIdItem[scriptHeader[i].obj1].onHover = { code: script.code, sentence: null };
208
break;
209
case 'Walk on':
210
testMapIdItem[scriptHeader[i].obj1].onWalk = { code: script.code, sentence: null };
211
break;
212
default:
213
scriptMap[scriptHeader[i].action][scriptHeader[i].obj1] = { code: script.code, sentence: scriptHeader[i].sentence};
214
break;
215
}
216
break;
217
case 'event-trigger':
218
if(!('Events' in scriptMap))
219
scriptMap['Events'] = {};
220
scriptMap['Events'][scriptHeader[i].eventName] = script.code;
221
break;
222
case 'enter-room-trigger':
223
if(!('EnterRoom' in scriptMap))
224
scriptMap['EnterRoom'] = {};
225
scriptMap['EnterRoom'][scriptHeader[i].roomId] = script.code;
226
break;
227
case 'exit-room-trigger':
228
break;
229
230
}
231
}
232
233
return { code : script.code };
234
};
235
236
var scriptTriggerersInterpreter = function(scriptTriggerers)
237
{
238
var triggerers = [];
239
for(var i = 0; i < scriptTriggerers.length; i++)
240
triggerers.push(scriptTriggererInterpreter(scriptTriggerers[i]));
241
return triggerers;
242
};
243
244
var replaceScriptOccurrencies = function(script, type, oldId, newId)
245
{
246
return;
247
replaceScriptBodyOccurrencies(script.scriptTree, type, oldId, newId);
248
replaceScriptTriggerersOccurrencies(script.scriptTriggerers, type, oldId, newId)
249
};
250
251
var replaceScriptBodyOccurrencies = function(scriptTree, type, oldId, newId)
252
{
253
return;
254
var length = scriptTree.children.length;
255
256
for(var i = 0; i < length; i++)
257
replaceScriptBodyOccurrencies(scriptTree.children[i], type, oldId, newId);
258
259
var scriptElement = scriptTree.scriptElement;
260
261
if(scriptElement.f == 'Aggregator')
262
return;
263
264
switch(type)
265
{
266
case 'item':
267
switch(scriptElement.f)
268
{
269
case 'setPosition':
270
case 'walkToPos':
271
case 'sayLine':
272
case 'show':
273
case 'hide':
274
case 'setState':
275
if(scriptElement.params[0] == oldId)
276
scriptElement.params[0] = newId;
277
break;
278
case 'walkToObj':
279
if(scriptElement.params[0] == oldId)
280
scriptElement.params[0] = newId;
281
if(scriptElement.params[1] == oldId)
282
scriptElement.params[1] = newId;
283
break;
284
}
285
break;
286
case 'room':
287
switch(scriptElement.f)
288
{
289
case 'setPosition':
290
if(scriptElement.params[1] == oldId)
291
scriptElement.params[1] = newId;
292
break;
293
case 'setRoom':
294
if(scriptElement.params[0] == oldId)
295
scriptElement.params[0] = newId;
296
break;
297
298
}
299
break;
300
case 'inventoryItem':
301
switch(scriptElement.f)
302
{
303
case 'inventoryAdd':
304
case 'inventoryRemove':
305
if(scriptElement.params[0] == oldId)
306
scriptElement.params[0] = newId;
307
break;
308
}
309
break;
310
case 'dialog':
311
switch(scriptElement.f)
312
{
313
case 'openDialog':
314
if(scriptElement.params[0] == oldId)
315
scriptElement.params[0] = newId;
316
break;
317
}
318
default:
319
break;
320
}
321
};
322
323
var replaceScriptTriggerersOccurrencies = function(scriptTriggerers, type, oldId, newId)
324
{
325
switch(type)
326
{
327
case 'inventoryItem':
328
case 'item':
329
for(var i = 0; i < scriptTriggerers.length; i++)
330
{
331
if(scriptTriggerers[i].type != 'user-trigger')
332
continue;
333
if(scriptTriggerers[i].params[1] == oldId)
334
scriptTriggerers[i].params[1] = newId;
335
if(scriptTriggerers[i].params[3] == oldId)
336
scriptTriggerers[i].params[3] = newId;
337
}
338
break;
339
}
340
};
341
342
var SortedSequence = function(body, callback)
343
{
344
this.processIdx = 0;
345
this.body = body;
346
347
this.execute = function()
348
{
349
for (var i = this.processIdx; i < body.length; i++)
350
{
351
if (!body[i].hasOwnProperty('params'))
352
body[i].f();
353
else
354
{
355
if(body[i].f in atomicEffects)
356
{
357
atomicEffects[body[i].f].apply(null, body[i].params);
358
continue;
359
}
360
var dfd = $.Deferred();
361
var that = this;
362
dfd.done(function () { that.execute(); });
363
that.processIdx = i + 1;
364
interruptibleEffects[body[i].f].apply(null, body[i].params.concat([
365
[],
366
dfd
367
]));
368
369
return;
370
}
371
}
372
if(callback)
373
callback();
374
}
375
};
376
377
var Sequence = function(body)
378
{
379
new SortedSequence(body, function()
380
{
381
if(guiObj.listening === false)
382
enableInput();
383
if(guiObj.dialogOpen)
384
{
385
openDialog(guiObj.dialogOpen);
386
}
387
}).execute();
388
};
389
390