@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,406 @@
1
+ import {
2
+ IConversation,
3
+ IConversationNode,
4
+ IConversationReply,
5
+ IConversationService,
6
+ IGame,
7
+ IPerson,
8
+ IQuest,
9
+ IRules,
10
+ PlayState
11
+ } from 'storyScript';
12
+ import {parseGamePropertiesInTemplate} from './sharedFunctions';
13
+ import {compareString, hasItem} from "../utilityFunctions";
14
+ import {getParsedDocument} from "../EntityCreatorFunctions";
15
+
16
+ export class ConversationService implements IConversationService {
17
+ constructor(private readonly _game: IGame, private readonly _rules: IRules) {
18
+ }
19
+
20
+ talk = (person: IPerson): void => {
21
+ this.loadConversation(person);
22
+ this.initConversation(person);
23
+ this._game.playState = PlayState.Conversation;
24
+ }
25
+
26
+ answer = (node: IConversationNode, reply: IConversationReply): void => {
27
+ const person = this._game.person;
28
+
29
+ person.conversation.conversationLog ??= [];
30
+
31
+ person.conversation.conversationLog.push({
32
+ lines: node.lines,
33
+ reply: reply.lines
34
+ });
35
+
36
+ if (reply.questStart) {
37
+ this.questProgress('questStart', person, reply);
38
+ }
39
+
40
+ if (reply.questComplete) {
41
+ this.questProgress('questComplete', person, reply);
42
+ }
43
+
44
+ this.processReply(person, reply);
45
+ }
46
+
47
+ private readonly loadConversation = (person: IPerson): void => {
48
+ if (person.conversation && !person.conversation.nodes) {
49
+ person.conversation.actions ??= [];
50
+ const conversationElement = getParsedDocument('conversation', person.description)[0];
51
+ const defaultReply = this.getDefaultReply(conversationElement, person);
52
+ const conversationNodes = conversationElement.getElementsByTagName('node');
53
+
54
+ person.conversation.nodes = [];
55
+ this.processConversationNodes(conversationNodes, person, defaultReply);
56
+ this.checkNodes(person);
57
+
58
+ const nodeToSelect = person.conversation.nodes.filter(n => person.conversation.activeNode && n.node === person.conversation.activeNode.node);
59
+ person.conversation.activeNode = nodeToSelect.length === 1 ? nodeToSelect[0] : null;
60
+ }
61
+ }
62
+
63
+ private readonly initConversation = (person: IPerson): void => {
64
+ this._game.person = person;
65
+ const activeNode = this.getActiveNode(person);
66
+
67
+ if (!activeNode) {
68
+ return;
69
+ }
70
+
71
+ person.conversation.activeNode = activeNode;
72
+
73
+ this.initReplies(person);
74
+ this.setReplyStatus(person.conversation, activeNode);
75
+ this.executeAction(activeNode.trigger, person);
76
+ }
77
+
78
+ private readonly getDefaultReply = (conversationElement: Element, person: IPerson): string => {
79
+ const defaultReplyNodes = conversationElement.getElementsByTagName('default-reply');
80
+ let defaultReply: string = null;
81
+
82
+ if (defaultReplyNodes.length > 1) {
83
+ throw new Error('More than one default reply in conversation for person ' + person.id + '.');
84
+ } else if (defaultReplyNodes.length === 1) {
85
+ defaultReply = defaultReplyNodes[0].innerHTML.trim();
86
+ }
87
+
88
+ return defaultReply;
89
+ }
90
+
91
+ private readonly processConversationNodes = (conversationNodes: HTMLCollectionOf<Element>, person: IPerson, defaultReply: string) => {
92
+ for (const element of conversationNodes) {
93
+ const newNode = this.getNewNode(person, element);
94
+ this.processReplyNodes(person, element, newNode, defaultReply);
95
+
96
+ if (!newNode.replies && defaultReply) {
97
+ newNode.replies = [
98
+ {
99
+ defaultReply: true,
100
+ lines: defaultReply
101
+ }
102
+ ]
103
+ }
104
+
105
+ newNode.lines = parseGamePropertiesInTemplate(element.innerHTML.trim(), this._game);
106
+ person.conversation.nodes.push(newNode);
107
+ }
108
+ }
109
+
110
+ private readonly getNewNode = (person: IPerson, node: Element): IConversationNode => {
111
+ let nameAttribute = this.GetNodeValue(node, 'name');
112
+
113
+ if (!nameAttribute && console) {
114
+ console.log('Missing name attribute on node for conversation for person ' + person.id + '. Using \'default\' as default name');
115
+ nameAttribute = 'default';
116
+ }
117
+
118
+ if (person.conversation.nodes.some((node) => {
119
+ return node.node == nameAttribute;
120
+ })) {
121
+ throw new Error('Duplicate nodes with name ' + nameAttribute + ' for conversation for person ' + person.id + '.');
122
+ }
123
+
124
+ return <IConversationNode>{
125
+ node: nameAttribute,
126
+ trigger: this.GetNodeValue(node, 'trigger'),
127
+ lines: '',
128
+ replies: null
129
+ };
130
+ }
131
+
132
+ private readonly processReplyNodes = (person: IPerson, node: Element, newNode: IConversationNode, defaultReply: string): void => {
133
+ for (const replies of node.childNodes) {
134
+ if (compareString(replies.nodeName, 'replies')) {
135
+ newNode.replies = [];
136
+ const addDefaultValue = this.GetNodeValue(replies, 'default-reply');
137
+ const addDefaultReply = !compareString(addDefaultValue, 'false');
138
+ this.buildReplies(person, newNode, replies);
139
+ node.removeChild(replies);
140
+
141
+ if (defaultReply && addDefaultReply) {
142
+ newNode.replies.push(<IConversationReply>{
143
+ lines: parseGamePropertiesInTemplate(defaultReply, this._game)
144
+ });
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+ private readonly buildReplies = (person: IPerson, newNode: IConversationNode, replies: ChildNode): void => {
151
+ for (const replyNode of replies.childNodes) {
152
+ if (compareString(replyNode.nodeName, 'reply')) {
153
+ const requires = this.GetNodeValue(replyNode, 'requires');
154
+ const linkToNode = this.GetNodeValue(replyNode, 'node');
155
+ const trigger = this.GetNodeValue(replyNode, 'trigger');
156
+ const questStart = this.GetNodeValue(replyNode, 'quest-start');
157
+ const questComplete = this.GetNodeValue(replyNode, 'quest-complete');
158
+ const setStart = this.GetNodeValue(replyNode, 'set-start');
159
+ const once = this.GetNodeValue(replyNode, 'once') === 'true';
160
+
161
+ if (trigger && !person.conversation.actions.some(([k, _]) => k === trigger)) {
162
+ console.log('No action ' + trigger + ' for node ' + newNode.node + ' found.');
163
+ }
164
+
165
+ const reply = <IConversationReply>{
166
+ requires: requires,
167
+ linkToNode: linkToNode,
168
+ trigger: trigger,
169
+ questStart: questStart,
170
+ questComplete: questComplete,
171
+ setStart: setStart,
172
+ once: once,
173
+ lines: parseGamePropertiesInTemplate((<any>replyNode).innerHTML.trim(), this._game)
174
+ };
175
+
176
+ newNode.replies.push(reply);
177
+ }
178
+ }
179
+ }
180
+
181
+ private readonly checkNodes = (person: IPerson): void => {
182
+ person.conversation.nodes.forEach(n => {
183
+ if (n.replies) {
184
+ n.replies.forEach(r => {
185
+ if (r.linkToNode && !person.conversation.nodes.some(n => n.node === r.linkToNode)) {
186
+ console.log('No node ' + r.linkToNode + ' to link to found for node ' + n.node + '.');
187
+ }
188
+
189
+ if (r.setStart && !person.conversation.nodes.some(n => n.node === r.setStart)) {
190
+ console.log('No new start node ' + r.setStart + ' found for node ' + n.node + '.');
191
+ }
192
+ });
193
+ }
194
+ });
195
+ }
196
+
197
+ private readonly GetNodeValue = (node: Node, attribute: string): string => (<any>node).attributes[attribute]?.value
198
+
199
+ private readonly getActiveNode = (person: IPerson): IConversationNode => {
200
+ if (!person?.conversation) {
201
+ return null;
202
+ }
203
+
204
+ const conversation = person.conversation;
205
+ let activeNode = conversation.activeNode;
206
+
207
+ if (!activeNode) {
208
+ activeNode = conversation.selectActiveNode ? conversation.selectActiveNode(this._game, person) : null;
209
+ }
210
+
211
+ if (!activeNode) {
212
+ activeNode = conversation.nodes.filter((node) => {
213
+ return compareString(node.node, person.conversation.startNode);
214
+ })[0];
215
+ }
216
+
217
+ if (!activeNode) {
218
+ activeNode = conversation.nodes[0];
219
+ }
220
+
221
+ return activeNode;
222
+ }
223
+
224
+ private readonly initReplies = (person: IPerson): void => {
225
+ const activeNode = person.conversation.activeNode;
226
+
227
+ activeNode.replies = activeNode.replies.filter(r =>
228
+ !r.once || !person.conversation.singleRepliesChosen?.includes(this.getReplyId(activeNode, r)));
229
+
230
+ activeNode.replies.forEach(reply => {
231
+ if (reply.linkToNode) {
232
+ if (!person.conversation.nodes.some((node) => {
233
+ return node.node === reply.linkToNode;
234
+ })) {
235
+ console.log('No node ' + reply.linkToNode + ' found to link to for reply ' + reply.lines + '!');
236
+ }
237
+ }
238
+
239
+ if (reply.requires) {
240
+ reply.available = this.checkReplyAvailability(activeNode, reply);
241
+ }
242
+ });
243
+
244
+ this._rules.encounters?.initReplies?.(this._game, activeNode);
245
+ }
246
+
247
+ private readonly processReply = (person: IPerson, reply: IConversationReply) => {
248
+ this.executeAction(reply.trigger, person);
249
+ const conversation = person.conversation;
250
+
251
+ if (reply.setStart) {
252
+ const startNode = conversation.nodes.filter((node) => {
253
+ return node.node == reply.setStart;
254
+ })[0];
255
+ conversation.startNode = startNode.node;
256
+ }
257
+
258
+ let activeNode = null;
259
+
260
+ if (reply.linkToNode) {
261
+ if (reply.once) {
262
+ conversation.singleRepliesChosen = !conversation.singleRepliesChosen ? '' : conversation.singleRepliesChosen + ';';
263
+ conversation.singleRepliesChosen += this.getReplyId(conversation.activeNode, reply);
264
+ }
265
+
266
+ activeNode = conversation.nodes.filter((node) => {
267
+ return node.node == reply.linkToNode;
268
+ })[0];
269
+
270
+ conversation.activeNode = activeNode;
271
+ this.executeAction(activeNode.trigger, person);
272
+ this.setReplyStatus(conversation, activeNode);
273
+ } else {
274
+ conversation.activeNode = null;
275
+ }
276
+ }
277
+
278
+ private readonly executeAction = (key: string, person: IPerson) => {
279
+ const action = key ? person.conversation.actions.find(([k, _]) => k === key)?.[1] : null;
280
+ action?.(this._game, person);
281
+ }
282
+
283
+ private readonly checkReplyAvailability = (activeNode: IConversationNode, reply: IConversationReply): boolean => {
284
+ let isAvailable = true;
285
+ const requirements = reply.requires.split(',');
286
+
287
+ for (const m in requirements) {
288
+ const requirement = requirements[m];
289
+ const values = requirement.toLowerCase().trim().split('=');
290
+ const type = values[0];
291
+ const value = values[1];
292
+
293
+ if (!type || !value) {
294
+ console.log('Invalid reply requirement for node ' + activeNode.node + '!');
295
+ }
296
+
297
+ isAvailable = this.checkReplyRequirements(activeNode, type, value);
298
+
299
+ if (!isAvailable) {
300
+ break;
301
+ }
302
+ }
303
+
304
+ return isAvailable;
305
+ }
306
+
307
+ private readonly checkReplyRequirements = (activeNode: IConversationNode, type: string, value: string): boolean => {
308
+ let isAvailable: boolean;
309
+
310
+ switch (type) {
311
+ case 'item': {
312
+ isAvailable = !!hasItem(this._game.party, value);
313
+ }
314
+ break;
315
+ case 'location': {
316
+ // Check location visited
317
+ const location = this._game.locations.get(value);
318
+
319
+ if (!location) {
320
+ console.log('Invalid location ' + value + ' for reply requirement for node ' + activeNode.node + '!');
321
+ }
322
+
323
+ isAvailable = location.hasVisited === true;
324
+ }
325
+ break;
326
+ case 'quest-start':
327
+ case 'quest-done':
328
+ case 'quest-complete': {
329
+ // Check quest start, quest done or quest complete.
330
+ const quest = this._game.party.quests.get(value);
331
+
332
+ if (quest) {
333
+ if (type === 'quest-start') {
334
+ isAvailable = true;
335
+ } else if (type === 'quest-done') {
336
+ isAvailable = quest.checkDone(this._game, quest);
337
+ } else {
338
+ isAvailable = quest.completed;
339
+ }
340
+ }
341
+ }
342
+ break;
343
+ default: {
344
+ // Check attributes
345
+ const attribute = this._game.activeCharacter[type];
346
+
347
+ if (!attribute) {
348
+ console.log('Invalid attribute ' + type + ' for reply requirement for node ' + activeNode.node + '!');
349
+ }
350
+
351
+ isAvailable = isNaN(attribute) ? attribute === value : parseInt(attribute) >= parseInt(value);
352
+ }
353
+ break;
354
+ }
355
+
356
+ return isAvailable;
357
+ }
358
+
359
+ private readonly setReplyStatus = (conversation: IConversation, node: IConversationNode): void => {
360
+ node.replies?.forEach(reply => {
361
+ if (reply.available === undefined) {
362
+ reply.available = true;
363
+ }
364
+ if (reply.showWhenUnavailable === undefined) {
365
+ reply.showWhenUnavailable = conversation.showUnavailableReplies;
366
+ }
367
+ });
368
+ }
369
+
370
+ private readonly questProgress = (type: string, person: IPerson, reply: IConversationReply): void => {
371
+ let quest: IQuest;
372
+ const start = type === 'questStart';
373
+
374
+ if (start) {
375
+ quest = person.quests.get(reply[type]);
376
+
377
+ if (!quest.started) {
378
+ quest.issuedBy = person.id;
379
+ person.quests.delete(quest);
380
+ this._game.party.quests.add(quest);
381
+ quest.progress = quest.progress || {};
382
+
383
+ if (quest.start) {
384
+ quest.start(this._game, quest, person);
385
+ }
386
+
387
+ quest.started = true;
388
+ quest.completed = false;
389
+ }
390
+ } else {
391
+ quest = this._game.party.quests.get(reply[type]);
392
+
393
+ if (!quest.completed) {
394
+ if (quest.complete) {
395
+ quest.complete(this._game, quest, person);
396
+ }
397
+
398
+ quest.completed = true;
399
+ }
400
+ }
401
+ }
402
+
403
+ private readonly getReplyId = (node: IConversationNode, reply: IConversationReply): string => {
404
+ return `${node.node}_${reply.linkToNode}`;
405
+ }
406
+ }