@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.
- package/README.md +38 -0
- package/dist/app.postcss +94 -0
- package/dist/assets/bg_tiled/bg_tiled_ares.png +0 -0
- package/dist/assets/bg_tiled/bg_tiled_corn.png +0 -0
- package/dist/assets/bg_tiled/bg_tiled_pineapple.png +0 -0
- package/dist/assets/bg_tiled/bg_tiled_reinhard.png +0 -0
- package/dist/assets/bg_tiled/bg_tiled_tomato.png +0 -0
- package/dist/assets/bg_tiled/bg_tiled_turnip.png +0 -0
- package/dist/assets/characters/ares/ares_blushing.webp +0 -0
- package/dist/assets/characters/ares/ares_disappointed.webp +0 -0
- package/dist/assets/characters/ares/ares_happy.webp +0 -0
- package/dist/assets/characters/ares/ares_lets_go.webp +0 -0
- package/dist/assets/characters/ares/ares_logo.webp +0 -0
- package/dist/assets/characters/ares/ares_mad.webp +0 -0
- package/dist/assets/characters/ares/ares_neutral.webp +0 -0
- package/dist/assets/characters/ares/ares_slightly_mad.webp +0 -0
- package/dist/assets/characters/ares/ares_surprised.webp +0 -0
- package/dist/assets/characters/ares/ares_yay.webp +0 -0
- package/dist/assets/game_dev/footage-chef-wings.gif +0 -0
- package/dist/assets/game_dev/footage-depreciation.webm +0 -0
- package/dist/assets/game_dev/footage-thinking-of-flowers.webm +0 -0
- package/dist/assets/game_dev/screenshot-game-jam-mama.png +0 -0
- package/dist/assets/game_dev/screenshot-string-hop.png +0 -0
- package/dist/assets/game_dev/screenshot-wet-ass-road.png +0 -0
- package/dist/assets/icons/chat_cursor.svg +47 -0
- package/dist/assets/icons/external_link.svg +50 -0
- package/dist/assets/temp/background-image.jpg +0 -0
- package/dist/assets/temp/bitbucket-logo.png +0 -0
- package/dist/assets/temp/github-logo.png +0 -0
- package/dist/assets/temp/header-hep-cat.mp4 +0 -0
- package/dist/assets/temp/header-hep-cat.ogg +0 -0
- package/dist/assets/temp/header-hep-cat.webm +0 -0
- package/dist/assets/temp/header-pengi.mp4 +0 -0
- package/dist/assets/temp/header-pengi.webm +0 -0
- package/dist/assets/temp/header-soulwork.mp4 +0 -0
- package/dist/assets/temp/header-soulwork.ogg +0 -0
- package/dist/assets/temp/header-soulwork.webm +0 -0
- package/dist/components/DialogOverlay.svelte +93 -0
- package/dist/components/DialogOverlay.svelte.d.ts +14 -0
- package/dist/components/LazyAsset.svelte +96 -0
- package/dist/components/LazyAsset.svelte.d.ts +20 -0
- package/dist/components/LazyAssetType.d.ts +10 -0
- package/dist/components/LazyAssetType.js +12 -0
- package/dist/components/PineappleBaseLayout.svelte +186 -0
- package/dist/components/PineappleBaseLayout.svelte.d.ts +19 -0
- package/dist/components/RandomizedBackground.svelte +62 -0
- package/dist/components/RandomizedBackground.svelte.d.ts +16 -0
- package/dist/components/RandomizedImage.svelte +29 -0
- package/dist/components/RandomizedImage.svelte.d.ts +17 -0
- package/dist/components/dialog_manager/DialogManager.d.ts +77 -0
- package/dist/components/dialog_manager/DialogManager.js +239 -0
- package/dist/components/dialog_manager/DialogManagerStore.d.ts +41 -0
- package/dist/components/dialog_manager/DialogManagerStore.js +45 -0
- package/dist/components/dialog_manager/DialogProcessor.d.ts +13 -0
- package/dist/components/dialog_manager/DialogProcessor.js +62 -0
- package/dist/components/dialog_manager/DialogUtils.d.ts +5 -0
- package/dist/components/dialog_manager/DialogUtils.js +8 -0
- package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.d.ts +15 -0
- package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.js +34 -0
- package/dist/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.d.ts +4 -0
- package/dist/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BehaviorNode.d.ts +3 -0
- package/dist/components/dialog_manager/behavior_tree/core/BehaviorNode.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BehaviorStatus.d.ts +5 -0
- package/dist/components/dialog_manager/behavior_tree/core/BehaviorStatus.js +6 -0
- package/dist/components/dialog_manager/behavior_tree/core/SelectorNode.d.ts +12 -0
- package/dist/components/dialog_manager/behavior_tree/core/SelectorNode.js +22 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.d.ts +5 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.d.ts +4 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.d.ts +15 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.js +220 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionResult.d.ts +5 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionResult.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.d.ts +8 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.js +15 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionState.d.ts +3 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionState.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.d.ts +10 -0
- package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.js +15 -0
- package/dist/components/dialog_manager/behavior_tree/expression/OperatorNode.d.ts +11 -0
- package/dist/components/dialog_manager/behavior_tree/expression/OperatorNode.js +30 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.d.ts +6 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.js +21 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.d.ts +9 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.js +19 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandMap.d.ts +9 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandMap.js +18 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.d.ts +15 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.js +24 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.d.ts +20 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.js +32 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.d.ts +13 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.js +25 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/AndOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/AndOperator.js +15 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.js +14 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.js +12 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.js +12 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.js +12 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.js +12 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.js +12 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.js +13 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.d.ts +17 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.js +32 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.d.ts +9 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.js +47 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OrOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OrOperator.js +13 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/XorOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/XorOperator.js +17 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.js +14 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.js +14 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.js +12 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.js +14 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.d.ts +7 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.js +14 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.d.ts +4 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.d.ts +6 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.d.ts +6 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.js +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.d.ts +8 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.js +15 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/BehaviorState.d.ts +5 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/BehaviorState.js +5 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.d.ts +11 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.js +53 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/ElseNode.d.ts +11 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/ElseNode.js +49 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/EndIfNode.d.ts +11 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/EndIfNode.js +23 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IfMode.d.ts +6 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IfMode.js +8 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.d.ts +12 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.js +43 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.d.ts +11 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.js +25 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.d.ts +6 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.js +18 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.d.ts +6 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.js +17 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.d.ts +10 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.js +38 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.d.ts +11 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.js +31 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.d.ts +8 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.js +39 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts +8 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.js +40 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.d.ts +9 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.js +28 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/scripts/SetDefaultEnvironment.d.ts +1 -0
- package/dist/scripts/SetDefaultEnvironment.js +41 -0
- package/dist/scripts/pineapple_fiber/PineappleWeaver.d.ts +9 -0
- package/dist/scripts/pineapple_fiber/PineappleWeaver.js +201 -0
- package/dist/scripts/util/FileManagement.d.ts +7 -0
- package/dist/scripts/util/FileManagement.js +35 -0
- package/dist/scripts/util/ManualCheck.d.ts +1 -0
- package/dist/scripts/util/ManualCheck.js +28 -0
- package/dist/scripts/util/ManualCheckRun.d.ts +1 -0
- package/dist/scripts/util/ManualCheckRun.js +6 -0
- package/dist/store.d.ts +17 -0
- package/dist/store.js +17 -0
- package/dist/styles/DefaultGridContainer.css +61 -0
- package/dist/theme.postcss +107 -0
- package/dist/types/BlogBlurbMeta.d.ts +11 -0
- package/dist/types/BlogBlurbMeta.js +16 -0
- package/dist/types/BreadcrumbData.d.ts +4 -0
- package/dist/types/BreadcrumbData.js +1 -0
- package/dist/types/pineapple_fiber/DialogDetail.d.ts +6 -0
- package/dist/types/pineapple_fiber/DialogDetail.js +1 -0
- package/dist/types/pineapple_fiber/DialogState.d.ts +5 -0
- package/dist/types/pineapple_fiber/DialogState.js +6 -0
- package/dist/types/pineapple_fiber/DialogVariableStore.d.ts +2 -0
- package/dist/types/pineapple_fiber/DialogVariableStore.js +20 -0
- package/dist/types/pineapple_fiber/PortraitType.d.ts +11 -0
- package/dist/types/pineapple_fiber/PortraitType.js +12 -0
- package/dist/util/stable_random.d.ts +2 -0
- package/dist/util/stable_random.js +15 -0
- package/package.json +67 -0
- package/src/app.html +13 -0
- package/src/lib/app.postcss +94 -0
- package/src/lib/assets/bg_tiled/bg_tiled_ares.png +0 -0
- package/src/lib/assets/bg_tiled/bg_tiled_corn.png +0 -0
- package/src/lib/assets/bg_tiled/bg_tiled_pineapple.png +0 -0
- package/src/lib/assets/bg_tiled/bg_tiled_reinhard.png +0 -0
- package/src/lib/assets/bg_tiled/bg_tiled_tomato.png +0 -0
- package/src/lib/assets/bg_tiled/bg_tiled_turnip.png +0 -0
- package/src/lib/assets/characters/ares/ares_blushing.webp +0 -0
- package/src/lib/assets/characters/ares/ares_disappointed.webp +0 -0
- package/src/lib/assets/characters/ares/ares_happy.webp +0 -0
- package/src/lib/assets/characters/ares/ares_lets_go.webp +0 -0
- package/src/lib/assets/characters/ares/ares_logo.webp +0 -0
- package/src/lib/assets/characters/ares/ares_mad.webp +0 -0
- package/src/lib/assets/characters/ares/ares_neutral.webp +0 -0
- package/src/lib/assets/characters/ares/ares_slightly_mad.webp +0 -0
- package/src/lib/assets/characters/ares/ares_surprised.webp +0 -0
- package/src/lib/assets/characters/ares/ares_yay.webp +0 -0
- package/src/lib/assets/game_dev/footage-chef-wings.gif +0 -0
- package/src/lib/assets/game_dev/footage-depreciation.webm +0 -0
- package/src/lib/assets/game_dev/footage-thinking-of-flowers.webm +0 -0
- package/src/lib/assets/game_dev/screenshot-game-jam-mama.png +0 -0
- package/src/lib/assets/game_dev/screenshot-string-hop.png +0 -0
- package/src/lib/assets/game_dev/screenshot-wet-ass-road.png +0 -0
- package/src/lib/assets/icons/chat_cursor.svg +47 -0
- package/src/lib/assets/icons/external_link.svg +50 -0
- package/src/lib/assets/temp/background-image.jpg +0 -0
- package/src/lib/assets/temp/bitbucket-logo.png +0 -0
- package/src/lib/assets/temp/github-logo.png +0 -0
- package/src/lib/assets/temp/header-hep-cat.mp4 +0 -0
- package/src/lib/assets/temp/header-hep-cat.ogg +0 -0
- package/src/lib/assets/temp/header-hep-cat.webm +0 -0
- package/src/lib/assets/temp/header-pengi.mp4 +0 -0
- package/src/lib/assets/temp/header-pengi.webm +0 -0
- package/src/lib/assets/temp/header-soulwork.mp4 +0 -0
- package/src/lib/assets/temp/header-soulwork.ogg +0 -0
- package/src/lib/assets/temp/header-soulwork.webm +0 -0
- package/src/lib/components/DialogOverlay.svelte +100 -0
- package/src/lib/components/LazyAsset.svelte +114 -0
- package/src/lib/components/LazyAssetType.ts +11 -0
- package/src/lib/components/PineappleBaseLayout.svelte +165 -0
- package/src/lib/components/RandomizedBackground.svelte +77 -0
- package/src/lib/components/RandomizedImage.svelte +31 -0
- package/src/lib/components/dialog_manager/DialogManager.ts +282 -0
- package/src/lib/components/dialog_manager/DialogManagerStore.ts +52 -0
- package/src/lib/components/dialog_manager/DialogProcessor.ts +68 -0
- package/src/lib/components/dialog_manager/DialogUtils.ts +10 -0
- package/src/lib/components/dialog_manager/behavior_tree/core/BTreeUtils.ts +40 -0
- package/src/lib/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.ts +5 -0
- package/src/lib/components/dialog_manager/behavior_tree/core/BehaviorNode.ts +3 -0
- package/src/lib/components/dialog_manager/behavior_tree/core/BehaviorStatus.ts +5 -0
- package/src/lib/components/dialog_manager/behavior_tree/core/SelectorNode.ts +32 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionArguments.ts +6 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.ts +5 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.ts +236 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionResult.ts +6 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.ts +20 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/ExpressionState.ts +3 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/OperandNode.ts +19 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/OperatorNode.ts +37 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.ts +28 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.ts +34 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/commands/CommandMap.ts +26 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.ts +31 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.ts +38 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.ts +28 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/AndOperator.ts +24 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.ts +21 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.ts +21 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.ts +21 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.ts +19 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.ts +21 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.ts +21 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.ts +20 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.ts +42 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.ts +53 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/OrOperator.ts +22 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/XorOperator.ts +24 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.ts +23 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.ts +23 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.ts +21 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.ts +23 -0
- package/src/lib/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.ts +23 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.ts +5 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.ts +7 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.ts +7 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.ts +20 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/BehaviorState.ts +6 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.ts +59 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/ElseNode.ts +55 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/EndIfNode.ts +28 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/IfMode.ts +7 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/IfNode.ts +49 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.ts +30 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.ts +24 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.ts +22 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.ts +48 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.ts +37 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.ts +48 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.ts +51 -0
- package/src/lib/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.ts +34 -0
- package/src/lib/index.ts +9 -0
- package/src/lib/scripts/SetDefaultEnvironment.ts +45 -0
- package/src/lib/scripts/pineapple_fiber/PineappleWeaver.ts +252 -0
- package/src/lib/scripts/util/FileManagement.ts +38 -0
- package/src/lib/scripts/util/ManualCheck.ts +32 -0
- package/src/lib/scripts/util/ManualCheckRun.ts +7 -0
- package/src/lib/store.ts +18 -0
- package/src/lib/styles/DefaultGridContainer.css +61 -0
- package/src/lib/theme.postcss +107 -0
- package/src/lib/types/BlogBlurbMeta.ts +16 -0
- package/src/lib/types/BreadcrumbData.ts +4 -0
- package/src/lib/types/pineapple_fiber/DialogDetail.ts +7 -0
- package/src/lib/types/pineapple_fiber/DialogState.ts +5 -0
- package/src/lib/types/pineapple_fiber/DialogVariableStore.ts +24 -0
- package/src/lib/types/pineapple_fiber/PortraitType.ts +11 -0
- package/src/lib/util/stable_random.ts +16 -0
- package/src/routes/+error.svelte +26 -0
- package/src/routes/+layout.svelte +23 -0
- package/src/routes/+page.svelte +41 -0
- package/src/routes/Error.yarn +7 -0
- package/src/routes/ErrorYarn.ts +24 -0
- package/src/routes/portfolio/+page.svelte +0 -0
- package/src/types.d.ts +8 -0
- package/static/default-card.png +0 -0
- 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,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">›</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
|
+
}
|