Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/helpers/FSM.js
Show First 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | "SUBSTATENAME": { | ||||
// handler, because otherwise the new state transition | // handler, because otherwise the new state transition | ||||
// will get mixed up with the previous ongoing one. | // will get mixed up with the previous ongoing one. | ||||
// In normal cases, you can return false or nothing. | // In normal cases, you can return false or nothing. | ||||
}, | }, | ||||
"leave": function() { | "leave": function() { | ||||
// Called when transitioning out of this state. | // Called when transitioning out of this state. | ||||
}, | }, | ||||
// Define a message handler that is an exact copy of another | |||||
// message handler defined in this Substate | |||||
"SomeMessageName": "AnotherMessageName", | |||||
}, | }, | ||||
// Define a new state which is an exact copy of another | // Define a new state which is an exact copy of another | ||||
// state that is defined elsewhere in this FSM: | // state that is defined elsewhere in this FSM: | ||||
"OTHERSUBSTATENAME": "STATENAME.SUBSTATENAME", | "OTHERSUBSTATENAME": "STATENAME.SUBSTATENAME", | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | function process(fsm, node, path, handlers) | ||||
state._refs = {}; | state._refs = {}; | ||||
for (var key in node) | for (var key in node) | ||||
{ | { | ||||
if (key === "enter" || key === "leave") | if (key === "enter" || key === "leave") | ||||
{ | { | ||||
state[key] = node[key]; | state[key] = node[key]; | ||||
} | } | ||||
else if (key.match(/^[A-Z]+$/)) | else if (typeof node[key] === "function") | ||||
{ | |||||
// New message handler | |||||
newhandlers[key] = node[key]; | |||||
} | |||||
else if (typeof node[key] === "object") | |||||
{ | { | ||||
// new substate | |||||
state._refs[key] = (state._name ? state._name + "." : "") + key; | state._refs[key] = (state._name ? state._name + "." : "") + key; | ||||
// (the rest of this will be handled later once we've grabbed | // (the rest of this will be handled later once we've grabbed | ||||
// all the event handlers) | // all the event handlers) | ||||
} | } | ||||
else | else if (typeof node[key] === "string") | ||||
{ | { | ||||
newhandlers[key] = node[key]; | // this can be either a reference to a message handler, or to a state. | ||||
if (!node[node[key]] && !fsm.states[node[key]]) | |||||
{ | |||||
error("FSM node " + path.join(".") + " node " + key + " referring to unknown node/state " + node[key]); | |||||
return {}; | |||||
} | |||||
else if (!!node[node[key]] && !!fsm.states[node[key]]) | |||||
{ | |||||
error("FSM node " + path.join(".") + " node " + key + " ambiguously referring to message handler or state " + node[key]); | |||||
return {}; | |||||
} | |||||
if (!node[node[key]]) | |||||
// new substate | |||||
state._refs[key] = (state._name ? state._name + "." : "") + key; | |||||
else | |||||
// New message handler | |||||
newhandlers[key] = node[node[key]]; | |||||
} | } | ||||
} | } | ||||
for (var e in newhandlers) | for (var e in newhandlers) | ||||
state[e] = newhandlers[e]; | state[e] = newhandlers[e]; | ||||
for (var key in node) | for (var key in node) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 174 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator