Introduce Symetric and Asymetric Template Relation Systems #40
@ -0,0 +1,34 @@
|
|||||||
|
import {TemplateProductSystemGenerator} from "./TemplateProductSystemGenerator";
|
||||||
|
import {ProductGenerationData} from "./ProductGenerationData";
|
||||||
|
import {ProductGeneratorResult} from "./ProductGeneratorResult";
|
||||||
|
import {ProductState} from "../states/ProductState";
|
||||||
|
import {ProductTransition} from "../transitions/ProductTransition";
|
||||||
|
import {ProductTemplateSystem} from "../../templates/productGamesystem/ProductTemplateSystem";
|
||||||
|
|
||||||
|
export class SymmetricProductTemplateGenerator extends TemplateProductSystemGenerator {
|
||||||
|
protected generateFromBinaryChildsystems(leftSystemData: ProductGenerationData, rightSystemData: ProductGenerationData): ProductGeneratorResult {
|
||||||
|
const generatedProductStates: ProductState[] = []
|
||||||
|
const generatedProductTransitions: ProductTransition[] = []
|
||||||
|
|
||||||
|
leftSystemData.states.forEach(leftState => {
|
||||||
|
rightSystemData.states.forEach(rightState => {
|
||||||
|
if(leftState.equals(rightState)) {
|
||||||
|
for(let i=0; i<leftState.outgoingTransitions.length; i++) {
|
||||||
|
for(let j=0; j<rightState.outgoingTransitions.length; j++) {
|
||||||
|
const startingState = this.generateBinaryProductState(leftState, rightState, generatedProductStates);
|
||||||
|
if(startingState != undefined && leftState.outgoingTransitions[i].endingState.equals(rightState.outgoingTransitions[j].endingState)) {
|
||||||
|
const endingState_left_right = this.generateBinaryProductState(leftState.outgoingTransitions[i].endingState, rightState.outgoingTransitions[j].endingState, generatedProductStates);
|
||||||
|
if(endingState_left_right != undefined) {
|
||||||
|
this.generateBinaryProductTransitionMulti(startingState, endingState_left_right, leftState.outgoingTransitions[i], rightState.outgoingTransitions[j], generatedProductTransitions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return new ProductGeneratorResult(generatedProductStates, generatedProductTransitions);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -33,75 +33,6 @@ export class TemplateProductSystemGenerator extends ProductSystemGenerator {
|
|||||||
console.log("Template: ", generationResult.transitions.length)
|
console.log("Template: ", generationResult.transitions.length)
|
||||||
}
|
}
|
||||||
|
|
||||||
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<leftState.outgoingTransitions.length; i++) {
|
|
||||||
for(let j=0; j<rightState.outgoingTransitions.length; j++) {
|
|
||||||
const startingState = this.generateBinaryProductState(leftState, rightState, generatedProductStates);
|
|
||||||
|
|
||||||
if(startingState != undefined) {
|
|
||||||
|
|
||||||
if(!(this.productGamesystem as ProductTemplateSystem).symmetric) {
|
|
||||||
const endingState_right = this.generateBinaryProductState(leftState, rightState.outgoingTransitions[j].endingState, generatedProductStates);
|
|
||||||
if(endingState_right != undefined) {
|
|
||||||
this.generateBinaryProductTransition(startingState, endingState_right, rightState.outgoingTransitions[j], generatedProductTransitions, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
const endingState_left = this.generateBinaryProductState(leftState.outgoingTransitions[i].endingState, rightState, generatedProductStates);
|
|
||||||
if(endingState_left != undefined) {
|
|
||||||
this.generateBinaryProductTransition(startingState, endingState_left, leftState.outgoingTransitions[i], generatedProductTransitions, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const endingState_left_right = this.generateBinaryProductState(leftState.outgoingTransitions[i].endingState, rightState.outgoingTransitions[j].endingState, generatedProductStates);
|
|
||||||
if(endingState_left_right != undefined) {
|
|
||||||
if((this.productGamesystem as ProductTemplateSystem).symmetric) {
|
|
||||||
if(leftState.equals(rightState) && leftState.outgoingTransitions[i].endingState.equals(rightState.outgoingTransitions[j].endingState)) {
|
|
||||||
this.generateBinaryProductTransitionMulti(startingState, endingState_left_right, leftState.outgoingTransitions[i], rightState.outgoingTransitions[j], generatedProductTransitions);
|
|
||||||
} else {
|
|
||||||
console.log(startingState , endingState_left_right)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.generateBinaryProductTransitionMulti(startingState, endingState_left_right, leftState.outgoingTransitions[i], rightState.outgoingTransitions[j], generatedProductTransitions);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(rightState.outgoingTransitions.length == 0 && !(this.productGamesystem as ProductTemplateSystem).symmetric) {
|
|
||||||
const startingState = this.generateBinaryProductState(leftState, rightState, generatedProductStates);
|
|
||||||
const endingState = this.generateBinaryProductState(leftState.outgoingTransitions[i].endingState, rightState, generatedProductStates);
|
|
||||||
|
|
||||||
if(startingState != undefined && endingState != undefined) {
|
|
||||||
this.generateBinaryProductTransition(startingState, endingState, leftState.outgoingTransitions[i], generatedProductTransitions, true)
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(leftState.outgoingTransitions.length == 0 && !(this.productGamesystem as ProductTemplateSystem).symmetric) {
|
|
||||||
for(let j=0; j<rightState.outgoingTransitions.length; j++) {
|
|
||||||
const startingState = this.generateBinaryProductState(leftState, rightState, generatedProductStates);
|
|
||||||
const endingState = this.generateBinaryProductState(leftState, rightState.outgoingTransitions[j].endingState, generatedProductStates);
|
|
||||||
|
|
||||||
if(startingState != undefined && endingState != undefined) {
|
|
||||||
this.generateBinaryProductTransition(startingState, endingState, rightState.outgoingTransitions[j], generatedProductTransitions, false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
return new ProductGeneratorResult(generatedProductStates, generatedProductTransitions);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected getTransitionConditions(transition: Transition<any>, leftSystem: boolean) {
|
protected getTransitionConditions(transition: Transition<any>, leftSystem: boolean) {
|
||||||
const templateElement = this.determineTemplateElement(leftSystem)!;
|
const templateElement = this.determineTemplateElement(leftSystem)!;
|
||||||
if(transition instanceof SimpleTemplateTransition && transition.conditionMap.has(templateElement)) {
|
if(transition instanceof SimpleTemplateTransition && transition.conditionMap.has(templateElement)) {
|
||||||
|
@ -7,6 +7,9 @@ import {SimpleGamesystem} from "../../gamesystems/SimpleGamesystem";
|
|||||||
import {GameModel} from "../../GameModel";
|
import {GameModel} from "../../GameModel";
|
||||||
import {TemplateType} from "../TemplateType";
|
import {TemplateType} from "../TemplateType";
|
||||||
import {TemplateProductSystemGenerator} from "../../gamesystems/productSystemGenerator/TemplateProductSystemGenerator";
|
import {TemplateProductSystemGenerator} from "../../gamesystems/productSystemGenerator/TemplateProductSystemGenerator";
|
||||||
|
import {
|
||||||
|
SymmetricProductTemplateGenerator
|
||||||
|
} from "../../gamesystems/productSystemGenerator/SymmetricProductTemplateGenerator";
|
||||||
|
|
||||||
export class ProductTemplateSystem extends ProductGamesystem implements TemplateGamesystem{
|
export class ProductTemplateSystem extends ProductGamesystem implements TemplateGamesystem{
|
||||||
|
|
||||||
@ -22,8 +25,14 @@ export class ProductTemplateSystem extends ProductGamesystem implements Template
|
|||||||
}
|
}
|
||||||
|
|
||||||
addTemplateElement(templateElement: TemplateElement): void {
|
addTemplateElement(templateElement: TemplateElement): void {
|
||||||
const productTemplateGenerator = new TemplateProductSystemGenerator(this, templateElement);
|
if(this.symmetric) {
|
||||||
productTemplateGenerator.generateFromChildsystems()
|
const symmetricGenerator = new SymmetricProductTemplateGenerator(this, templateElement);
|
||||||
|
symmetricGenerator.generateFromChildsystems()
|
||||||
|
} else {
|
||||||
|
const productTemplateGenerator = new TemplateProductSystemGenerator(this, templateElement);
|
||||||
|
productTemplateGenerator.generateFromChildsystems()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user