@strixit/storyscript 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +1 -0
- package/CodeSnippets/StoryScriptSnippets.code-snippets +573 -0
- package/LICENSE.txt +21 -0
- package/LiveTemplates/StoryScript.xml +271 -0
- package/README.md +9 -2
- package/baseViteConfig.js +112 -0
- package/clientFiles/currentGameName.js +1 -0
- package/clientFiles/gitignore +12 -0
- package/clientFiles/tsconfig.json +34 -0
- package/clientFiles/vite.config.ts +14 -0
- package/clientFiles/vitest.config.ts +29 -0
- package/dist/src/Engine/Actions/index.d.ts +2 -0
- package/dist/src/Engine/Actions/open.d.ts +6 -0
- package/dist/src/Engine/Actions/openWithKey.d.ts +7 -0
- package/dist/src/Engine/EntityCreatorFunctions.d.ts +18 -0
- package/dist/src/Engine/Interfaces/action.d.ts +37 -0
- package/dist/src/Engine/Interfaces/autoplayStep.d.ts +11 -0
- package/dist/src/Engine/Interfaces/barrier.d.ts +16 -0
- package/dist/src/Engine/Interfaces/barrierAction.d.ts +19 -0
- package/dist/src/Engine/Interfaces/character.d.ts +48 -0
- package/dist/src/Engine/Interfaces/combatSetup.d.ts +9 -0
- package/dist/src/Engine/Interfaces/combatTurn.d.ts +37 -0
- package/dist/src/Engine/Interfaces/combatWinnings.d.ts +6 -0
- package/dist/src/Engine/Interfaces/combinations/activeCombination.d.ts +14 -0
- package/dist/src/Engine/Interfaces/combinations/combinable.d.ts +18 -0
- package/dist/src/Engine/Interfaces/combinations/combinationAction.d.ts +41 -0
- package/dist/src/Engine/Interfaces/combinations/combinationMatchResult.d.ts +14 -0
- package/dist/src/Engine/Interfaces/combinations/combinations.d.ts +17 -0
- package/dist/src/Engine/Interfaces/combinations/combine.d.ts +22 -0
- package/dist/src/Engine/Interfaces/combinations/combineResult.d.ts +18 -0
- package/dist/src/Engine/Interfaces/combinations/gameCombinations.d.ts +40 -0
- package/dist/src/Engine/Interfaces/compiledLocation.d.ts +33 -0
- package/dist/src/Engine/Interfaces/conversations/conversation.d.ts +44 -0
- package/dist/src/Engine/Interfaces/conversations/conversationLogEntry.d.ts +13 -0
- package/dist/src/Engine/Interfaces/conversations/conversationNode.d.ts +22 -0
- package/dist/src/Engine/Interfaces/conversations/conversationReply.d.ts +49 -0
- package/dist/src/Engine/Interfaces/createCharacter/createCharacter.d.ts +20 -0
- package/dist/src/Engine/Interfaces/createCharacter/createCharacterAttribute.d.ts +18 -0
- package/dist/src/Engine/Interfaces/createCharacter/createCharacterAttributeEntry.d.ts +18 -0
- package/dist/src/Engine/Interfaces/createCharacter/createCharacterQuestion.d.ts +18 -0
- package/dist/src/Engine/Interfaces/createCharacter/createCharacterQuestionEntry.d.ts +22 -0
- package/dist/src/Engine/Interfaces/createCharacter/createCharacterStep.d.ts +40 -0
- package/dist/src/Engine/Interfaces/customCursor.d.ts +8 -0
- package/dist/src/Engine/Interfaces/defaultEquipment.d.ts +19 -0
- package/dist/src/Engine/Interfaces/definitions.d.ts +40 -0
- package/dist/src/Engine/Interfaces/destination.d.ts +31 -0
- package/dist/src/Engine/Interfaces/dynamicStyle.d.ts +10 -0
- package/dist/src/Engine/Interfaces/enemy.d.ts +46 -0
- package/dist/src/Engine/Interfaces/enumerations/actionStatus.d.ts +18 -0
- package/dist/src/Engine/Interfaces/enumerations/actionType.d.ts +9 -0
- package/dist/src/Engine/Interfaces/enumerations/equipmentType.d.ts +51 -0
- package/dist/src/Engine/Interfaces/enumerations/gameState.d.ts +11 -0
- package/dist/src/Engine/Interfaces/enumerations/playState.d.ts +10 -0
- package/dist/src/Engine/Interfaces/enumerations/targetType.d.ts +9 -0
- package/dist/src/Engine/Interfaces/equipment.d.ts +43 -0
- package/dist/src/Engine/Interfaces/feature.d.ts +37 -0
- package/dist/src/Engine/Interfaces/featureCollection.d.ts +7 -0
- package/dist/src/Engine/Interfaces/game.d.ts +148 -0
- package/dist/src/Engine/Interfaces/gameEvents.d.ts +7 -0
- package/dist/src/Engine/Interfaces/groupableItem.d.ts +32 -0
- package/dist/src/Engine/Interfaces/helpers.d.ts +50 -0
- package/dist/src/Engine/Interfaces/index.d.ts +78 -0
- package/dist/src/Engine/Interfaces/interfaceTexts.d.ts +140 -0
- package/dist/src/Engine/Interfaces/item.d.ts +96 -0
- package/dist/src/Engine/Interfaces/key.d.ts +16 -0
- package/dist/src/Engine/Interfaces/location.d.ts +78 -0
- package/dist/src/Engine/Interfaces/maps/map.d.ts +45 -0
- package/dist/src/Engine/Interfaces/maps/mapLocation.d.ts +23 -0
- package/dist/src/Engine/Interfaces/party.d.ts +33 -0
- package/dist/src/Engine/Interfaces/person.d.ts +25 -0
- package/dist/src/Engine/Interfaces/quest.d.ts +51 -0
- package/dist/src/Engine/Interfaces/rules/characterRules.d.ts +84 -0
- package/dist/src/Engine/Interfaces/rules/combatRules.d.ts +46 -0
- package/dist/src/Engine/Interfaces/rules/combinationRules.d.ts +15 -0
- package/dist/src/Engine/Interfaces/rules/demoMode.d.ts +15 -0
- package/dist/src/Engine/Interfaces/rules/encounterRules.d.ts +4 -0
- package/dist/src/Engine/Interfaces/rules/explorationRules.d.ts +42 -0
- package/dist/src/Engine/Interfaces/rules/generalRules.d.ts +62 -0
- package/dist/src/Engine/Interfaces/rules/rules.d.ts +31 -0
- package/dist/src/Engine/Interfaces/rules/setupRules.d.ts +56 -0
- package/dist/src/Engine/Interfaces/rules/titleScreen.d.ts +16 -0
- package/dist/src/Engine/Interfaces/saveGame.d.ts +33 -0
- package/dist/src/Engine/Interfaces/scoreEntry.d.ts +13 -0
- package/dist/src/Engine/Interfaces/services/autoplayService.d.ts +19 -0
- package/dist/src/Engine/Interfaces/services/characterService.d.ts +17 -0
- package/dist/src/Engine/Interfaces/services/combatService.d.ts +26 -0
- package/dist/src/Engine/Interfaces/services/combinationService.d.ts +9 -0
- package/dist/src/Engine/Interfaces/services/commandService.d.ts +64 -0
- package/dist/src/Engine/Interfaces/services/conversationService.d.ts +5 -0
- package/dist/src/Engine/Interfaces/services/dataSerializer.d.ts +4 -0
- package/dist/src/Engine/Interfaces/services/dataService.d.ts +33 -0
- package/dist/src/Engine/Interfaces/services/dataSynchronizer.d.ts +3 -0
- package/dist/src/Engine/Interfaces/services/gameService.d.ts +10 -0
- package/dist/src/Engine/Interfaces/services/index.d.ts +16 -0
- package/dist/src/Engine/Interfaces/services/itemService.d.ts +14 -0
- package/dist/src/Engine/Interfaces/services/localStorageService.d.ts +6 -0
- package/dist/src/Engine/Interfaces/services/locationService.d.ts +8 -0
- package/dist/src/Engine/Interfaces/services/soundService.d.ts +5 -0
- package/dist/src/Engine/Interfaces/services/tradeService.d.ts +9 -0
- package/dist/src/Engine/Interfaces/soundPlayer.d.ts +30 -0
- package/dist/src/Engine/Interfaces/sprite.d.ts +23 -0
- package/dist/src/Engine/Interfaces/stateList.d.ts +9 -0
- package/dist/src/Engine/Interfaces/statistics.d.ts +13 -0
- package/dist/src/Engine/Interfaces/stock.d.ts +39 -0
- package/dist/src/Engine/Interfaces/trade.d.ts +62 -0
- package/dist/src/Engine/ServiceFactory.d.ts +52 -0
- package/dist/src/Engine/Services/AutoplayService.d.ts +11 -0
- package/dist/src/Engine/Services/CharacterService.d.ts +21 -0
- package/dist/src/Engine/Services/CombatService.d.ts +16 -0
- package/dist/src/Engine/Services/CombinationService.d.ts +15 -0
- package/dist/src/Engine/Services/CommandService.d.ts +24 -0
- package/dist/src/Engine/Services/ConversationService.d.ts +26 -0
- package/dist/src/Engine/Services/DataSerializer.d.ts +17 -0
- package/dist/src/Engine/Services/DataService.d.ts +16 -0
- package/dist/src/Engine/Services/DataSynchronizer.d.ts +12 -0
- package/dist/src/Engine/Services/GameService.d.ts +28 -0
- package/dist/src/Engine/Services/HelperService.d.ts +18 -0
- package/dist/src/Engine/Services/ItemService.d.ts +21 -0
- package/dist/src/Engine/Services/LocalStorageService.d.ts +7 -0
- package/dist/src/Engine/Services/LocationService.d.ts +25 -0
- package/dist/src/Engine/Services/SoundService.d.ts +13 -0
- package/dist/src/Engine/Services/TradeService.d.ts +17 -0
- package/dist/src/Engine/Services/index.d.ts +17 -0
- package/dist/src/Engine/Services/serializationData.d.ts +8 -0
- package/dist/src/Engine/Services/sharedFunctions.d.ts +21 -0
- package/dist/src/Engine/arrayAndFunctionExtensions.d.ts +3 -0
- package/dist/src/Engine/defaultTexts.d.ts +7 -0
- package/dist/src/Engine/gameEvents.d.ts +10 -0
- package/dist/src/Engine/index.d.ts +8 -0
- package/dist/src/Engine/stateProperties.d.ts +6 -0
- package/dist/src/Engine/utilityFunctions.d.ts +25 -0
- package/dist/src/UI/Composables/CustomCursor.d.ts +2 -0
- package/dist/src/UI/Composables/LocationMap.d.ts +26 -0
- package/dist/src/UI/Composables/Sound.d.ts +7 -0
- package/dist/src/UI/Composables/TextFeatures.d.ts +8 -0
- package/dist/src/UI/Composables/VisualFeatures.d.ts +7 -0
- package/dist/src/UI/Composables/index.d.ts +7 -0
- package/dist/src/UI/Composables/playStateWatch.d.ts +2 -0
- package/dist/src/UI/StateStore.d.ts +14256 -0
- package/dist/src/UI/error.d.ts +6 -0
- package/dist/src/UI/helpers.d.ts +3 -0
- package/dist/src/UI/index.d.ts +6 -0
- package/dist/src/UI/main.d.ts +1 -0
- package/dist/src/UI/startup.d.ts +2 -0
- package/dist/src/constants.d.ts +17 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/storyscript.css +9566 -0
- package/dist/storyscript.js +9659 -0
- package/dist/storyscript.js.map +1 -0
- package/dist/storyscript.mjs +9569 -0
- package/dist/storyscript.mjs.map +1 -0
- package/electron.cjs +44 -0
- package/index.html +14 -0
- package/package.json +118 -4
- package/scripts/cli.js +268 -0
- package/scripts/createAsset.js +117 -0
- package/scripts/createGame.js +40 -0
- package/scripts/helpers.js +21 -0
- package/scripts/postbuild.js +179 -0
- package/scripts/setupTesting.js +17 -0
- package/shims-vue.d.ts +1 -0
- package/src/Engine/Actions/index.ts +2 -0
- package/src/Engine/Actions/open.ts +12 -0
- package/src/Engine/Actions/openWithKey.ts +23 -0
- package/src/Engine/EntityCreatorFunctions.ts +602 -0
- package/src/Engine/Interfaces/action.ts +43 -0
- package/src/Engine/Interfaces/autoplayStep.ts +13 -0
- package/src/Engine/Interfaces/barrier.ts +18 -0
- package/src/Engine/Interfaces/barrierAction.ts +21 -0
- package/src/Engine/Interfaces/character.ts +58 -0
- package/src/Engine/Interfaces/combatSetup.ts +10 -0
- package/src/Engine/Interfaces/combatTurn.ts +45 -0
- package/src/Engine/Interfaces/combatWinnings.ts +7 -0
- package/src/Engine/Interfaces/combinations/activeCombination.ts +16 -0
- package/src/Engine/Interfaces/combinations/combinable.ts +21 -0
- package/src/Engine/Interfaces/combinations/combinationAction.ts +45 -0
- package/src/Engine/Interfaces/combinations/combinationMatchResult.ts +16 -0
- package/src/Engine/Interfaces/combinations/combinations.ts +19 -0
- package/src/Engine/Interfaces/combinations/combine.ts +25 -0
- package/src/Engine/Interfaces/combinations/combineResult.ts +21 -0
- package/src/Engine/Interfaces/combinations/gameCombinations.ts +48 -0
- package/src/Engine/Interfaces/compiledLocation.ts +37 -0
- package/src/Engine/Interfaces/conversations/conversation.ts +47 -0
- package/src/Engine/Interfaces/conversations/conversationLogEntry.ts +14 -0
- package/src/Engine/Interfaces/conversations/conversationNode.ts +26 -0
- package/src/Engine/Interfaces/conversations/conversationReply.ts +59 -0
- package/src/Engine/Interfaces/createCharacter/createCharacter.ts +23 -0
- package/src/Engine/Interfaces/createCharacter/createCharacterAttribute.ts +21 -0
- package/src/Engine/Interfaces/createCharacter/createCharacterAttributeEntry.ts +21 -0
- package/src/Engine/Interfaces/createCharacter/createCharacterQuestion.ts +21 -0
- package/src/Engine/Interfaces/createCharacter/createCharacterQuestionEntry.ts +25 -0
- package/src/Engine/Interfaces/createCharacter/createCharacterStep.ts +47 -0
- package/src/Engine/Interfaces/customCursor.ts +5 -0
- package/src/Engine/Interfaces/defaultEquipment.ts +32 -0
- package/src/Engine/Interfaces/definitions.ts +48 -0
- package/src/Engine/Interfaces/destination.ts +37 -0
- package/src/Engine/Interfaces/dynamicStyle.ts +11 -0
- package/src/Engine/Interfaces/enemy.ts +54 -0
- package/src/Engine/Interfaces/enumerations/actionStatus.ts +20 -0
- package/src/Engine/Interfaces/enumerations/actionType.ts +9 -0
- package/src/Engine/Interfaces/enumerations/equipmentType.ts +61 -0
- package/src/Engine/Interfaces/enumerations/gameState.ts +11 -0
- package/src/Engine/Interfaces/enumerations/playState.ts +10 -0
- package/src/Engine/Interfaces/enumerations/targetType.ts +9 -0
- package/src/Engine/Interfaces/equipment.ts +44 -0
- package/src/Engine/Interfaces/feature.ts +43 -0
- package/src/Engine/Interfaces/featureCollection.ts +8 -0
- package/src/Engine/Interfaces/game.ts +201 -0
- package/src/Engine/Interfaces/gameEvents.ts +11 -0
- package/src/Engine/Interfaces/groupableItem.ts +37 -0
- package/src/Engine/Interfaces/helpers.ts +55 -0
- package/src/Engine/Interfaces/index.ts +158 -0
- package/src/Engine/Interfaces/interfaceTexts.ts +142 -0
- package/src/Engine/Interfaces/item.ts +111 -0
- package/src/Engine/Interfaces/key.ts +18 -0
- package/src/Engine/Interfaces/location.ts +92 -0
- package/src/Engine/Interfaces/maps/map.ts +55 -0
- package/src/Engine/Interfaces/maps/mapLocation.ts +28 -0
- package/src/Engine/Interfaces/party.ts +40 -0
- package/src/Engine/Interfaces/person.ts +29 -0
- package/src/Engine/Interfaces/quest.ts +60 -0
- package/src/Engine/Interfaces/rules/characterRules.ts +96 -0
- package/src/Engine/Interfaces/rules/combatRules.ts +52 -0
- package/src/Engine/Interfaces/rules/combinationRules.ts +17 -0
- package/src/Engine/Interfaces/rules/demoMode.ts +18 -0
- package/src/Engine/Interfaces/rules/encounterRules.ts +5 -0
- package/src/Engine/Interfaces/rules/explorationRules.ts +47 -0
- package/src/Engine/Interfaces/rules/generalRules.ts +80 -0
- package/src/Engine/Interfaces/rules/rules.ts +46 -0
- package/src/Engine/Interfaces/rules/setupRules.ts +65 -0
- package/src/Engine/Interfaces/rules/titleScreen.ts +19 -0
- package/src/Engine/Interfaces/saveGame.ts +39 -0
- package/src/Engine/Interfaces/scoreEntry.ts +14 -0
- package/src/Engine/Interfaces/services/autoplayService.ts +23 -0
- package/src/Engine/Interfaces/services/characterService.ts +35 -0
- package/src/Engine/Interfaces/services/combatService.ts +30 -0
- package/src/Engine/Interfaces/services/combinationService.ts +10 -0
- package/src/Engine/Interfaces/services/commandService.ts +75 -0
- package/src/Engine/Interfaces/services/conversationService.ts +7 -0
- package/src/Engine/Interfaces/services/dataSerializer.ts +4 -0
- package/src/Engine/Interfaces/services/dataService.ts +39 -0
- package/src/Engine/Interfaces/services/dataSynchronizer.ts +9 -0
- package/src/Engine/Interfaces/services/gameService.ts +17 -0
- package/src/Engine/Interfaces/services/index.ts +33 -0
- package/src/Engine/Interfaces/services/itemService.ts +25 -0
- package/src/Engine/Interfaces/services/localStorageService.ts +6 -0
- package/src/Engine/Interfaces/services/locationService.ts +13 -0
- package/src/Engine/Interfaces/services/soundService.ts +7 -0
- package/src/Engine/Interfaces/services/tradeService.ts +15 -0
- package/src/Engine/Interfaces/soundPlayer.ts +30 -0
- package/src/Engine/Interfaces/sprite.ts +27 -0
- package/src/Engine/Interfaces/stateList.ts +13 -0
- package/src/Engine/Interfaces/statistics.ts +14 -0
- package/src/Engine/Interfaces/stock.ts +46 -0
- package/src/Engine/Interfaces/trade.ts +72 -0
- package/src/Engine/ServiceFactory.ts +167 -0
- package/src/Engine/Services/AutoplayService.ts +59 -0
- package/src/Engine/Services/CharacterService.ts +291 -0
- package/src/Engine/Services/CombatService.ts +266 -0
- package/src/Engine/Services/CombinationService.ts +197 -0
- package/src/Engine/Services/CommandService.ts +197 -0
- package/src/Engine/Services/ConversationService.ts +406 -0
- package/src/Engine/Services/DataSerializer.ts +326 -0
- package/src/Engine/Services/DataService.ts +93 -0
- package/src/Engine/Services/DataSynchronizer.ts +216 -0
- package/src/Engine/Services/GameService.ts +554 -0
- package/src/Engine/Services/HelperService.ts +94 -0
- package/src/Engine/Services/ItemService.ts +294 -0
- package/src/Engine/Services/LocalStorageService.ts +24 -0
- package/src/Engine/Services/LocationService.ts +380 -0
- package/src/Engine/Services/SoundService.ts +54 -0
- package/src/Engine/Services/TradeService.ts +176 -0
- package/src/Engine/Services/index.ts +17 -0
- package/src/Engine/Services/serializationData.ts +8 -0
- package/src/Engine/Services/sharedFunctions.ts +296 -0
- package/src/Engine/arrayAndFunctionExtensions.ts +269 -0
- package/src/Engine/defaultTexts.ts +162 -0
- package/src/Engine/gameEvents.ts +51 -0
- package/src/Engine/index.ts +9 -0
- package/src/Engine/stateProperties.ts +9 -0
- package/src/Engine/utilityFunctions.ts +238 -0
- package/src/Games/_GameTemplate/character.ts +31 -0
- package/src/Games/_GameTemplate/customTexts.ts +8 -0
- package/src/Games/_GameTemplate/interfaces/action.ts +5 -0
- package/src/Games/_GameTemplate/interfaces/combatSetup.ts +7 -0
- package/src/Games/_GameTemplate/interfaces/combatTurn.ts +8 -0
- package/src/Games/_GameTemplate/interfaces/destination.ts +5 -0
- package/src/Games/_GameTemplate/interfaces/enemy.ts +11 -0
- package/src/Games/_GameTemplate/interfaces/equipment.ts +5 -0
- package/src/Games/_GameTemplate/interfaces/feature.ts +9 -0
- package/src/Games/_GameTemplate/interfaces/game.ts +22 -0
- package/src/Games/_GameTemplate/interfaces/interfaceTexts.ts +5 -0
- package/src/Games/_GameTemplate/interfaces/item.ts +18 -0
- package/src/Games/_GameTemplate/interfaces/key.ts +10 -0
- package/src/Games/_GameTemplate/interfaces/location.ts +22 -0
- package/src/Games/_GameTemplate/interfaces/map.ts +16 -0
- package/src/Games/_GameTemplate/interfaces/party.ts +8 -0
- package/src/Games/_GameTemplate/interfaces/person.ts +11 -0
- package/src/Games/_GameTemplate/interfaces/quest.ts +9 -0
- package/src/Games/_GameTemplate/locations/Start.html +5 -0
- package/src/Games/_GameTemplate/locations/start.ts +12 -0
- package/src/Games/_GameTemplate/rules.ts +60 -0
- package/src/Games/_GameTemplate/types.ts +55 -0
- package/src/Games/_GameTemplate/ui/styles/game.css +3 -0
- package/src/Games/_GameTemplate/webroot/favicon.ico +0 -0
- package/src/Games/_GameTemplate/webroot/gameinfo.json +10 -0
- package/src/Games/_GameTemplate/webroot/logo192.png +0 -0
- package/src/Games/_GameTemplate/webroot/logo512.png +0 -0
- package/src/Tests/Games/_GameTemplate/specs/rules.test.ts +9 -0
- package/src/UI/Components/AppShell.vue +43 -0
- package/src/UI/Components/Autoplay.vue +32 -0
- package/src/UI/Components/Combinations.vue +37 -0
- package/src/UI/Components/Common/Collapsible.vue +50 -0
- package/src/UI/Components/Common/ModalDialog.vue +54 -0
- package/src/UI/Components/Common/Sprite.vue +53 -0
- package/src/UI/Components/Description.vue +23 -0
- package/src/UI/Components/Encounter/Combat/Combat.vue +89 -0
- package/src/UI/Components/Encounter/Combat/CombatActions.vue +26 -0
- package/src/UI/Components/Encounter/Combat/CombatParticipant.vue +22 -0
- package/src/UI/Components/Encounter/Combat/CombatTargetSelect.vue +55 -0
- package/src/UI/Components/Encounter/Combat/CombatWin.vue +33 -0
- package/src/UI/Components/Encounter/Conversation.vue +66 -0
- package/src/UI/Components/Encounter/Encounter.vue +39 -0
- package/src/UI/Components/Encounter/Enemy.vue +30 -0
- package/src/UI/Components/Encounter/Trade/Stock.vue +58 -0
- package/src/UI/Components/Encounter/Trade/Trade.vue +24 -0
- package/src/UI/Components/Exploration/ActionLog.vue +17 -0
- package/src/UI/Components/Exploration/Destination.vue +66 -0
- package/src/UI/Components/Exploration/Exploration.vue +67 -0
- package/src/UI/Components/Exploration/Ground.vue +22 -0
- package/src/UI/Components/Exploration/LocationMap.vue +42 -0
- package/src/UI/Components/Exploration/LocationText.vue +39 -0
- package/src/UI/Components/Exploration/LocationVisual.vue +38 -0
- package/src/UI/Components/GameContainer.vue +49 -0
- package/src/UI/Components/GameMenu.vue +111 -0
- package/src/UI/Components/GameState/GameOver.vue +20 -0
- package/src/UI/Components/GameState/HighScores.vue +22 -0
- package/src/UI/Components/GameState/Intro.vue +17 -0
- package/src/UI/Components/GameState/TitleScreen.vue +42 -0
- package/src/UI/Components/GameState/Victory.vue +28 -0
- package/src/UI/Components/Navigation.vue +94 -0
- package/src/UI/Components/Party/Backpack.vue +68 -0
- package/src/UI/Components/Party/BuildCharacter.vue +64 -0
- package/src/UI/Components/Party/CharacterSheet.vue +57 -0
- package/src/UI/Components/Party/CreateCharacter.vue +46 -0
- package/src/UI/Components/Party/Equipment.vue +48 -0
- package/src/UI/Components/Party/EquipmentSlot.vue +31 -0
- package/src/UI/Components/Party/LevelUp.vue +27 -0
- package/src/UI/Components/Party/Party.vue +29 -0
- package/src/UI/Components/Party/Quests.vue +48 -0
- package/src/UI/Components/Sound.vue +42 -0
- package/src/UI/Composables/CustomCursor.ts +60 -0
- package/src/UI/Composables/LocationMap.ts +315 -0
- package/src/UI/Composables/Sound.ts +111 -0
- package/src/UI/Composables/TextFeatures.ts +148 -0
- package/src/UI/Composables/VisualFeatures.ts +220 -0
- package/src/UI/Composables/index.ts +15 -0
- package/src/UI/Composables/playStateWatch.ts +31 -0
- package/src/UI/StateStore.ts +237 -0
- package/src/UI/error.ts +6 -0
- package/src/UI/helpers.ts +62 -0
- package/src/UI/index.ts +13 -0
- package/src/UI/main.ts +62 -0
- package/src/UI/startup.ts +58 -0
- package/src/UI/styles/bootstrap-storyscript.scss +31 -0
- package/src/UI/styles/empty.css +3 -0
- package/src/UI/styles/lookinglass.png +0 -0
- package/src/UI/styles/storyscript.css +735 -0
- package/typeExtensions.d.ts +25 -0
- package/vite-env.d.ts +1 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div ref="ui-root">
|
|
3
|
+
<sound></sound>
|
|
4
|
+
<autoplay></autoplay>
|
|
5
|
+
<title-screen></title-screen>
|
|
6
|
+
<div>
|
|
7
|
+
<game-menu v-if="game.playState === PlayState.Menu"></game-menu>
|
|
8
|
+
<conversation v-if="game.playState === PlayState.Conversation"></conversation>
|
|
9
|
+
<trade v-if="game.playState === PlayState.Trade"></trade>
|
|
10
|
+
<combat v-if="game.playState === PlayState.Combat"></combat>
|
|
11
|
+
<description v-if="game.playState === PlayState.Description"></description>
|
|
12
|
+
<div v-if="error" id="error-alert">
|
|
13
|
+
<div class="error-alert-body alert alert-danger">
|
|
14
|
+
<h2 class="danger">{{ `An unhandled error occurred: ${error.message}!` }}</h2>
|
|
15
|
+
<p>{{ error.stackTrace }}</p>
|
|
16
|
+
<button class="btn btn-primary" @click="reload">Reload</button>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
<div>
|
|
20
|
+
<navigation></navigation>
|
|
21
|
+
<game-container></game-container>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</template>
|
|
26
|
+
|
|
27
|
+
<script lang="ts" setup>
|
|
28
|
+
import {storeToRefs} from "pinia";
|
|
29
|
+
import {useTemplateRef} from "vue";
|
|
30
|
+
import {PlayState, useCustomCursor, usePlayStateWatch, useStateStore} from 'storyScript';
|
|
31
|
+
|
|
32
|
+
const store = useStateStore();
|
|
33
|
+
const {game, error} = storeToRefs(store);
|
|
34
|
+
const uiRoot = useTemplateRef('ui-root');
|
|
35
|
+
|
|
36
|
+
useCustomCursor(uiRoot);
|
|
37
|
+
usePlayStateWatch(uiRoot);
|
|
38
|
+
|
|
39
|
+
const reload = () => {
|
|
40
|
+
window.location.reload();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
</script>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="game.autoplaying" id="autoplay-overlay">
|
|
3
|
+
<p id="autoplay-text" ref="autoplay-text"><span>{{ texts.autoplayText }}</span></p>
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
<script lang="ts" setup>
|
|
7
|
+
|
|
8
|
+
import {useStateStore} from 'storyScript';
|
|
9
|
+
import {storeToRefs} from "pinia";
|
|
10
|
+
import {useTemplateRef, watch} from "vue";
|
|
11
|
+
|
|
12
|
+
const store = useStateStore();
|
|
13
|
+
const {game} = storeToRefs(store);
|
|
14
|
+
const {texts} = store.services;
|
|
15
|
+
|
|
16
|
+
const autoPlayText = useTemplateRef('autoplay-text');
|
|
17
|
+
let demoTextTimer: NodeJS.Timeout;
|
|
18
|
+
|
|
19
|
+
watch(() => game.value.autoplaying, (newVal) => {
|
|
20
|
+
clearInterval(demoTextTimer);
|
|
21
|
+
|
|
22
|
+
if (newVal) {
|
|
23
|
+
let autoTextVisible = true;
|
|
24
|
+
|
|
25
|
+
demoTextTimer = setInterval(() => {
|
|
26
|
+
autoPlayText.value.style = autoTextVisible ? 'visibility: visible;' : 'visibility: hidden;';
|
|
27
|
+
autoTextVisible = !autoTextVisible;
|
|
28
|
+
}, 1000);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
</script>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="combineActions.length" id="combinations" class="box-container">
|
|
3
|
+
<div class="box-title">{{ texts.combinations }}</div>
|
|
4
|
+
<div class="row">
|
|
5
|
+
<ul class="list-unstyled col-lg-12 col-xl-5 col-xxl-4 combination-actions">
|
|
6
|
+
<li>
|
|
7
|
+
<button v-for="c of combineActions"
|
|
8
|
+
:class="getCombineClass(c)"
|
|
9
|
+
class="btn combination-button"
|
|
10
|
+
type="button"
|
|
11
|
+
@click="combinationService.setActiveCombination(c)">
|
|
12
|
+
<img v-if="c.picture" :alt="c.text" :src="`resources/${c.picture}`"/>
|
|
13
|
+
{{ c.text }}
|
|
14
|
+
</button>
|
|
15
|
+
</li>
|
|
16
|
+
</ul>
|
|
17
|
+
<div class="col-lg-12 col-xl-7 col-xxl-8">
|
|
18
|
+
<p v-if="game.combinations.combinationResult.text" class="combination-result-text"
|
|
19
|
+
v-html="game.combinations.combinationResult.text"></p>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</template>
|
|
24
|
+
<script lang="ts" setup>
|
|
25
|
+
import {ICombinationAction, useStateStore} from 'storyScript';
|
|
26
|
+
import {ref} from "vue";
|
|
27
|
+
import {storeToRefs} from "pinia";
|
|
28
|
+
|
|
29
|
+
const store = useStateStore();
|
|
30
|
+
const {game} = storeToRefs(store);
|
|
31
|
+
const {texts, combinationService} = store.services;
|
|
32
|
+
|
|
33
|
+
const combineActions = ref(combinationService.combinationActions);
|
|
34
|
+
|
|
35
|
+
const getCombineClass = (action: ICombinationAction): string => game.value.combinations.activeCombination?.selectedCombinationAction.text === action.text ? 'btn-outline-dark' : 'btn-dark';
|
|
36
|
+
|
|
37
|
+
</script>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="collapsible-header" :class="headerClass" @click="toggleCollapsible" ref="collapsible-header">
|
|
3
|
+
<slot name="header">
|
|
4
|
+
{{ text }}
|
|
5
|
+
</slot>
|
|
6
|
+
</div>
|
|
7
|
+
<div class="collapsible-body">
|
|
8
|
+
<slot></slot>
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
11
|
+
<script lang="ts" setup>
|
|
12
|
+
|
|
13
|
+
import {computed, onMounted, ref, useTemplateRef} from "vue";
|
|
14
|
+
|
|
15
|
+
const { preventCollapse, headerClass } = defineProps<{
|
|
16
|
+
text?: string;
|
|
17
|
+
headerClass?: string;
|
|
18
|
+
preventCollapse?: (isCollapsed: boolean) => boolean;
|
|
19
|
+
}>();
|
|
20
|
+
|
|
21
|
+
const isCollapsed = ref(false);
|
|
22
|
+
const collapsibleHeader = useTemplateRef('collapsible-header');
|
|
23
|
+
const collapsibleContent = computed(() => collapsibleHeader.value?.nextElementSibling as HTMLElement);
|
|
24
|
+
|
|
25
|
+
const setHeight = () => {
|
|
26
|
+
collapsibleContent.value.style.maxHeight = isCollapsed.value ? '0px' : null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
onMounted(() => {
|
|
30
|
+
collapsibleContent.value.classList.add('collapsible');
|
|
31
|
+
setHeight();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const toggleCollapsible = () => {
|
|
35
|
+
if (preventCollapse?.(isCollapsed.value)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
isCollapsed.value = !isCollapsed.value;
|
|
40
|
+
|
|
41
|
+
if (isCollapsed.value) {
|
|
42
|
+
collapsibleHeader.value.classList.add('collapsed');
|
|
43
|
+
} else {
|
|
44
|
+
collapsibleHeader.value.classList.remove('collapsed');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
setHeight();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
</script>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<dialog :open="game.playState === openState">
|
|
3
|
+
<div aria-hidden="true" class="modal-backdrop show"></div>
|
|
4
|
+
<div class="d-block modal" @click="e => closeModal(e)">
|
|
5
|
+
<div class="modal-dialog">
|
|
6
|
+
<div class="modal-content">
|
|
7
|
+
<div class="modal-header">
|
|
8
|
+
<h4 class="model-title">
|
|
9
|
+
{{ title }}
|
|
10
|
+
</h4>
|
|
11
|
+
<button v-if="canClose" aria-label="Close" class="close" type="button" @click="closeModal()">
|
|
12
|
+
<span aria-hidden="true">×</span>
|
|
13
|
+
</button>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="modal-body">
|
|
16
|
+
<slot></slot>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="modal-footer">
|
|
19
|
+
<button v-if="closeButton && canClose" class="btn btn-primary" type="button" @click="closeModal()">
|
|
20
|
+
{{ closeText ?? texts.closeModal }}
|
|
21
|
+
</button>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</dialog>
|
|
27
|
+
</template>
|
|
28
|
+
<script lang="ts" setup>
|
|
29
|
+
import {storeToRefs} from "pinia";
|
|
30
|
+
import {PlayState, useStateStore}from 'storyScript';
|
|
31
|
+
|
|
32
|
+
const store = useStateStore();
|
|
33
|
+
const {game} = storeToRefs(store);
|
|
34
|
+
const {texts} = store.services;
|
|
35
|
+
|
|
36
|
+
const {openState, canClose} = defineProps<{
|
|
37
|
+
openState: PlayState,
|
|
38
|
+
canClose: boolean,
|
|
39
|
+
title: string,
|
|
40
|
+
closeButton: boolean,
|
|
41
|
+
closeText?: string,
|
|
42
|
+
}>();
|
|
43
|
+
|
|
44
|
+
const closeModal = (event?: PointerEvent) => {
|
|
45
|
+
if (event) {
|
|
46
|
+
if (canClose === false || !(<HTMLElement>event.target).classList.contains("modal")) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
game.value.playState = null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
</script>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<img ref="sprite" :src="`resources/${spriteSettings.sheet}`" @load="initSprite"
|
|
3
|
+
:data-sprite-width="spriteSettings.width" :data-sprite-height="spriteSettings.height"/>
|
|
4
|
+
</template>
|
|
5
|
+
<script lang="ts" setup>
|
|
6
|
+
import {Sprite}from 'storyScript';
|
|
7
|
+
import {useTemplateRef, watch} from "vue";
|
|
8
|
+
|
|
9
|
+
const props = defineProps<{
|
|
10
|
+
factor: number;
|
|
11
|
+
spriteSettings: Sprite;
|
|
12
|
+
}>();
|
|
13
|
+
|
|
14
|
+
const sprite = useTemplateRef('sprite');
|
|
15
|
+
|
|
16
|
+
let animation: Animation;
|
|
17
|
+
const animationFrames: Keyframe[] = [];
|
|
18
|
+
const animationSettings: KeyframeAnimationOptions = {};
|
|
19
|
+
|
|
20
|
+
watch(() => props.factor, () => {
|
|
21
|
+
updateSprite();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const initSprite = () => {
|
|
25
|
+
animationFrames.push({objectPosition: '0 0'});
|
|
26
|
+
// Todo: add additional steps here to support sprite sheets with multiple rows(?)
|
|
27
|
+
animationFrames.push({objectPosition: '100% 0'});
|
|
28
|
+
|
|
29
|
+
animationSettings.duration = (props.spriteSettings.speed ??= 1) * 1000;
|
|
30
|
+
animationSettings.iterations = Infinity;
|
|
31
|
+
animationSettings.easing = `steps(${props.spriteSettings.steps}, jump-none)`;
|
|
32
|
+
updateSprite();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const updateSprite = () => {
|
|
36
|
+
animation?.cancel();
|
|
37
|
+
animation = null;
|
|
38
|
+
|
|
39
|
+
// We need a timeout to make setting up a new animation work in all cases. Without the timeout, the whole
|
|
40
|
+
// sprite sheet will be displayed without any animation on updates and hot reloads.
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
updateSpriteAnimation();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const updateSpriteAnimation = () => {
|
|
47
|
+
sprite.value.width = Math.round(props.spriteSettings.width * props.factor);
|
|
48
|
+
sprite.value.height = Math.round(props.spriteSettings.height * props.factor);
|
|
49
|
+
sprite.value.style.objectFit = 'cover';
|
|
50
|
+
animation = sprite.value.animate(animationFrames, animationSettings);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
</script>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<modal-dialog :canClose="true"
|
|
3
|
+
:closeButton="true"
|
|
4
|
+
:openState="PlayState.Description"
|
|
5
|
+
:title="game.currentDescription.title">
|
|
6
|
+
<div class="description" v-html="descriptionToShow"></div>
|
|
7
|
+
</modal-dialog>
|
|
8
|
+
</template>
|
|
9
|
+
<script lang="ts" setup>
|
|
10
|
+
import {checkAutoplay, PlayState, useStateStore} from 'storyScript';
|
|
11
|
+
import {storeToRefs} from "pinia";
|
|
12
|
+
import {ref, watch} from "vue";
|
|
13
|
+
|
|
14
|
+
const store = useStateStore();
|
|
15
|
+
const {game} = storeToRefs(store);
|
|
16
|
+
|
|
17
|
+
const descriptionToShow = ref<string>(null);
|
|
18
|
+
|
|
19
|
+
watch(() => game.value.currentDescription, async (newValue) => {
|
|
20
|
+
descriptionToShow.value = checkAutoplay(game.value, newValue.item.description);
|
|
21
|
+
}, {immediate: true});
|
|
22
|
+
|
|
23
|
+
</script>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<modal-dialog :canClose="!enemiesPresent"
|
|
3
|
+
:closeButton="true"
|
|
4
|
+
:openState="PlayState.Combat"
|
|
5
|
+
:title="texts.combatTitle">
|
|
6
|
+
<div v-if="enemiesPresent" id="combat" class="row">
|
|
7
|
+
<div class="col-12">
|
|
8
|
+
<h3 class="combat-header">{{ game.combat.roundHeader }}</h3>
|
|
9
|
+
|
|
10
|
+
<div v-for="enemyRow of enemyRows" class="row enemy-row">
|
|
11
|
+
<div v-for="enemy of enemyRow" :class="rowClass(enemyRow, enemy)">
|
|
12
|
+
<combat-participant :participant="enemy"></combat-participant>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div v-for="characterRow of characterRows" class="row character-row">
|
|
17
|
+
<div v-for="turn of characterRow" :class="rowClass(characterRow, turn.character)">
|
|
18
|
+
<combat-participant :participant="turn.character"></combat-participant>
|
|
19
|
+
<combat-target-select :setup="game.combat" :turn="turn"></combat-target-select>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="row">
|
|
24
|
+
<div class="col-12 fight-row">
|
|
25
|
+
<button
|
|
26
|
+
:disabled="!actionsEnabled"
|
|
27
|
+
class="btn btn-danger"
|
|
28
|
+
type="button"
|
|
29
|
+
@click="fight()">
|
|
30
|
+
{{ texts.fight }}
|
|
31
|
+
</button>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
<combat-actions :actions="game.currentLocation.combatActions" :enabled="actionsEnabled"></combat-actions>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<combat-win v-else :winnings="game.combat.winnings"></combat-win>
|
|
39
|
+
|
|
40
|
+
<fieldset class="combatlog">
|
|
41
|
+
<legend>{{ texts.messages }}</legend>
|
|
42
|
+
<ul class="list-unstyled action-log">
|
|
43
|
+
<li v-for="message of game.combatLog">{{ message }}</li>
|
|
44
|
+
</ul>
|
|
45
|
+
</fieldset>
|
|
46
|
+
</modal-dialog>
|
|
47
|
+
</template>
|
|
48
|
+
<script lang="ts" setup>
|
|
49
|
+
import {storeToRefs} from "pinia";
|
|
50
|
+
import {ICharacter, ICombatTurn, IEnemy, ModalDialog, PlayState, useStateStore} from 'storyScript';
|
|
51
|
+
import {ref} from "vue";
|
|
52
|
+
|
|
53
|
+
const store = useStateStore();
|
|
54
|
+
const {game, enemiesPresent} = storeToRefs(store);
|
|
55
|
+
const {texts, combatService} = store.services;
|
|
56
|
+
|
|
57
|
+
const actionsEnabled = ref(true);
|
|
58
|
+
const enemyRows = ref<Array<Array<IEnemy>>>(split(game.value.combat.enemies, 3));
|
|
59
|
+
const characterRows = ref<Array<Array<ICombatTurn>>>(split(game.value.combat, 3));
|
|
60
|
+
|
|
61
|
+
const rowClass = (row: (IEnemy | ICombatTurn)[], participant: IEnemy | ICharacter) =>
|
|
62
|
+
`col-${(12 / row.length)}` + (participant.currentHitpoints <= 0 ? ' unavailable' : '');
|
|
63
|
+
|
|
64
|
+
const fight = (): void => {
|
|
65
|
+
actionsEnabled.value = false;
|
|
66
|
+
|
|
67
|
+
Promise.resolve(combatService.fight(game.value.combat)).then(() => {
|
|
68
|
+
// Refresh the character rows to show the new combat targets. We don't need to do this for enemies.
|
|
69
|
+
characterRows.value = split(game.value.combat, 3);
|
|
70
|
+
actionsEnabled.value = true;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function split(array: any[], size: number): any[] {
|
|
75
|
+
const result = [];
|
|
76
|
+
|
|
77
|
+
if (!array) {
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (let i = 0; i < array.length; i += size) {
|
|
82
|
+
let chunk = array.slice(i, i + size);
|
|
83
|
+
result.push(chunk);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
</script>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="row">
|
|
3
|
+
<ul class="list-unstyled combat-actions">
|
|
4
|
+
<li v-for="action of actions">
|
|
5
|
+
<button :class="store.getButtonClass(action)"
|
|
6
|
+
:disabled="!enabled"
|
|
7
|
+
class="btn"
|
|
8
|
+
type="button"
|
|
9
|
+
@click="commandService.useAction(action)">{{ action[1].text }}
|
|
10
|
+
</button>
|
|
11
|
+
</li>
|
|
12
|
+
</ul>
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
15
|
+
<script lang="ts" setup>
|
|
16
|
+
import {IAction, useStateStore} from 'storyScript';
|
|
17
|
+
|
|
18
|
+
const store = useStateStore();
|
|
19
|
+
const {commandService} = store.services;
|
|
20
|
+
|
|
21
|
+
const {actions} = defineProps<{
|
|
22
|
+
actions: [string, IAction][],
|
|
23
|
+
enabled: boolean,
|
|
24
|
+
}>();
|
|
25
|
+
|
|
26
|
+
</script>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<h4>{{ participant.name }}</h4>
|
|
3
|
+
<p :class="healthClass">
|
|
4
|
+
{{ texts.format(hitPointText, [participant.currentHitpoints, participant.hitpoints]) }}
|
|
5
|
+
</p>
|
|
6
|
+
<img v-if="participant.picture" :alt="participant.name" :src="participant.picture" class="combat-participant">
|
|
7
|
+
</template>
|
|
8
|
+
<script lang="ts" setup>
|
|
9
|
+
import {useStateStore} from 'storyScript';
|
|
10
|
+
import {computed} from "vue";
|
|
11
|
+
|
|
12
|
+
const store = useStateStore();
|
|
13
|
+
const {texts} = store.services;
|
|
14
|
+
|
|
15
|
+
const healthClass = computed(() => participant.type ? 'enemy-health' : 'character-health');
|
|
16
|
+
const hitPointText = computed(() => participant.type ? texts.enemyHitpoints : texts.characterHitpoints);
|
|
17
|
+
|
|
18
|
+
const {participant} = defineProps<{
|
|
19
|
+
participant: any
|
|
20
|
+
}>();
|
|
21
|
+
|
|
22
|
+
</script>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="turn.item && turn.character.currentHitpoints > 0">
|
|
3
|
+
<div :class="{ 'not-applicable': !turn.item.targetType }">
|
|
4
|
+
<span>{{ turn.item.targetType === 'Enemy' ? texts.attack : texts.aid }}</span>
|
|
5
|
+
<select v-if="filteredTargets(turn).length > 1" v-model="turn.target" class="custom-select">
|
|
6
|
+
<option v-for="target of filteredTargets(turn)" :value="target">{{ (target as any).name }}</option>
|
|
7
|
+
</select>
|
|
8
|
+
<input v-if="filteredTargets(turn).length === 1"
|
|
9
|
+
:disabled="true" :value="turn.target?.name"
|
|
10
|
+
class="single-item"
|
|
11
|
+
type="text"/>
|
|
12
|
+
</div>
|
|
13
|
+
<div v-if="turn.itemsAvailable.length">
|
|
14
|
+
<span>{{
|
|
15
|
+
turn.item.targetType === 'Enemy' ? texts.attackWith : turn.item.targetType ? texts.aidWith : texts.useCombatItem
|
|
16
|
+
}}</span>
|
|
17
|
+
<select v-if="turn.itemsAvailable.length > 1" v-model="turn.item" class="custom-select"
|
|
18
|
+
@change="itemChange(turn.item, turn)">
|
|
19
|
+
<option v-for="item of turn.itemsAvailable"
|
|
20
|
+
:class="{'unselectable': !combatService.isSelectable(item)}"
|
|
21
|
+
:disabled="!combatService.isSelectable(item)"
|
|
22
|
+
:value="item">{{ itemService.getItemName(item) }}
|
|
23
|
+
</option>
|
|
24
|
+
</select>
|
|
25
|
+
<input v-if="turn.itemsAvailable.length === 1" :disabled="true"
|
|
26
|
+
:value="itemService.getItemName(turn.item)"
|
|
27
|
+
class="single-item"
|
|
28
|
+
type="text"/>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<div v-if="!turn.item && turn.character.currentHitpoints > 0">
|
|
32
|
+
<span>{{ setup.noActionText }}</span>
|
|
33
|
+
</div>
|
|
34
|
+
</template>
|
|
35
|
+
<script lang="ts" setup>
|
|
36
|
+
import {ICharacter, ICombatSetup, ICombatTurn, IEnemy, IItem, useStateStore} from 'storyScript';
|
|
37
|
+
|
|
38
|
+
const store = useStateStore();
|
|
39
|
+
const {texts, combatService, itemService} = store.services;
|
|
40
|
+
|
|
41
|
+
const {setup, turn} = defineProps<{
|
|
42
|
+
setup: ICombatSetup<ICombatTurn>,
|
|
43
|
+
turn: ICombatTurn
|
|
44
|
+
}>();
|
|
45
|
+
|
|
46
|
+
const itemChange = (item: IItem, turn: ICombatTurn) => {
|
|
47
|
+
const currentTarget = turn.target;
|
|
48
|
+
const targets = filteredTargets(turn, item);
|
|
49
|
+
turn.target = targets.filter(t => t === currentTarget)[0] ?? targets[0];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const filteredTargets = (turn: ICombatTurn, item?: IItem): (IEnemy | ICharacter)[] =>
|
|
53
|
+
turn.targetsAvailable.concat([turn.character]).filter(t => combatService.canTarget(item ?? turn.item, t, turn.character));
|
|
54
|
+
|
|
55
|
+
</script>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div id="combat-win">
|
|
3
|
+
<h2 class="combat-win-header">{{ texts.combatWin }}</h2>
|
|
4
|
+
<ul class="combat-winnings">
|
|
5
|
+
<li>
|
|
6
|
+
<span class="enemies-defeated-header">{{ texts.enemiesDefeated }}</span>
|
|
7
|
+
<ul>
|
|
8
|
+
<li v-for="enemy of winnings.enemiesDefeated">{{ enemy.name }}</li>
|
|
9
|
+
</ul>
|
|
10
|
+
</li>
|
|
11
|
+
<li v-if="winnings.currency" class="currency-won">
|
|
12
|
+
{{ texts.format(texts.currencyWon, [winnings.currency.toString()]) }}
|
|
13
|
+
</li>
|
|
14
|
+
<li v-if="winnings.itemsWon.length">
|
|
15
|
+
<span class="items-taken-header">{{ texts.itemsTaken }}</span>
|
|
16
|
+
<ul>
|
|
17
|
+
<li v-for="item of winnings.itemsWon">{{ item.name }}</li>
|
|
18
|
+
</ul>
|
|
19
|
+
</li>
|
|
20
|
+
</ul>
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
23
|
+
<script lang="ts" setup>
|
|
24
|
+
import {ICombatWinnings, useStateStore} from 'storyScript';
|
|
25
|
+
|
|
26
|
+
const store = useStateStore();
|
|
27
|
+
const {texts} = store.services;
|
|
28
|
+
|
|
29
|
+
const {winnings} = defineProps<{
|
|
30
|
+
winnings: ICombatWinnings
|
|
31
|
+
}>();
|
|
32
|
+
|
|
33
|
+
</script>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<modal-dialog :canClose="true"
|
|
3
|
+
:closeButton="true"
|
|
4
|
+
:openState="PlayState.Conversation"
|
|
5
|
+
:title="game.person.conversation.title || texts.format(texts.talk, [game.person.name])">
|
|
6
|
+
<div id="conversation">
|
|
7
|
+
<img v-if="game.person.picture" :alt="game.person.name" :src="game.person.picture"/>
|
|
8
|
+
<div v-if="game.person.conversation.activeNode" id="conversation-options">
|
|
9
|
+
<div v-html="textToShow"></div>
|
|
10
|
+
<ul>
|
|
11
|
+
<li v-for="reply of repliesToShow">
|
|
12
|
+
<div :class="{ 'unavailable': !reply.available }" @click="answer(reply)">
|
|
13
|
+
<span v-html="reply.lines"></span>
|
|
14
|
+
</div>
|
|
15
|
+
</li>
|
|
16
|
+
</ul>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<div v-if="!game.person.conversation.activeNode?.replies?.length">
|
|
20
|
+
{{ texts.conversationEnded }}
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div v-if="game.person.conversation.conversationLog?.length" id="conversation-history">
|
|
24
|
+
<p id="conversation-history-title">Conversation history</p>
|
|
25
|
+
<ul class="list-unstyled">
|
|
26
|
+
<li v-for="entry of game.person.conversation.conversationLog">
|
|
27
|
+
<div class="conversation-lines" v-html="stripAutoplay(entry.lines)"></div>
|
|
28
|
+
<div class="conversation-option" v-html="stripAutoplay(entry.reply)"></div>
|
|
29
|
+
</li>
|
|
30
|
+
</ul>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</modal-dialog>
|
|
34
|
+
</template>
|
|
35
|
+
<script lang="ts" setup>
|
|
36
|
+
import {checkAutoplay, IConversationReply, PlayState, useStateStore} from 'storyScript';
|
|
37
|
+
import {storeToRefs} from "pinia";
|
|
38
|
+
import {ref, watch} from "vue";
|
|
39
|
+
|
|
40
|
+
const store = useStateStore();
|
|
41
|
+
const {game} = storeToRefs(store);
|
|
42
|
+
const {texts, conversationService} = store.services;
|
|
43
|
+
|
|
44
|
+
const textToShow = ref<string>(null);
|
|
45
|
+
const repliesToShow = ref<IConversationReply[]>(null);
|
|
46
|
+
|
|
47
|
+
watch(() => game.value.person.conversation.activeNode, async (newValue) => {
|
|
48
|
+
textToShow.value = checkAutoplay(game.value, newValue?.lines);
|
|
49
|
+
repliesToShow.value = newValue?.replies.filter(r => r.available || r.showWhenUnavailable).map(r => {
|
|
50
|
+
if (r.lines) {
|
|
51
|
+
r.lines = checkAutoplay(game.value, r.lines);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return r;
|
|
55
|
+
});
|
|
56
|
+
}, {immediate: true});
|
|
57
|
+
|
|
58
|
+
const answer = (reply: IConversationReply) => {
|
|
59
|
+
if (reply.available) {
|
|
60
|
+
conversationService.answer(game.value.person.conversation.activeNode, reply)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const stripAutoplay = (value: string) => value.replace('autoplay="autoplay"', '');
|
|
65
|
+
|
|
66
|
+
</script>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="activePersons.length > 0 && !enemiesPresent" id="encounters" class="box-container">
|
|
3
|
+
<div class="box-title">{{ texts.encounters }}</div>
|
|
4
|
+
<ul class="list-unstyled">
|
|
5
|
+
<li v-for="person of activePersons" :class="game.combinations.getCombineClass(person)"
|
|
6
|
+
@click="game.combinations.tryCombine(person)">
|
|
7
|
+
<span class="person-name">{{ person.name }}</span>
|
|
8
|
+
<div class="inline">
|
|
9
|
+
<button v-if="person.conversation" class="btn btn-info talk" type="button"
|
|
10
|
+
@click="conversationService.talk(person)">
|
|
11
|
+
{{ texts.format(texts.talk, [person.name]) }}
|
|
12
|
+
</button>
|
|
13
|
+
<button v-if="person.trade" class="btn btn-info trade" type="button"
|
|
14
|
+
@click="store.trade(game.currentLocation, person)">
|
|
15
|
+
{{ texts.format(texts.trade, [person.name]) }}
|
|
16
|
+
</button>
|
|
17
|
+
<button v-if="hasDescription(person)" class="btn btn-info examine" type="button"
|
|
18
|
+
@click="store.showDescription('person', person, person.name)">
|
|
19
|
+
{{ texts.format(texts.examine, [person.name]) }}
|
|
20
|
+
</button>
|
|
21
|
+
<button v-if="person.canAttack === undefined || person.canAttack === true" class="btn btn-danger"
|
|
22
|
+
type="button" @click="store.startCombat(game.currentLocation, person)">
|
|
23
|
+
{{ texts.format(texts.attack, [person.name]) }}
|
|
24
|
+
</button>
|
|
25
|
+
</div>
|
|
26
|
+
<img v-if="person.picture" :alt="person.name" :src="person.picture" class="person-picture"/>
|
|
27
|
+
</li>
|
|
28
|
+
</ul>
|
|
29
|
+
</div>
|
|
30
|
+
</template>
|
|
31
|
+
<script lang="ts" setup>
|
|
32
|
+
import {storeToRefs} from "pinia";
|
|
33
|
+
import {hasDescription, useStateStore} from 'storyScript';
|
|
34
|
+
|
|
35
|
+
const store = useStateStore();
|
|
36
|
+
const {game, enemiesPresent, activePersons} = storeToRefs(store);
|
|
37
|
+
const {texts, conversationService} = store.services;
|
|
38
|
+
|
|
39
|
+
</script>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="enemiesPresent" class="box-container">
|
|
3
|
+
<div class="box-title">{{ texts.encounters }}</div>
|
|
4
|
+
<p>{{ texts.enemiesToFight }}</p>
|
|
5
|
+
<ul class="list-unstyled enemy-list">
|
|
6
|
+
<li v-for="enemy of activeEnemies" :class="game.combinations.getCombineClass(enemy)"
|
|
7
|
+
@click="game.combinations.tryCombine(enemy)">
|
|
8
|
+
<span class="enemy-name">{{ enemy.name }}</span>
|
|
9
|
+
<div :class="game.combinations.getCombineClass(enemy)" class="inline">
|
|
10
|
+
<button v-if="hasDescription(enemy)" class="btn btn-info btn-sm" type="button"
|
|
11
|
+
@click="store.showDescription('enemy', enemy, enemy.name)">{{ texts.view }}
|
|
12
|
+
</button>
|
|
13
|
+
</div>
|
|
14
|
+
<img v-if="enemy.picture" :alt="enemy.name" :src="enemy.picture" class="enemy-picture"/>
|
|
15
|
+
</li>
|
|
16
|
+
</ul>
|
|
17
|
+
<button id="start-combat" class="btn btn-danger" type="button" @click="store.startCombat(game.currentLocation)">
|
|
18
|
+
{{ texts.startCombat }}
|
|
19
|
+
</button>
|
|
20
|
+
</div>
|
|
21
|
+
</template>
|
|
22
|
+
<script lang="ts" setup>
|
|
23
|
+
import {storeToRefs} from "pinia";
|
|
24
|
+
import {hasDescription, useStateStore} from 'storyScript';
|
|
25
|
+
|
|
26
|
+
const store = useStateStore();
|
|
27
|
+
const {game, enemiesPresent, activeEnemies} = storeToRefs(store);
|
|
28
|
+
const {texts} = store.services;
|
|
29
|
+
|
|
30
|
+
</script>
|