@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.
Files changed (370) hide show
  1. package/.env +1 -0
  2. package/CodeSnippets/StoryScriptSnippets.code-snippets +573 -0
  3. package/LICENSE.txt +21 -0
  4. package/LiveTemplates/StoryScript.xml +271 -0
  5. package/README.md +9 -2
  6. package/baseViteConfig.js +112 -0
  7. package/clientFiles/currentGameName.js +1 -0
  8. package/clientFiles/gitignore +12 -0
  9. package/clientFiles/tsconfig.json +34 -0
  10. package/clientFiles/vite.config.ts +14 -0
  11. package/clientFiles/vitest.config.ts +29 -0
  12. package/dist/src/Engine/Actions/index.d.ts +2 -0
  13. package/dist/src/Engine/Actions/open.d.ts +6 -0
  14. package/dist/src/Engine/Actions/openWithKey.d.ts +7 -0
  15. package/dist/src/Engine/EntityCreatorFunctions.d.ts +18 -0
  16. package/dist/src/Engine/Interfaces/action.d.ts +37 -0
  17. package/dist/src/Engine/Interfaces/autoplayStep.d.ts +11 -0
  18. package/dist/src/Engine/Interfaces/barrier.d.ts +16 -0
  19. package/dist/src/Engine/Interfaces/barrierAction.d.ts +19 -0
  20. package/dist/src/Engine/Interfaces/character.d.ts +48 -0
  21. package/dist/src/Engine/Interfaces/combatSetup.d.ts +9 -0
  22. package/dist/src/Engine/Interfaces/combatTurn.d.ts +37 -0
  23. package/dist/src/Engine/Interfaces/combatWinnings.d.ts +6 -0
  24. package/dist/src/Engine/Interfaces/combinations/activeCombination.d.ts +14 -0
  25. package/dist/src/Engine/Interfaces/combinations/combinable.d.ts +18 -0
  26. package/dist/src/Engine/Interfaces/combinations/combinationAction.d.ts +41 -0
  27. package/dist/src/Engine/Interfaces/combinations/combinationMatchResult.d.ts +14 -0
  28. package/dist/src/Engine/Interfaces/combinations/combinations.d.ts +17 -0
  29. package/dist/src/Engine/Interfaces/combinations/combine.d.ts +22 -0
  30. package/dist/src/Engine/Interfaces/combinations/combineResult.d.ts +18 -0
  31. package/dist/src/Engine/Interfaces/combinations/gameCombinations.d.ts +40 -0
  32. package/dist/src/Engine/Interfaces/compiledLocation.d.ts +33 -0
  33. package/dist/src/Engine/Interfaces/conversations/conversation.d.ts +44 -0
  34. package/dist/src/Engine/Interfaces/conversations/conversationLogEntry.d.ts +13 -0
  35. package/dist/src/Engine/Interfaces/conversations/conversationNode.d.ts +22 -0
  36. package/dist/src/Engine/Interfaces/conversations/conversationReply.d.ts +49 -0
  37. package/dist/src/Engine/Interfaces/createCharacter/createCharacter.d.ts +20 -0
  38. package/dist/src/Engine/Interfaces/createCharacter/createCharacterAttribute.d.ts +18 -0
  39. package/dist/src/Engine/Interfaces/createCharacter/createCharacterAttributeEntry.d.ts +18 -0
  40. package/dist/src/Engine/Interfaces/createCharacter/createCharacterQuestion.d.ts +18 -0
  41. package/dist/src/Engine/Interfaces/createCharacter/createCharacterQuestionEntry.d.ts +22 -0
  42. package/dist/src/Engine/Interfaces/createCharacter/createCharacterStep.d.ts +40 -0
  43. package/dist/src/Engine/Interfaces/customCursor.d.ts +8 -0
  44. package/dist/src/Engine/Interfaces/defaultEquipment.d.ts +19 -0
  45. package/dist/src/Engine/Interfaces/definitions.d.ts +40 -0
  46. package/dist/src/Engine/Interfaces/destination.d.ts +31 -0
  47. package/dist/src/Engine/Interfaces/dynamicStyle.d.ts +10 -0
  48. package/dist/src/Engine/Interfaces/enemy.d.ts +46 -0
  49. package/dist/src/Engine/Interfaces/enumerations/actionStatus.d.ts +18 -0
  50. package/dist/src/Engine/Interfaces/enumerations/actionType.d.ts +9 -0
  51. package/dist/src/Engine/Interfaces/enumerations/equipmentType.d.ts +51 -0
  52. package/dist/src/Engine/Interfaces/enumerations/gameState.d.ts +11 -0
  53. package/dist/src/Engine/Interfaces/enumerations/playState.d.ts +10 -0
  54. package/dist/src/Engine/Interfaces/enumerations/targetType.d.ts +9 -0
  55. package/dist/src/Engine/Interfaces/equipment.d.ts +43 -0
  56. package/dist/src/Engine/Interfaces/feature.d.ts +37 -0
  57. package/dist/src/Engine/Interfaces/featureCollection.d.ts +7 -0
  58. package/dist/src/Engine/Interfaces/game.d.ts +148 -0
  59. package/dist/src/Engine/Interfaces/gameEvents.d.ts +7 -0
  60. package/dist/src/Engine/Interfaces/groupableItem.d.ts +32 -0
  61. package/dist/src/Engine/Interfaces/helpers.d.ts +50 -0
  62. package/dist/src/Engine/Interfaces/index.d.ts +78 -0
  63. package/dist/src/Engine/Interfaces/interfaceTexts.d.ts +140 -0
  64. package/dist/src/Engine/Interfaces/item.d.ts +96 -0
  65. package/dist/src/Engine/Interfaces/key.d.ts +16 -0
  66. package/dist/src/Engine/Interfaces/location.d.ts +78 -0
  67. package/dist/src/Engine/Interfaces/maps/map.d.ts +45 -0
  68. package/dist/src/Engine/Interfaces/maps/mapLocation.d.ts +23 -0
  69. package/dist/src/Engine/Interfaces/party.d.ts +33 -0
  70. package/dist/src/Engine/Interfaces/person.d.ts +25 -0
  71. package/dist/src/Engine/Interfaces/quest.d.ts +51 -0
  72. package/dist/src/Engine/Interfaces/rules/characterRules.d.ts +84 -0
  73. package/dist/src/Engine/Interfaces/rules/combatRules.d.ts +46 -0
  74. package/dist/src/Engine/Interfaces/rules/combinationRules.d.ts +15 -0
  75. package/dist/src/Engine/Interfaces/rules/demoMode.d.ts +15 -0
  76. package/dist/src/Engine/Interfaces/rules/encounterRules.d.ts +4 -0
  77. package/dist/src/Engine/Interfaces/rules/explorationRules.d.ts +42 -0
  78. package/dist/src/Engine/Interfaces/rules/generalRules.d.ts +62 -0
  79. package/dist/src/Engine/Interfaces/rules/rules.d.ts +31 -0
  80. package/dist/src/Engine/Interfaces/rules/setupRules.d.ts +56 -0
  81. package/dist/src/Engine/Interfaces/rules/titleScreen.d.ts +16 -0
  82. package/dist/src/Engine/Interfaces/saveGame.d.ts +33 -0
  83. package/dist/src/Engine/Interfaces/scoreEntry.d.ts +13 -0
  84. package/dist/src/Engine/Interfaces/services/autoplayService.d.ts +19 -0
  85. package/dist/src/Engine/Interfaces/services/characterService.d.ts +17 -0
  86. package/dist/src/Engine/Interfaces/services/combatService.d.ts +26 -0
  87. package/dist/src/Engine/Interfaces/services/combinationService.d.ts +9 -0
  88. package/dist/src/Engine/Interfaces/services/commandService.d.ts +64 -0
  89. package/dist/src/Engine/Interfaces/services/conversationService.d.ts +5 -0
  90. package/dist/src/Engine/Interfaces/services/dataSerializer.d.ts +4 -0
  91. package/dist/src/Engine/Interfaces/services/dataService.d.ts +33 -0
  92. package/dist/src/Engine/Interfaces/services/dataSynchronizer.d.ts +3 -0
  93. package/dist/src/Engine/Interfaces/services/gameService.d.ts +10 -0
  94. package/dist/src/Engine/Interfaces/services/index.d.ts +16 -0
  95. package/dist/src/Engine/Interfaces/services/itemService.d.ts +14 -0
  96. package/dist/src/Engine/Interfaces/services/localStorageService.d.ts +6 -0
  97. package/dist/src/Engine/Interfaces/services/locationService.d.ts +8 -0
  98. package/dist/src/Engine/Interfaces/services/soundService.d.ts +5 -0
  99. package/dist/src/Engine/Interfaces/services/tradeService.d.ts +9 -0
  100. package/dist/src/Engine/Interfaces/soundPlayer.d.ts +30 -0
  101. package/dist/src/Engine/Interfaces/sprite.d.ts +23 -0
  102. package/dist/src/Engine/Interfaces/stateList.d.ts +9 -0
  103. package/dist/src/Engine/Interfaces/statistics.d.ts +13 -0
  104. package/dist/src/Engine/Interfaces/stock.d.ts +39 -0
  105. package/dist/src/Engine/Interfaces/trade.d.ts +62 -0
  106. package/dist/src/Engine/ServiceFactory.d.ts +52 -0
  107. package/dist/src/Engine/Services/AutoplayService.d.ts +11 -0
  108. package/dist/src/Engine/Services/CharacterService.d.ts +21 -0
  109. package/dist/src/Engine/Services/CombatService.d.ts +16 -0
  110. package/dist/src/Engine/Services/CombinationService.d.ts +15 -0
  111. package/dist/src/Engine/Services/CommandService.d.ts +24 -0
  112. package/dist/src/Engine/Services/ConversationService.d.ts +26 -0
  113. package/dist/src/Engine/Services/DataSerializer.d.ts +17 -0
  114. package/dist/src/Engine/Services/DataService.d.ts +16 -0
  115. package/dist/src/Engine/Services/DataSynchronizer.d.ts +12 -0
  116. package/dist/src/Engine/Services/GameService.d.ts +28 -0
  117. package/dist/src/Engine/Services/HelperService.d.ts +18 -0
  118. package/dist/src/Engine/Services/ItemService.d.ts +21 -0
  119. package/dist/src/Engine/Services/LocalStorageService.d.ts +7 -0
  120. package/dist/src/Engine/Services/LocationService.d.ts +25 -0
  121. package/dist/src/Engine/Services/SoundService.d.ts +13 -0
  122. package/dist/src/Engine/Services/TradeService.d.ts +17 -0
  123. package/dist/src/Engine/Services/index.d.ts +17 -0
  124. package/dist/src/Engine/Services/serializationData.d.ts +8 -0
  125. package/dist/src/Engine/Services/sharedFunctions.d.ts +21 -0
  126. package/dist/src/Engine/arrayAndFunctionExtensions.d.ts +3 -0
  127. package/dist/src/Engine/defaultTexts.d.ts +7 -0
  128. package/dist/src/Engine/gameEvents.d.ts +10 -0
  129. package/dist/src/Engine/index.d.ts +8 -0
  130. package/dist/src/Engine/stateProperties.d.ts +6 -0
  131. package/dist/src/Engine/utilityFunctions.d.ts +25 -0
  132. package/dist/src/UI/Composables/CustomCursor.d.ts +2 -0
  133. package/dist/src/UI/Composables/LocationMap.d.ts +26 -0
  134. package/dist/src/UI/Composables/Sound.d.ts +7 -0
  135. package/dist/src/UI/Composables/TextFeatures.d.ts +8 -0
  136. package/dist/src/UI/Composables/VisualFeatures.d.ts +7 -0
  137. package/dist/src/UI/Composables/index.d.ts +7 -0
  138. package/dist/src/UI/Composables/playStateWatch.d.ts +2 -0
  139. package/dist/src/UI/StateStore.d.ts +14256 -0
  140. package/dist/src/UI/error.d.ts +6 -0
  141. package/dist/src/UI/helpers.d.ts +3 -0
  142. package/dist/src/UI/index.d.ts +6 -0
  143. package/dist/src/UI/main.d.ts +1 -0
  144. package/dist/src/UI/startup.d.ts +2 -0
  145. package/dist/src/constants.d.ts +17 -0
  146. package/dist/src/index.d.ts +3 -0
  147. package/dist/storyscript.css +9566 -0
  148. package/dist/storyscript.js +9659 -0
  149. package/dist/storyscript.js.map +1 -0
  150. package/dist/storyscript.mjs +9569 -0
  151. package/dist/storyscript.mjs.map +1 -0
  152. package/electron.cjs +44 -0
  153. package/index.html +14 -0
  154. package/package.json +118 -4
  155. package/scripts/cli.js +268 -0
  156. package/scripts/createAsset.js +117 -0
  157. package/scripts/createGame.js +40 -0
  158. package/scripts/helpers.js +21 -0
  159. package/scripts/postbuild.js +179 -0
  160. package/scripts/setupTesting.js +17 -0
  161. package/shims-vue.d.ts +1 -0
  162. package/src/Engine/Actions/index.ts +2 -0
  163. package/src/Engine/Actions/open.ts +12 -0
  164. package/src/Engine/Actions/openWithKey.ts +23 -0
  165. package/src/Engine/EntityCreatorFunctions.ts +602 -0
  166. package/src/Engine/Interfaces/action.ts +43 -0
  167. package/src/Engine/Interfaces/autoplayStep.ts +13 -0
  168. package/src/Engine/Interfaces/barrier.ts +18 -0
  169. package/src/Engine/Interfaces/barrierAction.ts +21 -0
  170. package/src/Engine/Interfaces/character.ts +58 -0
  171. package/src/Engine/Interfaces/combatSetup.ts +10 -0
  172. package/src/Engine/Interfaces/combatTurn.ts +45 -0
  173. package/src/Engine/Interfaces/combatWinnings.ts +7 -0
  174. package/src/Engine/Interfaces/combinations/activeCombination.ts +16 -0
  175. package/src/Engine/Interfaces/combinations/combinable.ts +21 -0
  176. package/src/Engine/Interfaces/combinations/combinationAction.ts +45 -0
  177. package/src/Engine/Interfaces/combinations/combinationMatchResult.ts +16 -0
  178. package/src/Engine/Interfaces/combinations/combinations.ts +19 -0
  179. package/src/Engine/Interfaces/combinations/combine.ts +25 -0
  180. package/src/Engine/Interfaces/combinations/combineResult.ts +21 -0
  181. package/src/Engine/Interfaces/combinations/gameCombinations.ts +48 -0
  182. package/src/Engine/Interfaces/compiledLocation.ts +37 -0
  183. package/src/Engine/Interfaces/conversations/conversation.ts +47 -0
  184. package/src/Engine/Interfaces/conversations/conversationLogEntry.ts +14 -0
  185. package/src/Engine/Interfaces/conversations/conversationNode.ts +26 -0
  186. package/src/Engine/Interfaces/conversations/conversationReply.ts +59 -0
  187. package/src/Engine/Interfaces/createCharacter/createCharacter.ts +23 -0
  188. package/src/Engine/Interfaces/createCharacter/createCharacterAttribute.ts +21 -0
  189. package/src/Engine/Interfaces/createCharacter/createCharacterAttributeEntry.ts +21 -0
  190. package/src/Engine/Interfaces/createCharacter/createCharacterQuestion.ts +21 -0
  191. package/src/Engine/Interfaces/createCharacter/createCharacterQuestionEntry.ts +25 -0
  192. package/src/Engine/Interfaces/createCharacter/createCharacterStep.ts +47 -0
  193. package/src/Engine/Interfaces/customCursor.ts +5 -0
  194. package/src/Engine/Interfaces/defaultEquipment.ts +32 -0
  195. package/src/Engine/Interfaces/definitions.ts +48 -0
  196. package/src/Engine/Interfaces/destination.ts +37 -0
  197. package/src/Engine/Interfaces/dynamicStyle.ts +11 -0
  198. package/src/Engine/Interfaces/enemy.ts +54 -0
  199. package/src/Engine/Interfaces/enumerations/actionStatus.ts +20 -0
  200. package/src/Engine/Interfaces/enumerations/actionType.ts +9 -0
  201. package/src/Engine/Interfaces/enumerations/equipmentType.ts +61 -0
  202. package/src/Engine/Interfaces/enumerations/gameState.ts +11 -0
  203. package/src/Engine/Interfaces/enumerations/playState.ts +10 -0
  204. package/src/Engine/Interfaces/enumerations/targetType.ts +9 -0
  205. package/src/Engine/Interfaces/equipment.ts +44 -0
  206. package/src/Engine/Interfaces/feature.ts +43 -0
  207. package/src/Engine/Interfaces/featureCollection.ts +8 -0
  208. package/src/Engine/Interfaces/game.ts +201 -0
  209. package/src/Engine/Interfaces/gameEvents.ts +11 -0
  210. package/src/Engine/Interfaces/groupableItem.ts +37 -0
  211. package/src/Engine/Interfaces/helpers.ts +55 -0
  212. package/src/Engine/Interfaces/index.ts +158 -0
  213. package/src/Engine/Interfaces/interfaceTexts.ts +142 -0
  214. package/src/Engine/Interfaces/item.ts +111 -0
  215. package/src/Engine/Interfaces/key.ts +18 -0
  216. package/src/Engine/Interfaces/location.ts +92 -0
  217. package/src/Engine/Interfaces/maps/map.ts +55 -0
  218. package/src/Engine/Interfaces/maps/mapLocation.ts +28 -0
  219. package/src/Engine/Interfaces/party.ts +40 -0
  220. package/src/Engine/Interfaces/person.ts +29 -0
  221. package/src/Engine/Interfaces/quest.ts +60 -0
  222. package/src/Engine/Interfaces/rules/characterRules.ts +96 -0
  223. package/src/Engine/Interfaces/rules/combatRules.ts +52 -0
  224. package/src/Engine/Interfaces/rules/combinationRules.ts +17 -0
  225. package/src/Engine/Interfaces/rules/demoMode.ts +18 -0
  226. package/src/Engine/Interfaces/rules/encounterRules.ts +5 -0
  227. package/src/Engine/Interfaces/rules/explorationRules.ts +47 -0
  228. package/src/Engine/Interfaces/rules/generalRules.ts +80 -0
  229. package/src/Engine/Interfaces/rules/rules.ts +46 -0
  230. package/src/Engine/Interfaces/rules/setupRules.ts +65 -0
  231. package/src/Engine/Interfaces/rules/titleScreen.ts +19 -0
  232. package/src/Engine/Interfaces/saveGame.ts +39 -0
  233. package/src/Engine/Interfaces/scoreEntry.ts +14 -0
  234. package/src/Engine/Interfaces/services/autoplayService.ts +23 -0
  235. package/src/Engine/Interfaces/services/characterService.ts +35 -0
  236. package/src/Engine/Interfaces/services/combatService.ts +30 -0
  237. package/src/Engine/Interfaces/services/combinationService.ts +10 -0
  238. package/src/Engine/Interfaces/services/commandService.ts +75 -0
  239. package/src/Engine/Interfaces/services/conversationService.ts +7 -0
  240. package/src/Engine/Interfaces/services/dataSerializer.ts +4 -0
  241. package/src/Engine/Interfaces/services/dataService.ts +39 -0
  242. package/src/Engine/Interfaces/services/dataSynchronizer.ts +9 -0
  243. package/src/Engine/Interfaces/services/gameService.ts +17 -0
  244. package/src/Engine/Interfaces/services/index.ts +33 -0
  245. package/src/Engine/Interfaces/services/itemService.ts +25 -0
  246. package/src/Engine/Interfaces/services/localStorageService.ts +6 -0
  247. package/src/Engine/Interfaces/services/locationService.ts +13 -0
  248. package/src/Engine/Interfaces/services/soundService.ts +7 -0
  249. package/src/Engine/Interfaces/services/tradeService.ts +15 -0
  250. package/src/Engine/Interfaces/soundPlayer.ts +30 -0
  251. package/src/Engine/Interfaces/sprite.ts +27 -0
  252. package/src/Engine/Interfaces/stateList.ts +13 -0
  253. package/src/Engine/Interfaces/statistics.ts +14 -0
  254. package/src/Engine/Interfaces/stock.ts +46 -0
  255. package/src/Engine/Interfaces/trade.ts +72 -0
  256. package/src/Engine/ServiceFactory.ts +167 -0
  257. package/src/Engine/Services/AutoplayService.ts +59 -0
  258. package/src/Engine/Services/CharacterService.ts +291 -0
  259. package/src/Engine/Services/CombatService.ts +266 -0
  260. package/src/Engine/Services/CombinationService.ts +197 -0
  261. package/src/Engine/Services/CommandService.ts +197 -0
  262. package/src/Engine/Services/ConversationService.ts +406 -0
  263. package/src/Engine/Services/DataSerializer.ts +326 -0
  264. package/src/Engine/Services/DataService.ts +93 -0
  265. package/src/Engine/Services/DataSynchronizer.ts +216 -0
  266. package/src/Engine/Services/GameService.ts +554 -0
  267. package/src/Engine/Services/HelperService.ts +94 -0
  268. package/src/Engine/Services/ItemService.ts +294 -0
  269. package/src/Engine/Services/LocalStorageService.ts +24 -0
  270. package/src/Engine/Services/LocationService.ts +380 -0
  271. package/src/Engine/Services/SoundService.ts +54 -0
  272. package/src/Engine/Services/TradeService.ts +176 -0
  273. package/src/Engine/Services/index.ts +17 -0
  274. package/src/Engine/Services/serializationData.ts +8 -0
  275. package/src/Engine/Services/sharedFunctions.ts +296 -0
  276. package/src/Engine/arrayAndFunctionExtensions.ts +269 -0
  277. package/src/Engine/defaultTexts.ts +162 -0
  278. package/src/Engine/gameEvents.ts +51 -0
  279. package/src/Engine/index.ts +9 -0
  280. package/src/Engine/stateProperties.ts +9 -0
  281. package/src/Engine/utilityFunctions.ts +238 -0
  282. package/src/Games/_GameTemplate/character.ts +31 -0
  283. package/src/Games/_GameTemplate/customTexts.ts +8 -0
  284. package/src/Games/_GameTemplate/interfaces/action.ts +5 -0
  285. package/src/Games/_GameTemplate/interfaces/combatSetup.ts +7 -0
  286. package/src/Games/_GameTemplate/interfaces/combatTurn.ts +8 -0
  287. package/src/Games/_GameTemplate/interfaces/destination.ts +5 -0
  288. package/src/Games/_GameTemplate/interfaces/enemy.ts +11 -0
  289. package/src/Games/_GameTemplate/interfaces/equipment.ts +5 -0
  290. package/src/Games/_GameTemplate/interfaces/feature.ts +9 -0
  291. package/src/Games/_GameTemplate/interfaces/game.ts +22 -0
  292. package/src/Games/_GameTemplate/interfaces/interfaceTexts.ts +5 -0
  293. package/src/Games/_GameTemplate/interfaces/item.ts +18 -0
  294. package/src/Games/_GameTemplate/interfaces/key.ts +10 -0
  295. package/src/Games/_GameTemplate/interfaces/location.ts +22 -0
  296. package/src/Games/_GameTemplate/interfaces/map.ts +16 -0
  297. package/src/Games/_GameTemplate/interfaces/party.ts +8 -0
  298. package/src/Games/_GameTemplate/interfaces/person.ts +11 -0
  299. package/src/Games/_GameTemplate/interfaces/quest.ts +9 -0
  300. package/src/Games/_GameTemplate/locations/Start.html +5 -0
  301. package/src/Games/_GameTemplate/locations/start.ts +12 -0
  302. package/src/Games/_GameTemplate/rules.ts +60 -0
  303. package/src/Games/_GameTemplate/types.ts +55 -0
  304. package/src/Games/_GameTemplate/ui/styles/game.css +3 -0
  305. package/src/Games/_GameTemplate/webroot/favicon.ico +0 -0
  306. package/src/Games/_GameTemplate/webroot/gameinfo.json +10 -0
  307. package/src/Games/_GameTemplate/webroot/logo192.png +0 -0
  308. package/src/Games/_GameTemplate/webroot/logo512.png +0 -0
  309. package/src/Tests/Games/_GameTemplate/specs/rules.test.ts +9 -0
  310. package/src/UI/Components/AppShell.vue +43 -0
  311. package/src/UI/Components/Autoplay.vue +32 -0
  312. package/src/UI/Components/Combinations.vue +37 -0
  313. package/src/UI/Components/Common/Collapsible.vue +50 -0
  314. package/src/UI/Components/Common/ModalDialog.vue +54 -0
  315. package/src/UI/Components/Common/Sprite.vue +53 -0
  316. package/src/UI/Components/Description.vue +23 -0
  317. package/src/UI/Components/Encounter/Combat/Combat.vue +89 -0
  318. package/src/UI/Components/Encounter/Combat/CombatActions.vue +26 -0
  319. package/src/UI/Components/Encounter/Combat/CombatParticipant.vue +22 -0
  320. package/src/UI/Components/Encounter/Combat/CombatTargetSelect.vue +55 -0
  321. package/src/UI/Components/Encounter/Combat/CombatWin.vue +33 -0
  322. package/src/UI/Components/Encounter/Conversation.vue +66 -0
  323. package/src/UI/Components/Encounter/Encounter.vue +39 -0
  324. package/src/UI/Components/Encounter/Enemy.vue +30 -0
  325. package/src/UI/Components/Encounter/Trade/Stock.vue +58 -0
  326. package/src/UI/Components/Encounter/Trade/Trade.vue +24 -0
  327. package/src/UI/Components/Exploration/ActionLog.vue +17 -0
  328. package/src/UI/Components/Exploration/Destination.vue +66 -0
  329. package/src/UI/Components/Exploration/Exploration.vue +67 -0
  330. package/src/UI/Components/Exploration/Ground.vue +22 -0
  331. package/src/UI/Components/Exploration/LocationMap.vue +42 -0
  332. package/src/UI/Components/Exploration/LocationText.vue +39 -0
  333. package/src/UI/Components/Exploration/LocationVisual.vue +38 -0
  334. package/src/UI/Components/GameContainer.vue +49 -0
  335. package/src/UI/Components/GameMenu.vue +111 -0
  336. package/src/UI/Components/GameState/GameOver.vue +20 -0
  337. package/src/UI/Components/GameState/HighScores.vue +22 -0
  338. package/src/UI/Components/GameState/Intro.vue +17 -0
  339. package/src/UI/Components/GameState/TitleScreen.vue +42 -0
  340. package/src/UI/Components/GameState/Victory.vue +28 -0
  341. package/src/UI/Components/Navigation.vue +94 -0
  342. package/src/UI/Components/Party/Backpack.vue +68 -0
  343. package/src/UI/Components/Party/BuildCharacter.vue +64 -0
  344. package/src/UI/Components/Party/CharacterSheet.vue +57 -0
  345. package/src/UI/Components/Party/CreateCharacter.vue +46 -0
  346. package/src/UI/Components/Party/Equipment.vue +48 -0
  347. package/src/UI/Components/Party/EquipmentSlot.vue +31 -0
  348. package/src/UI/Components/Party/LevelUp.vue +27 -0
  349. package/src/UI/Components/Party/Party.vue +29 -0
  350. package/src/UI/Components/Party/Quests.vue +48 -0
  351. package/src/UI/Components/Sound.vue +42 -0
  352. package/src/UI/Composables/CustomCursor.ts +60 -0
  353. package/src/UI/Composables/LocationMap.ts +315 -0
  354. package/src/UI/Composables/Sound.ts +111 -0
  355. package/src/UI/Composables/TextFeatures.ts +148 -0
  356. package/src/UI/Composables/VisualFeatures.ts +220 -0
  357. package/src/UI/Composables/index.ts +15 -0
  358. package/src/UI/Composables/playStateWatch.ts +31 -0
  359. package/src/UI/StateStore.ts +237 -0
  360. package/src/UI/error.ts +6 -0
  361. package/src/UI/helpers.ts +62 -0
  362. package/src/UI/index.ts +13 -0
  363. package/src/UI/main.ts +62 -0
  364. package/src/UI/startup.ts +58 -0
  365. package/src/UI/styles/bootstrap-storyscript.scss +31 -0
  366. package/src/UI/styles/empty.css +3 -0
  367. package/src/UI/styles/lookinglass.png +0 -0
  368. package/src/UI/styles/storyscript.css +735 -0
  369. package/typeExtensions.d.ts +25 -0
  370. 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>