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