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)) {
|
if (!fs.existsSync(projectDir)) {
|
||||||
fs.mkdirSync(projectDir, { recursive: true });
|
fs.mkdirSync(projectDir, { recursive: true });
|
||||||
}
|
}
|
||||||
|
console.log(storageModels);
|
||||||
storageModels.forEach(storageModel => {
|
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)) {
|
if (!fs.existsSync(modelDir)) {
|
||||||
fs.mkdirSync(modelDir, { recursive: true });
|
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 fs from "fs";
|
||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
import {LoadModel} from "./LoadModel";
|
import {LoadModel} from "./LoadModel";
|
||||||
@ -13,8 +13,10 @@ export class SaveProject {
|
|||||||
fs.mkdirSync(projectDir, {recursive: true});
|
fs.mkdirSync(projectDir, {recursive: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log(storageModels)
|
||||||
storageModels.forEach(storageModel => {
|
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)) {
|
if(!fs.existsSync(modelDir)) {
|
||||||
fs.mkdirSync(modelDir, {recursive: true});
|
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 path from 'path';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import {json} from "node:stream/consumers";
|
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";
|
import {SaveProject} from "./SaveProject";
|
||||||
|
|
||||||
let win: BrowserWindow | null = null;
|
let win: BrowserWindow | null = null;
|
||||||
|
@ -20,6 +20,7 @@ import {ProductState} from "./game-model/gamesystems/ProductState";
|
|||||||
import {LoadModel} from "../../app/LoadModel";
|
import {LoadModel} from "../../app/LoadModel";
|
||||||
import {LoadedProject} from "../../app/LoadedProject";
|
import {LoadedProject} from "../../app/LoadedProject";
|
||||||
import {ProcessLoadedProject} from "./game-model/fs/ProcessLoadedProject";
|
import {ProcessLoadedProject} from "./game-model/fs/ProcessLoadedProject";
|
||||||
|
import {StoreProject} from "./game-model/fs/store/StoreProject";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-root',
|
selector: 'app-root',
|
||||||
@ -62,6 +63,25 @@ export class AppComponent implements OnInit{
|
|||||||
|
|
||||||
electronService.ipcRenderer.on('open-project', (event: any, loadedProject: LoadedProject) => {
|
electronService.ipcRenderer.on('open-project', (event: any, loadedProject: LoadedProject) => {
|
||||||
this.gameModel = ProcessLoadedProject.processLoadedProject(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 {
|
} else {
|
||||||
console.log('Run in browser');
|
console.log('Run in browser');
|
||||||
@ -69,7 +89,7 @@ export class AppComponent implements OnInit{
|
|||||||
}
|
}
|
||||||
|
|
||||||
saveGameModel() {
|
saveGameModel() {
|
||||||
const storageModels = this.gameModel!.save()
|
const storageModels = StoreProject.storeProject(this.gameModel!);
|
||||||
this.electronService.ipcRenderer.send('save-model', storageModels)
|
this.electronService.ipcRenderer.send('save-model', storageModels)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ import {Transition} from "./gamesystems/Transition";
|
|||||||
import {State} from "./gamesystems/State";
|
import {State} from "./gamesystems/State";
|
||||||
import {ProductGamesystem} from "./gamesystems/ProductGamesystem";
|
import {ProductGamesystem} from "./gamesystems/ProductGamesystem";
|
||||||
import {SimpleGamesystem} from "./gamesystems/SimpleGamesystem";
|
import {SimpleGamesystem} from "./gamesystems/SimpleGamesystem";
|
||||||
import {StorageModel} from "./StorageModel";
|
import {StorageModel} from "./fs/StorageModel";
|
||||||
|
|
||||||
export class GameModel {
|
export class GameModel {
|
||||||
private readonly _gameModelName: string
|
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) {
|
addScriptAccount(scriptAccount: ScriptAccount) {
|
||||||
this.scriptAccounts.push(scriptAccount);
|
this.scriptAccounts.push(scriptAccount);
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,4 @@ export abstract class SaveComponent {
|
|||||||
onSaveContent() {
|
onSaveContent() {
|
||||||
this.unsaved = false;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
save() {
|
|
||||||
return JSON.stringify(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,4 @@ export class SimpleGamesystem extends Gamesystem<SimpleState, SimpleTransition>
|
|||||||
|
|
||||||
return updated;
|
return updated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,4 @@ export class ScriptAccount extends ModelComponent{
|
|||||||
constructor(componentName: string, componentDescription: string) {
|
constructor(componentName: string, componentDescription: string) {
|
||||||
super(componentName, componentDescription, ModelComponentType.SCRIPTACCOUNT);
|
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