From ed2f28760e6c922d179d5cfd8a52b7b3a71c7f76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Wed, 20 Mar 2024 11:19:32 +0100 Subject: [PATCH] Refactor Gamesystem parsing --- app/storage/loader/GameModelLoader.js | 5 +- app/storage/loader/GameModelLoader.ts | 5 +- app/storage/loader/GamesystemLoader.ts | 44 ++++++++++++++ .../gamesystemParser/GamesystemParser.ts | 60 +++++++++++++++++++ .../ParsedParentGamesystems.ts | 12 ++++ src/app/project/project.service.ts | 12 ++++ .../gamesystems/ParentTestSystem/Numbers.json | 32 ---------- .../ParentTestSystem/ParentTestSystem.json | 4 -- .../Weathersystem/Weathersystem.json | 10 +++- 9 files changed, 145 insertions(+), 39 deletions(-) create mode 100644 app/storage/loader/GamesystemLoader.ts create mode 100644 src/app/project/parser/gamesystemParser/GamesystemParser.ts create mode 100644 src/app/project/parser/gamesystemParser/ParsedParentGamesystems.ts delete mode 100644 testModel/gamesystems/ParentTestSystem/Numbers.json delete mode 100644 testModel/gamesystems/ParentTestSystem/ParentTestSystem.json diff --git a/app/storage/loader/GameModelLoader.js b/app/storage/loader/GameModelLoader.js index 33c28fb..a705ac9 100644 --- a/app/storage/loader/GameModelLoader.js +++ b/app/storage/loader/GameModelLoader.js @@ -5,6 +5,7 @@ const StoredGameModel_1 = require("../StoredGameModel"); const path = require("node:path"); const ModelComponentFileDirectory_1 = require("../ModelComponentFileDirectory"); const ScriptAccountLoader_1 = require("./ScriptAccountLoader"); +const GamesystemLoader_1 = require("./GamesystemLoader"); class GameModelLoader { constructor(gameModelDir) { this.gameModelDir = gameModelDir; @@ -25,7 +26,9 @@ class GameModelLoader { return scriptAccountLoader.loadScriptAccounts(); } loadGamesystems() { - return []; + const gamesystemDir = path.join(this.gameModelDir, ModelComponentFileDirectory_1.ModelComponentFileDirectory.GAMESYSTEM_DIR_NAME); + const gamesystemLoader = new GamesystemLoader_1.GamesystemLoader(gamesystemDir); + return gamesystemLoader.loadGamesystems(); } } exports.GameModelLoader = GameModelLoader; diff --git a/app/storage/loader/GameModelLoader.ts b/app/storage/loader/GameModelLoader.ts index b077721..d9edfb3 100644 --- a/app/storage/loader/GameModelLoader.ts +++ b/app/storage/loader/GameModelLoader.ts @@ -4,6 +4,7 @@ import * as path from "node:path"; import * as fs from "fs"; import {ModelComponentFileDirectory} from "../ModelComponentFileDirectory"; import {ScriptAccountLoader} from "./ScriptAccountLoader"; +import {GamesystemLoader} from "./GamesystemLoader"; export class GameModelLoader { gameModelDir: string @@ -33,7 +34,9 @@ export class GameModelLoader { } private loadGamesystems(): StoreComponent[] { - return [] + const gamesystemDir = path.join(this.gameModelDir, ModelComponentFileDirectory.GAMESYSTEM_DIR_NAME); + const gamesystemLoader = new GamesystemLoader(gamesystemDir); + return gamesystemLoader.loadGamesystems(); } diff --git a/app/storage/loader/GamesystemLoader.ts b/app/storage/loader/GamesystemLoader.ts new file mode 100644 index 0000000..8ade2ca --- /dev/null +++ b/app/storage/loader/GamesystemLoader.ts @@ -0,0 +1,44 @@ +import {StoreComponent} from "../StoreComponent"; +import {FileUtils} from "../FileUtils"; +import * as fs from "fs"; +import * as path from "node:path"; +import {ModelComponentType} from "../../../src/app/project/game-model/ModelComponentType"; + +export class GamesystemLoader { + + gamesystemDir: string + + + constructor(gamesystemDir: string) { + this.gamesystemDir = gamesystemDir; + } + + loadGamesystems() { + return this.loadGamesystemsRecursivly(this.gamesystemDir) + } + + private loadGamesystemsRecursivly(currentGamesystemDir: string) { + let loadedGamesystems: StoreComponent[] = [] + const gamesystemFiles = FileUtils.listFilesInDirectory(currentGamesystemDir); + gamesystemFiles.forEach(gamesystemFile => { + if(fs.lstatSync(gamesystemFile).isDirectory()) { + const childGamesystems = this.loadGamesystemsRecursivly(gamesystemFile); + loadedGamesystems = loadedGamesystems.concat(childGamesystems); + } else if(path.basename(gamesystemFile).endsWith(".json")) { + const loadedGamesystem = this.loadGamesystem(gamesystemFile); + if(loadedGamesystem != undefined) { + loadedGamesystems.push(loadedGamesystem); + } + } + }) + + return loadedGamesystems; + } + + private loadGamesystem(gamesystemFile: string) { + if(gamesystemFile.endsWith(".json")) { + const gamesystemData = fs.readFileSync(gamesystemFile, 'utf-8'); + return new StoreComponent(gamesystemData, gamesystemFile, ModelComponentType.GAMESYTEM); + } + } +} diff --git a/src/app/project/parser/gamesystemParser/GamesystemParser.ts b/src/app/project/parser/gamesystemParser/GamesystemParser.ts new file mode 100644 index 0000000..af65bc3 --- /dev/null +++ b/src/app/project/parser/gamesystemParser/GamesystemParser.ts @@ -0,0 +1,60 @@ +import {StoreComponent} from "../../../../../app/storage/StoreComponent"; +import {Gamesystem} from "../../game-model/gamesystems/Gamesystem"; +import {ParsedParentGamesystems} from "./ParsedParentGamesystems"; +import {ProductGamesystem} from "../../game-model/gamesystems/ProductGamesystem"; +import {SimpleGamesystem} from "../../game-model/gamesystems/SimpleGamesystem"; + +export class GamesystemParser { + + parsedParentGamesystems: ParsedParentGamesystems[] = [] + parsedGamesystems: Gamesystem[] = [] + public parseGamesystem(storedGamesystem: StoreComponent) { + const parsedGamesystemData = JSON.parse(storedGamesystem.jsonString) + let parsedSystem: Gamesystem + if(parsedGamesystemData.childsystems != undefined) { + parsedSystem = this.parseProductGamesystem(parsedGamesystemData) + } else { + parsedSystem = this.parseSimpleGamesystem(parsedGamesystemData) + } + this.parsedGamesystems.push(parsedSystem); + } + + parseSimpleGamesystem(gamesystemData: any): SimpleGamesystem { + const simpleGamesystem = new SimpleGamesystem(gamesystemData.componentName, gamesystemData.componentDescription) + + return simpleGamesystem + } + + parseProductGamesystem(gamesystemData: any) { + const productGamesystem = new ProductGamesystem(gamesystemData.componentName, gamesystemData.componentDescription); + const childsystemNames: string[] = [] + for(let i=0; i[] { + const topGamesystems: Gamesystem[] = [] + this.parsedGamesystems.forEach(parsedGamesystem => { + const searchedParentsystem = this.findParentsystem(parsedGamesystem.componentName) + if(searchedParentsystem != undefined) { + searchedParentsystem.addChildGamesystem(parsedGamesystem) + } else { + topGamesystems.push(parsedGamesystem) + } + }) + return topGamesystems + } + + findParentsystem(childsystemName: string) { + for(let i=0; i { switch (storedComponent.componentType) { case ModelComponentType.SCRIPTACCOUNT: { const scriptAccount = ScriptAccountParser.parseScriptAccount(storedComponent); gameModel.addScriptAccount(scriptAccount); + } break + case ModelComponentType.GAMESYTEM: { + gamesystemParser.parseGamesystem(storedComponent); } } }) + + gamesystemParser.computeGamesystemStructure().forEach(topGamesystem => { + gameModel.addGamesystem(topGamesystem) + }) + + console.log(gameModel) this.gameModel = gameModel; } diff --git a/testModel/gamesystems/ParentTestSystem/Numbers.json b/testModel/gamesystems/ParentTestSystem/Numbers.json deleted file mode 100644 index 546a507..0000000 --- a/testModel/gamesystems/ParentTestSystem/Numbers.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "componentName": "Numbers", - "componentDescription": "", - "states": [ - { - "initial": false, - "conditions": [], - "stateLabel": "1", - "stateDescription": "" - }, - { - "initial": false, - "conditions": [ - { - "scriptAccount": "Luftfeuchtigkeit", - "minValue": 0, - "maxValue": "5" - } - ], - "stateLabel": "2", - "stateDescription": "" - } - ], - "transitions": [ - { - "scriptAccountActions": [], - "scriptAccountConditions": [], - "startingState": "1", - "endingState": "2" - } - ] -} \ No newline at end of file diff --git a/testModel/gamesystems/ParentTestSystem/ParentTestSystem.json b/testModel/gamesystems/ParentTestSystem/ParentTestSystem.json deleted file mode 100644 index 0572a4c..0000000 --- a/testModel/gamesystems/ParentTestSystem/ParentTestSystem.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "componentName": "ParentTestSystem", - "componentDescription": "" -} \ No newline at end of file diff --git a/testModel/gamesystems/Weathersystem/Weathersystem.json b/testModel/gamesystems/Weathersystem/Weathersystem.json index 4a0733a..47d644a 100644 --- a/testModel/gamesystems/Weathersystem/Weathersystem.json +++ b/testModel/gamesystems/Weathersystem/Weathersystem.json @@ -1,4 +1,12 @@ { "componentName": "Weathersystem", - "componentDescription": "Ein Wettersystem, dass sich aus normalem Wetter (Sonne, Regen, Wolke, Schnee, Sturm etc.) und zusätzlich den Jahreszeiten (Frühling, Sommer, Herbst, Winter, etc.) zusammensetzt." + "componentDescription": "Ein Wettersystem, dass sich aus normalem Wetter (Sonne, Regen, Wolke, Schnee, Sturm etc.) und zusätzlich den Jahreszeiten (Frühling, Sommer, Herbst, Winter, etc.) zusammensetzt.", + "childsystems": [ + { + "componentName": "Season" + }, + { + "componentName": "Weather" + } + ] } \ No newline at end of file