diff --git a/client/src/services/Campaign.js b/client/src/services/Campaign.js
index 7ade2100..a867db3d 100644
--- a/client/src/services/Campaign.js
+++ b/client/src/services/Campaign.js
@@ -60,6 +60,10 @@ function _UpdatePlayers(data){
});
}
+function GetCampaignModuleName(){
+ return GetCampaign().system;
+}
+
export {
_currentCampaign,
_currentPlayer,
@@ -68,5 +72,6 @@ export {
ConnectToCampaign,
DisplayCampaign,
UpdateCampaignData,
+ GetCampaignModuleName,
Disconnect
}
\ No newline at end of file
diff --git a/client/src/services/Modules.js b/client/src/services/Modules.js
index 31fb1500..a1618f6b 100644
--- a/client/src/services/Modules.js
+++ b/client/src/services/Modules.js
@@ -24,8 +24,13 @@ function GetModule(id){
return module;
}
+function CreateModule(moduleInfo, registeredWindows){
+
+}
+
export {
ImportModule,
+ CreateModule,
GetModules,
GetModule,
GetModulesToLoad,
diff --git a/client/src/services/Windows.js b/client/src/services/Windows.js
index 5c9390dc..285a94ee 100644
--- a/client/src/services/Windows.js
+++ b/client/src/services/Windows.js
@@ -1,7 +1,71 @@
import { reactive, ref } from 'vue'
import { Disconnect } from './Campaign';
-const windows = ref([])
+const windows = ref([]);
+
+import LoginWindow from '@/views/windows/LoginWindow.vue'
+import RegisterWindow from '@/views/windows/RegisterWindow.vue'
+import ExampleWindow from '@/views/windows/ExampleWindow.vue'
+import MainMenuWindow from '@/views/windows/MainMenuWindow.vue'
+import EditProfileWindow from '@/views/windows/EditProfileWindow.vue'
+import SettingsWindow from '@/views/windows/SettingsWindow.vue'
+import CampaignListWindow from '@/views/windows/campaigns/CampaignListWindow.vue'
+import NewCampaignWindow from '@/views/windows/campaigns/NewCampaignWindow.vue'
+import JoinCampaignWindow from '@/views/windows/campaigns/JoinCampaignWindow.vue'
+import CampaignPreviewWindow from '@/views/windows/campaigns/CampaignPreviewWindow.vue'
+import ChatWindow from '@/views/windows/game/ChatWindow.vue'
+import DiceWindow from '@/views/windows/game/DiceWindow.vue'
+import MapButtons from '@/views/windows/dm/MapButtons.vue'
+import EnvironmentWindow from '@/views/windows/dm/EnvironmentWindow.vue'
+import SystemSelectorWindow from '@/views/windows/campaigns/SystemSelectorWindow.vue'
+import MapWindow from '@/views/windows/dm/MapWindow.vue'
+import CombatWindow from '@/views/windows/game/CombatWindow.vue'
+import EntityWindow from '@/views/windows/dm/EntityWindow.vue'
+import CharactersWindow from '@/views/windows/game/CharactersWindow.vue'
+import WelcomeWindow from '@/views/windows/WelcomeWindow.vue'
+import CompendiumWindow from '@/views/windows/CompendiumWindow.vue'
+import BookAnvilWindow from '@/views/windows/BookAnvilWindow.vue'
+import IconSelectorWindow from '@/views/windows/selectors/IconSelectorWindow.vue'
+import DatabaseWindow from '@/views/windows/game/DatabaseWindow.vue'
+import AccountManagementWindow from '@/views/windows/settings/AccountManagementWindow.vue'
+import PluginManagementWindow from '@/views/windows/settings/PluginManagementWindow.vue'
+
+let windowMap = {
+ test: ExampleWindow,
+ login: LoginWindow,
+ main_menu: MainMenuWindow,
+ welcome: WelcomeWindow,
+ register: RegisterWindow,
+ edit_profile: EditProfileWindow,
+ settings: SettingsWindow,
+ campaign_list: CampaignListWindow,
+ new_campaign: NewCampaignWindow,
+ join_campaign: JoinCampaignWindow,
+ campaign_preview: CampaignPreviewWindow,
+ chat: ChatWindow,
+ dice_menu: DiceWindow,
+ map_buttons: MapButtons,
+ environment: EnvironmentWindow,
+ system_selector: SystemSelectorWindow,
+ map_window: MapWindow,
+ combat_window: CombatWindow,
+ entity_window: EntityWindow,
+ characters_window: CharactersWindow,
+ compendium_window: CompendiumWindow,
+ book_anvil_window: BookAnvilWindow,
+ icon_selector: IconSelectorWindow,
+ database: DatabaseWindow,
+ plugin_management: PluginManagementWindow,
+ account_management: AccountManagementWindow
+};
+
+async function InjectWindow(plugin, window_type, window_component){
+ let systemWidows = {};
+ systemWidows[plugin + "/" + window_type] = (await import(`../../plugins/${plugin}/views/${window_component}.vue`)).default;
+ windowMap = {...windowMap, ...systemWidows};
+
+ console.log("Window injected");
+}
// Presets
const defValues = {
@@ -119,11 +183,6 @@ const defValues = {
title: "Compendium",
close: () => ClearWindow('compendium_window')
},
- 'character_sheet': {
- id: 'character_sheet',
- title: 'Character Sheet',
- close: () => ClearWindow('character_sheet')
- },
'book_anvil_window': {
id: 'book_anvil_window',
title: "Book Anvil",
@@ -147,6 +206,7 @@ const reload = ref(0);
let ReloadRef = () => { return reload };
let Windows = () => { return windows };
+let WindowMap = () => { return windowMap };
let currentIndex = 10;
@@ -403,6 +463,8 @@ export {
SetPosition,
ResetPosition,
Windows,
+ WindowMap,
+ InjectWindow,
ReloadRef,
ClearWindows,
CreateWindow,
diff --git a/client/src/views/managers/WindowManager.vue b/client/src/views/managers/WindowManager.vue
index 84a5b5f0..33c89fcd 100644
--- a/client/src/views/managers/WindowManager.vue
+++ b/client/src/views/managers/WindowManager.vue
@@ -1,88 +1,17 @@
-
+
diff --git a/client/src/views/windows/game/CharactersWindow.vue b/client/src/views/windows/game/CharactersWindow.vue
index 7233451f..f0f70668 100644
--- a/client/src/views/windows/game/CharactersWindow.vue
+++ b/client/src/views/windows/game/CharactersWindow.vue
@@ -4,7 +4,8 @@ import WindowHandle from '@/views/partials/WindowHandle.vue';
import { onMounted, ref } from 'vue';
import { SetupHandle, SetSize, ResetPosition } from '@/services/Windows';
import GameEntry from '../../partials/GameEntry.vue';
-import { CreateWindow, SetMinSize, SetMaxSize, SetResizable } from '../../../services/Windows';
+import { CreateWindow, SetMinSize, SetMaxSize, SetResizable, ClearWindow } from '../../../services/Windows';
+import { GetCampaignModuleName } from '../../../services/Campaign';
const props = defineProps(['data']);
const data = props.data;
@@ -24,7 +25,11 @@ onMounted(() => {
// temp
function openCharacterSheet(){
- CreateWindow('character_sheet');
+ CreateWindow(`${GetCampaignModuleName()}/character_sheet`, {
+ id: 'character_sheet',
+ title: 'Character Sheet',
+ close: () => ClearWindow(`character_sheet`)
+ });
}
diff --git a/client/src/views/windows/game/DatabaseWindow.vue b/client/src/views/windows/game/DatabaseWindow.vue
index d5d80ff0..f3ba58c8 100644
--- a/client/src/views/windows/game/DatabaseWindow.vue
+++ b/client/src/views/windows/game/DatabaseWindow.vue
@@ -7,6 +7,7 @@ import IconButton from '@/views/partials/game/IconButton.vue'
import ConceptList from '../../partials/ConceptList.vue';
import { FetchConcepts, GetConcepts } from '../../../services/Data';
import Tabs from '../../partials/Tabs.vue';
+import { GetCampaignModuleName } from '../../../services/Campaign';
const handle = ref(null);
@@ -33,12 +34,13 @@ onMounted(() => {
FetchConcepts();
});
function OpenCreateItemPrompt(){
- CreateWindow('create_item_prompt', {id: 'create_item_prompt', title: 'Create Item', close: () => ClearWindow('create_item_prompt')})
+ CreateWindow(`${GetCampaignModuleName()}/create_item_prompt`, {id: 'create_item_prompt', title: 'Create Item', close: () => ClearWindow('create_item_prompt')})
}
function OpenConcept(element){
- CreateWindow('item_sheet', {
+ console.log(`${GetCampaignModuleName()}/item_sheet`);
+ CreateWindow(`${GetCampaignModuleName()}/item_sheet`, {
id: 'item_sheet_' + element._id,
title: 'Edit Item',
item_id: element._id,
diff --git a/plugins/dnd-5e/client/main.js b/plugins/dnd-5e/client/main.js
index 1150c538..4b019c0a 100644
--- a/plugins/dnd-5e/client/main.js
+++ b/plugins/dnd-5e/client/main.js
@@ -4,6 +4,23 @@
function Main(Api){
console.log("Hello World!");
console.log(Api);
+
+ Api.Modules.CreateModule({
+ "id": "dnd-5e",
+ "title": "Dungeons & Dragons 5e",
+ "description": "Dungeons & Dragons Fifth edition game system support",
+ "authors": [
+ {
+ "name": "Aran Roig"
+ }
+ ],
+ "version": "1.0.0",
+ "color": "#e92026"
+ });
+
+ Api.Windows.InjectWindow('dnd-5e', 'character_sheet', 'CharacterSheet');
+ Api.Windows.InjectWindow('dnd-5e', 'item_sheet', 'ItemSheet');
+ Api.Windows.InjectWindow('dnd-5e', 'create_item_prompt', 'CreateItemPrompt');
}
export { Main };
\ No newline at end of file
diff --git a/prebuild.js b/prebuild.js
index fb4bcba2..90772d29 100755
--- a/prebuild.js
+++ b/prebuild.js
@@ -53,7 +53,6 @@ console.log("Generated " + iconCount + " icons");
// #region locales
const locales = fs.readdirSync("./locales");
-console.log(locales);
function deepMerge(obj1, obj2) {
for (let key in obj2) {
@@ -106,4 +105,5 @@ fs.writeFileSync(outputPath, JSON.stringify({
icons,
plugins
}, null, "\t"));
+console.log("Installed plugins")
// #endregion
\ No newline at end of file