From 8085b07264a669b5d9c365c71c492c053ebf803a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 20 Apr 2024 10:55:50 +0200 Subject: [PATCH] Load Items --- app/storage/loader/GameModelLoader.js | 9 ++- app/storage/loader/GameModelLoader.ts | 12 ++-- app/storage/loader/ItemLoader.js | 31 +++++++++ app/storage/loader/ItemLoader.ts | 33 ++++++++++ app/storage/storing/ItemStorage.js | 31 +++++++++ src/app/app.component.ts | 3 + src/app/project/game-model/GameModel.ts | 3 - src/app/project/parser/ItemParser.ts | 85 +++++++++++++++++++++++++ testModel/items/Item 1.json | 55 ++++++++++++++++ testModel/items/Item 2.json | 55 ++++++++++++++++ 10 files changed, 309 insertions(+), 8 deletions(-) create mode 100644 app/storage/loader/ItemLoader.js create mode 100644 app/storage/loader/ItemLoader.ts create mode 100644 app/storage/storing/ItemStorage.js create mode 100644 src/app/project/parser/ItemParser.ts create mode 100644 testModel/items/Item 1.json create mode 100644 testModel/items/Item 2.json diff --git a/app/storage/loader/GameModelLoader.js b/app/storage/loader/GameModelLoader.js index d78f3b3..5431d73 100644 --- a/app/storage/loader/GameModelLoader.js +++ b/app/storage/loader/GameModelLoader.js @@ -7,6 +7,7 @@ const ModelComponentFileDirectory_1 = require("../ModelComponentFileDirectory"); const ScriptAccountLoader_1 = require("./ScriptAccountLoader"); const GamesystemLoader_1 = require("./GamesystemLoader"); const CharacterLoader_1 = require("./CharacterLoader"); +const ItemLoader_1 = require("./ItemLoader"); class GameModelLoader { constructor(gameModelDir) { this.gameModelDir = gameModelDir; @@ -16,7 +17,8 @@ class GameModelLoader { const storedScriptAccounts = this.loadScriptAccountComponents(); const storedGamesystems = this.loadGamesystems(); const storedCharacters = this.loadCharacters(); - return new StoredGameModel_1.StoredGameModel(gameModelName, storedScriptAccounts, storedGamesystems, storedCharacters, []); + const storedItems = this.loadItems(); + return new StoredGameModel_1.StoredGameModel(gameModelName, storedScriptAccounts, storedGamesystems, storedCharacters, storedItems); } loadScriptAccountComponents() { const scriptAccountDir = path.join(this.gameModelDir, ModelComponentFileDirectory_1.ModelComponentFileDirectory.SCRIPTACCOUNT_DIR_NAME); @@ -33,6 +35,11 @@ class GameModelLoader { const characterLoader = new CharacterLoader_1.CharacterLoader(characterDir); return characterLoader.loadCharacters(); } + loadItems() { + const itemDir = path.join(this.gameModelDir, ModelComponentFileDirectory_1.ModelComponentFileDirectory.ITEM_DIR_NAME); + const itemLoader = new ItemLoader_1.ItemLoader(itemDir); + return itemLoader.loadItems(); + } } exports.GameModelLoader = GameModelLoader; //# sourceMappingURL=GameModelLoader.js.map \ No newline at end of file diff --git a/app/storage/loader/GameModelLoader.ts b/app/storage/loader/GameModelLoader.ts index fffebef..14dc146 100644 --- a/app/storage/loader/GameModelLoader.ts +++ b/app/storage/loader/GameModelLoader.ts @@ -6,6 +6,7 @@ import {ModelComponentFileDirectory} from "../ModelComponentFileDirectory"; import {ScriptAccountLoader} from "./ScriptAccountLoader"; import {GamesystemLoader} from "./GamesystemLoader"; import {CharacterLoader} from "./CharacterLoader"; +import {ItemLoader} from "./ItemLoader"; export class GameModelLoader { gameModelDir: string @@ -21,8 +22,9 @@ export class GameModelLoader { const storedScriptAccounts = this.loadScriptAccountComponents(); const storedGamesystems = this.loadGamesystems(); const storedCharacters = this.loadCharacters() + const storedItems = this.loadItems(); - return new StoredGameModel(gameModelName, storedScriptAccounts, storedGamesystems, storedCharacters, []); + return new StoredGameModel(gameModelName, storedScriptAccounts, storedGamesystems, storedCharacters, storedItems); } private loadScriptAccountComponents() { @@ -44,7 +46,9 @@ export class GameModelLoader { } - - - + private loadItems(): StoreComponent[] { + const itemDir = path.join(this.gameModelDir, ModelComponentFileDirectory.ITEM_DIR_NAME); + const itemLoader = new ItemLoader(itemDir) + return itemLoader.loadItems(); + } } diff --git a/app/storage/loader/ItemLoader.js b/app/storage/loader/ItemLoader.js new file mode 100644 index 0000000..7536397 --- /dev/null +++ b/app/storage/loader/ItemLoader.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ItemLoader = void 0; +const fs = require("node:fs"); +const StoreComponent_1 = require("../StoreComponent"); +const ModelComponentType_1 = require("../../../src/app/project/game-model/ModelComponentType"); +const FileUtils_1 = require("../FileUtils"); +class ItemLoader { + constructor(itemDir) { + this.itemDir = itemDir; + } + loadItems() { + const itemFiles = FileUtils_1.FileUtils.listFilesInDirectory(this.itemDir); + const loadedItems = []; + itemFiles.forEach(itemFile => { + const loadedItem = this.loadItem(itemFile); + if (loadedItem != undefined) { + loadedItems.push(loadedItem); + } + }); + return loadedItems; + } + loadItem(itemFile) { + if (itemFile.endsWith(".json")) { + const itemData = fs.readFileSync(itemFile, 'utf-8'); + return new StoreComponent_1.StoreComponent(itemData, itemFile, ModelComponentType_1.ModelComponentType.ITEM); + } + } +} +exports.ItemLoader = ItemLoader; +//# sourceMappingURL=ItemLoader.js.map \ No newline at end of file diff --git a/app/storage/loader/ItemLoader.ts b/app/storage/loader/ItemLoader.ts new file mode 100644 index 0000000..aca7a9c --- /dev/null +++ b/app/storage/loader/ItemLoader.ts @@ -0,0 +1,33 @@ +import * as fs from "node:fs"; +import {StoreComponent} from "../StoreComponent"; +import {ModelComponentType} from "../../../src/app/project/game-model/ModelComponentType"; +import {FileUtils} from "../FileUtils"; + +export class ItemLoader { + private itemDir: string + + + constructor(itemDir: string) { + this.itemDir = itemDir; + } + + loadItems() { + const itemFiles = FileUtils.listFilesInDirectory(this.itemDir); + const loadedItems :StoreComponent[] = [] + itemFiles.forEach(itemFile => { + const loadedItem = this.loadItem(itemFile); + if(loadedItem != undefined) { + loadedItems.push(loadedItem); + } + }) + + return loadedItems; + } + + private loadItem(itemFile: string) { + if(itemFile.endsWith(".json")) { + const itemData = fs.readFileSync(itemFile, 'utf-8'); + return new StoreComponent(itemData, itemFile, ModelComponentType.ITEM) + } + } +} diff --git a/app/storage/storing/ItemStorage.js b/app/storage/storing/ItemStorage.js new file mode 100644 index 0000000..00aa1db --- /dev/null +++ b/app/storage/storing/ItemStorage.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ItemStorage = void 0; +const FileUtils_1 = require("../FileUtils"); +const path = require("node:path"); +const fs = require("node:fs"); +class ItemStorage { + constructor(itemDir) { + this.itemDir = itemDir; + FileUtils_1.FileUtils.prepareDirectoryFroWriting(this.itemDir); + } + storeItem(storedItems) { + this.persistDeletedItems(storedItems); + storedItems.forEach(item => this.storeSingleItem(item)); + } + persistDeletedItems(existingItems) { + const itemFiles = FileUtils_1.FileUtils.listFilesInDirectory(this.itemDir); + itemFiles.forEach(itemFile => { + const itemFileName = path.parse(path.basename(itemFile)).name; + if (existingItems.find(item => item.fileName === itemFileName) == undefined) { + fs.unlinkSync(itemFile); + } + }); + } + storeSingleItem(item) { + const completeItemFile = path.join(this.itemDir, item.fileName + ".json"); + fs.writeFileSync(completeItemFile, item.jsonString, 'utf-8'); + } +} +exports.ItemStorage = ItemStorage; +//# sourceMappingURL=ItemStorage.js.map \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts index e09a487..64992c3 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -28,6 +28,7 @@ import {TemplateType} from "./project/game-model/templates/TemplateType"; import {TemplateTypeUtilities} from "./project/game-model/templates/TemplateTypeUtilities"; import {SimpleTemplateGamesystem} from "./project/game-model/templates/simpleGamesystem/SimpleTemplateGamesystem"; import {ItemSerializer} from "./project/serializer/ItemSerializer"; +import {ItemParser} from "./project/parser/ItemParser"; @Component({ selector: 'app-root', @@ -224,6 +225,8 @@ export class AppComponent implements OnInit{ const characterParser = new CharacterParser(characterTemplateSystems, characterRelationTemplateSystems, gameModel.scriptAccounts); gameModel.characters = characterParser.parseCharacters(storedGameModel.storedCharacters) + gameModel.inventoryItems = ItemParser.parseItems(storedGameModel.storedItems) + this.gameModel = gameModel; } diff --git a/src/app/project/game-model/GameModel.ts b/src/app/project/game-model/GameModel.ts index 3c4030d..4ba59a8 100644 --- a/src/app/project/game-model/GameModel.ts +++ b/src/app/project/game-model/GameModel.ts @@ -23,9 +23,6 @@ export class GameModel { constructor(gameModelName: string) { this.gameModelName = gameModelName; - - this.createInventoryItem("Item 1") - this.createInventoryItem("Item 2") } addGamesystem(gamesystem: Gamesystem) { diff --git a/src/app/project/parser/ItemParser.ts b/src/app/project/parser/ItemParser.ts new file mode 100644 index 0000000..f6f1bf6 --- /dev/null +++ b/src/app/project/parser/ItemParser.ts @@ -0,0 +1,85 @@ +import {StoreComponent} from "../../../../app/storage/StoreComponent"; +import {Item} from "../game-model/inventory/Item"; +import {ItemQuality} from "../game-model/inventory/ItemQuality"; +import {ItemProperty} from "../game-model/inventory/ItemProperty"; +import {ItemPropertyDescription} from "../game-model/inventory/ItemPropertyDescription"; +import {ModelComponentType} from "../game-model/ModelComponentType"; + +export class ItemParser { + + public static parseItems(items: StoreComponent[]): Item[] { + const parsedItems: Item[] = [] + items.forEach(item => parsedItems.push(this.parseSingleItem(JSON.parse(item.jsonString)))); + return parsedItems; + } + + private static parseSingleItem(itemData: any): Item { + const componentName = itemData.componentName; + const componentDescription = itemData.componentDescription; + + const perQualityProperties = this.parseQualityPropertyReferences(itemData.perQualityProperties); + const qualties = this.parseQualities(itemData.possible_qualities, perQualityProperties) + const itemProperties = this.parseItemProperties(itemData.itemProperties) + + const item = new Item(componentName, componentDescription, ModelComponentType.ITEM); + item.possible_qualities = qualties; + item.itemProperties = itemProperties; + item.perQualityProperties = perQualityProperties; + + return item; + } + + private static parseItemProperties(propertyData: any): ItemProperty[] { + const itemProperties : ItemProperty[] = [] + for(let i=0; i property.propertyName === propertyName); + } + + private static parseQualityPropertyReferences(qualityPropertyData: any): ItemPropertyDescription[] { + const result: ItemPropertyDescription[] = [] + for(let i=0; i