94 lines
4.4 KiB
TypeScript
94 lines
4.4 KiB
TypeScript
import {SimpleGamesystem} from "../../gamesystems/SimpleGamesystem";
|
|
import {SimpleState} from "../../gamesystems/states/SimpleState";
|
|
import {SimpleTransition} from "../../gamesystems/transitions/SimpleTransition";
|
|
import {ScriptAccount} from "../../scriptAccounts/ScriptAccount";
|
|
import {ScriptAccountCondition} from "../../gamesystems/conditions/ScriptAccountCondition";
|
|
import {ScriptAccountAction} from "../../gamesystems/actions/ScriptAccountAction";
|
|
|
|
export class SimpleGamesystemParser {
|
|
|
|
static parseSimpleGamesystem(jsonObject: any, scriptAccounts: ScriptAccount[] = []) : SimpleGamesystem {
|
|
const gamesystemName = jsonObject.componentName;
|
|
const gamesystemDescription = jsonObject.componentDescription;
|
|
const simpleStates = SimpleGamesystemParser.parseSimpleStates(jsonObject, scriptAccounts)
|
|
const simpleTransitions = SimpleGamesystemParser.parseSimpleTransitions(jsonObject, simpleStates, scriptAccounts);
|
|
|
|
const gamesystem = new SimpleGamesystem(gamesystemName, gamesystemDescription);
|
|
gamesystem.states = simpleStates;
|
|
gamesystem.transitions = simpleTransitions;
|
|
|
|
return gamesystem;
|
|
}
|
|
|
|
static parseSimpleStates(jsonObject: any, scriptAccounts: ScriptAccount[] = []): SimpleState[] {
|
|
const states: SimpleState[] = [];
|
|
for(let i=0; i<jsonObject.states.length; i++) {
|
|
const state = new SimpleState(jsonObject.states[i].stateLabel, jsonObject.states[i].stateDescription);
|
|
const conditions = jsonObject.states[i].conditions
|
|
for(let j=0; j<conditions.length; j++) {
|
|
const searchedScriptAccount = scriptAccounts.find(scriptAccount => scriptAccount.componentName === conditions[j].scriptAccount)
|
|
if(searchedScriptAccount != undefined) {
|
|
const scriptAccountCondition =
|
|
ScriptAccountCondition.constructScriptAccountCondition(searchedScriptAccount, conditions[j].minValue, conditions[j].maxValue)
|
|
|
|
state.conditions.push(scriptAccountCondition!)
|
|
}
|
|
}
|
|
|
|
states.push(state);
|
|
}
|
|
return states;
|
|
}
|
|
|
|
|
|
|
|
static parseSimpleTransitions(jsonObject: any, states: SimpleState[], scriptAccounts: ScriptAccount[]): SimpleTransition[] {
|
|
const transitions: SimpleTransition[] = [];
|
|
for(let i=0; i<jsonObject.transitions.length; i++) {
|
|
const startingStateLabel = jsonObject.transitions[i].startingState;
|
|
const endingStateLabel = jsonObject.transitions[i].endingState;
|
|
|
|
const startingState = states.find(state => state.stateLabel === startingStateLabel);
|
|
const endingState = states.find(state => state.stateLabel === endingStateLabel);
|
|
|
|
const actions: ScriptAccountAction[] = []
|
|
for(let j=0; j<jsonObject.transitions[i].scriptAccountActions.length; j++) {
|
|
const scriptAccountName = jsonObject.transitions[i].scriptAccountActions[j].scriptAccount
|
|
const referencedScriptAccount = scriptAccounts.find(scriptAccount => scriptAccount.componentName === scriptAccountName)
|
|
|
|
if(referencedScriptAccount != undefined) {
|
|
const scriptAccountAction = new ScriptAccountAction(referencedScriptAccount!, jsonObject.transitions[i].scriptAccountActions[j].changingValue)
|
|
actions.push(scriptAccountAction)
|
|
}
|
|
}
|
|
|
|
const conditions: ScriptAccountCondition[] = [];
|
|
for(let j=0; j<jsonObject.transitions[i].scriptAccountConditions.length; j++) {
|
|
const scriptAccountName = jsonObject.transitions[i].scriptAccountConditions[j].scriptAccount
|
|
const referencedScriptAccount = scriptAccounts.find(scriptAccount => scriptAccount.componentName === scriptAccountName)
|
|
|
|
if(referencedScriptAccount != undefined) {
|
|
const minValue = jsonObject.transitions[i].scriptAccountConditions[j].minValue
|
|
const maxValue = jsonObject.transitions[i].scriptAccountConditions[j].maxValue
|
|
|
|
const scriptAccountCondition =
|
|
ScriptAccountCondition.constructScriptAccountCondition(referencedScriptAccount, minValue, maxValue)
|
|
|
|
conditions.push(scriptAccountCondition!)
|
|
}
|
|
}
|
|
|
|
if(startingState != undefined && endingState != undefined) {
|
|
const simpleTransition = new SimpleTransition(startingState, endingState);
|
|
simpleTransition.scriptAccountActions = actions;
|
|
simpleTransition.scriptAccountConditions = conditions;
|
|
|
|
transitions.push(simpleTransition);
|
|
} else {
|
|
console.error("Starting or Ending State are not defined!", startingState, endingState)
|
|
}
|
|
}
|
|
return transitions;
|
|
}
|
|
}
|