diff --git a/src/content-library/content-library.ts b/src/content-library/content-library.ts new file mode 100644 index 0000000..583dfe7 --- /dev/null +++ b/src/content-library/content-library.ts @@ -0,0 +1,34 @@ +import type Activity from '../content-types/activity'; +import Article from '../content-types/article'; +import ContentLoader from './content-loader'; + +class ContentLibrary { + loader: ContentLoader; + articles: Map = new Map(); + activities: Map = new Map(); + + getArticle(id: string) { + return this.articles.get(id); + } + + getActivity(id: string) { + return this.activities.get(id); + } + + async initialize() { + const articles = await this.loader.loadArticles(); + articles.forEach((article) => { + this.articles.set(article.id, article); + }); + const activities = await this.loader.loadActivities(); + activities.forEach((activity) => { + this.activities.set(activity.id, activity); + }); + } + + constructor() { + this.loader = new ContentLoader(); + } +} + +export default ContentLibrary; diff --git a/src/content-library/content-loader.ts b/src/content-library/content-loader.ts new file mode 100644 index 0000000..13f1815 --- /dev/null +++ b/src/content-library/content-loader.ts @@ -0,0 +1,32 @@ +import Activity from '../content-types/activity'; +import Article from '../content-types/article'; +const loadedActivities = import.meta.glob('../content/activities/*', { eager: true }); +const loadedArticles = import.meta.glob('../content/articles/*', { eager: true }); +import.meta.glob('../scripts/*', { eager: true }); + +class ContentLoader { + async loadArticles(): Promise { + const articles: Article[] = []; + Object.entries(loadedArticles).forEach(([, definition]) => { + const article = (definition as Record).default; + articles.push(article); + }); + return articles; + } + + async loadActivities(): Promise { + const activities: Activity[] = []; + for (let i = 0; i < Object.entries(loadedActivities).length; i++) { + const module: [string, unknown] = Object.entries(loadedActivities)[i]; + const rawActivity = (module[1] as Record).default; + const importedScript = await import(rawActivity.scriptPath as string); + rawActivity.apply = importedScript.default; + activities.push(rawActivity); + } + return activities; + } + + constructor() {} +} + +export default ContentLoader; diff --git a/src/content-types/activity.ts b/src/content-types/activity.ts index d39650b..2b35713 100644 --- a/src/content-types/activity.ts +++ b/src/content-types/activity.ts @@ -1,16 +1,16 @@ import BaseContentType from './base-content'; -import UIData from './ui-data'; // An activity is a way for players to spend time in between each month of gameplay. // e.g. leisure, studying, working class Activity extends BaseContentType { // Run any state changing effects of the activity. - apply: (/* player */) => void; + apply: (/* player */) => void = () => { + console.log('warning: apply not set on activity with id ' + this.id); + return; + }; - constructor(id: string, uiData: UIData, applyFunction: () => void) { - super(id, uiData); - this.apply = applyFunction; - } + // for deserialization purposes + scriptPath: string = ''; } export default Activity; diff --git a/src/content/activities/test-activity.json b/src/content/activities/test-activity.json new file mode 100644 index 0000000..672325c --- /dev/null +++ b/src/content/activities/test-activity.json @@ -0,0 +1,8 @@ +{ + "id": "test-activity", + "scriptPath": "../scripts/test-activity", + "uiData": { + "description": "an activity for testing", + "name": "test activity" + } +} \ No newline at end of file diff --git a/src/content/articles/test-article.json b/src/content/articles/test-article.json new file mode 100644 index 0000000..cda0bd0 --- /dev/null +++ b/src/content/articles/test-article.json @@ -0,0 +1,7 @@ +{ + "id": "test-article", + "uiData": { + "description": "an article for testing", + "name": "test article" + } +} \ No newline at end of file diff --git a/src/scripts/test-activity.ts b/src/scripts/test-activity.ts new file mode 100644 index 0000000..d039642 --- /dev/null +++ b/src/scripts/test-activity.ts @@ -0,0 +1,5 @@ +const testFunction = function () { + console.log('test successful'); +}; + +export default testFunction;