diff --git a/src/app/project/game-model/gamesystems/ProductGamesystem.ts b/src/app/project/game-model/gamesystems/ProductGamesystem.ts index 83d73ec..e3e2daf 100644 --- a/src/app/project/game-model/gamesystems/ProductGamesystem.ts +++ b/src/app/project/game-model/gamesystems/ProductGamesystem.ts @@ -8,6 +8,7 @@ import {SimpleGamesystem} from "./SimpleGamesystem"; import {GameModel} from "../GameModel"; import {ScriptAccountCondition} from "./conditions/ScriptAccountCondition"; import {ScriptAccountAction} from "./actions/ScriptAccountAction"; +import {ProductSystemGenerator} from "./productSystemGenerator/ProductSystemGenerator"; export class ProductGamesystem extends Gamesystem { @@ -66,202 +67,8 @@ export class ProductGamesystem extends Gamesystem[] = [this.innerGamesystems[0], this.innerGamesystems[1]]; - if(this.innerGamesystems[0] instanceof ProductGamesystem) { - this.innerGamesystems[0].generateFromChildsystems(); - } - - if(this.innerGamesystems[1] instanceof ProductGamesystem) { - this.innerGamesystems[1].generateFromChildsystems(); - } - let gamesystem: ProductGamesystem = ProductGamesystem.generateFromChildsystems(this.innerGamesystems[0], this.innerGamesystems[1], false, integratedSystems); - - for(let i=2; i, rightSystem: Gamesystem, left_temp: boolean, integratedSystems: Gamesystem[]) { - const productGamesystem = new ProductGamesystem("Temporary Gamesystem", ""); - integratedSystems.forEach(integratedSystem => productGamesystem.addChildGamesystem(integratedSystem)); - - leftSystem.states.forEach(leftState => { - rightSystem.states.forEach(rightState => { - for(let i=0; i, rightInnerState: State, left_temp: boolean) { - const combinedStateConditions: ScriptAccountCondition[] = leftInnerState.conditions.concat(rightInnerState.conditions) - for(let i=0; i[] = []; - if(!left_temp) { - innerStates = [leftInnerState, rightInnerState]; - } else { - const left_inner_product_state = leftInnerState as ProductState; - left_inner_product_state.innerStates.forEach(state => innerStates.push(state)); - innerStates.push(rightInnerState); - } - - - let binary_productState = this.findProductStateByInnerStates(innerStates); - if(binary_productState == undefined) { - binary_productState = this.createState(innerStates)!; - } - - let productInitial = true; - binary_productState.innerStates.forEach(innerState => productInitial = productInitial && innerState.initial) - binary_productState!.initial = productInitial - binary_productState.conditions = combinedStateConditions - - return binary_productState!; + const productGenerator = new ProductSystemGenerator(this); + productGenerator.generateFromChildsystems(); } addChildGamesystem(gamesystem: Gamesystem, Transition>) { diff --git a/src/app/project/game-model/gamesystems/productSystemGenerator/ProductGenerationData.ts b/src/app/project/game-model/gamesystems/productSystemGenerator/ProductGenerationData.ts new file mode 100644 index 0000000..56bf1b4 --- /dev/null +++ b/src/app/project/game-model/gamesystems/productSystemGenerator/ProductGenerationData.ts @@ -0,0 +1,14 @@ +import {Transition} from "../transitions/Transition"; +import {State} from "../states/State"; + +export class ProductGenerationData { + states: State[] + transitions: Transition[] + + + constructor(states: State[], transitions: Transition[]) { + this.states = states; + this.transitions = transitions; + } + +} diff --git a/src/app/project/game-model/gamesystems/productSystemGenerator/ProductGeneratorResult.ts b/src/app/project/game-model/gamesystems/productSystemGenerator/ProductGeneratorResult.ts new file mode 100644 index 0000000..bcac716 --- /dev/null +++ b/src/app/project/game-model/gamesystems/productSystemGenerator/ProductGeneratorResult.ts @@ -0,0 +1,19 @@ +import {ProductState} from "../states/ProductState"; +import {ProductTransition} from "../transitions/ProductTransition"; +import {ProductGenerationData} from "./ProductGenerationData"; + +export class ProductGeneratorResult { + states: ProductState[]; + transitions: ProductTransition[] + + + constructor(states: ProductState[], transitions: ProductTransition[]) { + this.states = states; + this.transitions = transitions; + } + + get productGenerationData(): ProductGenerationData { + return new ProductGenerationData(this.states, this.transitions) + } + +} diff --git a/src/app/project/game-model/gamesystems/productSystemGenerator/ProductSystemGenerator.ts b/src/app/project/game-model/gamesystems/productSystemGenerator/ProductSystemGenerator.ts new file mode 100644 index 0000000..d84bbb0 --- /dev/null +++ b/src/app/project/game-model/gamesystems/productSystemGenerator/ProductSystemGenerator.ts @@ -0,0 +1,234 @@ +import {ScriptAccountCondition} from "../conditions/ScriptAccountCondition"; +import {ScriptAccountAction} from "../actions/ScriptAccountAction"; +import {ProductState} from "../states/ProductState"; +import {State} from "../states/State"; +import {Transition} from "../transitions/Transition"; +import {ProductGamesystem} from "../ProductGamesystem"; +import {ProductGeneratorResult} from "./ProductGeneratorResult"; +import {Gamesystem} from "../Gamesystem"; +import {ProductGenerationData} from "./ProductGenerationData"; +import {ProductTransition} from "../transitions/ProductTransition"; + +export class ProductSystemGenerator { + productGamesystem: ProductGamesystem + + + constructor(productGamesystem: ProductGamesystem) { + this.productGamesystem = productGamesystem; + } + + generateFromChildsystems(): void { + 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.generateFromBinaryChildsystems(leftInitialData, rightInitialData); + + if(this.productGamesystem.innerGamesystems.length > 2) { + for(let i=2; i) { + if(childsystem instanceof ProductGamesystem) { + childsystem.generateFromChildsystems() + } + + return new ProductGenerationData(childsystem.states, childsystem.transitions) + } + + protected generateFromBinaryChildsystems(leftSystemData: ProductGenerationData, rightSystemData: ProductGenerationData): ProductGeneratorResult { + const generatedProductStates: ProductState[] = [] + const generatedProductTransitions: ProductTransition[] = [] + + leftSystemData.states.forEach(leftState => { + rightSystemData.states.forEach(rightState => { + for(let i=0; i, generatedTransitions: ProductTransition[]) { + const transition = new ProductTransition(startingState, endingState); + transition.scriptAccountActions = [... usedTransition.scriptAccountActions]; + transition.scriptAccountConditions = [... usedTransition.scriptAccountConditions]; + + if(generatedTransitions.find(generatedTransition => generatedTransition.startingState.equals(startingState) && generatedTransition.endingState.equals(endingState)) == undefined) { + generatedTransitions.push(transition) + } else { + console.log(transition) + } + } + + protected generateBinaryProductTransitionMulti(startingState: ProductState, endingState: ProductState, leftTransition: Transition, rightTransition: Transition, generatedTransitions: ProductTransition[]) { + const leftConditions = leftTransition.scriptAccountConditions; + const rightConditions = rightTransition.scriptAccountConditions; + + if(!this.contradictCombinedConditions(leftConditions, rightConditions)) { + const transition = new ProductTransition(startingState, endingState) + transition.scriptAccountActions = this.generateCombinedActions(leftTransition.scriptAccountActions, rightTransition.scriptAccountActions); + transition.scriptAccountConditions = this.generateCombinedConditions(leftTransition.scriptAccountConditions, rightTransition.scriptAccountConditions); + + if(generatedTransitions.find(generatedTransition => generatedTransition.startingState.equals(startingState) && generatedTransition.endingState.equals(endingState)) == undefined) { + generatedTransitions.push(transition) + } else { + console.log(transition) + } + } + } + + protected generateBinaryProductState(leftState: State, rightState: State, generatedStates: ProductState[]): ProductState | undefined { + const combinedStateConditions: ScriptAccountCondition[] = leftState.conditions.concat(rightState.conditions); + for(let i=0; i[] = [] + if(leftState instanceof ProductState) { + innerStates = leftState.innerStates + } else { + innerStates = [leftState] + } + + if(rightState instanceof ProductState) { + innerStates = innerStates.concat(rightState.innerStates) + } else { + innerStates = innerStates.concat(rightState) + } + + let binaryProductState: ProductState | undefined = this.findGeneratedProductState(innerStates, generatedStates); + if(binaryProductState == undefined) { + binaryProductState = new ProductState(innerStates); + generatedStates.push(binaryProductState) + } + + //binaryProductState.determineInitialProperty() + binaryProductState.conditions = combinedStateConditions; + + return binaryProductState; + } + + + protected findGeneratedProductState(innerStates: State[], productStates: ProductState[]) { + return productStates.find(productState => productState.equalInnerStates(innerStates)); + } + + protected generateCombinedActions(leftActions: ScriptAccountAction[], rightActions: ScriptAccountAction[]): ScriptAccountAction[] { + const combinedActions: ScriptAccountAction[] = [] + for(let i=0; i