Path: blob/main/website/GAUSS/js/script-manager.js
2941 views
var editorScriptList = { };12var ScriptTree = function(scriptElement)3{4this.children = new Array();5this.scriptElement = scriptElement;6this.type = null;7};89var Script = function(code, scriptTriggerers)10{11//this.scriptTree = scriptTree;12this.code = code;13this.scriptTriggerers = scriptTriggerers;14};1516var ScriptElement = function(f, params)17{18this.f = f;19this.params = params;20this.execute = function(abort, callback) {21window[f].apply(this, params.concat([abort]).concat([callback]));22};23};2425var ScriptTriggerer = function(type, params)26{27this.type = type;28this.params = params;29};3031var Aggregator = function(type, body, cond)32{33this.body = body;34this.type = type;35this.processIdx = 0;36this.execute = function(check, callback)37{38if(this.type == 'Parallel')39{40var interruptibleCount = 0;41var completedInterruptible = 0;42for(var i = 0; i < body.length; i++)43{44if(body[i].type == 'atomic')45body[i].f();46if(body[i].type == 'interruptible')47{48interruptibleCount++;49var dfd = $.Deferred();50dfd.done(function()51{52completedInterruptible++;53if(completedInterruptible == interruptibleCount)54callback.resolve();55});56body[i].f(dfd);57}58}59if(interruptibleCount == 0)60callback.resolve();61return;62}63if(this.type == 'If' && check == true)64{65if(!eval(cond))66return;67}68for (var i = this.processIdx; i < body.length; i++)69if(body[i].type == 'atomic')70body[i].f();71else if(body[i].type == 'interruptible' || body[i].type == 'Parallel')72{73var dfd = $.Deferred();74var that = this;75dfd.done(function()76{77that.processIdx = i + 1;78if(that.processIdx == that.body.length)79{80that.processIdx = 0;81if(callback)82callback.resolve();83}84else85that.execute(false, callback);86});87if(body[i].type == 'interruptible')88body[i].f(dfd);89else90body[i].execute(false, dfd);91return;92}93else if(body[i].type == 'If')94{95body[i].execute(true, callback);96}97this.processIdx = 0;98if(callback)99callback.resolve();100}101};102103var scriptTreeInterpreter = function(scriptTree)104{105if(!scriptTree)106return null;107108if (scriptTree.type == 'game-controllers') {109if (scriptTree.scriptElement.f == 'Aggregator') {110var body = [];111112for (var i = 0; i < scriptTree.children.length; i++)113body.push(scriptTreeInterpreter(scriptTree.children[i]));114115return new Aggregator(scriptTree.scriptElement.params[0], body, true);116}117else if (scriptTree.scriptElement.f == 'If')118{119var expr = new Parser().parse(scriptTree.scriptElement.params[0]);120if(expr.valid == false)121throwError('Bad if-guard: \"' + scriptTree.scriptElement.params[0] + '\"')();122var body = [];123124for (var i = 0; i < scriptTree.children.length; i++)125body.push(scriptTreeInterpreter(scriptTree.children[i]));126return new Aggregator('If', body, scriptTree.scriptElement.params[0]);127128}129else130{131throwError('Error: bad scriptTree.')();132}133}134else if (scriptTree.type == 'game-side-effects') {135//if (scriptTree.scriptElement.f === 'waitEvent')136// return evreact.expr.simple({});//events[scriptTree.scriptElement.params[0]]);137if (scriptTree.scriptElement.f in atomicEffects)138return {type : 'atomic', f : function() {139atomicEffects[scriptTree.scriptElement.f].apply(null, scriptTree.scriptElement.params) }};140if (scriptTree.scriptElement.f in interruptibleEffects)141return {type : 'interruptible', f : function(dfd) {142interruptibleEffects[scriptTree.scriptElement.f].apply(null, scriptTree.scriptElement.params.concat([[], dfd])) }};143(function() { var errMsg = "Unknown side effect: " + scriptTree.scriptElement.f; alert(errMsg); throw errMsg; })();144145return null;146}147148149};150151var scriptTriggererInterpreter = function(triggerer)152{153var definedTriggerer = { type : triggerer.type };154155switch(triggerer.type)156{157case 'user-trigger':158definedTriggerer.action = triggerer.params[0];159definedTriggerer.obj1 = triggerer.params[1];160definedTriggerer.sentence = triggerer.params[4];161162if(triggerer.params[2])163{164definedTriggerer.obj2 = triggerer.params[3];165}166break;167case 'event-trigger':168definedTriggerer.eventName = triggerer.params[0];169break;170case 'timer-trigger':171break;172case 'enter-room-trigger':173case 'exit-room-trigger':174definedTriggerer.roomId = triggerer.params[0];175break;176}177return definedTriggerer;178};179180var scriptInterpreter = function(script, scriptMap)181{182if(!script)183return null;184//var scriptBody = scriptTreeInterpreter(script.scriptTree);185var scriptHeader = scriptTriggerersInterpreter(script.scriptTriggerers);186187for(var i = 0; i < scriptHeader.length; i++)188{189switch(scriptHeader[i].type)190{191case 'user-trigger':192if193(scriptHeader[i].obj2)194{195if (!scriptMap[scriptHeader[i].action][scriptHeader[i].obj1])196scriptMap[scriptHeader[i].action][scriptHeader[i].obj1] = {};197scriptMap[scriptHeader[i].action][scriptHeader[i].obj1][scriptHeader[i].obj2] = { code: script.code, sentence: scriptHeader[i].sentence};198}199else200switch (scriptHeader[i].action)201{202case 'Mouse click':203testMapIdItem[scriptHeader[i].obj1].onClick = { code: script.code, sentence: null };204break;205case 'Mouse hover':206testMapIdItem[scriptHeader[i].obj1].onHover = { code: script.code, sentence: null };207break;208case 'Walk on':209testMapIdItem[scriptHeader[i].obj1].onWalk = { code: script.code, sentence: null };210break;211default:212scriptMap[scriptHeader[i].action][scriptHeader[i].obj1] = { code: script.code, sentence: scriptHeader[i].sentence};213break;214}215break;216case 'event-trigger':217if(!('Events' in scriptMap))218scriptMap['Events'] = {};219scriptMap['Events'][scriptHeader[i].eventName] = script.code;220break;221case 'enter-room-trigger':222if(!('EnterRoom' in scriptMap))223scriptMap['EnterRoom'] = {};224scriptMap['EnterRoom'][scriptHeader[i].roomId] = script.code;225break;226case 'exit-room-trigger':227break;228229}230}231232return { code : script.code };233};234235var scriptTriggerersInterpreter = function(scriptTriggerers)236{237var triggerers = [];238for(var i = 0; i < scriptTriggerers.length; i++)239triggerers.push(scriptTriggererInterpreter(scriptTriggerers[i]));240return triggerers;241};242243var replaceScriptOccurrencies = function(script, type, oldId, newId)244{245return;246replaceScriptBodyOccurrencies(script.scriptTree, type, oldId, newId);247replaceScriptTriggerersOccurrencies(script.scriptTriggerers, type, oldId, newId)248};249250var replaceScriptBodyOccurrencies = function(scriptTree, type, oldId, newId)251{252return;253var length = scriptTree.children.length;254255for(var i = 0; i < length; i++)256replaceScriptBodyOccurrencies(scriptTree.children[i], type, oldId, newId);257258var scriptElement = scriptTree.scriptElement;259260if(scriptElement.f == 'Aggregator')261return;262263switch(type)264{265case 'item':266switch(scriptElement.f)267{268case 'setPosition':269case 'walkToPos':270case 'sayLine':271case 'show':272case 'hide':273case 'setState':274if(scriptElement.params[0] == oldId)275scriptElement.params[0] = newId;276break;277case 'walkToObj':278if(scriptElement.params[0] == oldId)279scriptElement.params[0] = newId;280if(scriptElement.params[1] == oldId)281scriptElement.params[1] = newId;282break;283}284break;285case 'room':286switch(scriptElement.f)287{288case 'setPosition':289if(scriptElement.params[1] == oldId)290scriptElement.params[1] = newId;291break;292case 'setRoom':293if(scriptElement.params[0] == oldId)294scriptElement.params[0] = newId;295break;296297}298break;299case 'inventoryItem':300switch(scriptElement.f)301{302case 'inventoryAdd':303case 'inventoryRemove':304if(scriptElement.params[0] == oldId)305scriptElement.params[0] = newId;306break;307}308break;309case 'dialog':310switch(scriptElement.f)311{312case 'openDialog':313if(scriptElement.params[0] == oldId)314scriptElement.params[0] = newId;315break;316}317default:318break;319}320};321322var replaceScriptTriggerersOccurrencies = function(scriptTriggerers, type, oldId, newId)323{324switch(type)325{326case 'inventoryItem':327case 'item':328for(var i = 0; i < scriptTriggerers.length; i++)329{330if(scriptTriggerers[i].type != 'user-trigger')331continue;332if(scriptTriggerers[i].params[1] == oldId)333scriptTriggerers[i].params[1] = newId;334if(scriptTriggerers[i].params[3] == oldId)335scriptTriggerers[i].params[3] = newId;336}337break;338}339};340341var SortedSequence = function(body, callback)342{343this.processIdx = 0;344this.body = body;345346this.execute = function()347{348for (var i = this.processIdx; i < body.length; i++)349{350if (!body[i].hasOwnProperty('params'))351body[i].f();352else353{354if(body[i].f in atomicEffects)355{356atomicEffects[body[i].f].apply(null, body[i].params);357continue;358}359var dfd = $.Deferred();360var that = this;361dfd.done(function () { that.execute(); });362that.processIdx = i + 1;363interruptibleEffects[body[i].f].apply(null, body[i].params.concat([364[],365dfd366]));367368return;369}370}371if(callback)372callback();373}374};375376var Sequence = function(body)377{378new SortedSequence(body, function()379{380if(guiObj.listening === false)381enableInput();382if(guiObj.dialogOpen)383{384openDialog(guiObj.dialogOpen);385}386}).execute();387};388389390