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