@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,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DialogManagerStore is for variables that will be used as a Svelte store
|
|
3
|
+
* or is saved in local storage
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { DialogMapStore } from "$lib/types/pineapple_fiber/DialogVariableStore";
|
|
7
|
+
import { createNewMapStore } from "$lib/types/pineapple_fiber/DialogVariableStore";
|
|
8
|
+
import { writable } from "svelte/store";
|
|
9
|
+
import type { DialogDetail } from "$lib/types/pineapple_fiber/DialogDetail";
|
|
10
|
+
import { DialogManager } from "$lib/components/dialog_manager/DialogManager";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Enables the dialogue overlay
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* When updating to false, remember to restore the value to true, our default value, onDestroy.
|
|
17
|
+
* Avoid async to prevent weird flashes of updates!
|
|
18
|
+
* ```
|
|
19
|
+
* import {enableDialogueOverlay} from "$lib/store.ts";
|
|
20
|
+
* enableDialogueOverlay.update(() => false);
|
|
21
|
+
*
|
|
22
|
+
* onDestroy(() => {
|
|
23
|
+
* enableDialogueOverlay.update(() => true);
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export const enableDialogueOverlay = writable(true);
|
|
28
|
+
|
|
29
|
+
export const dialogVariableStore: DialogMapStore = createNewMapStore();
|
|
30
|
+
export const updateRate: number = 40 / 1000; // *at least* 40ms per letter
|
|
31
|
+
|
|
32
|
+
// todo: if we go through doing yarn to typescript, move this!
|
|
33
|
+
export const defaultDialogMessage: DialogDetail[] = [
|
|
34
|
+
{
|
|
35
|
+
textContent: `<p>Have you drank water? Or perhaps, you've checked out <a target="_blank" class="external-link" href="http://crouton.net">one of the best webpages</a> out there?`
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* strictly must be declared last! or you might receive a weird error that looks like:
|
|
41
|
+
*
|
|
42
|
+
* 2:04:21 AM [vite] Error when evaluating SSR module /src/lib/components/dialog_manager/DialogManagerStore.ts:
|
|
43
|
+
* |- TypeError: Cannot read properties of undefined (reading '0')
|
|
44
|
+
* at <instance_members_initializer> (/src/lib/components/dialog_manager/DialogManager.ts:38:67)
|
|
45
|
+
* at new DialogManager (/src/lib/components/dialog_manager/DialogManager.ts:53:14)
|
|
46
|
+
* at eval (/src/lib/components/dialog_manager/DialogManagerStore.ts:15:23)
|
|
47
|
+
* at async instantiateModule (file:///C:/Users/Pumpkin/Projects/Web/pineapple/node_modules/vite/dist/node/chunks/dep-934dbc7c.js:54360:9)
|
|
48
|
+
*
|
|
49
|
+
* what this means is that one member of dialogManager cannot be initialized. in our case, it was the
|
|
50
|
+
* defaultDialogMessage not yet being initialized
|
|
51
|
+
*/
|
|
52
|
+
export const dialogManager = new DialogManager();
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { DialogDetail } from "$lib/types/pineapple_fiber/DialogDetail";
|
|
2
|
+
import { BehaviorState } from "$lib/components/dialog_manager/behavior_tree/line_processors/BehaviorState";
|
|
3
|
+
import { IfNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/IfNode";
|
|
4
|
+
import { EndIfNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/EndIfNode";
|
|
5
|
+
import { ElseNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/ElseNode";
|
|
6
|
+
import { ElseIfNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/ElseIfNode";
|
|
7
|
+
import { SetVariableNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/SetVariableNode";
|
|
8
|
+
import { IgnoreGuardNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode";
|
|
9
|
+
import { NormalLineProcessorNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode";
|
|
10
|
+
import { LineSelectorNode } from "$lib/components/dialog_manager/behavior_tree/line_core/LineSelectorNode";
|
|
11
|
+
import { browser } from "$app/environment";
|
|
12
|
+
import { LineCommentNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/LineCommentNode";
|
|
13
|
+
import { DeclareCommand } from "$lib/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand";
|
|
14
|
+
import { JumpCommand } from "$lib/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand";
|
|
15
|
+
import { IgnoreJumpNode } from "$lib/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode";
|
|
16
|
+
import { UnvisitCommand } from "$lib/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* DialogProcessor processes dialogs
|
|
20
|
+
*/
|
|
21
|
+
export class DialogProcessor {
|
|
22
|
+
processingTree = new LineSelectorNode([
|
|
23
|
+
/*region comment based formats*/
|
|
24
|
+
new IgnoreJumpNode(), // must be prioritized above line comment node
|
|
25
|
+
new LineCommentNode(),
|
|
26
|
+
/*endregion commend based formats*/
|
|
27
|
+
new EndIfNode(),
|
|
28
|
+
new ElseIfNode(),
|
|
29
|
+
new ElseNode(),
|
|
30
|
+
new IfNode(),
|
|
31
|
+
new IgnoreGuardNode(),
|
|
32
|
+
/*region commands*/
|
|
33
|
+
new SetVariableNode(),
|
|
34
|
+
new DeclareCommand(),
|
|
35
|
+
new JumpCommand(),
|
|
36
|
+
new UnvisitCommand(),
|
|
37
|
+
/*endregion commands*/
|
|
38
|
+
new NormalLineProcessorNode()
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* process the dialog line by line and return a presentable string
|
|
43
|
+
* @param dialogDetail
|
|
44
|
+
*/
|
|
45
|
+
processDialog = (dialogDetail: DialogDetail): string => {
|
|
46
|
+
if (!browser) {
|
|
47
|
+
return ""; // don't process any line in the server
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let currentState = new BehaviorState();
|
|
51
|
+
|
|
52
|
+
// split each yarn line
|
|
53
|
+
return dialogDetail.textContent
|
|
54
|
+
.trim()
|
|
55
|
+
.split("\n")
|
|
56
|
+
.map((line_, index) => {
|
|
57
|
+
const result = this.processingTree.process({
|
|
58
|
+
initState: currentState,
|
|
59
|
+
line: line_.trim(),
|
|
60
|
+
lineIndex: index
|
|
61
|
+
});
|
|
62
|
+
currentState = result.nextState;
|
|
63
|
+
|
|
64
|
+
return result.renderedLine;
|
|
65
|
+
})
|
|
66
|
+
.join("\n"); // combine all processed lines
|
|
67
|
+
};
|
|
68
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { dialogVariableStore } from "$lib/components/dialog_manager/DialogManagerStore";
|
|
2
|
+
|
|
3
|
+
class _DialogUtils {
|
|
4
|
+
isNodeVisited = (dialogId: string): boolean => {
|
|
5
|
+
const value = Number(dialogVariableStore.getItem(`+${dialogId}`));
|
|
6
|
+
return !isNaN(value) && value > 0;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const DialogUtils = new _DialogUtils();
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
class BTreeUtils {
|
|
2
|
+
/**
|
|
3
|
+
* peek the top of a stack object with the assumption it's not an empty stack
|
|
4
|
+
* todo: add possible protection like an assertion
|
|
5
|
+
* @param stack
|
|
6
|
+
* @return top of the stack
|
|
7
|
+
*/
|
|
8
|
+
peek = <T>(stack: T[]): T => {
|
|
9
|
+
return stack[stack.length - 1];
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
removeQuotes = (value: string): string => {
|
|
13
|
+
return value
|
|
14
|
+
.replace(/^"/, "") // remove possible " at the start: https://stackoverflow.com/a/2182602
|
|
15
|
+
.replace(/"$/, ""); // remove possible " at the end: https://stackoverflow.com/a/12249011
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
simplifyToken = (oldToken: string): string => {
|
|
19
|
+
if (oldToken[0] == "$") {
|
|
20
|
+
const value = localStorage.getItem(oldToken);
|
|
21
|
+
if (value) {
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
console.error(`Value obtained in local storage false: ${oldToken}`);
|
|
25
|
+
return "";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return btreeUtils.removeQuotes(oldToken);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
isTrue = (value: string): boolean => {
|
|
32
|
+
return value.trim().toLowerCase() === "true";
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
isFalse = (value: string): boolean => {
|
|
36
|
+
return value.trim().toLowerCase() === "false";
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const btreeUtils = new BTreeUtils();
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { BehaviorNode } from "$lib/components/dialog_manager/behavior_tree/core/BehaviorNode";
|
|
2
|
+
import { BehaviorStatus } from "$lib/components/dialog_manager/behavior_tree/core/BehaviorStatus";
|
|
3
|
+
import type { BaseBehaviorResult } from "$lib/components/dialog_manager/behavior_tree/core/BaseBehaviorResult";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Selector is a composite behavior node where it tries to process everything until it
|
|
7
|
+
* finds a non-failing node
|
|
8
|
+
*/
|
|
9
|
+
export abstract class SelectorNode<Argument, Result extends BaseBehaviorResult>
|
|
10
|
+
implements BehaviorNode<Argument, Result>
|
|
11
|
+
{
|
|
12
|
+
nodeList: BehaviorNode<Argument, Result>[];
|
|
13
|
+
abstract defaultResult: () => Result;
|
|
14
|
+
|
|
15
|
+
protected constructor(nodeList: BehaviorNode<Argument, Result>[]) {
|
|
16
|
+
this.nodeList = nodeList;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
process(nodeArgs: Argument): Result {
|
|
20
|
+
let finalResult: Result = this.defaultResult();
|
|
21
|
+
|
|
22
|
+
for (const node of this.nodeList) {
|
|
23
|
+
const currentResult = node.process(nodeArgs);
|
|
24
|
+
if (currentResult.status !== BehaviorStatus.Failure) {
|
|
25
|
+
finalResult = currentResult;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return finalResult;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BehaviorNode } from "$lib/components/dialog_manager/behavior_tree/core/BehaviorNode";
|
|
2
|
+
import type { ExpressionArguments } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionArguments";
|
|
3
|
+
import type { ExpressionResult } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionResult";
|
|
4
|
+
|
|
5
|
+
export type ExpressionBehaviorNode = BehaviorNode<ExpressionArguments, ExpressionResult>;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { browser } from "$app/environment";
|
|
2
|
+
import { OperatorNode } from "$lib/components/dialog_manager/behavior_tree/expression/OperatorNode";
|
|
3
|
+
import { OperandNode } from "$lib/components/dialog_manager/behavior_tree/expression/OperandNode";
|
|
4
|
+
import { ExpressionSelectorNode } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode";
|
|
5
|
+
import type { ExpressionState } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionState";
|
|
6
|
+
import { btreeUtils } from "$lib/components/dialog_manager/behavior_tree/core/BTreeUtils";
|
|
7
|
+
import { CommandExpressionNode } from "$lib/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode";
|
|
8
|
+
|
|
9
|
+
class ExpressionEvaluator {
|
|
10
|
+
evaluatorTree = new ExpressionSelectorNode([
|
|
11
|
+
new OperatorNode(),
|
|
12
|
+
new CommandExpressionNode(),
|
|
13
|
+
new OperandNode()
|
|
14
|
+
]);
|
|
15
|
+
|
|
16
|
+
// from https://stackoverflow.com/a/175787/17836168
|
|
17
|
+
isNumeric = (str: string): boolean => {
|
|
18
|
+
return (
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
!isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
|
|
22
|
+
!isNaN(parseFloat(str))
|
|
23
|
+
); // ...and ensure strings of whitespace fail
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
getPrecedence = (token: string): number => {
|
|
27
|
+
switch (token) {
|
|
28
|
+
case "&&":
|
|
29
|
+
case "||":
|
|
30
|
+
case "^":
|
|
31
|
+
return 1;
|
|
32
|
+
case "==":
|
|
33
|
+
case "!=":
|
|
34
|
+
return 2;
|
|
35
|
+
case "<":
|
|
36
|
+
case ">":
|
|
37
|
+
case ">=":
|
|
38
|
+
case "<=":
|
|
39
|
+
return 3;
|
|
40
|
+
case "+":
|
|
41
|
+
case "-":
|
|
42
|
+
return 4;
|
|
43
|
+
case "*":
|
|
44
|
+
case "/":
|
|
45
|
+
case "%":
|
|
46
|
+
return 3;
|
|
47
|
+
case "!":
|
|
48
|
+
return 4;
|
|
49
|
+
case "(":
|
|
50
|
+
case ")":
|
|
51
|
+
return 0; // hack lol
|
|
52
|
+
default:
|
|
53
|
+
// usable to test if operator lol
|
|
54
|
+
// console.error(`Unknown token: ${token}`);
|
|
55
|
+
return -1;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
evaluateFreeform = (line: string, prefix: string): string[] => {
|
|
60
|
+
if (!browser) {
|
|
61
|
+
return []; // do not process when not in browser
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// tokenize first!
|
|
65
|
+
const infixTokens: string[] = [];
|
|
66
|
+
const expression = line
|
|
67
|
+
.split("//")[0]
|
|
68
|
+
.trim()
|
|
69
|
+
.slice(prefix === "" ? 0 : prefix.trim().length + 1, line.length - 2);
|
|
70
|
+
|
|
71
|
+
// region tokenizer
|
|
72
|
+
// console.log("Tokenizing:", expression);
|
|
73
|
+
const operators = "+-*/%!<>=&|^";
|
|
74
|
+
let currentToken = "";
|
|
75
|
+
let escapeToggle = false;
|
|
76
|
+
let quoteToggle = false;
|
|
77
|
+
let operatorFound = false;
|
|
78
|
+
for (const character of expression) {
|
|
79
|
+
if (escapeToggle) {
|
|
80
|
+
currentToken += character;
|
|
81
|
+
escapeToggle = false;
|
|
82
|
+
} else if (quoteToggle) {
|
|
83
|
+
currentToken += character;
|
|
84
|
+
if (character === '"') {
|
|
85
|
+
infixTokens.push(currentToken);
|
|
86
|
+
currentToken = "";
|
|
87
|
+
quoteToggle = false;
|
|
88
|
+
}
|
|
89
|
+
} else if (operatorFound) {
|
|
90
|
+
if (operators.includes(character)) {
|
|
91
|
+
currentToken += character;
|
|
92
|
+
} else if ("()".includes(character)) {
|
|
93
|
+
if (currentToken !== "") {
|
|
94
|
+
infixTokens.push(currentToken);
|
|
95
|
+
}
|
|
96
|
+
infixTokens.push(character);
|
|
97
|
+
currentToken = "";
|
|
98
|
+
operatorFound = false;
|
|
99
|
+
} else {
|
|
100
|
+
operatorFound = false;
|
|
101
|
+
infixTokens.push(currentToken);
|
|
102
|
+
if (character !== " ") {
|
|
103
|
+
currentToken = character;
|
|
104
|
+
} else {
|
|
105
|
+
currentToken = "";
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
} else if (character === "," || character === " ") {
|
|
109
|
+
if (currentToken !== "") {
|
|
110
|
+
infixTokens.push(currentToken);
|
|
111
|
+
currentToken = "";
|
|
112
|
+
}
|
|
113
|
+
} else if (character === '"') {
|
|
114
|
+
// do quote stuff unless we had an escape toggle
|
|
115
|
+
currentToken += character;
|
|
116
|
+
quoteToggle = true;
|
|
117
|
+
} else if (operators.includes(character)) {
|
|
118
|
+
if (currentToken !== "") {
|
|
119
|
+
infixTokens.push(currentToken);
|
|
120
|
+
}
|
|
121
|
+
currentToken = character;
|
|
122
|
+
operatorFound = true;
|
|
123
|
+
} else if ("()".includes(character)) {
|
|
124
|
+
if (currentToken !== "") {
|
|
125
|
+
// determine if function
|
|
126
|
+
if (
|
|
127
|
+
currentToken[0] !== "$" && // should not be a variable stand-in
|
|
128
|
+
currentToken[0] !== '"' && // should not be a string literal
|
|
129
|
+
!this.isNumeric(currentToken[0]) // should not be a number literal
|
|
130
|
+
) {
|
|
131
|
+
currentToken = `#${currentToken}`;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
infixTokens.push(currentToken);
|
|
135
|
+
}
|
|
136
|
+
infixTokens.push(character);
|
|
137
|
+
currentToken = "";
|
|
138
|
+
} else {
|
|
139
|
+
currentToken += character;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (currentToken !== "") {
|
|
144
|
+
infixTokens.push(currentToken);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// console.log(infixTokens);
|
|
148
|
+
// endregion tokenizer
|
|
149
|
+
|
|
150
|
+
// region infix to postfix
|
|
151
|
+
|
|
152
|
+
// convert from infix to postfix
|
|
153
|
+
// algo from https://www.geeksforgeeks.org/convert-infix-expression-to-postfix-expression/
|
|
154
|
+
// console.log(infixTokens);
|
|
155
|
+
const postfixTokens: string[] = [];
|
|
156
|
+
const stack: string[] = [];
|
|
157
|
+
|
|
158
|
+
infixTokens.forEach((token) => {
|
|
159
|
+
if (token.startsWith("#")) {
|
|
160
|
+
stack.push(token);
|
|
161
|
+
} else if (token === "(") {
|
|
162
|
+
stack.push("(");
|
|
163
|
+
} else if (token === ")") {
|
|
164
|
+
while (btreeUtils.peek(stack) !== "(") {
|
|
165
|
+
// just for safety
|
|
166
|
+
if (stack.length === 0) {
|
|
167
|
+
console.error(
|
|
168
|
+
"Assumption was made in postfix conversion that stack will not be empty! It was wrong!"
|
|
169
|
+
);
|
|
170
|
+
throw new Error("Wrong postfix conversion!");
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
postfixTokens.push(<string>stack.pop());
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
stack.pop(); // remove "("
|
|
177
|
+
|
|
178
|
+
if (stack.length > 0 && btreeUtils.peek(stack).startsWith("#")) {
|
|
179
|
+
postfixTokens.push(<string>stack.pop());
|
|
180
|
+
}
|
|
181
|
+
} else if (![-1, 5].includes(this.getPrecedence(token))) {
|
|
182
|
+
while (
|
|
183
|
+
stack.length > 0 &&
|
|
184
|
+
this.getPrecedence(btreeUtils.peek(stack)) >= this.getPrecedence(token)
|
|
185
|
+
) {
|
|
186
|
+
postfixTokens.push(<string>stack.pop());
|
|
187
|
+
}
|
|
188
|
+
stack.push(token);
|
|
189
|
+
} else {
|
|
190
|
+
// operand
|
|
191
|
+
postfixTokens.push(token);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// pop all remaining elements from the stack
|
|
196
|
+
while (stack.length > 0) {
|
|
197
|
+
postfixTokens.push(<string>stack.pop());
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// console.log("Finished postfix", postfixTokens);
|
|
201
|
+
// endregion infix to postfix
|
|
202
|
+
|
|
203
|
+
// evaluate
|
|
204
|
+
let currentState: ExpressionState = {
|
|
205
|
+
operandStack: []
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
postfixTokens.forEach((token) => {
|
|
209
|
+
// console.log("Current token", token);
|
|
210
|
+
const result = this.evaluatorTree.process({
|
|
211
|
+
initState: currentState,
|
|
212
|
+
token: token
|
|
213
|
+
});
|
|
214
|
+
// console.log("Token evaluated with result", result.nextState.operandStack.toString());
|
|
215
|
+
currentState = result.nextState;
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// console.log("Result", currentState.operandStack);
|
|
219
|
+
return currentState.operandStack;
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* evaluates a yarn if or elseif statement
|
|
224
|
+
* @param line is the current line being evaluated
|
|
225
|
+
* @param prefix is either "<<if" or "<<elseif"
|
|
226
|
+
*/
|
|
227
|
+
evaluate = (line: string, prefix: string): boolean => {
|
|
228
|
+
if (!browser) {
|
|
229
|
+
return false; // do not process when not in browser
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return String(btreeUtils.peek(this.evaluateFreeform(line, prefix))) === "true";
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export const expressionEvaluator = new ExpressionEvaluator();
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BaseBehaviorResult } from "$lib/components/dialog_manager/behavior_tree/core/BaseBehaviorResult";
|
|
2
|
+
import type { ExpressionState } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionState";
|
|
3
|
+
|
|
4
|
+
export interface ExpressionResult extends BaseBehaviorResult {
|
|
5
|
+
nextState: ExpressionState;
|
|
6
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SelectorNode } from "$lib/components/dialog_manager/behavior_tree/core/SelectorNode";
|
|
2
|
+
import type { ExpressionArguments } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionArguments";
|
|
3
|
+
import type { ExpressionResult } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionResult";
|
|
4
|
+
import { BehaviorStatus } from "$lib/components/dialog_manager/behavior_tree/core/BehaviorStatus";
|
|
5
|
+
import type { ExpressionBehaviorNode } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode";
|
|
6
|
+
|
|
7
|
+
export class ExpressionSelectorNode extends SelectorNode<ExpressionArguments, ExpressionResult> {
|
|
8
|
+
constructor(nodeList: ExpressionBehaviorNode[]) {
|
|
9
|
+
super(nodeList);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
defaultResult = (): ExpressionResult => {
|
|
13
|
+
return {
|
|
14
|
+
nextState: {
|
|
15
|
+
operandStack: []
|
|
16
|
+
},
|
|
17
|
+
status: BehaviorStatus.Failure
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExpressionBehaviorNode } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode";
|
|
2
|
+
import type { ExpressionArguments } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionArguments";
|
|
3
|
+
import type { ExpressionResult } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionResult";
|
|
4
|
+
import { BehaviorStatus } from "$lib/components/dialog_manager/behavior_tree/core/BehaviorStatus";
|
|
5
|
+
import { btreeUtils } from "$lib/components/dialog_manager/behavior_tree/core/BTreeUtils";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Puts the token as an operand
|
|
9
|
+
* It's always successful
|
|
10
|
+
*/
|
|
11
|
+
export class OperandNode implements ExpressionBehaviorNode {
|
|
12
|
+
process(nodeArgs: ExpressionArguments): ExpressionResult {
|
|
13
|
+
nodeArgs.initState.operandStack.push(btreeUtils.simplifyToken(nodeArgs.token));
|
|
14
|
+
return {
|
|
15
|
+
nextState: nodeArgs.initState,
|
|
16
|
+
status: BehaviorStatus.Success
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ExpressionBehaviorNode } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode";
|
|
2
|
+
import type { ExpressionArguments } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionArguments";
|
|
3
|
+
import type { ExpressionResult } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionResult";
|
|
4
|
+
import { BehaviorStatus } from "$lib/components/dialog_manager/behavior_tree/core/BehaviorStatus";
|
|
5
|
+
import { operatorMap } from "$lib/components/dialog_manager/behavior_tree/expression/operators/OperatorMap";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A leaf node that returns:
|
|
9
|
+
* - Success if the current token is an operator, and does its associated logic
|
|
10
|
+
* - Failure if it is not an operator
|
|
11
|
+
*/
|
|
12
|
+
export class OperatorNode implements ExpressionBehaviorNode {
|
|
13
|
+
process(nodeArgs: ExpressionArguments): ExpressionResult {
|
|
14
|
+
if (!operatorMap.exists(nodeArgs.token)) {
|
|
15
|
+
return {
|
|
16
|
+
nextState: nodeArgs.initState,
|
|
17
|
+
status: BehaviorStatus.Failure
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const logic = operatorMap.get(nodeArgs.token);
|
|
22
|
+
if (logic === undefined) {
|
|
23
|
+
console.error(`Unimplemented operator: ${nodeArgs.token}`);
|
|
24
|
+
return {
|
|
25
|
+
nextState: nodeArgs.initState,
|
|
26
|
+
status: BehaviorStatus.Failure
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
logic.process(nodeArgs);
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
nextState: nodeArgs.initState,
|
|
34
|
+
status: BehaviorStatus.Success
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
package/src/lib/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ExpressionBehaviorNode } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode";
|
|
2
|
+
import type { ExpressionArguments } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionArguments";
|
|
3
|
+
import type { ExpressionResult } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionResult";
|
|
4
|
+
import { commandMap } from "$lib/components/dialog_manager/behavior_tree/expression/commands/CommandMap";
|
|
5
|
+
import { BehaviorStatus } from "$lib/components/dialog_manager/behavior_tree/core/BehaviorStatus";
|
|
6
|
+
|
|
7
|
+
export class CommandExpressionNode implements ExpressionBehaviorNode {
|
|
8
|
+
process(nodeArgs: ExpressionArguments): ExpressionResult {
|
|
9
|
+
const commandNode = commandMap.get(nodeArgs.token);
|
|
10
|
+
if (commandNode === undefined) {
|
|
11
|
+
if (nodeArgs.token.startsWith("#")) {
|
|
12
|
+
console.error(`Unimplemented command: ${nodeArgs.token}`);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
nextState: nodeArgs.initState,
|
|
17
|
+
status: BehaviorStatus.Failure
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
commandNode.process(nodeArgs);
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
nextState: nodeArgs.initState,
|
|
25
|
+
status: BehaviorStatus.Success
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
package/src/lib/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ExpressionBehaviorNode } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode";
|
|
2
|
+
import type { ExpressionArguments } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionArguments";
|
|
3
|
+
import type { ExpressionResult } from "$lib/components/dialog_manager/behavior_tree/expression/ExpressionResult";
|
|
4
|
+
import { BehaviorStatus } from "$lib/components/dialog_manager/behavior_tree/core/BehaviorStatus";
|
|
5
|
+
|
|
6
|
+
export abstract class CommandLogicNode implements ExpressionBehaviorNode {
|
|
7
|
+
abstract getToken: () => string;
|
|
8
|
+
abstract getArgumentCount: () => number;
|
|
9
|
+
abstract doOperation: (currentOperands: string[], nodeArgs: ExpressionArguments) => void; // do side effects on to the result instead
|
|
10
|
+
|
|
11
|
+
process(nodeArgs: ExpressionArguments): ExpressionResult {
|
|
12
|
+
const currentOperands = nodeArgs.initState.operandStack.slice(
|
|
13
|
+
nodeArgs.initState.operandStack.length - this.getArgumentCount(),
|
|
14
|
+
nodeArgs.initState.operandStack.length
|
|
15
|
+
);
|
|
16
|
+
nodeArgs.initState.operandStack = nodeArgs.initState.operandStack.slice(
|
|
17
|
+
0,
|
|
18
|
+
nodeArgs.initState.operandStack.length - this.getArgumentCount()
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
if (currentOperands.length !== this.getArgumentCount()) {
|
|
22
|
+
console.error(`Insufficient operands/arguments found for command ${this.getToken()}`);
|
|
23
|
+
console.error(`Arguments found instead: ${currentOperands}`);
|
|
24
|
+
console.error(`Error occurred at token: ${nodeArgs.token}`);
|
|
25
|
+
} else {
|
|
26
|
+
this.doOperation(currentOperands, nodeArgs);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
nextState: nodeArgs.initState,
|
|
31
|
+
status: BehaviorStatus.Success
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CommandLogicNode } from "$lib/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode";
|
|
2
|
+
import { RandomRangeCommand } from "$lib/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand";
|
|
3
|
+
import { VisitedCountCommand } from "$lib/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand";
|
|
4
|
+
import { VisitedCommand } from "$lib/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand";
|
|
5
|
+
|
|
6
|
+
class CommandMap {
|
|
7
|
+
_commandMap: Map<string, CommandLogicNode> = new Map();
|
|
8
|
+
|
|
9
|
+
constructor() {
|
|
10
|
+
[new RandomRangeCommand(), new VisitedCountCommand(), new VisitedCommand()].forEach(
|
|
11
|
+
(commandLogic) => {
|
|
12
|
+
this._commandMap.set(commandLogic.getToken(), commandLogic);
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get = (command: string): CommandLogicNode | undefined => {
|
|
18
|
+
return this._commandMap.get(command);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exists = (command: string): boolean => {
|
|
22
|
+
return this.get(command) !== undefined;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const commandMap = new CommandMap();
|