Save Gamesystems and Ignore save status and type of saved gamemodelcomponent
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				E2E Testing / test (push) Successful in 1m28s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	E2E Testing / test (push) Successful in 1m28s
				
			This commit is contained in:
		
							parent
							
								
									78a264aa26
								
							
						
					
					
						commit
						e873688cb7
					
				@ -10,8 +10,10 @@ class SaveProject {
 | 
			
		||||
        if (!fs.existsSync(projectDir)) {
 | 
			
		||||
            fs.mkdirSync(projectDir, { recursive: true });
 | 
			
		||||
        }
 | 
			
		||||
        console.log(storageModels);
 | 
			
		||||
        storageModels.forEach(storageModel => {
 | 
			
		||||
            const modelDir = path.join(projectDir, storageModel.storageDir);
 | 
			
		||||
            let modelDir = path.join(projectDir, storageModel.storageRootDir);
 | 
			
		||||
            storageModel.storagePath.forEach(pathElement => modelDir = path.join(modelDir, pathElement));
 | 
			
		||||
            if (!fs.existsSync(modelDir)) {
 | 
			
		||||
                fs.mkdirSync(modelDir, { recursive: true });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
import {StorageModel} from "../src/app/game-model/StorageModel";
 | 
			
		||||
import {StorageModel} from "../src/app/game-model/fs/StorageModel";
 | 
			
		||||
import * as fs from "fs";
 | 
			
		||||
import * as path from "node:path";
 | 
			
		||||
import {LoadModel} from "./LoadModel";
 | 
			
		||||
@ -13,8 +13,10 @@ export class SaveProject {
 | 
			
		||||
      fs.mkdirSync(projectDir, {recursive: true});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    console.log(storageModels)
 | 
			
		||||
    storageModels.forEach(storageModel => {
 | 
			
		||||
      const modelDir = path.join(projectDir, storageModel.storageDir);
 | 
			
		||||
      let modelDir = path.join(projectDir, storageModel.storageRootDir);
 | 
			
		||||
      storageModel.storagePath.forEach(pathElement => modelDir = path.join(modelDir, pathElement));
 | 
			
		||||
      if(!fs.existsSync(modelDir)) {
 | 
			
		||||
        fs.mkdirSync(modelDir, {recursive: true});
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@ import {app, BrowserWindow, screen, Menu, ipcMain, dialog, globalShortcut} from
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
import {json} from "node:stream/consumers";
 | 
			
		||||
import {StorageModel} from "../src/app/game-model/StorageModel";
 | 
			
		||||
import {StorageModel} from "../src/app/game-model/fs/StorageModel";
 | 
			
		||||
import {SaveProject} from "./SaveProject";
 | 
			
		||||
 | 
			
		||||
let win: BrowserWindow | null = null;
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@ import {ProductState} from "./game-model/gamesystems/ProductState";
 | 
			
		||||
import {LoadModel} from "../../app/LoadModel";
 | 
			
		||||
import {LoadedProject} from "../../app/LoadedProject";
 | 
			
		||||
import {ProcessLoadedProject} from "./game-model/fs/ProcessLoadedProject";
 | 
			
		||||
import {StoreProject} from "./game-model/fs/store/StoreProject";
 | 
			
		||||
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'app-root',
 | 
			
		||||
@ -62,6 +63,25 @@ export class AppComponent implements OnInit{
 | 
			
		||||
 | 
			
		||||
      electronService.ipcRenderer.on('open-project', (event: any, loadedProject: LoadedProject) => {
 | 
			
		||||
        this.gameModel = ProcessLoadedProject.processLoadedProject(loadedProject)
 | 
			
		||||
        const weather = new SimpleGamesystem("Weather");
 | 
			
		||||
        const season = new SimpleGamesystem("Season");
 | 
			
		||||
 | 
			
		||||
        const springState = season.createState("Spring", "Spring, also known as springtime, is one of the four temperate seasons, succeeding winter and preceding summer.");
 | 
			
		||||
        const summerState = season.createState("Summer", "Summer is the hottest and brightest of the four temperate seasons, occurring after spring and before autumn. ");
 | 
			
		||||
 | 
			
		||||
        const sunnyState = weather.createState("Sunny", "The sun is shining. No clouds, no rain, no storm.");
 | 
			
		||||
        const rainingState = weather.createState("Raining", "It rains")
 | 
			
		||||
 | 
			
		||||
        season.createTransition(springState!, summerState!);
 | 
			
		||||
        weather.createTransition(sunnyState!, rainingState!);
 | 
			
		||||
 | 
			
		||||
        const weather_season = new ProductGamesystem("Weather-Season");
 | 
			
		||||
        weather_season.addChildGamesystem(weather);
 | 
			
		||||
        weather_season.addChildGamesystem(season);
 | 
			
		||||
 | 
			
		||||
        weather_season.createState([springState!, sunnyState!]);
 | 
			
		||||
 | 
			
		||||
        this.gameModel.addGamesystem(weather_season);
 | 
			
		||||
      })
 | 
			
		||||
    } else {
 | 
			
		||||
      console.log('Run in browser');
 | 
			
		||||
@ -69,7 +89,7 @@ export class AppComponent implements OnInit{
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  saveGameModel() {
 | 
			
		||||
    const storageModels = this.gameModel!.save()
 | 
			
		||||
    const storageModels = StoreProject.storeProject(this.gameModel!);
 | 
			
		||||
    this.electronService.ipcRenderer.send('save-model', storageModels)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ import {Transition} from "./gamesystems/Transition";
 | 
			
		||||
import {State} from "./gamesystems/State";
 | 
			
		||||
import {ProductGamesystem} from "./gamesystems/ProductGamesystem";
 | 
			
		||||
import {SimpleGamesystem} from "./gamesystems/SimpleGamesystem";
 | 
			
		||||
import {StorageModel} from "./StorageModel";
 | 
			
		||||
import {StorageModel} from "./fs/StorageModel";
 | 
			
		||||
 | 
			
		||||
export class GameModel {
 | 
			
		||||
  private readonly _gameModelName: string
 | 
			
		||||
@ -91,22 +91,6 @@ export class GameModel {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  save() {
 | 
			
		||||
    const storageModels: StorageModel[] = [];
 | 
			
		||||
    this.scriptAccounts.forEach(scriptAccount => {
 | 
			
		||||
      const scriptAccountJson = scriptAccount.save();
 | 
			
		||||
      storageModels.push({
 | 
			
		||||
        fileName: scriptAccount.componentName,
 | 
			
		||||
        jsonString: scriptAccountJson,
 | 
			
		||||
        storageDir: "script-accounts"
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      console.log(scriptAccount)
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    return storageModels;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  addScriptAccount(scriptAccount: ScriptAccount) {
 | 
			
		||||
    this.scriptAccounts.push(scriptAccount);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,4 @@ export abstract class SaveComponent {
 | 
			
		||||
  onSaveContent() {
 | 
			
		||||
    this.unsaved = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  abstract save(): string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,12 +0,0 @@
 | 
			
		||||
export class StorageModel {
 | 
			
		||||
  jsonString: string
 | 
			
		||||
  fileName: string
 | 
			
		||||
  storageDir: string
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  constructor(jsonString: string, fileName: string, storageDir: string) {
 | 
			
		||||
    this.jsonString = jsonString;
 | 
			
		||||
    this.fileName = fileName;
 | 
			
		||||
    this.storageDir = storageDir;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								src/app/game-model/fs/StorageModel.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/app/game-model/fs/StorageModel.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
export class StorageModel {
 | 
			
		||||
  jsonString: string
 | 
			
		||||
  fileName: string
 | 
			
		||||
  storagePath: string[]
 | 
			
		||||
  storageRootDir: string
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  constructor(jsonString: string, fileName: string, storagePath: string[], storageRootDir: string) {
 | 
			
		||||
    this.jsonString = jsonString;
 | 
			
		||||
    this.fileName = fileName;
 | 
			
		||||
    this.storagePath = storagePath;
 | 
			
		||||
    this.storageRootDir = storageRootDir;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										84
									
								
								src/app/game-model/fs/store/StoreProject.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/app/game-model/fs/store/StoreProject.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,84 @@
 | 
			
		||||
import {StorageModel} from "../StorageModel";
 | 
			
		||||
import {GameModel} from "../../GameModel";
 | 
			
		||||
import {ScriptAccount} from "../../scriptAccounts/ScriptAccount";
 | 
			
		||||
import {Gamesystem} from "../../gamesystems/Gamesystem";
 | 
			
		||||
import {SimpleGamesystem} from "../../gamesystems/SimpleGamesystem";
 | 
			
		||||
import {ModelComponent} from "../../ModelComponent";
 | 
			
		||||
import {ProductGamesystem} from "../../gamesystems/ProductGamesystem";
 | 
			
		||||
 | 
			
		||||
export class StoreProject {
 | 
			
		||||
 | 
			
		||||
  static JSON_INDENT = 4
 | 
			
		||||
 | 
			
		||||
  static storeProject(gameModel: GameModel): StorageModel[] {
 | 
			
		||||
    let storageModels: StorageModel[] = [];
 | 
			
		||||
    storageModels = storageModels.concat(this.storeScriptAccounts(gameModel.scriptAccounts));
 | 
			
		||||
    storageModels = storageModels.concat(this.storeGamesystems(gameModel.gamesystems));
 | 
			
		||||
    return storageModels;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static storeScriptAccounts(scriptAcccounts: ScriptAccount[]): StorageModel[] {
 | 
			
		||||
    const storedScriptAccounts: StorageModel[] = [];
 | 
			
		||||
    scriptAcccounts.forEach(scriptAccount => {
 | 
			
		||||
      storedScriptAccounts.push({
 | 
			
		||||
        fileName: scriptAccount.componentName,
 | 
			
		||||
        jsonString: JSON.stringify(scriptAccount, (key,value) => {
 | 
			
		||||
          if(key === 'unsaved' || key === 'type') {
 | 
			
		||||
            return undefined
 | 
			
		||||
          } else {
 | 
			
		||||
            return value;
 | 
			
		||||
          }
 | 
			
		||||
        }, StoreProject.JSON_INDENT),
 | 
			
		||||
        storageRootDir: "script-accounts",
 | 
			
		||||
        storagePath: []
 | 
			
		||||
      })
 | 
			
		||||
      scriptAccount.onSaveContent();
 | 
			
		||||
    })
 | 
			
		||||
    return storedScriptAccounts;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static storeGamesystems(gamesystems: Gamesystem<any, any>[]): StorageModel[] {
 | 
			
		||||
    let storedGamesystems: StorageModel[] = [];
 | 
			
		||||
    gamesystems.forEach(gamesystem => {
 | 
			
		||||
      const storageModels: StorageModel[] = StoreProject.storeIndividualGamesystem(gamesystem, []);
 | 
			
		||||
      storedGamesystems = storedGamesystems.concat(storageModels);
 | 
			
		||||
    })
 | 
			
		||||
    return storedGamesystems;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static storeIndividualGamesystem(gamesystem: Gamesystem<any, any>, storagePath: string[]): StorageModel[] {
 | 
			
		||||
    if(gamesystem instanceof SimpleGamesystem) {
 | 
			
		||||
      return [new StorageModel(JSON.stringify(gamesystem, (key, value) => {
 | 
			
		||||
        if(key === 'startingState' || key === 'endingState') {
 | 
			
		||||
          return value.stateLabel
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(key === 'incomingTransitions' || key === 'outgoingTransitions' || key === 'unsaved' || key === 'type') {
 | 
			
		||||
          return undefined;
 | 
			
		||||
        } else {
 | 
			
		||||
          return value;
 | 
			
		||||
        }
 | 
			
		||||
      }, this.JSON_INDENT), gamesystem.componentName, storagePath, "gamesystems")];
 | 
			
		||||
    } else if(gamesystem instanceof ProductGamesystem) {
 | 
			
		||||
      const storageModels: StorageModel[] = [];
 | 
			
		||||
      //Root-StorageModel
 | 
			
		||||
      storagePath.push(gamesystem.componentName);
 | 
			
		||||
      (gamesystem as ProductGamesystem).innerGamesystems.forEach(innerGamesystem => {
 | 
			
		||||
        const innerStorageModels: StorageModel[] = StoreProject.storeIndividualGamesystem(innerGamesystem, storagePath)
 | 
			
		||||
        innerStorageModels.forEach(storageModel => storageModels.push(storageModel))
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      const productData = {
 | 
			
		||||
        'componentName': gamesystem.componentName,
 | 
			
		||||
        'componentDescription': gamesystem.componentDescription
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      storageModels.push(new StorageModel(JSON.stringify(productData, null, this.JSON_INDENT), gamesystem.componentName, storagePath, "gamesystems"))
 | 
			
		||||
      return storageModels;
 | 
			
		||||
    } else {
 | 
			
		||||
      return [];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -25,9 +25,4 @@ export abstract class Gamesystem<S, T> extends ModelComponent{
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  save() {
 | 
			
		||||
    return JSON.stringify(this);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -55,6 +55,4 @@ export class SimpleGamesystem extends Gamesystem<SimpleState, SimpleTransition>
 | 
			
		||||
 | 
			
		||||
    return updated;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -8,9 +8,4 @@ export class ScriptAccount extends ModelComponent{
 | 
			
		||||
  constructor(componentName: string, componentDescription: string) {
 | 
			
		||||
    super(componentName, componentDescription, ModelComponentType.SCRIPTACCOUNT);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  save(): string {
 | 
			
		||||
    this.unsaved = false;
 | 
			
		||||
    return JSON.stringify(this, null, SaveComponent.JSON_INDENT)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user