@turnipxenon/pineapple 1.1.2

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 (322) hide show
  1. package/README.md +38 -0
  2. package/dist/app.postcss +94 -0
  3. package/dist/assets/bg_tiled/bg_tiled_ares.png +0 -0
  4. package/dist/assets/bg_tiled/bg_tiled_corn.png +0 -0
  5. package/dist/assets/bg_tiled/bg_tiled_pineapple.png +0 -0
  6. package/dist/assets/bg_tiled/bg_tiled_reinhard.png +0 -0
  7. package/dist/assets/bg_tiled/bg_tiled_tomato.png +0 -0
  8. package/dist/assets/bg_tiled/bg_tiled_turnip.png +0 -0
  9. package/dist/assets/characters/ares/ares_blushing.webp +0 -0
  10. package/dist/assets/characters/ares/ares_disappointed.webp +0 -0
  11. package/dist/assets/characters/ares/ares_happy.webp +0 -0
  12. package/dist/assets/characters/ares/ares_lets_go.webp +0 -0
  13. package/dist/assets/characters/ares/ares_logo.webp +0 -0
  14. package/dist/assets/characters/ares/ares_mad.webp +0 -0
  15. package/dist/assets/characters/ares/ares_neutral.webp +0 -0
  16. package/dist/assets/characters/ares/ares_slightly_mad.webp +0 -0
  17. package/dist/assets/characters/ares/ares_surprised.webp +0 -0
  18. package/dist/assets/characters/ares/ares_yay.webp +0 -0
  19. package/dist/assets/game_dev/footage-chef-wings.gif +0 -0
  20. package/dist/assets/game_dev/footage-depreciation.webm +0 -0
  21. package/dist/assets/game_dev/footage-thinking-of-flowers.webm +0 -0
  22. package/dist/assets/game_dev/screenshot-game-jam-mama.png +0 -0
  23. package/dist/assets/game_dev/screenshot-string-hop.png +0 -0
  24. package/dist/assets/game_dev/screenshot-wet-ass-road.png +0 -0
  25. package/dist/assets/icons/chat_cursor.svg +47 -0
  26. package/dist/assets/icons/external_link.svg +50 -0
  27. package/dist/assets/temp/background-image.jpg +0 -0
  28. package/dist/assets/temp/bitbucket-logo.png +0 -0
  29. package/dist/assets/temp/github-logo.png +0 -0
  30. package/dist/assets/temp/header-hep-cat.mp4 +0 -0
  31. package/dist/assets/temp/header-hep-cat.ogg +0 -0
  32. package/dist/assets/temp/header-hep-cat.webm +0 -0
  33. package/dist/assets/temp/header-pengi.mp4 +0 -0
  34. package/dist/assets/temp/header-pengi.webm +0 -0
  35. package/dist/assets/temp/header-soulwork.mp4 +0 -0
  36. package/dist/assets/temp/header-soulwork.ogg +0 -0
  37. package/dist/assets/temp/header-soulwork.webm +0 -0
  38. package/dist/components/DialogOverlay.svelte +93 -0
  39. package/dist/components/DialogOverlay.svelte.d.ts +14 -0
  40. package/dist/components/LazyAsset.svelte +96 -0
  41. package/dist/components/LazyAsset.svelte.d.ts +20 -0
  42. package/dist/components/LazyAssetType.d.ts +10 -0
  43. package/dist/components/LazyAssetType.js +12 -0
  44. package/dist/components/PineappleBaseLayout.svelte +186 -0
  45. package/dist/components/PineappleBaseLayout.svelte.d.ts +19 -0
  46. package/dist/components/RandomizedBackground.svelte +62 -0
  47. package/dist/components/RandomizedBackground.svelte.d.ts +16 -0
  48. package/dist/components/RandomizedImage.svelte +29 -0
  49. package/dist/components/RandomizedImage.svelte.d.ts +17 -0
  50. package/dist/components/dialog_manager/DialogManager.d.ts +77 -0
  51. package/dist/components/dialog_manager/DialogManager.js +239 -0
  52. package/dist/components/dialog_manager/DialogManagerStore.d.ts +41 -0
  53. package/dist/components/dialog_manager/DialogManagerStore.js +45 -0
  54. package/dist/components/dialog_manager/DialogProcessor.d.ts +13 -0
  55. package/dist/components/dialog_manager/DialogProcessor.js +62 -0
  56. package/dist/components/dialog_manager/DialogUtils.d.ts +5 -0
  57. package/dist/components/dialog_manager/DialogUtils.js +8 -0
  58. package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.d.ts +15 -0
  59. package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.js +34 -0
  60. package/dist/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.d.ts +4 -0
  61. package/dist/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.js +1 -0
  62. package/dist/components/dialog_manager/behavior_tree/core/BehaviorNode.d.ts +3 -0
  63. package/dist/components/dialog_manager/behavior_tree/core/BehaviorNode.js +1 -0
  64. package/dist/components/dialog_manager/behavior_tree/core/BehaviorStatus.d.ts +5 -0
  65. package/dist/components/dialog_manager/behavior_tree/core/BehaviorStatus.js +6 -0
  66. package/dist/components/dialog_manager/behavior_tree/core/SelectorNode.d.ts +12 -0
  67. package/dist/components/dialog_manager/behavior_tree/core/SelectorNode.js +22 -0
  68. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.d.ts +5 -0
  69. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.js +1 -0
  70. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.d.ts +4 -0
  71. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.js +1 -0
  72. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.d.ts +15 -0
  73. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.js +220 -0
  74. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionResult.d.ts +5 -0
  75. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionResult.js +1 -0
  76. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.d.ts +8 -0
  77. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.js +15 -0
  78. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionState.d.ts +3 -0
  79. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionState.js +1 -0
  80. package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.d.ts +10 -0
  81. package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.js +15 -0
  82. package/dist/components/dialog_manager/behavior_tree/expression/OperatorNode.d.ts +11 -0
  83. package/dist/components/dialog_manager/behavior_tree/expression/OperatorNode.js +30 -0
  84. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.d.ts +6 -0
  85. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.js +21 -0
  86. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.d.ts +9 -0
  87. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.js +19 -0
  88. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandMap.d.ts +9 -0
  89. package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandMap.js +18 -0
  90. package/dist/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.d.ts +15 -0
  91. package/dist/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.js +24 -0
  92. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.d.ts +20 -0
  93. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.js +32 -0
  94. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.d.ts +13 -0
  95. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.js +25 -0
  96. package/dist/components/dialog_manager/behavior_tree/expression/operators/AndOperator.d.ts +7 -0
  97. package/dist/components/dialog_manager/behavior_tree/expression/operators/AndOperator.js +15 -0
  98. package/dist/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.d.ts +7 -0
  99. package/dist/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.js +14 -0
  100. package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.d.ts +7 -0
  101. package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.js +12 -0
  102. package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.d.ts +7 -0
  103. package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.js +12 -0
  104. package/dist/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.d.ts +7 -0
  105. package/dist/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.js +12 -0
  106. package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.d.ts +7 -0
  107. package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.js +12 -0
  108. package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.d.ts +7 -0
  109. package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.js +12 -0
  110. package/dist/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.d.ts +7 -0
  111. package/dist/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.js +13 -0
  112. package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.d.ts +17 -0
  113. package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.js +32 -0
  114. package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.d.ts +9 -0
  115. package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.js +47 -0
  116. package/dist/components/dialog_manager/behavior_tree/expression/operators/OrOperator.d.ts +7 -0
  117. package/dist/components/dialog_manager/behavior_tree/expression/operators/OrOperator.js +13 -0
  118. package/dist/components/dialog_manager/behavior_tree/expression/operators/XorOperator.d.ts +7 -0
  119. package/dist/components/dialog_manager/behavior_tree/expression/operators/XorOperator.js +17 -0
  120. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.d.ts +7 -0
  121. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.js +14 -0
  122. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.d.ts +7 -0
  123. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.js +14 -0
  124. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.d.ts +7 -0
  125. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.js +12 -0
  126. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.d.ts +7 -0
  127. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.js +14 -0
  128. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.d.ts +7 -0
  129. package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.js +14 -0
  130. package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.d.ts +4 -0
  131. package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.js +1 -0
  132. package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.d.ts +6 -0
  133. package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.js +1 -0
  134. package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.d.ts +6 -0
  135. package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.js +1 -0
  136. package/dist/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.d.ts +8 -0
  137. package/dist/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.js +15 -0
  138. package/dist/components/dialog_manager/behavior_tree/line_processors/BehaviorState.d.ts +5 -0
  139. package/dist/components/dialog_manager/behavior_tree/line_processors/BehaviorState.js +5 -0
  140. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.d.ts +11 -0
  141. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.js +53 -0
  142. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseNode.d.ts +11 -0
  143. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseNode.js +49 -0
  144. package/dist/components/dialog_manager/behavior_tree/line_processors/EndIfNode.d.ts +11 -0
  145. package/dist/components/dialog_manager/behavior_tree/line_processors/EndIfNode.js +23 -0
  146. package/dist/components/dialog_manager/behavior_tree/line_processors/IfMode.d.ts +6 -0
  147. package/dist/components/dialog_manager/behavior_tree/line_processors/IfMode.js +8 -0
  148. package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.d.ts +12 -0
  149. package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.js +43 -0
  150. package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.d.ts +11 -0
  151. package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.js +25 -0
  152. package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.d.ts +6 -0
  153. package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.js +18 -0
  154. package/dist/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.d.ts +6 -0
  155. package/dist/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.js +17 -0
  156. package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.d.ts +10 -0
  157. package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.js +38 -0
  158. package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.d.ts +11 -0
  159. package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.js +31 -0
  160. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.d.ts +8 -0
  161. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.js +39 -0
  162. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts +8 -0
  163. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.js +40 -0
  164. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.d.ts +9 -0
  165. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.js +28 -0
  166. package/dist/index.d.ts +8 -0
  167. package/dist/index.js +8 -0
  168. package/dist/scripts/SetDefaultEnvironment.d.ts +1 -0
  169. package/dist/scripts/SetDefaultEnvironment.js +41 -0
  170. package/dist/scripts/pineapple_fiber/PineappleWeaver.d.ts +9 -0
  171. package/dist/scripts/pineapple_fiber/PineappleWeaver.js +201 -0
  172. package/dist/scripts/util/FileManagement.d.ts +7 -0
  173. package/dist/scripts/util/FileManagement.js +35 -0
  174. package/dist/scripts/util/ManualCheck.d.ts +1 -0
  175. package/dist/scripts/util/ManualCheck.js +28 -0
  176. package/dist/scripts/util/ManualCheckRun.d.ts +1 -0
  177. package/dist/scripts/util/ManualCheckRun.js +6 -0
  178. package/dist/store.d.ts +17 -0
  179. package/dist/store.js +17 -0
  180. package/dist/styles/DefaultGridContainer.css +61 -0
  181. package/dist/theme.postcss +107 -0
  182. package/dist/types/BlogBlurbMeta.d.ts +11 -0
  183. package/dist/types/BlogBlurbMeta.js +16 -0
  184. package/dist/types/BreadcrumbData.d.ts +4 -0
  185. package/dist/types/BreadcrumbData.js +1 -0
  186. package/dist/types/pineapple_fiber/DialogDetail.d.ts +6 -0
  187. package/dist/types/pineapple_fiber/DialogDetail.js +1 -0
  188. package/dist/types/pineapple_fiber/DialogState.d.ts +5 -0
  189. package/dist/types/pineapple_fiber/DialogState.js +6 -0
  190. package/dist/types/pineapple_fiber/DialogVariableStore.d.ts +2 -0
  191. package/dist/types/pineapple_fiber/DialogVariableStore.js +20 -0
  192. package/dist/types/pineapple_fiber/PortraitType.d.ts +11 -0
  193. package/dist/types/pineapple_fiber/PortraitType.js +12 -0
  194. package/dist/util/stable_random.d.ts +2 -0
  195. package/dist/util/stable_random.js +15 -0
  196. package/package.json +67 -0
  197. package/src/app.html +13 -0
  198. package/src/lib/app.postcss +94 -0
  199. package/src/lib/assets/bg_tiled/bg_tiled_ares.png +0 -0
  200. package/src/lib/assets/bg_tiled/bg_tiled_corn.png +0 -0
  201. package/src/lib/assets/bg_tiled/bg_tiled_pineapple.png +0 -0
  202. package/src/lib/assets/bg_tiled/bg_tiled_reinhard.png +0 -0
  203. package/src/lib/assets/bg_tiled/bg_tiled_tomato.png +0 -0
  204. package/src/lib/assets/bg_tiled/bg_tiled_turnip.png +0 -0
  205. package/src/lib/assets/characters/ares/ares_blushing.webp +0 -0
  206. package/src/lib/assets/characters/ares/ares_disappointed.webp +0 -0
  207. package/src/lib/assets/characters/ares/ares_happy.webp +0 -0
  208. package/src/lib/assets/characters/ares/ares_lets_go.webp +0 -0
  209. package/src/lib/assets/characters/ares/ares_logo.webp +0 -0
  210. package/src/lib/assets/characters/ares/ares_mad.webp +0 -0
  211. package/src/lib/assets/characters/ares/ares_neutral.webp +0 -0
  212. package/src/lib/assets/characters/ares/ares_slightly_mad.webp +0 -0
  213. package/src/lib/assets/characters/ares/ares_surprised.webp +0 -0
  214. package/src/lib/assets/characters/ares/ares_yay.webp +0 -0
  215. package/src/lib/assets/game_dev/footage-chef-wings.gif +0 -0
  216. package/src/lib/assets/game_dev/footage-depreciation.webm +0 -0
  217. package/src/lib/assets/game_dev/footage-thinking-of-flowers.webm +0 -0
  218. package/src/lib/assets/game_dev/screenshot-game-jam-mama.png +0 -0
  219. package/src/lib/assets/game_dev/screenshot-string-hop.png +0 -0
  220. package/src/lib/assets/game_dev/screenshot-wet-ass-road.png +0 -0
  221. package/src/lib/assets/icons/chat_cursor.svg +47 -0
  222. package/src/lib/assets/icons/external_link.svg +50 -0
  223. package/src/lib/assets/temp/background-image.jpg +0 -0
  224. package/src/lib/assets/temp/bitbucket-logo.png +0 -0
  225. package/src/lib/assets/temp/github-logo.png +0 -0
  226. package/src/lib/assets/temp/header-hep-cat.mp4 +0 -0
  227. package/src/lib/assets/temp/header-hep-cat.ogg +0 -0
  228. package/src/lib/assets/temp/header-hep-cat.webm +0 -0
  229. package/src/lib/assets/temp/header-pengi.mp4 +0 -0
  230. package/src/lib/assets/temp/header-pengi.webm +0 -0
  231. package/src/lib/assets/temp/header-soulwork.mp4 +0 -0
  232. package/src/lib/assets/temp/header-soulwork.ogg +0 -0
  233. package/src/lib/assets/temp/header-soulwork.webm +0 -0
  234. package/src/lib/components/DialogOverlay.svelte +100 -0
  235. package/src/lib/components/LazyAsset.svelte +114 -0
  236. package/src/lib/components/LazyAssetType.ts +11 -0
  237. package/src/lib/components/PineappleBaseLayout.svelte +165 -0
  238. package/src/lib/components/RandomizedBackground.svelte +77 -0
  239. package/src/lib/components/RandomizedImage.svelte +31 -0
  240. package/src/lib/components/dialog_manager/DialogManager.ts +282 -0
  241. package/src/lib/components/dialog_manager/DialogManagerStore.ts +52 -0
  242. package/src/lib/components/dialog_manager/DialogProcessor.ts +68 -0
  243. package/src/lib/components/dialog_manager/DialogUtils.ts +10 -0
  244. package/src/lib/components/dialog_manager/behavior_tree/core/BTreeUtils.ts +40 -0
  245. package/src/lib/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.ts +5 -0
  246. package/src/lib/components/dialog_manager/behavior_tree/core/BehaviorNode.ts +3 -0
  247. package/src/lib/components/dialog_manager/behavior_tree/core/BehaviorStatus.ts +5 -0
  248. package/src/lib/components/dialog_manager/behavior_tree/core/SelectorNode.ts +32 -0
  249. package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionArguments.ts +6 -0
  250. package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.ts +5 -0
  251. package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.ts +236 -0
  252. package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionResult.ts +6 -0
  253. package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.ts +20 -0
  254. package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionState.ts +3 -0
  255. package/src/lib/components/dialog_manager/behavior_tree/expression/OperandNode.ts +19 -0
  256. package/src/lib/components/dialog_manager/behavior_tree/expression/OperatorNode.ts +37 -0
  257. package/src/lib/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.ts +28 -0
  258. package/src/lib/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.ts +34 -0
  259. package/src/lib/components/dialog_manager/behavior_tree/expression/commands/CommandMap.ts +26 -0
  260. package/src/lib/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.ts +31 -0
  261. package/src/lib/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.ts +38 -0
  262. package/src/lib/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.ts +28 -0
  263. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/AndOperator.ts +24 -0
  264. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.ts +21 -0
  265. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.ts +21 -0
  266. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.ts +21 -0
  267. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.ts +19 -0
  268. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.ts +21 -0
  269. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.ts +21 -0
  270. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.ts +20 -0
  271. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.ts +42 -0
  272. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.ts +53 -0
  273. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/OrOperator.ts +22 -0
  274. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/XorOperator.ts +24 -0
  275. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.ts +23 -0
  276. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.ts +23 -0
  277. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.ts +21 -0
  278. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.ts +23 -0
  279. package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.ts +23 -0
  280. package/src/lib/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.ts +5 -0
  281. package/src/lib/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.ts +7 -0
  282. package/src/lib/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.ts +7 -0
  283. package/src/lib/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.ts +20 -0
  284. package/src/lib/components/dialog_manager/behavior_tree/line_processors/BehaviorState.ts +6 -0
  285. package/src/lib/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.ts +59 -0
  286. package/src/lib/components/dialog_manager/behavior_tree/line_processors/ElseNode.ts +55 -0
  287. package/src/lib/components/dialog_manager/behavior_tree/line_processors/EndIfNode.ts +28 -0
  288. package/src/lib/components/dialog_manager/behavior_tree/line_processors/IfMode.ts +7 -0
  289. package/src/lib/components/dialog_manager/behavior_tree/line_processors/IfNode.ts +49 -0
  290. package/src/lib/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.ts +30 -0
  291. package/src/lib/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.ts +24 -0
  292. package/src/lib/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.ts +22 -0
  293. package/src/lib/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.ts +48 -0
  294. package/src/lib/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.ts +37 -0
  295. package/src/lib/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.ts +48 -0
  296. package/src/lib/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.ts +51 -0
  297. package/src/lib/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.ts +34 -0
  298. package/src/lib/index.ts +9 -0
  299. package/src/lib/scripts/SetDefaultEnvironment.ts +45 -0
  300. package/src/lib/scripts/pineapple_fiber/PineappleWeaver.ts +252 -0
  301. package/src/lib/scripts/util/FileManagement.ts +38 -0
  302. package/src/lib/scripts/util/ManualCheck.ts +32 -0
  303. package/src/lib/scripts/util/ManualCheckRun.ts +7 -0
  304. package/src/lib/store.ts +18 -0
  305. package/src/lib/styles/DefaultGridContainer.css +61 -0
  306. package/src/lib/theme.postcss +107 -0
  307. package/src/lib/types/BlogBlurbMeta.ts +16 -0
  308. package/src/lib/types/BreadcrumbData.ts +4 -0
  309. package/src/lib/types/pineapple_fiber/DialogDetail.ts +7 -0
  310. package/src/lib/types/pineapple_fiber/DialogState.ts +5 -0
  311. package/src/lib/types/pineapple_fiber/DialogVariableStore.ts +24 -0
  312. package/src/lib/types/pineapple_fiber/PortraitType.ts +11 -0
  313. package/src/lib/util/stable_random.ts +16 -0
  314. package/src/routes/+error.svelte +26 -0
  315. package/src/routes/+layout.svelte +23 -0
  316. package/src/routes/+page.svelte +41 -0
  317. package/src/routes/Error.yarn +7 -0
  318. package/src/routes/ErrorYarn.ts +24 -0
  319. package/src/routes/portfolio/+page.svelte +0 -0
  320. package/src/types.d.ts +8 -0
  321. package/static/default-card.png +0 -0
  322. package/static/favicon.png +0 -0
