alt-templatesystem-impl #29
@ -1,42 +1,54 @@
|
|||||||
import {SimpleGamesystem} from "./SimpleGamesystem";
|
import {SimpleGamesystem} from "./SimpleGamesystem";
|
||||||
import { ScriptAccountAction } from "./actions/ScriptAccountAction";
|
import {SimpleTemplateState} from "./states/SimpleTemplateState";
|
||||||
import { ScriptAccountCondition } from "./conditions/ScriptAccountCondition";
|
import {Gamesystem} from "./Gamesystem";
|
||||||
import { SimpleState } from "./states/SimpleState";
|
|
||||||
import {SimpleTransition} from "./transitions/SimpleTransition";
|
import {SimpleTransition} from "./transitions/SimpleTransition";
|
||||||
|
import {SimpleState} from "./states/SimpleState";
|
||||||
|
import {SimpleTemplateTransition} from "./transitions/SimpleTemplateTransition";
|
||||||
|
|
||||||
export class SimpleTemplateGamesystem extends SimpleGamesystem {
|
export class SimpleTemplateGamesystem<ReferenceType> extends Gamesystem<SimpleTemplateState<ReferenceType>, SimpleTemplateTransition<ReferenceType>> {
|
||||||
referenceSystem: SimpleGamesystem
|
|
||||||
|
|
||||||
constructor(referenceSystem: SimpleGamesystem) {
|
createState(label: string, description: string): SimpleState | undefined {
|
||||||
super(referenceSystem.componentName, referenceSystem.componentDescription)
|
if(label == null) {
|
||||||
this.referenceSystem = referenceSystem;
|
return undefined;
|
||||||
|
|
||||||
this.referenceSystem.states.forEach(state => {
|
|
||||||
const templateState = new SimpleState(state.stateLabel, state.stateDescription)
|
|
||||||
templateState.initial = state.initial;
|
|
||||||
templateState.conditions = state.conditions.map(condition => ScriptAccountCondition.constructScriptAccountCondition(condition.scriptAccount, condition.minValue, condition.maxValue)!)
|
|
||||||
|
|
||||||
this.states.push(templateState);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.referenceSystem.transitions.forEach(transition => {
|
|
||||||
const startingState = this.findStateByStateLabel(transition.startingState.stateLabel);
|
|
||||||
const endingState = this.findStateByStateLabel(transition.endingState.stateLabel);
|
|
||||||
|
|
||||||
const templateTransition = new SimpleTransition(startingState!, endingState!)
|
|
||||||
|
|
||||||
templateTransition.scriptAccountConditions = transition.scriptAccountConditions.map(condition =>
|
|
||||||
ScriptAccountCondition.constructScriptAccountCondition(condition.scriptAccount, condition.minValue, condition.maxValue)!)
|
|
||||||
|
|
||||||
templateTransition.scriptAccountActions = transition.scriptAccountActions.map(action => {
|
|
||||||
return new ScriptAccountAction(action.scriptAccount, action.changingValue);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.transitions.push(templateTransition);
|
|
||||||
})
|
|
||||||
|
|
||||||
this.referenceSystem.addTemplateSystem(this)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(description == null) {
|
||||||
|
description = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const state = new SimpleTemplateState<ReferenceType>(label, description);
|
||||||
|
if(this.states.find(s => s.stateLabel == label) == undefined) {
|
||||||
|
this.states.push(state);
|
||||||
|
return state;
|
||||||
|
} else {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createTransition(startingState: SimpleTemplateState<ReferenceType>, endingState: SimpleTemplateState<ReferenceType>): SimpleTemplateTransition<ReferenceType> | undefined {
|
||||||
|
if((startingState == null || endingState == null) || startingState === endingState) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const transition = new SimpleTemplateTransition<ReferenceType>(startingState, endingState);
|
||||||
|
if(this.transitions.find(t => t.startingState === startingState && t.endingState === endingState) == undefined) {
|
||||||
|
this.transitions.push(transition)
|
||||||
|
return transition;
|
||||||
|
} else {
|
||||||
|
startingState.removeOutgoingTransition(transition);
|
||||||
|
endingState.removeIncomingTransition(transition);
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removeState(state: SimpleTemplateState<ReferenceType>): boolean {
|
||||||
|
const updatedStates = this.states.filter(s => s !== state);
|
||||||
|
const updated = updatedStates.length != this.states.length;
|
||||||
|
this.states = updatedStates;
|
||||||
|
|
||||||
|
this.transitions = this.transitions.filter(t => t.startingState !== state && t.endingState !== state);
|
||||||
|
|
||||||
|
return updated;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
import {SimpleState} from "./SimpleState";
|
||||||
|
import {ScriptAccountCondition} from "../conditions/ScriptAccountCondition";
|
||||||
|
|
||||||
|
export class SimpleTemplateState<ReferenceType> extends SimpleState {
|
||||||
|
|
||||||
|
conditionMap: Map<ReferenceType, ScriptAccountCondition> = new Map<ReferenceType, ScriptAccountCondition>()
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
import {SimpleTransition} from "./SimpleTransition";
|
||||||
|
import {ScriptAccountCondition} from "../conditions/ScriptAccountCondition";
|
||||||
|
import {ScriptAccountAction} from "../actions/ScriptAccountAction";
|
||||||
|
|
||||||
|
export class SimpleTemplateTransition<ReferenceType> extends SimpleTransition {
|
||||||
|
|
||||||
|
conditions: Map<ReferenceType, ScriptAccountCondition[]> = new Map();
|
||||||
|
actions: Map<ReferenceType, ScriptAccountAction[]> = new Map();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user