diff --git a/src/app/editor/gamesystem-editor/gamesystem-editor.component.html b/src/app/editor/gamesystem-editor/gamesystem-editor.component.html
index c32d36c..a055b2d 100644
--- a/src/app/editor/gamesystem-editor/gamesystem-editor.component.html
+++ b/src/app/editor/gamesystem-editor/gamesystem-editor.component.html
@@ -1,6 +1,14 @@
-
- Gamesystem is symmetric template
-
+
+
+
+
+ Product Generation Settings
+
+
+ Use symmetric Productgenerators
+
+ Generate Isolated ProductStates
+
diff --git a/src/app/editor/gamesystem-editor/product-gamesystem-editor/product-gamesystem-editor.component.html b/src/app/editor/gamesystem-editor/product-gamesystem-editor/product-gamesystem-editor.component.html
index 0eee76f..b812aca 100644
--- a/src/app/editor/gamesystem-editor/product-gamesystem-editor/product-gamesystem-editor.component.html
+++ b/src/app/editor/gamesystem-editor/product-gamesystem-editor/product-gamesystem-editor.component.html
@@ -1,3 +1,4 @@
+
diff --git a/src/app/editor/gamesystem-editor/product-gamesystem-editor/product-gamesystem-editor.component.ts b/src/app/editor/gamesystem-editor/product-gamesystem-editor/product-gamesystem-editor.component.ts
index 29319ca..e96554b 100644
--- a/src/app/editor/gamesystem-editor/product-gamesystem-editor/product-gamesystem-editor.component.ts
+++ b/src/app/editor/gamesystem-editor/product-gamesystem-editor/product-gamesystem-editor.component.ts
@@ -1,4 +1,4 @@
-import {Component, EventEmitter, Input, Output} from '@angular/core';
+import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {
ProductTransitionEditorComponent
} from "../transition-editor/product-transition-editor/product-transition-editor.component";
@@ -13,12 +13,15 @@ import {TemplateElement} from "../../../project/game-model/templates/TemplateEle
templateUrl: './product-gamesystem-editor.component.html',
styleUrl: './product-gamesystem-editor.component.scss'
})
-export class ProductGamesystemEditorComponent {
+export class ProductGamesystemEditorComponent implements OnInit{
@Input() gamesystem: ProductGamesystem | undefined
@Input() templateElement: TemplateElement | undefined
@Output("onOpenGamesystemEditor") openGamesystemEditorEmitter = new EventEmitter
();
+ ngOnInit() {
+ }
+
onOpenGamesystemEditor(gamesystem: SimpleGamesystem) {
this.openGamesystemEditorEmitter.emit(gamesystem);
}
diff --git a/src/app/editor/gamesystem-editor/state-editor/product-state-editor/product-state-editor.component.ts b/src/app/editor/gamesystem-editor/state-editor/product-state-editor/product-state-editor.component.ts
index 1c7a7e8..ab1168d 100644
--- a/src/app/editor/gamesystem-editor/state-editor/product-state-editor/product-state-editor.component.ts
+++ b/src/app/editor/gamesystem-editor/state-editor/product-state-editor/product-state-editor.component.ts
@@ -50,6 +50,7 @@ export class ProductStateEditorComponent implements OnInit{
if(this.templateElement == undefined) {
this.datasource.data = this.gamesystem!.states;
} else if(this.gamesystem instanceof ProductTemplateSystem) {
+ console.log("Product Template System: ", this.gamesystem!.stateMap.get(this.templateElement))
this.datasource.data = this.gamesystem!.stateMap.get(this.templateElement)!
}
diff --git a/src/app/project/game-model/characters/CharacterRelation.ts b/src/app/project/game-model/characters/CharacterRelation.ts
index ea9ecb1..fe1307a 100644
--- a/src/app/project/game-model/characters/CharacterRelation.ts
+++ b/src/app/project/game-model/characters/CharacterRelation.ts
@@ -22,6 +22,7 @@ export class CharacterRelation implements TemplateElement{
if((gamesystem instanceof SimpleTemplateGamesystem || gamesystem instanceof ProductTemplateSystem) && !this.isGamesystemCharacterRelationSpecific(gamesystem.componentName)) {
const templateGamesystem = new ProductTemplateSystem(gamesystem.componentName, gamesystem.componentDescription, TemplateType.CHARACTER_RELATION);
templateGamesystem.symmetric = gamesystem.symmetric
+ templateGamesystem.generateIsolatedStates = gamesystem.generateIsolatedStates
templateGamesystem.addChildGamesystem(gamesystem);
templateGamesystem.addChildGamesystem(gamesystem);
this.characterRelationGamesystems.push(templateGamesystem);
diff --git a/src/app/project/game-model/gamesystems/Gamesystem.ts b/src/app/project/game-model/gamesystems/Gamesystem.ts
index 2e94174..981590a 100644
--- a/src/app/project/game-model/gamesystems/Gamesystem.ts
+++ b/src/app/project/game-model/gamesystems/Gamesystem.ts
@@ -8,6 +8,8 @@ export abstract class Gamesystem extends ModelComponent{
states: S[] = [];
transitions: T[] = [];
parentGamesystem: ProductGamesystem | undefined
+ generateIsolatedStates: boolean = false
+
constructor(gamesystemName: string, gamesystemDescription: string) {
super(gamesystemName, gamesystemDescription, ModelComponentType.GAMESYTEM);
}
diff --git a/src/app/project/game-model/gamesystems/ProductGamesystem.ts b/src/app/project/game-model/gamesystems/ProductGamesystem.ts
index a7d380f..2b77cdc 100644
--- a/src/app/project/game-model/gamesystems/ProductGamesystem.ts
+++ b/src/app/project/game-model/gamesystems/ProductGamesystem.ts
@@ -11,6 +11,7 @@ import {ScriptAccountAction} from "./actions/ScriptAccountAction";
import {ProductSystemGenerator} from "./productSystemGenerator/ProductSystemGenerator";
import {TemplateType} from "../templates/TemplateType";
import {ProductTemplateSystem} from "../templates/productGamesystem/ProductTemplateSystem";
+import {IsolatedProductStateGenerator} from "./productSystemGenerator/IsolatedProductStateGenerator";
export class ProductGamesystem extends Gamesystem {
@@ -74,6 +75,11 @@ export class ProductGamesystem extends Gamesystem, Transition>) {
diff --git a/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedProductStateGenerator.ts b/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedProductStateGenerator.ts
new file mode 100644
index 0000000..db982a9
--- /dev/null
+++ b/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedProductStateGenerator.ts
@@ -0,0 +1,54 @@
+import {ProductSystemGenerator} from "./ProductSystemGenerator";
+import {ProductGenerationData} from "./ProductGenerationData";
+import {ProductGeneratorResult} from "./ProductGeneratorResult";
+import {ProductState} from "../states/ProductState";
+
+export class IsolatedProductStateGenerator extends ProductSystemGenerator {
+
+ generateIsolatedProductStates() {
+ if(this.productGamesystem.innerGamesystems.length < 2) return;
+
+ const leftInitialData = this.prepareChildsystemForGeneration(this.productGamesystem.innerGamesystems[0])
+ const rightInitialData = this.prepareChildsystemForGeneration(this.productGamesystem.innerGamesystems[1])
+
+ const initialGenerationResult = this.generateBinaryIsolatedProductStates(leftInitialData, rightInitialData);
+
+ if(this.productGamesystem.innerGamesystems.length > 2) {
+ for(let i=2; i {
+ if(leftState.outgoingTransitions.length == 0 && leftState.incomingTransitions.length == 0) {
+ rightSystemData.states.forEach(rightState => {
+ if(rightState.outgoingTransitions.length == 0 && rightState.incomingTransitions.length == 0) {
+ const leftConditions = this.getStateConditions(leftState, true);
+ const rightConditions = this.getStateConditions(rightState, true);
+
+ if(!this.contradictCombinedConditions(leftConditions, rightConditions)) {
+ this.generateBinaryProductState(leftState, rightState, generatedProductStates);
+ }
+ }
+ })
+ }
+ })
+ return new ProductGeneratorResult(generatedProductStates, []);
+ }
+
+}
diff --git a/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedSymmetricTemplateStateGenerator.ts b/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedSymmetricTemplateStateGenerator.ts
new file mode 100644
index 0000000..e9301c2
--- /dev/null
+++ b/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedSymmetricTemplateStateGenerator.ts
@@ -0,0 +1,48 @@
+import {IsolatedTemplateStateGenerator} from "./IsolatedTemplateStateGenerator";
+import {ProductGenerationData} from "./ProductGenerationData";
+import {ProductGeneratorResult} from "./ProductGeneratorResult";
+import {ProductState} from "../states/ProductState";
+import {SimpleState} from "../states/SimpleState";
+import {State} from "../states/State";
+import {ScriptAccountCondition} from "../conditions/ScriptAccountCondition";
+
+export class IsolatedSymmetricTemplateStateGenerator extends IsolatedTemplateStateGenerator{
+
+
+ protected generateBinaryIsolatedProductStates(leftSystemData: ProductGenerationData, rightSystemData: ProductGenerationData): ProductGeneratorResult {
+ console.log("Calling test")
+
+ console.log(leftSystemData.states)
+ console.log(rightSystemData.states)
+
+ const generatedProductStates: ProductState[] = []
+ leftSystemData.states.forEach(leftState => {
+ if(leftState.outgoingTransitions.length == 0 && leftState.incomingTransitions.length == 0) {
+ rightSystemData.states.forEach(rightState => {
+ console.log("LeftState is isolated")
+ if(leftState.equals(rightState)) {
+ if(rightState.outgoingTransitions.length == 0 && rightState.incomingTransitions.length == 0) {
+ const leftConditions = this.getStateConditions(leftState, true);
+ const rightConditions = this.getStateConditions(rightState, true);
+
+ if(!this.contradictCombinedConditions(leftConditions, rightConditions)) {
+ this.generateBinaryProductState(leftState, rightState, generatedProductStates);
+ }
+ }
+ }
+
+ if(leftState.equals(rightState) && rightState.outgoingTransitions.length == 0 && rightState.incomingTransitions.length == 0) {
+ const leftConditions = this.getStateConditions(leftState, true);
+ const rightConditions = this.getStateConditions(rightState, true);
+
+ if(!this.contradictCombinedConditions(leftConditions, rightConditions)) {
+ const generatedState = this.generateBinaryProductState(leftState, rightState, generatedProductStates);
+ console.log(generatedProductStates)
+ }
+ }
+ })
+ }
+ })
+ return new ProductGeneratorResult(generatedProductStates, []);
+ }
+}
diff --git a/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedTemplateStateGenerator.ts b/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedTemplateStateGenerator.ts
new file mode 100644
index 0000000..ad2fe31
--- /dev/null
+++ b/src/app/project/game-model/gamesystems/productSystemGenerator/IsolatedTemplateStateGenerator.ts
@@ -0,0 +1,66 @@
+import {IsolatedProductStateGenerator} from "./IsolatedProductStateGenerator";
+import {Transition} from "../transitions/Transition";
+import {SimpleTemplateTransition} from "../../templates/simpleGamesystem/SimpleTemplateTransition";
+import {State} from "../states/State";
+import {ScriptAccountCondition} from "../conditions/ScriptAccountCondition";
+import {SimpleTemplateState} from "../../templates/simpleGamesystem/SimpleTemplateState";
+import {Character} from "../../characters/Character";
+import {CharacterRelation} from "../../characters/CharacterRelation";
+import {TemplateElement} from "../../templates/TemplateElement";
+import {ProductTemplateSystem} from "../../templates/productGamesystem/ProductTemplateSystem";
+import {ProductGeneratorResult} from "./ProductGeneratorResult";
+import {state, transition} from "@angular/animations";
+
+export class IsolatedTemplateStateGenerator extends IsolatedProductStateGenerator {
+ templateElement: TemplateElement
+
+ constructor(productGamesystem: ProductTemplateSystem, templateElement: TemplateElement) {
+ super(productGamesystem);
+ this.templateElement = templateElement;
+ }
+
+
+ protected assignGeneratedStatesAndTransitions(generationResult: ProductGeneratorResult) {
+ const templateSystem = this.productGamesystem as ProductTemplateSystem;
+
+ const nonIsolatedStates = templateSystem.stateMap.get(this.templateElement)!
+ const states = nonIsolatedStates.concat(generationResult.states);
+ templateSystem.stateMap.set(this.templateElement, states)
+ }
+
+ protected getTransitionConditions(transition: Transition, leftSystem: boolean) {
+ const templateElement = this.determineTemplateElement(leftSystem)!;
+ if(transition instanceof SimpleTemplateTransition && transition.conditionMap.has(templateElement)) {
+ return transition.conditionMap.get(templateElement)!
+ }
+ return transition.scriptAccountConditions;
+ }
+
+ protected getTransitionActions(transition: Transition, leftSystem: boolean) {
+ const templateElement = this.determineTemplateElement(leftSystem)!;
+
+ if(transition instanceof SimpleTemplateTransition && transition.actionMap.has(templateElement)) {
+ return transition.actionMap.get(templateElement)!
+ } else {
+ return transition.scriptAccountActions;
+ }
+ }
+
+
+ protected getStateConditions(state: State, leftSystem: boolean): ScriptAccountCondition[] {
+ const templateElement = this.determineTemplateElement(leftSystem)!
+ if(state instanceof SimpleTemplateState && state.conditionMap.has(templateElement)) {
+ return state.conditionMap.get(templateElement)!
+ } else {
+ return state.conditions
+ }
+ }
+
+ private determineTemplateElement(leftSystem: boolean) {
+ if(this.templateElement instanceof Character) {
+ return this.templateElement;
+ } else if(this.templateElement instanceof CharacterRelation) {
+ return leftSystem ? this.templateElement.firstCharacter : this.templateElement.secondCharacter;
+ }
+ }
+}
diff --git a/src/app/project/game-model/templates/productGamesystem/ProductTemplateSystem.ts b/src/app/project/game-model/templates/productGamesystem/ProductTemplateSystem.ts
index 4193ecd..1c8fa26 100644
--- a/src/app/project/game-model/templates/productGamesystem/ProductTemplateSystem.ts
+++ b/src/app/project/game-model/templates/productGamesystem/ProductTemplateSystem.ts
@@ -10,6 +10,10 @@ import {TemplateProductSystemGenerator} from "../../gamesystems/productSystemGen
import {
SymmetricProductTemplateGenerator
} from "../../gamesystems/productSystemGenerator/SymmetricProductTemplateGenerator";
+import {IsolatedTemplateStateGenerator} from "../../gamesystems/productSystemGenerator/IsolatedTemplateStateGenerator";
+import {
+ IsolatedSymmetricTemplateStateGenerator
+} from "../../gamesystems/productSystemGenerator/IsolatedSymmetricTemplateStateGenerator";
export class ProductTemplateSystem extends ProductGamesystem implements TemplateGamesystem{
@@ -28,11 +32,26 @@ export class ProductTemplateSystem extends ProductGamesystem implements Template
if(this.symmetric) {
const symmetricGenerator = new SymmetricProductTemplateGenerator(this, templateElement);
symmetricGenerator.generateFromChildsystems()
+
+ if(this.generateIsolatedStates) {
+ const isolatedTemplateStateGenerator = new IsolatedSymmetricTemplateStateGenerator(this, templateElement);
+ isolatedTemplateStateGenerator.generateIsolatedProductStates();
+ console.log(this.states)
+ console.log("Generate symmetric isolated states")
+ } else {
+ console.log("Do not generate symmetric isolated states")
+ }
} else {
const productTemplateGenerator = new TemplateProductSystemGenerator(this, templateElement);
productTemplateGenerator.generateFromChildsystems()
+
+ if(this.generateIsolatedStates) {
+ const isolatedTemplateStateGenerator = new IsolatedTemplateStateGenerator(this, templateElement);
+ isolatedTemplateStateGenerator.generateIsolatedProductStates();
+ }
}
+
}
}
diff --git a/src/app/project/game-model/templates/simpleGamesystem/SimpleTemplateGamesystem.ts b/src/app/project/game-model/templates/simpleGamesystem/SimpleTemplateGamesystem.ts
index 0c844f4..bb8af87 100644
--- a/src/app/project/game-model/templates/simpleGamesystem/SimpleTemplateGamesystem.ts
+++ b/src/app/project/game-model/templates/simpleGamesystem/SimpleTemplateGamesystem.ts
@@ -10,7 +10,7 @@ import {TemplateType} from "../TemplateType";
export class SimpleTemplateGamesystem extends SimpleGamesystem implements TemplateGamesystem {
templateType: TemplateType
- symmetric: boolean = true
+ symmetric: boolean = false
constructor(gamesystemName: string, gamesystemDescription: string, templateType: TemplateType) {
super(gamesystemName, gamesystemDescription);
diff --git a/testModel/characters/Hicks Haddock.json b/testModel/characters/Hicks Haddock.json
index debd75a..8f7bf3a 100644
--- a/testModel/characters/Hicks Haddock.json
+++ b/testModel/characters/Hicks Haddock.json
@@ -17,6 +17,18 @@
{
"stateLabel": "Fester Freund",
"conditionMap": []
+ },
+ {
+ "stateLabel": "Eltern",
+ "conditionMap": []
+ },
+ {
+ "stateLabel": "Geschwister",
+ "conditionMap": []
+ },
+ {
+ "stateLabel": "Großeltern",
+ "conditionMap": []
}
],
"transitions": [
@@ -45,6 +57,7 @@
"actionMap": []
}
],
+ "generateIsolatedStates": true,
"symmetric": true
}
]
diff --git a/testModel/gamesystems/Characterbeziehungssystem.json b/testModel/gamesystems/Characterbeziehungssystem.json
index ad1b1b4..8ad03fd 100644
--- a/testModel/gamesystems/Characterbeziehungssystem.json
+++ b/testModel/gamesystems/Characterbeziehungssystem.json
@@ -19,6 +19,24 @@
"conditions": [],
"stateLabel": "Fester Freund",
"stateDescription": ""
+ },
+ {
+ "initial": false,
+ "conditions": [],
+ "stateLabel": "Eltern",
+ "stateDescription": ""
+ },
+ {
+ "initial": false,
+ "conditions": [],
+ "stateLabel": "Geschwister",
+ "stateDescription": ""
+ },
+ {
+ "initial": false,
+ "conditions": [],
+ "stateLabel": "Großeltern",
+ "stateDescription": ""
}
],
"transitions": [
@@ -47,6 +65,7 @@
"endingState": "Feind"
}
],
+ "generateIsolatedStates": true,
"symmetric": true,
"templateType": 1
}
\ No newline at end of file