@@ -0,0 +1,114 @@
1
+ <script lang="ts">
2
+ import {LazyAssetStatus, LazyAssetType} from "$lib/components/LazyAssetType";
3
+ import BgTiledAres from "$lib/assets/bg_tiled/bg_tiled_ares.png";
4
+ import {onMount} from "svelte";
5
+
6
+ export let src: string;
7
+ export let alt: string;
8
+
9
+ // in pixels
10
+ export let width: string;
11
+ export let height: string;
12
+
13
+ // playsinline autoplay muted loop
14
+ // whatever your heart's content
15
+ export let props = {};
16
+ // todo: add size and alt text
17
+
18
+ props = {
19
+ ...props,
20
+ alt,
21
+ width,
22
+ height
23
+ };
24
+
25
+ // auto detect asset type
26
+ let extension = "";
27
+ const getAssetType = (): LazyAssetType => {
28
+ const srcArray = src.split(".");
29
+ extension = srcArray[srcArray.length - 1];
30
+ switch (extension) {
31
+ case "png":
32
+ case "webp":
33
+ case "gif":
34
+ case "jpg":
35
+ return LazyAssetType.Image;
36
+ case "ogg":
37
+ case "webm":
38
+ case "mp4":
39
+ return LazyAssetType.Video;
40
+ default:
41
+ console.log(`Unknown asset type for: ${src}`);
42
+ return LazyAssetType.Unknown;
43
+ }
44
+ };
45
+ const assetType: LazyAssetType = getAssetType();
46
+
47
+ let actualSrc = "";
48
+ let status: LazyAssetStatus = LazyAssetStatus.Loading;
49
+
50
+ onMount(async () => {
51
+ const path = src.includes("https://") ? src : `${window.location.origin}${src}`;
52
+
53
+ switch(assetType) {
54
+ case LazyAssetType.Image: {
55
+ const img = new Image();
56
+ img.onload = () => {
57
+ actualSrc = path;
58
+ status = LazyAssetStatus.Loaded;
59
+ }
60
+ img.src = path;
61
+ break;
62
+ }
63
+ case LazyAssetType.Video: {
64
+ fetch(path)
65
+ .then(resp => resp.blob())
66
+ .then(blob => {
67
+ actualSrc = URL.createObjectURL(blob);
68
+ status = LazyAssetStatus.Loaded;
69
+ })
70
+ .catch(error => {
71
+ console.warn(error);
72
+ status = LazyAssetStatus.Error;
73
+ });
74
+ break;
75
+ }
76
+ case LazyAssetType.Unknown: {
77
+ console.warn("Unknown asset: ", path)
78
+ status = LazyAssetStatus.Error;
79
+ break;
80
+ }
81
+
82
+ }
83
+ });
84
+ </script>
85
+
86
+ {#if status === LazyAssetStatus.Loaded}
87
+ {#if assetType === LazyAssetType.Image}
88
+ <img src={actualSrc} alt="Placeholder image" {...props} />
89
+ {:else if assetType === LazyAssetType.Video}
90
+ <video playsinline autoplay muted loop {...props} poster={BgTiledAres} style="object-fit: scale-down">
91
+ <source src={actualSrc} type={`video/${extension}`} />
92
+ Your browser does not support the video tag.
93
+ </video>
94
+ {:else}
95
+ <img src={actualSrc} alt="Placeholder image" />
96
+ {/if}
97
+ {:else}
98
+ <img class="rotate" src={BgTiledAres} {...props} style="object-fit: scale-down" />
99
+ {/if}
100
+
101
+ <style lang="postcss">
102
+ .rotate {
103
+ animation: rotation 4s infinite linear;
104
+ }
105
+
106
+ @keyframes rotation {
107
+ from {
108
+ transform: rotate(0deg);
109
+ }
110
+ to {
111
+ transform: rotate(359deg);
112
+ }
113
+ }
114
+ </style>
@@ -0,0 +1,11 @@
1
+ export enum LazyAssetType {
2
+ Image,
3
+ Video,
4
+ Unknown
5
+ }
6
+
7
+ export enum LazyAssetStatus {
8
+ Loading,
9
+ Loaded,
10
+ Error
11
+ }
@@ -0,0 +1,165 @@
1
+ <script lang="ts">
2
+ // The ordering of these imports is critical to your app working properly
3
+ import "../theme.postcss";
4
+ // If you have source.organizeImports set to true in VSCode, then it will auto change this ordering
5
+ import "@skeletonlabs/skeleton/styles/all.css";
6
+ // Most of your app wide CSS should be put in this file
7
+ import "../app.postcss";
8
+ // For auto dark/light mode
9
+ import { AppBar, AppShell, autoModeWatcher, LightSwitch } from "@skeletonlabs/skeleton";
10
+ import RandomizedBackground from "$lib/components/RandomizedBackground.svelte";
11
+
12
+ // navigation
13
+ import { page } from "$app/stores";
14
+ // store
15
+ import { enableBackground } from "$lib/store";
16
+ import type { BreadcrumbData } from "$lib/types/BreadcrumbData";
17
+ // assets
18
+ import DialogOverlay from "$lib/components/DialogOverlay.svelte";
19
+ import AresLogo from "$lib/assets/characters/ares/ares_logo.webp";
20
+ import { enableDialogueOverlay } from "$lib/components/dialog_manager/DialogManagerStore";
21
+ // todo: clean up all these imports!
22
+
23
+ let pages: BreadcrumbData[] = [];
24
+
25
+ const updateBreadcrumb = (pathname: string) => {
26
+ pages = [];
27
+ let basePath = "";
28
+ pathname.split("/").forEach((value, index) => {
29
+ if (index === 0) {
30
+ basePath = "/";
31
+ pages.push({
32
+ path: "/",
33
+ name: "Home"
34
+ });
35
+ return;
36
+ }
37
+
38
+ if (value === "") {
39
+ return;
40
+ }
41
+
42
+ basePath += value + "/";
43
+ pages.push({
44
+ path: basePath,
45
+ name: value
46
+ });
47
+ });
48
+ pages = pages;
49
+ };
50
+
51
+ $: updateBreadcrumb($page.url.pathname); // run every time we navigate
52
+
53
+ let enableBackgroundValue = true;
54
+ enableBackground.subscribe((value) => {
55
+ enableBackgroundValue = value;
56
+ });
57
+
58
+ let enableDialogueOverlayValue = true;
59
+ enableDialogueOverlay.subscribe((value) => {
60
+ enableDialogueOverlayValue = value;
61
+ });
62
+ </script>
63
+
64
+ <!-- App Shell -->
65
+ <svelte:head>
66
+ {@html `<script>${autoModeWatcher.toString()} autoModeWatcher();</script>`}
67
+ </svelte:head>
68
+
69
+ <AppShell>
70
+ <svelte:fragment slot="header">
71
+ <!-- App Bar -->
72
+ <AppBar slotDefault="place-content-start" slotTrail="place-content-end">
73
+ <svelte:fragment slot="lead">
74
+ <!--TODO: add logo or something for the lead in layout-->
75
+ <img
76
+ alt="Ares's head titled towards the left with his tongue out and winking"
77
+ class="ares-logo"
78
+ src={AresLogo}
79
+ />
80
+ <span class="mr-2" />
81
+ <ol class="breadcrumb">
82
+ {#each pages as crumb, i}
83
+ {#if i < pages.length - 1}
84
+ <li class="crumb">
85
+ <a href={crumb.path}>{crumb.name.charAt(0).toUpperCase() + crumb.name.slice(1)}</a>
86
+ </li>
87
+ <li class="crumb-separator" aria-hidden="true">&rsaquo;</li>
88
+ {:else}
89
+ <li class="crumb">{crumb.name.charAt(0).toUpperCase() + crumb.name.slice(1)}</li>
90
+ {/if}
91
+ {/each}
92
+ </ol>
93
+ </svelte:fragment>
94
+ <svelte:fragment slot="trail">
95
+ <LightSwitch bgLight="bg-surface-400" />
96
+ </svelte:fragment>
97
+ </AppBar>
98
+ </svelte:fragment>
99
+
100
+ <RandomizedBackground enable={enableBackgroundValue} />
101
+
102
+ {#if enableDialogueOverlayValue}
103
+ <!-- Page Route Content -->
104
+ <div class="default-page-container">
105
+ <slot />
106
+ <div class="footer-space" />
107
+ </div>
108
+ <DialogOverlay />
109
+ {:else}
110
+ <DialogOverlay />
111
+ <slot />
112
+ {/if}
113
+ </AppShell>
114
+
115
+ <style lang="postcss">
116
+ :root {
117
+ --dialog-left-pad: clamp(0em, 5vw, 2em);
118
+ --dialog-box-width: min(calc(50em + 4em), calc(100vw - var(--dialog-left-pad) - var(--theme-border-base)));
119
+ --dialog-box-height: clamp(15em, 50vw, 18em);
120
+ }
121
+
122
+ .default-page-container {
123
+ @apply flex justify-center items-center;
124
+ margin-top: 4em;
125
+ margin-left: clamp(1em, 15vw, 10em);
126
+ margin-right: 1em;
127
+ flex-direction: column;
128
+ z-index: 0;
129
+ }
130
+
131
+ .ares-logo {
132
+ object-fit: contain;
133
+ height: 2em;
134
+ margin-inline-end: 0.5em;
135
+ }
136
+
137
+ /* breadcrumb does not work due to a lot of magic stuff i do
138
+ the code below is from skeleton's tailwind css:
139
+ https://github.com/skeletonlabs/skeleton/blob/54f4ecedabf2be6d94a670b56dc8821095ca3fc9/packages/plugin/src/styles/components/breadcrumbs.css
140
+
141
+ it likely disappeared due to code gen shenanigans and package magic */
142
+ .breadcrumb,
143
+ .breadcrumb-nonresponsive {
144
+ @apply flex items-center space-x-4 w-full overflow-x-auto;
145
+ /*@apply flex items-center space-x-4 w-full hide-scrollbar overflow-x-auto;*/
146
+ }
147
+
148
+ .crumb {
149
+ @apply flex justify-center items-center space-x-2;
150
+ }
151
+ .crumb-separator {
152
+ @apply flex text-surface-700-200-token opacity-50;
153
+ }
154
+
155
+ /* === Auto-Responsive === */
156
+
157
+ .breadcrumb li {
158
+ @apply hidden md:block;
159
+ }
160
+ .breadcrumb li:nth-last-child(3),
161
+ .breadcrumb li:nth-last-child(2),
162
+ .breadcrumb li:nth-last-child(1) {
163
+ @apply block;
164
+ }
165
+ </style>
@@ -0,0 +1,77 @@
1
+ <script lang="ts">
2
+ import { generatedDailySeed, mulberry32Generator } from "$lib/util/stable_random";
3
+ import BgTiledAres from "$lib/assets/bg_tiled/bg_tiled_ares.png";
4
+ import BgTiledCorn from "$lib/assets/bg_tiled/bg_tiled_corn.png";
5
+ import BgTiledPineapple from "$lib/assets/bg_tiled/bg_tiled_pineapple.png";
6
+ import BgTiledReinhard from "$lib/assets/bg_tiled/bg_tiled_reinhard.png";
7
+ import BgTiledTomato from "$lib/assets/bg_tiled/bg_tiled_tomato.png";
8
+ import BgTiledTurnip from "$lib/assets/bg_tiled/bg_tiled_turnip.png";
9
+ import RandomizedImage from "$lib/components/RandomizedImage.svelte";
10
+
11
+ export let enable;
12
+
13
+ const imageList = [BgTiledAres, BgTiledCorn, BgTiledPineapple, BgTiledReinhard, BgTiledTomato, BgTiledTurnip];
14
+
15
+ const seed = generatedDailySeed();
16
+ const rng = mulberry32Generator(seed);
17
+
18
+ const shuffle = (array: any[]): any[] => {
19
+ // from: community wiki @ https://stackoverflow.com/a/2450976/17836168
20
+ let currentIndex = array.length,
21
+ randomIndex;
22
+
23
+ // While there remain elements to shuffle.
24
+ while (currentIndex != 0) {
25
+ // Pick a remaining element.
26
+ randomIndex = Math.floor(rng() * currentIndex);
27
+ currentIndex--;
28
+
29
+ // And swap it with the current element.
30
+ [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
31
+ }
32
+
33
+ return array;
34
+ };
35
+
36
+ let generatedImageList = [];
37
+ let component;
38
+
39
+ for (let i = 0; i < 20; i++) {
40
+ shuffle(imageList);
41
+ generatedImageList = generatedImageList.concat(imageList);
42
+ }
43
+ </script>
44
+
45
+ <svelte:head>
46
+ <!-- from: https://dev.to/khromov/preloading-images-in-svelte-465h -->
47
+ {#each imageList as image}
48
+ <link rel="preload" as="image" href={image} />
49
+ {/each}
50
+ <link
51
+ as="video"
52
+ href="https://video.twimg.com/ext_tw_video/1318728494256410624/pu/vid/640x360/TMklz6hiTkQu3xhn.mp4"
53
+ rel="preload"
54
+ />
55
+ </svelte:head>
56
+
57
+ {#if enable}
58
+ <div class="default-background" aria-hidden="true">
59
+ {#each generatedImageList as imageItem}
60
+ <svelte:component this={RandomizedImage} src={imageItem} {rng} />
61
+ {/each}
62
+ </div>
63
+ {/if}
64
+
65
+ <style lang="postcss">
66
+ .default-background {
67
+ position: fixed;
68
+ display: flex;
69
+ margin-top: -8rem;
70
+ margin-left: -8rem;
71
+ width: calc(100vw + 16rem);
72
+ height: calc(100vh + 16rem);
73
+ flex-wrap: wrap;
74
+ overflow: hidden;
75
+ z-index: -10;
76
+ }
77
+ </style>
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ export let src: URL;
3
+ export let rng: () => number;
4
+ let rotateRandom = rng() * 90 - 45;
5
+
6
+ const paddingLeft = 1 + rng() * 5;
7
+ const paddingRight = 1 + rng() * 5;
8
+ const paddingTop = 1 + rng() * 7;
9
+ </script>
10
+
11
+ <div
12
+ style="--paddingTop: {paddingTop}rem;
13
+ --paddingLeft: {paddingLeft}rem;
14
+ --paddingRight: {paddingRight}rem;"
15
+ >
16
+ <img {src} aria-hidden="true" style="--rotateRandom:{rotateRandom}deg;" alt="" />
17
+ </div>
18
+
19
+ <style>
20
+ div {
21
+ padding-top: var(--paddingTop);
22
+ padding-left: var(--paddingLeft);
23
+ padding-right: var(--paddingRight);
24
+ }
25
+
26
+ img {
27
+ width: 8rem;
28
+ height: 8rem;
29
+ transform: rotate(var(--rotateRandom));
30
+ }
31
+ </style>
@@ -0,0 +1,282 @@
1
+ /**
2
+ * DialogManager is the object we want to interact with in Svelte
3
+ */
4
+
5
+ import { writable } from "svelte/store";
6
+ import type { DialogDetail } from "$pkg/types/pineapple_fiber/DialogDetail";
7
+ import { DialogState } from "$pkg/types/pineapple_fiber/DialogState";
8
+ import { tweened } from "svelte/motion";
9
+ import { cubicOut } from "svelte/easing";
10
+ import { PortraitType } from "$pkg/types/pineapple_fiber/PortraitType";
11
+ import AresHappy from "$pkg/assets/characters/ares/ares_happy.webp";
12
+ import AresBlushing from "$pkg/assets/characters/ares/ares_blushing.webp";
13
+ import AresDisappointed from "$pkg/assets/characters/ares/ares_disappointed.webp";
14
+ import AresLetsGo from "$pkg/assets/characters/ares/ares_lets_go.webp";
15
+ import AresMad from "$pkg/assets/characters/ares/ares_mad.webp";
16
+ import AresNeutral from "$pkg/assets/characters/ares/ares_neutral.webp";
17
+ import AresSlightlyMad from "$pkg/assets/characters/ares/ares_slightly_mad.webp";
18
+ import AresSurprised from "$pkg/assets/characters/ares/ares_surprised.webp";
19
+ import AresYay from "$pkg/assets/characters/ares/ares_yay.webp";
20
+ import {
21
+ defaultDialogMessage,
22
+ dialogVariableStore,
23
+ enableDialogueOverlay,
24
+ updateRate
25
+ } from "$pkg/components/dialog_manager/DialogManagerStore";
26
+ import { DialogProcessor } from "$pkg/components/dialog_manager/DialogProcessor";
27
+
28
+ const shouldDebugYarn = false;
29
+
30
+ export type OnSetDialogChoiceCallback = (newMessage: DialogDetail) => void;
31
+
32
+ export class DialogManager {
33
+ dialogMessageMap: Map<string, DialogDetail> = new Map();
34
+ dialogMessageList: DialogDetail[] = [];
35
+ fullCurrentMessage: string = defaultDialogMessage[0].textContent;
36
+ currentMessageMeta: DialogDetail = defaultDialogMessage[0];
37
+ currentMessage = writable("");
38
+ currentIndex = 0;
39
+ previousTimestamp = 0;
40
+ isDoneTransition = false;
41
+ currentPortrait = writable();
42
+ portraitMap: Map<string, any> = new Map();
43
+ currentState = DialogState.Visible;
44
+ hidePercent = tweened(100, {
45
+ duration: 400,
46
+ easing: cubicOut
47
+ }); // 100 = 100%
48
+ skipNextActiveTime = 0;
49
+ dialogProcessor = new DialogProcessor();
50
+ // for queueing actions
51
+ _setDialogChoiceQueue: DialogDetail[] = [];
52
+ _setDialogChoiceMutex = false;
53
+ onSetDialogListeners: OnSetDialogChoiceCallback[] = [];
54
+
55
+ constructor() {
56
+ enableDialogueOverlay.subscribe((value) => {
57
+ // todo: investigate why we cant put setDialogDefault inside the then clause
58
+ // ISSUE #82 https://github.com/TurnipXenon/pineapple/issues/82
59
+ if (value) {
60
+ this.hidePercent.set(0);
61
+ this.setDialogToDefault();
62
+ } else {
63
+ this.hidePercent.set(100);
64
+ this.setDialogTree([{ textContent: "" }]);
65
+ }
66
+ });
67
+ }
68
+
69
+ /**
70
+ * when users interact with the dialog, they can skip the transition like in a game
71
+ * note that there is a cool down to this, check out skipNextActiveTime
72
+ */
73
+ skipAnimation = () => {
74
+ if (
75
+ this.previousTimestamp > this.skipNextActiveTime &&
76
+ this.currentState == DialogState.Visible &&
77
+ !this.isDoneTransition // crucial for dynamic links!
78
+ ) {
79
+ this.currentIndex = this.fullCurrentMessage.length - 1;
80
+ this.currentMessage.update(() => this.fullCurrentMessage.slice(0, this.currentIndex));
81
+ }
82
+ };
83
+
84
+ /**
85
+ * hides or shows the dialog UI
86
+ * @param shouldEnable
87
+ */
88
+ enableDialog = (shouldEnable: boolean) => {
89
+ enableDialogueOverlay.update(() => shouldEnable);
90
+ };
91
+
92
+ /**
93
+ * sets the possible dialog that might appear on the Dialog UI
94
+ * note that it overwrites the previous tree and does not append on it due to the possibility
95
+ * of node name conflicts
96
+ * @param newMessageList
97
+ */
98
+ setDialogTree = (newMessageList: DialogDetail[]) => {
99
+ this.dialogMessageList = newMessageList;
100
+
101
+ this.dialogMessageMap.clear();
102
+ newMessageList.map((value) => {
103
+ if (value.dialogId) {
104
+ this.dialogMessageMap.set(value.dialogId!, value);
105
+ }
106
+ });
107
+
108
+ // lazy load map
109
+ if (this.portraitMap.size == 0) {
110
+ this.portraitMap.set(PortraitType.AresHappy.toString(), AresHappy);
111
+ this.portraitMap.set(PortraitType.AresBlushing.toString(), AresBlushing);
112
+ this.portraitMap.set(PortraitType.AresDisappointed.toString(), AresDisappointed);
113
+ this.portraitMap.set(PortraitType.AresLetsGo.toString(), AresLetsGo);
114
+ this.portraitMap.set(PortraitType.AresMad.toString(), AresMad);
115
+ this.portraitMap.set(PortraitType.AresNeutral.toString(), AresNeutral);
116
+ this.portraitMap.set(PortraitType.AresSlightlyMad.toString(), AresSlightlyMad);
117
+ this.portraitMap.set(PortraitType.AresSurprised.toString(), AresSurprised);
118
+ this.portraitMap.set(PortraitType.AresYay.toString(), AresYay);
119
+ }
120
+
121
+ this.setDialogChoice(newMessageList[0]);
122
+ };
123
+
124
+ /**
125
+ * Remember to call this before SetDialogTree
126
+ * and unsubscribe during onDestroy
127
+ * @param callback
128
+ */
129
+ subscribeToSetDialogChoice = (callback: OnSetDialogChoiceCallback) => {
130
+ this.onSetDialogListeners.push(callback);
131
+ };
132
+
133
+ /**
134
+ * Remember to call this during onDestroy
135
+ * @param callback
136
+ * todo: double check if this works???
137
+ */
138
+ unsubscribeToSetDialogChoice = (callback: OnSetDialogChoiceCallback) => {
139
+ // from: https://stackoverflow.com/a/5767357/17836168
140
+ const index = this.onSetDialogListeners.indexOf(callback);
141
+ if (index > -1) {
142
+ // only splice array when item is found
143
+ this.onSetDialogListeners.splice(index, 1); // 2nd parameter means remove one item only
144
+ }
145
+ };
146
+
147
+ /**
148
+ * Sets the next dialog to show depending on which special choice a href link the user
149
+ * has interacted with
150
+ * @param newMessage
151
+ *
152
+ * you can listen to this!
153
+ */
154
+ setDialogChoice = (newMessage: DialogDetail | undefined) => {
155
+ if (!newMessage || !newMessage.textContent) {
156
+ return;
157
+ }
158
+
159
+ this._setDialogChoiceQueue.push(newMessage);
160
+
161
+ if (!this._setDialogChoiceMutex) {
162
+ this._setDialogChoiceMutex = true; // not a true mutex but this will do
163
+ this._setDialogChoice();
164
+ }
165
+ };
166
+
167
+ _setDialogChoice = () => {
168
+ const newMessage = this._setDialogChoiceQueue.shift();
169
+ if (newMessage === undefined) {
170
+ this._setDialogChoiceMutex = false; // set it free!
171
+ this.onSetDialogListeners.forEach((listener) => {
172
+ listener(this.currentMessageMeta);
173
+ });
174
+ return;
175
+ }
176
+
177
+ this.currentMessageMeta = newMessage;
178
+
179
+ // set the portrait
180
+ let portraitValue = AresHappy;
181
+ if (this.currentMessageMeta.portraitType) {
182
+ portraitValue = this.portraitMap.get(this.currentMessageMeta.portraitType);
183
+ }
184
+ if (portraitValue) {
185
+ this.currentPortrait.update(() => portraitValue);
186
+ }
187
+
188
+ // process the dialogue here line-by-line
189
+ this.fullCurrentMessage = this.dialogProcessor.processDialog(this.currentMessageMeta);
190
+ this.currentMessage.update(() => "");
191
+ this.currentIndex = 0;
192
+ this.skipNextActiveTime = this.previousTimestamp + 1000; // guard
193
+ this.isDoneTransition = false; // must be after the guard
194
+
195
+ if (shouldDebugYarn) {
196
+ console.info(`Currently processing node: ${this.currentMessageMeta.dialogId}`);
197
+ }
198
+
199
+ // save that we visited AND processed the node
200
+ if (this.currentMessageMeta.dialogId) {
201
+ const key = `+${this.currentMessageMeta.dialogId}`;
202
+ const value = Number(dialogVariableStore.getItem(key));
203
+ if (isNaN(value)) {
204
+ dialogVariableStore.setItem(key, "1");
205
+ } else {
206
+ dialogVariableStore.setItem(key, `${value + 1}`);
207
+ }
208
+ }
209
+
210
+ // reloop this to process all messages
211
+ this._setDialogChoice();
212
+ };
213
+
214
+ setDialogToDefault = () => {
215
+ this.setDialogTree(defaultDialogMessage);
216
+ };
217
+
218
+ /**
219
+ * updates the information and detail frame by frame
220
+ * you can think of this like the main game loop
221
+ *
222
+ * @param timestamp
223
+ *
224
+ * todo: this might be too big we might want to refactor this method for better readability
225
+ * ISSUE #81 https://github.com/TurnipXenon/pineapple/issues/81
226
+ */
227
+ update = (timestamp: number) => {
228
+ if (this.currentState == DialogState.Invisible || this.currentState == DialogState.Busy) {
229
+ window.requestAnimationFrame(this.update);
230
+ return;
231
+ }
232
+
233
+ // if visible
234
+
235
+ // text transition loop
236
+ if (!this.isDoneTransition && this.currentIndex > this.fullCurrentMessage.length) {
237
+ const elementList = document.getElementsByClassName("dialog-choice");
238
+ for (const el of elementList) {
239
+ el.addEventListener("click", (event) => {
240
+ // todo: make more robust; for now we're assuming first class is our choice
241
+ const choice = el.classList[0].split("-")[1];
242
+ this.setDialogChoice(this.dialogMessageMap.get(choice));
243
+ });
244
+ }
245
+
246
+ this.isDoneTransition = true;
247
+ }
248
+
249
+ // guard: skip if done or if not yet time to update
250
+ if (
251
+ this.currentIndex > this.fullCurrentMessage.length ||
252
+ this.previousTimestamp + updateRate > timestamp
253
+ ) {
254
+ window.requestAnimationFrame(this.update);
255
+ return;
256
+ }
257
+ this.previousTimestamp = timestamp;
258
+
259
+ // check if valid text
260
+ // there is an assumption that previous character is valid
261
+ // let validCharacterIndex = this.currentLength - 1;
262
+ // validCharacterIndex++;
263
+ // the code above is just to show you how it looks like but let's assume
264
+ // that currentLength = validCharacter + 1
265
+ while (
266
+ this.fullCurrentMessage[this.currentIndex] == "<" &&
267
+ this.currentIndex + 1 < this.fullCurrentMessage.length
268
+ ) {
269
+ // find valid character, trap with closing
270
+ this.currentIndex = this.fullCurrentMessage.indexOf(">", this.currentIndex) + 1;
271
+ // normalize
272
+ this.currentIndex = Math.min(this.currentIndex, this.fullCurrentMessage.length - 1);
273
+ }
274
+
275
+ this.currentMessage.update(() => this.fullCurrentMessage.slice(0, this.currentIndex));
276
+
277
+ // increment
278
+ ++this.currentIndex;
279
+
280
+ window.requestAnimationFrame(this.update);
281
+ };
282
+ }