From 1427cf2ca864703ed4badf4a4117dadb23abdf8a Mon Sep 17 00:00:00 2001 From: significantotter Date: Sun, 29 Jan 2023 10:07:18 -0500 Subject: [PATCH 01/11] implements basic vite client. Currently just stubs its data --- client/.gitignore | 24 + client/.vscode/extensions.json | 3 + client/README.md | 18 + client/index.html | 265 + client/package-lock.json | 1870 ++ client/package.json | 22 + client/public/vite.svg | 1 + client/tsconfig.json | 19 + client/tsconfig.node.json | 9 + client/vite.config.ts | 18 + client/vue-src/App.vue | 20 + client/vue-src/assets/vue.svg | 1 + client/vue-src/components/HelloWorld.vue | 38 + .../legacy-js/admin_builders/admin-panel.js | 21 + .../ancestry/builder-ancestry.js | 208 + .../ancestry/editor-ancestry.js | 159 + .../ancestry/manager-ancestry.js | 62 + .../archetype/builder-archetype.js | 164 + .../archetype/editor-archetype.js | 132 + .../archetype/manager-archetype.js | 63 + .../background/builder-background.js | 67 + .../background/editor-background.js | 43 + .../background/manager-background.js | 62 + .../admin_builders/cClass/builder-class.js | 335 + .../admin_builders/cClass/editor-class.js | 207 + .../admin_builders/cClass/manager-class.js | 66 + .../class-feature/builder-class-feature.js | 233 + .../class-feature/editor-class-feature.js | 88 + .../class-feature/manager-class-feature.js | 63 + .../creature/manager-creature.js | 441 + .../admin_builders/eExtra/builder-extra.js | 90 + .../admin_builders/eExtra/editor-extra.js | 47 + .../admin_builders/eExtra/manager-extra.js | 62 + .../legacy-js/admin_builders/editor-utils.js | 58 + .../feat-action/builder-feat-action.js | 252 + .../feat-action/editor-feat-action.js | 112 + .../feat-action/manager-feat-action.js | 63 + .../heritage/builder-heritage.js | 71 + .../heritage/editor-heritage.js | 34 + .../heritage/manager-heritage.js | 63 + .../admin_builders/item/builder-item.js | 384 + .../admin_builders/item/editor-item.js | 182 + .../admin_builders/item/manager-item.js | 62 + .../admin_builders/spell/builder-spell.js | 104 + .../admin_builders/spell/editor-spell.js | 73 + .../admin_builders/spell/manager-spell.js | 131 + .../uni-heritage/builder-uni-heritage.js | 135 + .../uni-heritage/editor-uni-heritage.js | 96 + .../uni-heritage/manager-uni-heritage.js | 63 + .../legacy-js/api/api-request-access.js | 31 + .../legacy-js/api/profile-api-clients.js | 223 + client/vue-src/legacy-js/back-to-top.js | 49 + .../browse/ancestry/ancestry-browse.js | 81 + .../browse/archetype/archetype-browse.js | 116 + .../browse/background/background-browse.js | 92 + .../vue-src/legacy-js/browse/browse-utils.js | 40 + .../legacy-js/browse/cClass/class-browse.js | 81 + .../legacy-js/browse/feat/feat-browse.js | 176 + .../legacy-js/browse/general-browse.js | 548 + .../legacy-js/browse/item/item-browse.js | 195 + .../vue-src/legacy-js/browse/query-params.js | 162 + .../legacy-js/browse/spell/spell-browse.js | 252 + .../uni_heritage/uni-heritage-browse.js | 71 + .../data_mapping/data-map-ext.js | 250 + .../build_planner/data_mapping/data-map.js | 238 + .../build_planner/data_mapping/retrieval.js | 75 + .../build_planner/libraries/selector.js | 117 + .../vue-src/legacy-js/build_planner/main.js | 1115 + .../build_planner/modules/process-ancestry.js | 487 + .../modules/process-background.js | 78 + .../build_planner/modules/process-class.js | 320 + .../modules/process-custom-code.js | 46 + .../build_planner/processor/core-processor.js | 282 + .../sub_processors/builder-statements.js | 133 + .../sub_processors/builder/display-structs.js | 23 + .../sub_processors/builder/feats-selection.js | 475 + .../sub_processors/builder/prereq-parser.js | 491 + .../sub_processors/builder/wsc-boosts.js | 213 + .../sub_processors/builder/wsc-charTags.js | 175 + .../builder/wsc-class-feature.js | 212 + .../sub_processors/builder/wsc-domains.js | 202 + .../sub_processors/builder/wsc-familiarity.js | 37 + .../sub_processors/builder/wsc-feats.js | 549 + .../sub_processors/builder/wsc-heritage.js | 183 + .../sub_processors/builder/wsc-keyAbility.js | 25 + .../sub_processors/builder/wsc-langs.js | 210 + .../sub_processors/builder/wsc-lore.js | 152 + .../sub_processors/builder/wsc-notes.js | 76 + .../sub_processors/builder/wsc-phyFeats.js | 44 + .../sub_processors/builder/wsc-profs.js | 200 + .../sub_processors/builder/wsc-resistances.js | 63 + .../sub_processors/builder/wsc-scfs.js | 164 + .../sub_processors/builder/wsc-senses.js | 45 + .../sub_processors/builder/wsc-skills.js | 259 + .../builder/wsc-specializations.js | 97 + .../sub_processors/builder/wsc-speeds.js | 39 + .../builder/wsc-spells-focus.js | 67 + .../builder/wsc-spells-innate.js | 212 + .../sub_processors/builder/wsc-spells.js | 191 + .../sub_processors/expression-processor.js | 749 + .../sub_processors/expression-utils.js | 163 + .../sub_processors/sheet-statements.js | 460 + .../scripts/extra-skills-and-langs.js | 59 + .../build_planner/scripts/init-variables.js | 209 + .../scripts/process-ancestry-stats.js | 514 + .../scripts/process-class-stats.js | 479 + .../scripts/unselected-options.js | 153 + .../variants/auto-bonus-progression.js | 239 + .../scripts/variants/class-archetypes.js | 439 + .../scripts/variants/free-archetype.js | 25 + .../variants/gradual-ability-boosts.js | 69 + .../legacy-js/build_planner/ui-handler.js | 174 + .../legacy-js/builds/build-creator-augment.js | 347 + .../legacy-js/builds/build-creator-init.js | 635 + client/vue-src/legacy-js/builds/build-view.js | 1034 + .../vue-src/legacy-js/builds/builds-browse.js | 181 + .../legacy-js/builds/general-builds.js | 67 + .../vue-src/legacy-js/builds/user-content.js | 121 + .../legacy-js/bulma/bulma-accordion.min.js | 1 + .../legacy-js/bulma/bulma-collapsible.min.js | 1 + .../legacy-js/bulma/bulma-quickview.min.js | 1 + .../legacy-js/bulma/bulma-steps.min.js | 1 + .../legacy-js/bulma/bulma-tagsinput.min.js | 1 + client/vue-src/legacy-js/cache-storing.js | 142 + .../char_builders/char-builder-general.js | 296 + .../char_builders/char-builder-init.js | 920 + .../char_builders/pages/page-2-ancestry.js | 675 + .../char_builders/pages/page-3-background.js | 147 + .../char_builders/pages/page-4-class.js | 794 + .../char_builders/pages/page-5-finalize.js | 206 + .../legacy-js/char_builders/top-stickies.js | 13 + .../char_builders/unselected-options.js | 138 + .../vue-src/legacy-js/char_builders/utils.js | 101 + .../variants/auto-bonus-progression.js | 239 + .../variants/class-archetypes.js | 423 + .../char_builders/variants/dual-class.js | 7 + .../char_builders/variants/free-archetype.js | 25 + .../variants/gradual-ability-boosts.js | 69 + .../char_builders/wsc/display-structs.js | 23 + .../char_builders/wsc/feats-selection.js | 385 + .../char_builders/wsc/init-processing.js | 465 + .../char_builders/wsc/prereq-parser.js | 408 + .../char_builders/wsc/prof-manager.js | 9 + .../char_builders/wsc/quickview-left.js | 213 + .../char_builders/wsc/skill-manager.js | 198 + .../legacy-js/char_builders/wsc/wsc-boosts.js | 167 + .../char_builders/wsc/wsc-charTags.js | 167 + .../char_builders/wsc/wsc-class-feature.js | 249 + .../char_builders/wsc/wsc-domains.js | 177 + .../char_builders/wsc/wsc-familiarity.js | 31 + .../legacy-js/char_builders/wsc/wsc-feats.js | 548 + .../char_builders/wsc/wsc-heritage.js | 193 + .../char_builders/wsc/wsc-keyAbility.js | 24 + .../legacy-js/char_builders/wsc/wsc-langs.js | 197 + .../legacy-js/char_builders/wsc/wsc-lore.js | 160 + .../legacy-js/char_builders/wsc/wsc-notes.js | 65 + .../char_builders/wsc/wsc-phyFeats.js | 31 + .../legacy-js/char_builders/wsc/wsc-profs.js | 237 + .../char_builders/wsc/wsc-resistances.js | 47 + .../legacy-js/char_builders/wsc/wsc-scfs.js | 158 + .../legacy-js/char_builders/wsc/wsc-senses.js | 31 + .../legacy-js/char_builders/wsc/wsc-skills.js | 208 + .../char_builders/wsc/wsc-specializations.js | 79 + .../legacy-js/char_builders/wsc/wsc-speeds.js | 33 + .../char_builders/wsc/wsc-spells-focus.js | 45 + .../char_builders/wsc/wsc-spells-innate.js | 184 + .../legacy-js/char_builders/wsc/wsc-spells.js | 167 + .../legacy-js/char_export/export-handler.js | 42 + .../legacy-js/char_export/populate-pdf.js | 983 + client/vue-src/legacy-js/character-list.js | 165 + .../vue-src/legacy-js/confirm-page-leave.js | 22 + client/vue-src/legacy-js/general-utils.js | 432 + .../gm_tools/campaigns/conditions-handler.js | 75 + .../gm_tools/campaigns/ui-handler.js | 156 + .../encounter_builder/balance-utils.js | 102 + .../encounter_builder/campaigns-handler.js | 177 + .../encounter_builder/campaigns-ui.js | 113 + .../encounter_builder/conditions-ui.js | 232 + .../creature-select-quickview.js | 768 + .../encounter_builder/creature-utils.js | 295 + .../encounter_builder/encounter-builder.js | 763 + .../encounter_builder/roll-initiative.js | 162 + .../gm_tools/shop_generator/generation.js | 527 + .../gm_tools/shop_generator/item-profiles.js | 807 + .../gm_tools/shop_generator/presets.js | 4542 ++++ .../legacy-js/gm_tools/shop_generator/shop.js | 165 + .../gm_tools/shop_generator/ui-handler.js | 189 + .../vue-src/legacy-js/gm_tools/ui-handler.js | 24 + client/vue-src/legacy-js/home-page.js | 168 + .../builder/ancestry/builder-ancestry.js | 198 + .../builder/ancestry/editor-ancestry.js | 158 + .../builder/archetype/builder-archetype.js | 154 + .../builder/archetype/editor-archetype.js | 131 + .../builder/background/builder-background.js | 57 + .../builder/background/editor-background.js | 42 + .../homebrew/builder/builder-templating.js | 196 + .../homebrew/builder/bundle-editor.js | 692 + .../homebrew/builder/cClass/builder-class.js | 325 + .../homebrew/builder/cClass/editor-class.js | 206 + .../class-feature/builder-class-feature.js | 225 + .../class-feature/editor-class-feature.js | 88 + .../builder/creature/builder-creature.js | 207 + .../builder/creature/editor-creature.js | 34 + .../feat-action/builder-feat-action.js | 242 + .../builder/feat-action/editor-feat-action.js | 159 + .../builder/heritage/builder-heritage.js | 63 + .../builder/heritage/editor-heritage.js | 34 + .../homebrew/builder/item/builder-item.js | 373 + .../homebrew/builder/item/editor-item.js | 180 + .../builder/language/builder-language.js | 49 + .../builder/language/editor-language.js | 34 + .../homebrew/builder/spell/builder-spell.js | 93 + .../homebrew/builder/spell/editor-spell.js | 71 + .../builder/toggleable/builder-toggleable.js | 47 + .../builder/toggleable/editor-toggleable.js | 33 + .../homebrew/builder/trait/builder-trait.js | 45 + .../homebrew/builder/trait/editor-trait.js | 32 + .../uni-heritage/builder-uni-heritage.js | 125 + .../uni-heritage/editor-uni-heritage.js | 95 + .../legacy-js/homebrew/bundle-browse.js | 198 + .../legacy-js/homebrew/bundle-manage-keys.js | 57 + .../vue-src/legacy-js/homebrew/bundle-view.js | 458 + .../legacy-js/homebrew/general-homebrew.js | 85 + .../legacy-js/homebrew/user-collection.js | 67 + .../legacy-js/homebrew/user-content.js | 147 + .../legacy-js/jQuery/chosen.jquery.min.js | 3 + .../jQuery/jquery.ui.touch-punch.min.js | 11 + .../confirm_message/confirm-message.js | 32 + .../display_ancestry/display-ancestry.js | 217 + .../display_archetype/display-archetype.js | 129 + .../display_background/display-background.js | 86 + .../display_campaign/display-campaign.js | 425 + .../libraries/display_class/display-class.js | 242 + .../display-uni-heritage.js | 126 + .../libraries/form-entry-ui/form-entry-ui.js | 39 + .../modal_selection/modal-selection.js | 144 + .../legacy-js/loading_bar/loading-bar.js | 811 + .../legacy-js/loading_bar/loadingHandler.js | 141 + client/vue-src/legacy-js/mobile-view.js | 52 + client/vue-src/legacy-js/prof/prof-manager.js | 134 + client/vue-src/legacy-js/profile-page.js | 81 + client/vue-src/legacy-js/require-signin.js | 18 + client/vue-src/legacy-js/sheet/char-sheet.js | 3136 +++ .../legacy-js/sheet/general/coin-manager.js | 134 + .../sheet/general/conditions-manager.js | 333 + .../sheet/general/critical-specializations.js | 233 + .../legacy-js/sheet/general/item-runes.js | 539 + .../legacy-js/sheet/general/manage-spells.js | 515 + .../legacy-js/sheet/general/notes-fields.js | 49 + .../sheet/general/prof-history-display.js | 28 + .../legacy-js/sheet/general/remote-updates.js | 192 + .../legacy-js/sheet/general/sheet-states.js | 52 + .../legacy-js/sheet/general/stat-manager.js | 244 + .../sheet/general/weap-mod-manager.js | 98 + .../sheet/quickviews/_left-quickview.js | 438 + .../sheet/quickviews/_old_add-item-view.js | 626 + .../legacy-js/sheet/quickviews/_quickviews.js | 234 + .../sheet/quickviews/ability-score-view.js | 39 + .../ability-scores-breakdown-view.js | 171 + .../sheet/quickviews/ability-view.js | 139 + .../legacy-js/sheet/quickviews/ac-view.js | 79 + .../sheet/quickviews/add-item-view.js | 947 + .../sheet/quickviews/add-lang-view.js | 51 + .../sheet/quickviews/add-lore-view.js | 49 + .../sheet/quickviews/add-prof-view.js | 109 + .../sheet/quickviews/add-resist-view.js | 41 + .../sheet/quickviews/add-spell-slot-view.js | 33 + .../sheet/quickviews/add-spell-view.js | 430 + .../quickviews/add-unarmed-attack-view.js | 254 + .../sheet/quickviews/add-weak-view.js | 41 + .../sheet/quickviews/animal-comp-view.js | 404 + .../sheet/quickviews/char-info-view.js | 225 + .../sheet/quickviews/character-view.js | 564 + .../sheet/quickviews/class-dc-view.js | 108 + .../sheet/quickviews/condition-view.js | 13 + .../sheet/quickviews/creature-custom-view.js | 59 + .../sheet/quickviews/creature-view.js | 968 + .../sheet/quickviews/customize-item-view.js | 247 + .../sheet/quickviews/customize-prof-view.js | 113 + .../sheet/quickviews/familiar-view.js | 262 + .../legacy-js/sheet/quickviews/feat-view.js | 316 + .../quickviews/general-breakdown-view.js | 219 + .../sheet/quickviews/hero-points-view.js | 18 + .../quickviews/hit-points-breakdown-view.js | 100 + .../sheet/quickviews/inv-item-view.js | 856 + .../sheet/quickviews/item-breakdown-view.js | 192 + .../legacy-js/sheet/quickviews/item-view.js | 242 + .../sheet/quickviews/language-view.js | 83 + .../sheet/quickviews/other-profs-view.js | 113 + .../sheet/quickviews/perception-view.js | 118 + .../sheet/quickviews/resist-list-view.js | 105 + .../legacy-js/sheet/quickviews/resist-view.js | 72 + .../sheet/quickviews/saving-throw-view.js | 107 + .../legacy-js/sheet/quickviews/skill-view.js | 136 + .../legacy-js/sheet/quickviews/speed-view.js | 69 + .../sheet/quickviews/spell-empty-view.js | 93 + .../legacy-js/sheet/quickviews/spell-view.js | 1211 + .../legacy-js/sheet/quickviews/tag-view.js | 40 + .../sheet/quickviews/warnings-view.js | 49 + client/vue-src/legacy-js/sheet/tabs/_tabs.js | 41 + .../legacy-js/sheet/tabs/actions-tab.js | 567 + .../legacy-js/sheet/tabs/companions-tab.js | 135 + .../legacy-js/sheet/tabs/details-tab.js | 593 + .../legacy-js/sheet/tabs/inventory-tab.js | 688 + .../vue-src/legacy-js/sheet/tabs/notes-tab.js | 248 + .../legacy-js/sheet/tabs/spells-tab.js | 1201 + .../legacy-js/sheet/tabs/weapons-tab.js | 259 + .../sheet/utils/animal-comp-utils.js | 438 + .../legacy-js/sheet/utils/calc-utils.js | 553 + .../legacy-js/sheet/utils/dice-roller.js | 132 + .../legacy-js/sheet/utils/familiar-utils.js | 295 + .../sheet/utils/item-actions-generator.js | 114 + .../legacy-js/sheet/utils/item-utils.js | 427 + .../legacy-js/sheet/utils/material-utils.js | 23 + .../legacy-js/sheet/utils/prof-map-utils.js | 382 + .../legacy-js/sheet/utils/sheet-reload.js | 19 + .../legacy-js/sheet/utils/spell-utils.js | 106 + .../legacy-js/sheet/utils/struct-utils.js | 4 + client/vue-src/legacy-js/sheet/utils/utils.js | 79 + client/vue-src/legacy-js/show-more.js | 48 + .../legacy-js/wsc/add-text-processing.js | 188 + .../wsc/default-statement-processing.js | 168 + client/vue-src/legacy-js/wsc/docs-page.js | 32 + client/vue-src/legacy-js/wsc/errorHandling.js | 44 + .../legacy-js/wsc/expression-processing.js | 699 + .../vue-src/legacy-js/wsc/expression-utils.js | 31 + .../legacy-js/wsc/misc-feat-processing.js | 124 + .../legacy-js/wsc/removal-processing.js | 172 + .../legacy-js/wsc/statement-processing.js | 585 + .../vue-src/legacy-js/wsc/text-processing.js | 848 + .../legacy-js/wsc/variable-processing.js | 1316 ++ client/vue-src/main.ts | 24 + client/vue-src/style.css | 1 + .../character-list/character-list.vue | 450 + client/vue-src/vite-env.d.ts | 1 + package-lock.json | 19585 +++++++++++++--- 336 files changed, 94197 insertions(+), 3441 deletions(-) create mode 100644 client/.gitignore create mode 100644 client/.vscode/extensions.json create mode 100644 client/README.md create mode 100644 client/index.html create mode 100644 client/package-lock.json create mode 100644 client/package.json create mode 100644 client/public/vite.svg create mode 100644 client/tsconfig.json create mode 100644 client/tsconfig.node.json create mode 100644 client/vite.config.ts create mode 100644 client/vue-src/App.vue create mode 100644 client/vue-src/assets/vue.svg create mode 100644 client/vue-src/components/HelloWorld.vue create mode 100644 client/vue-src/legacy-js/admin_builders/admin-panel.js create mode 100644 client/vue-src/legacy-js/admin_builders/ancestry/builder-ancestry.js create mode 100644 client/vue-src/legacy-js/admin_builders/ancestry/editor-ancestry.js create mode 100644 client/vue-src/legacy-js/admin_builders/ancestry/manager-ancestry.js create mode 100644 client/vue-src/legacy-js/admin_builders/archetype/builder-archetype.js create mode 100644 client/vue-src/legacy-js/admin_builders/archetype/editor-archetype.js create mode 100644 client/vue-src/legacy-js/admin_builders/archetype/manager-archetype.js create mode 100644 client/vue-src/legacy-js/admin_builders/background/builder-background.js create mode 100644 client/vue-src/legacy-js/admin_builders/background/editor-background.js create mode 100644 client/vue-src/legacy-js/admin_builders/background/manager-background.js create mode 100644 client/vue-src/legacy-js/admin_builders/cClass/builder-class.js create mode 100644 client/vue-src/legacy-js/admin_builders/cClass/editor-class.js create mode 100644 client/vue-src/legacy-js/admin_builders/cClass/manager-class.js create mode 100644 client/vue-src/legacy-js/admin_builders/class-feature/builder-class-feature.js create mode 100644 client/vue-src/legacy-js/admin_builders/class-feature/editor-class-feature.js create mode 100644 client/vue-src/legacy-js/admin_builders/class-feature/manager-class-feature.js create mode 100644 client/vue-src/legacy-js/admin_builders/creature/manager-creature.js create mode 100644 client/vue-src/legacy-js/admin_builders/eExtra/builder-extra.js create mode 100644 client/vue-src/legacy-js/admin_builders/eExtra/editor-extra.js create mode 100644 client/vue-src/legacy-js/admin_builders/eExtra/manager-extra.js create mode 100644 client/vue-src/legacy-js/admin_builders/editor-utils.js create mode 100644 client/vue-src/legacy-js/admin_builders/feat-action/builder-feat-action.js create mode 100644 client/vue-src/legacy-js/admin_builders/feat-action/editor-feat-action.js create mode 100644 client/vue-src/legacy-js/admin_builders/feat-action/manager-feat-action.js create mode 100644 client/vue-src/legacy-js/admin_builders/heritage/builder-heritage.js create mode 100644 client/vue-src/legacy-js/admin_builders/heritage/editor-heritage.js create mode 100644 client/vue-src/legacy-js/admin_builders/heritage/manager-heritage.js create mode 100644 client/vue-src/legacy-js/admin_builders/item/builder-item.js create mode 100644 client/vue-src/legacy-js/admin_builders/item/editor-item.js create mode 100644 client/vue-src/legacy-js/admin_builders/item/manager-item.js create mode 100644 client/vue-src/legacy-js/admin_builders/spell/builder-spell.js create mode 100644 client/vue-src/legacy-js/admin_builders/spell/editor-spell.js create mode 100644 client/vue-src/legacy-js/admin_builders/spell/manager-spell.js create mode 100644 client/vue-src/legacy-js/admin_builders/uni-heritage/builder-uni-heritage.js create mode 100644 client/vue-src/legacy-js/admin_builders/uni-heritage/editor-uni-heritage.js create mode 100644 client/vue-src/legacy-js/admin_builders/uni-heritage/manager-uni-heritage.js create mode 100644 client/vue-src/legacy-js/api/api-request-access.js create mode 100644 client/vue-src/legacy-js/api/profile-api-clients.js create mode 100644 client/vue-src/legacy-js/back-to-top.js create mode 100644 client/vue-src/legacy-js/browse/ancestry/ancestry-browse.js create mode 100644 client/vue-src/legacy-js/browse/archetype/archetype-browse.js create mode 100644 client/vue-src/legacy-js/browse/background/background-browse.js create mode 100644 client/vue-src/legacy-js/browse/browse-utils.js create mode 100644 client/vue-src/legacy-js/browse/cClass/class-browse.js create mode 100644 client/vue-src/legacy-js/browse/feat/feat-browse.js create mode 100644 client/vue-src/legacy-js/browse/general-browse.js create mode 100644 client/vue-src/legacy-js/browse/item/item-browse.js create mode 100644 client/vue-src/legacy-js/browse/query-params.js create mode 100644 client/vue-src/legacy-js/browse/spell/spell-browse.js create mode 100644 client/vue-src/legacy-js/browse/uni_heritage/uni-heritage-browse.js create mode 100644 client/vue-src/legacy-js/build_planner/data_mapping/data-map-ext.js create mode 100644 client/vue-src/legacy-js/build_planner/data_mapping/data-map.js create mode 100644 client/vue-src/legacy-js/build_planner/data_mapping/retrieval.js create mode 100644 client/vue-src/legacy-js/build_planner/libraries/selector.js create mode 100644 client/vue-src/legacy-js/build_planner/main.js create mode 100644 client/vue-src/legacy-js/build_planner/modules/process-ancestry.js create mode 100644 client/vue-src/legacy-js/build_planner/modules/process-background.js create mode 100644 client/vue-src/legacy-js/build_planner/modules/process-class.js create mode 100644 client/vue-src/legacy-js/build_planner/modules/process-custom-code.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/core-processor.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder-statements.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/display-structs.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/feats-selection.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/prereq-parser.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-boosts.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-charTags.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-class-feature.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-domains.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-familiarity.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-feats.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-heritage.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-keyAbility.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-langs.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-lore.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-notes.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-phyFeats.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-profs.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-resistances.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-scfs.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-senses.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-skills.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-specializations.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-speeds.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells-focus.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells-innate.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/expression-processor.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/expression-utils.js create mode 100644 client/vue-src/legacy-js/build_planner/processor/sub_processors/sheet-statements.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/extra-skills-and-langs.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/init-variables.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/process-ancestry-stats.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/process-class-stats.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/unselected-options.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/variants/auto-bonus-progression.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/variants/class-archetypes.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/variants/free-archetype.js create mode 100644 client/vue-src/legacy-js/build_planner/scripts/variants/gradual-ability-boosts.js create mode 100644 client/vue-src/legacy-js/build_planner/ui-handler.js create mode 100644 client/vue-src/legacy-js/builds/build-creator-augment.js create mode 100644 client/vue-src/legacy-js/builds/build-creator-init.js create mode 100644 client/vue-src/legacy-js/builds/build-view.js create mode 100644 client/vue-src/legacy-js/builds/builds-browse.js create mode 100644 client/vue-src/legacy-js/builds/general-builds.js create mode 100644 client/vue-src/legacy-js/builds/user-content.js create mode 100644 client/vue-src/legacy-js/bulma/bulma-accordion.min.js create mode 100644 client/vue-src/legacy-js/bulma/bulma-collapsible.min.js create mode 100644 client/vue-src/legacy-js/bulma/bulma-quickview.min.js create mode 100644 client/vue-src/legacy-js/bulma/bulma-steps.min.js create mode 100644 client/vue-src/legacy-js/bulma/bulma-tagsinput.min.js create mode 100644 client/vue-src/legacy-js/cache-storing.js create mode 100644 client/vue-src/legacy-js/char_builders/char-builder-general.js create mode 100644 client/vue-src/legacy-js/char_builders/char-builder-init.js create mode 100644 client/vue-src/legacy-js/char_builders/pages/page-2-ancestry.js create mode 100644 client/vue-src/legacy-js/char_builders/pages/page-3-background.js create mode 100644 client/vue-src/legacy-js/char_builders/pages/page-4-class.js create mode 100644 client/vue-src/legacy-js/char_builders/pages/page-5-finalize.js create mode 100644 client/vue-src/legacy-js/char_builders/top-stickies.js create mode 100644 client/vue-src/legacy-js/char_builders/unselected-options.js create mode 100644 client/vue-src/legacy-js/char_builders/utils.js create mode 100644 client/vue-src/legacy-js/char_builders/variants/auto-bonus-progression.js create mode 100644 client/vue-src/legacy-js/char_builders/variants/class-archetypes.js create mode 100644 client/vue-src/legacy-js/char_builders/variants/dual-class.js create mode 100644 client/vue-src/legacy-js/char_builders/variants/free-archetype.js create mode 100644 client/vue-src/legacy-js/char_builders/variants/gradual-ability-boosts.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/display-structs.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/feats-selection.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/init-processing.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/prereq-parser.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/prof-manager.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/quickview-left.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/skill-manager.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-boosts.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-charTags.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-class-feature.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-domains.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-familiarity.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-feats.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-heritage.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-keyAbility.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-langs.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-lore.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-notes.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-phyFeats.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-profs.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-resistances.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-scfs.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-senses.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-skills.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-specializations.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-speeds.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-spells-focus.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-spells-innate.js create mode 100644 client/vue-src/legacy-js/char_builders/wsc/wsc-spells.js create mode 100644 client/vue-src/legacy-js/char_export/export-handler.js create mode 100644 client/vue-src/legacy-js/char_export/populate-pdf.js create mode 100644 client/vue-src/legacy-js/character-list.js create mode 100644 client/vue-src/legacy-js/confirm-page-leave.js create mode 100644 client/vue-src/legacy-js/general-utils.js create mode 100644 client/vue-src/legacy-js/gm_tools/campaigns/conditions-handler.js create mode 100644 client/vue-src/legacy-js/gm_tools/campaigns/ui-handler.js create mode 100644 client/vue-src/legacy-js/gm_tools/encounter_builder/balance-utils.js create mode 100644 client/vue-src/legacy-js/gm_tools/encounter_builder/campaigns-handler.js create mode 100644 client/vue-src/legacy-js/gm_tools/encounter_builder/campaigns-ui.js create mode 100644 client/vue-src/legacy-js/gm_tools/encounter_builder/conditions-ui.js create mode 100644 client/vue-src/legacy-js/gm_tools/encounter_builder/creature-select-quickview.js create mode 100644 client/vue-src/legacy-js/gm_tools/encounter_builder/creature-utils.js create mode 100644 client/vue-src/legacy-js/gm_tools/encounter_builder/encounter-builder.js create mode 100644 client/vue-src/legacy-js/gm_tools/encounter_builder/roll-initiative.js create mode 100644 client/vue-src/legacy-js/gm_tools/shop_generator/generation.js create mode 100644 client/vue-src/legacy-js/gm_tools/shop_generator/item-profiles.js create mode 100644 client/vue-src/legacy-js/gm_tools/shop_generator/presets.js create mode 100644 client/vue-src/legacy-js/gm_tools/shop_generator/shop.js create mode 100644 client/vue-src/legacy-js/gm_tools/shop_generator/ui-handler.js create mode 100644 client/vue-src/legacy-js/gm_tools/ui-handler.js create mode 100644 client/vue-src/legacy-js/home-page.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/ancestry/builder-ancestry.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/ancestry/editor-ancestry.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/archetype/builder-archetype.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/archetype/editor-archetype.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/background/builder-background.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/background/editor-background.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/builder-templating.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/bundle-editor.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/cClass/builder-class.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/cClass/editor-class.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/class-feature/builder-class-feature.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/class-feature/editor-class-feature.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/creature/builder-creature.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/creature/editor-creature.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/feat-action/builder-feat-action.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/feat-action/editor-feat-action.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/heritage/builder-heritage.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/heritage/editor-heritage.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/item/builder-item.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/item/editor-item.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/language/builder-language.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/language/editor-language.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/spell/builder-spell.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/spell/editor-spell.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/toggleable/builder-toggleable.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/toggleable/editor-toggleable.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/trait/builder-trait.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/trait/editor-trait.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/uni-heritage/builder-uni-heritage.js create mode 100644 client/vue-src/legacy-js/homebrew/builder/uni-heritage/editor-uni-heritage.js create mode 100644 client/vue-src/legacy-js/homebrew/bundle-browse.js create mode 100644 client/vue-src/legacy-js/homebrew/bundle-manage-keys.js create mode 100644 client/vue-src/legacy-js/homebrew/bundle-view.js create mode 100644 client/vue-src/legacy-js/homebrew/general-homebrew.js create mode 100644 client/vue-src/legacy-js/homebrew/user-collection.js create mode 100644 client/vue-src/legacy-js/homebrew/user-content.js create mode 100644 client/vue-src/legacy-js/jQuery/chosen.jquery.min.js create mode 100644 client/vue-src/legacy-js/jQuery/jquery.ui.touch-punch.min.js create mode 100644 client/vue-src/legacy-js/libraries/confirm_message/confirm-message.js create mode 100644 client/vue-src/legacy-js/libraries/display_ancestry/display-ancestry.js create mode 100644 client/vue-src/legacy-js/libraries/display_archetype/display-archetype.js create mode 100644 client/vue-src/legacy-js/libraries/display_background/display-background.js create mode 100644 client/vue-src/legacy-js/libraries/display_campaign/display-campaign.js create mode 100644 client/vue-src/legacy-js/libraries/display_class/display-class.js create mode 100644 client/vue-src/legacy-js/libraries/display_uni_heritage/display-uni-heritage.js create mode 100644 client/vue-src/legacy-js/libraries/form-entry-ui/form-entry-ui.js create mode 100644 client/vue-src/legacy-js/libraries/modal_selection/modal-selection.js create mode 100644 client/vue-src/legacy-js/loading_bar/loading-bar.js create mode 100644 client/vue-src/legacy-js/loading_bar/loadingHandler.js create mode 100644 client/vue-src/legacy-js/mobile-view.js create mode 100644 client/vue-src/legacy-js/prof/prof-manager.js create mode 100644 client/vue-src/legacy-js/profile-page.js create mode 100644 client/vue-src/legacy-js/require-signin.js create mode 100644 client/vue-src/legacy-js/sheet/char-sheet.js create mode 100644 client/vue-src/legacy-js/sheet/general/coin-manager.js create mode 100644 client/vue-src/legacy-js/sheet/general/conditions-manager.js create mode 100644 client/vue-src/legacy-js/sheet/general/critical-specializations.js create mode 100644 client/vue-src/legacy-js/sheet/general/item-runes.js create mode 100644 client/vue-src/legacy-js/sheet/general/manage-spells.js create mode 100644 client/vue-src/legacy-js/sheet/general/notes-fields.js create mode 100644 client/vue-src/legacy-js/sheet/general/prof-history-display.js create mode 100644 client/vue-src/legacy-js/sheet/general/remote-updates.js create mode 100644 client/vue-src/legacy-js/sheet/general/sheet-states.js create mode 100644 client/vue-src/legacy-js/sheet/general/stat-manager.js create mode 100644 client/vue-src/legacy-js/sheet/general/weap-mod-manager.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/_left-quickview.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/_old_add-item-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/_quickviews.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/ability-score-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/ability-scores-breakdown-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/ability-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/ac-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-item-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-lang-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-lore-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-prof-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-resist-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-spell-slot-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-spell-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-unarmed-attack-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/add-weak-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/animal-comp-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/char-info-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/character-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/class-dc-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/condition-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/creature-custom-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/creature-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/customize-item-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/customize-prof-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/familiar-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/feat-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/general-breakdown-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/hero-points-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/hit-points-breakdown-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/inv-item-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/item-breakdown-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/item-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/language-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/other-profs-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/perception-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/resist-list-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/resist-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/saving-throw-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/skill-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/speed-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/spell-empty-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/spell-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/tag-view.js create mode 100644 client/vue-src/legacy-js/sheet/quickviews/warnings-view.js create mode 100644 client/vue-src/legacy-js/sheet/tabs/_tabs.js create mode 100644 client/vue-src/legacy-js/sheet/tabs/actions-tab.js create mode 100644 client/vue-src/legacy-js/sheet/tabs/companions-tab.js create mode 100644 client/vue-src/legacy-js/sheet/tabs/details-tab.js create mode 100644 client/vue-src/legacy-js/sheet/tabs/inventory-tab.js create mode 100644 client/vue-src/legacy-js/sheet/tabs/notes-tab.js create mode 100644 client/vue-src/legacy-js/sheet/tabs/spells-tab.js create mode 100644 client/vue-src/legacy-js/sheet/tabs/weapons-tab.js create mode 100644 client/vue-src/legacy-js/sheet/utils/animal-comp-utils.js create mode 100644 client/vue-src/legacy-js/sheet/utils/calc-utils.js create mode 100644 client/vue-src/legacy-js/sheet/utils/dice-roller.js create mode 100644 client/vue-src/legacy-js/sheet/utils/familiar-utils.js create mode 100644 client/vue-src/legacy-js/sheet/utils/item-actions-generator.js create mode 100644 client/vue-src/legacy-js/sheet/utils/item-utils.js create mode 100644 client/vue-src/legacy-js/sheet/utils/material-utils.js create mode 100644 client/vue-src/legacy-js/sheet/utils/prof-map-utils.js create mode 100644 client/vue-src/legacy-js/sheet/utils/sheet-reload.js create mode 100644 client/vue-src/legacy-js/sheet/utils/spell-utils.js create mode 100644 client/vue-src/legacy-js/sheet/utils/struct-utils.js create mode 100644 client/vue-src/legacy-js/sheet/utils/utils.js create mode 100644 client/vue-src/legacy-js/show-more.js create mode 100644 client/vue-src/legacy-js/wsc/add-text-processing.js create mode 100644 client/vue-src/legacy-js/wsc/default-statement-processing.js create mode 100644 client/vue-src/legacy-js/wsc/docs-page.js create mode 100644 client/vue-src/legacy-js/wsc/errorHandling.js create mode 100644 client/vue-src/legacy-js/wsc/expression-processing.js create mode 100644 client/vue-src/legacy-js/wsc/expression-utils.js create mode 100644 client/vue-src/legacy-js/wsc/misc-feat-processing.js create mode 100644 client/vue-src/legacy-js/wsc/removal-processing.js create mode 100644 client/vue-src/legacy-js/wsc/statement-processing.js create mode 100644 client/vue-src/legacy-js/wsc/text-processing.js create mode 100644 client/vue-src/legacy-js/wsc/variable-processing.js create mode 100644 client/vue-src/main.ts create mode 100644 client/vue-src/style.css create mode 100644 client/vue-src/views/dashboard/character-list/character-list.vue create mode 100644 client/vue-src/vite-env.d.ts diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/client/.vscode/extensions.json b/client/.vscode/extensions.json new file mode 100644 index 00000000..c0a6e5a4 --- /dev/null +++ b/client/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/client/README.md b/client/README.md new file mode 100644 index 00000000..ef72fd52 --- /dev/null +++ b/client/README.md @@ -0,0 +1,18 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 00000000..3d84a2c6 --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,1870 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "dependencies": { + "jquery": "^3.6.3", + "socket.io": "^4.5.4", + "vue": "^3.2.45" + }, + "devDependencies": { + "@types/jquery": "^3.5.16", + "@vitejs/plugin-vue": "^4.0.0", + "typescript": "^4.9.3", + "vite": "^4.0.0", + "vue-tsc": "^1.0.11" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jquery": { + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", + "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "dev": true, + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz", + "integrity": "sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.24.tgz", + "integrity": "sha512-vTN+alJiWwK0Pax6POqrmevbtFW2dXhjwWiW/MW4f48eDYPLdyURWcr8TixO7EN/nHsUBj2udT7igFKPtjyAKg==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.0.24", + "muggle-string": "^0.1.0" + } + }, + "node_modules/@volar/source-map": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.24.tgz", + "integrity": "sha512-Qsv/tkplx18pgBr8lKAbM1vcDqgkGKQzbChg6NW+v0CZc3G7FLmK+WrqEPzKlN7Cwdc6XVL559Nod8WKAfKr4A==", + "dev": true, + "dependencies": { + "muggle-string": "^0.1.0" + } + }, + "node_modules/@volar/typescript": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.24.tgz", + "integrity": "sha512-f8hCSk+PfKR1/RQHxZ79V1NpDImHoivqoizK+mstphm25tn/YJ/JnKNjZHB+o21fuW0yKlI26NV3jkVb2Cc/7A==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.0.24" + } + }, + "node_modules/@volar/vue-language-core": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.24.tgz", + "integrity": "sha512-2NTJzSgrwKu6uYwPqLiTMuAzi7fAY3yFy5PJ255bGJc82If0Xr+cW8pC80vpjG0D/aVLmlwAdO4+Ya2BI8GdDg==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.0.24", + "@volar/source-map": "1.0.24", + "@vue/compiler-dom": "^3.2.45", + "@vue/compiler-sfc": "^3.2.45", + "@vue/reactivity": "^3.2.45", + "@vue/shared": "^3.2.45", + "minimatch": "^5.1.1", + "vue-template-compiler": "^2.7.14" + } + }, + "node_modules/@volar/vue-typescript": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.24.tgz", + "integrity": "sha512-9a25oHDvGaNC0okRS47uqJI6FxY4hUQZUsxeOUFHcqVxZEv8s17LPuP/pMMXyz7jPygrZubB/qXqHY5jEu/akA==", + "dev": true, + "dependencies": { + "@volar/typescript": "1.0.24", + "@volar/vue-language-core": "1.0.24" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", + "dependencies": { + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.45", + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-ssr": "3.2.45", + "@vue/reactivity-transform": "3.2.45", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", + "dependencies": { + "@vue/compiler-dom": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", + "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", + "dependencies": { + "@vue/shared": "3.2.45" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", + "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", + "dependencies": { + "@vue/reactivity": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", + "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", + "dependencies": { + "@vue/runtime-core": "3.2.45", + "@vue/shared": "3.2.45", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", + "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", + "dependencies": { + "@vue/compiler-ssr": "3.2.45", + "@vue/shared": "3.2.45" + }, + "peerDependencies": { + "vue": "3.2.45" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jquery": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", + "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/muggle-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.1.0.tgz", + "integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.0.tgz", + "integrity": "sha512-4MZ8kA2HNYahIjz63rzrMMRvDqQDeS9LoriJvMuV0V6zIGysP36e9t4yObUfwdT9h/szXoHQideICftcdZklWg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/socket.io": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", + "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.1", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + }, + "node_modules/socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "dev": true, + "dependencies": { + "esbuild": "^0.16.3", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", + "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", + "dependencies": { + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-sfc": "3.2.45", + "@vue/runtime-dom": "3.2.45", + "@vue/server-renderer": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.24.tgz", + "integrity": "sha512-mmU1s5SAqE1nByQAiQnao9oU4vX+mSdsgI8H57SfKH6UVzq/jP9+Dbi2GaV+0b4Cn361d2ln8m6xeU60ApiEXg==", + "dev": true, + "dependencies": { + "@volar/vue-language-core": "1.0.24", + "@volar/vue-typescript": "1.0.24" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + }, + "dependencies": { + "@babel/parser": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==" + }, + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "dev": true, + "optional": true + }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "requires": { + "@types/node": "*" + } + }, + "@types/jquery": { + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", + "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "dev": true, + "requires": { + "@types/sizzle": "*" + } + }, + "@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "@vitejs/plugin-vue": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz", + "integrity": "sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==", + "dev": true, + "requires": {} + }, + "@volar/language-core": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.24.tgz", + "integrity": "sha512-vTN+alJiWwK0Pax6POqrmevbtFW2dXhjwWiW/MW4f48eDYPLdyURWcr8TixO7EN/nHsUBj2udT7igFKPtjyAKg==", + "dev": true, + "requires": { + "@volar/source-map": "1.0.24", + "muggle-string": "^0.1.0" + } + }, + "@volar/source-map": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.24.tgz", + "integrity": "sha512-Qsv/tkplx18pgBr8lKAbM1vcDqgkGKQzbChg6NW+v0CZc3G7FLmK+WrqEPzKlN7Cwdc6XVL559Nod8WKAfKr4A==", + "dev": true, + "requires": { + "muggle-string": "^0.1.0" + } + }, + "@volar/typescript": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.24.tgz", + "integrity": "sha512-f8hCSk+PfKR1/RQHxZ79V1NpDImHoivqoizK+mstphm25tn/YJ/JnKNjZHB+o21fuW0yKlI26NV3jkVb2Cc/7A==", + "dev": true, + "requires": { + "@volar/language-core": "1.0.24" + } + }, + "@volar/vue-language-core": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.24.tgz", + "integrity": "sha512-2NTJzSgrwKu6uYwPqLiTMuAzi7fAY3yFy5PJ255bGJc82If0Xr+cW8pC80vpjG0D/aVLmlwAdO4+Ya2BI8GdDg==", + "dev": true, + "requires": { + "@volar/language-core": "1.0.24", + "@volar/source-map": "1.0.24", + "@vue/compiler-dom": "^3.2.45", + "@vue/compiler-sfc": "^3.2.45", + "@vue/reactivity": "^3.2.45", + "@vue/shared": "^3.2.45", + "minimatch": "^5.1.1", + "vue-template-compiler": "^2.7.14" + } + }, + "@volar/vue-typescript": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.24.tgz", + "integrity": "sha512-9a25oHDvGaNC0okRS47uqJI6FxY4hUQZUsxeOUFHcqVxZEv8s17LPuP/pMMXyz7jPygrZubB/qXqHY5jEu/akA==", + "dev": true, + "requires": { + "@volar/typescript": "1.0.24", + "@volar/vue-language-core": "1.0.24" + } + }, + "@vue/compiler-core": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", + "requires": { + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.45", + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-ssr": "3.2.45", + "@vue/reactivity-transform": "3.2.45", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", + "requires": { + "@vue/compiler-dom": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "@vue/reactivity": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", + "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", + "requires": { + "@vue/shared": "3.2.45" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", + "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", + "requires": { + "@vue/reactivity": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "@vue/runtime-dom": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", + "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", + "requires": { + "@vue/runtime-core": "3.2.45", + "@vue/shared": "3.2.45", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", + "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", + "requires": { + "@vue/compiler-ssr": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "@vue/shared": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "engine.io": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + } + }, + "engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==" + }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "jquery": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", + "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "muggle-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.1.0.tgz", + "integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==", + "dev": true + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.0.tgz", + "integrity": "sha512-4MZ8kA2HNYahIjz63rzrMMRvDqQDeS9LoriJvMuV0V6zIGysP36e9t4yObUfwdT9h/szXoHQideICftcdZklWg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "socket.io": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", + "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.1", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.1" + } + }, + "socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + }, + "socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "dev": true, + "requires": { + "esbuild": "^0.16.3", + "fsevents": "~2.3.2", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + } + }, + "vue": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", + "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", + "requires": { + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-sfc": "3.2.45", + "@vue/runtime-dom": "3.2.45", + "@vue/server-renderer": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-tsc": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.24.tgz", + "integrity": "sha512-mmU1s5SAqE1nByQAiQnao9oU4vX+mSdsgI8H57SfKH6UVzq/jP9+Dbi2GaV+0b4Cn361d2ln8m6xeU60ApiEXg==", + "dev": true, + "requires": { + "@volar/vue-language-core": "1.0.24", + "@volar/vue-typescript": "1.0.24" + } + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} + } + } +} diff --git a/client/package.json b/client/package.json new file mode 100644 index 00000000..47be094d --- /dev/null +++ b/client/package.json @@ -0,0 +1,22 @@ +{ + "name": "client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "socket.io": "^4.5.4", + "vue": "^3.2.45" + }, + "devDependencies": { + "@types/jquery": "^3.5.16", + "@vitejs/plugin-vue": "^4.0.0", + "typescript": "^4.9.3", + "vite": "^4.0.0", + "vue-tsc": "^1.0.11" + } +} diff --git a/client/public/vite.svg b/client/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 00000000..4ded63ef --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "allowJs": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true, + "noEmit": true + }, + "include": ["vue-src/**/*.ts", "vue-src/**/*.d.ts", "vue-src/**/*.tsx", "vue-src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json new file mode 100644 index 00000000..9d31e2ae --- /dev/null +++ b/client/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 00000000..7d9f66dc --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], + server: { + proxy: { + // There's probably a better way to do this, but I don't know my way around proxies well enough! + "^(?!(/profile/characters\/?$)|(.*vue)|(.*vite)).*": { + target: "http://localhost:3000", + changeOrigin: false, + secure: false, + ws: true, + }, + }, + }, +}); diff --git a/client/vue-src/App.vue b/client/vue-src/App.vue new file mode 100644 index 00000000..eb11e240 --- /dev/null +++ b/client/vue-src/App.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/client/vue-src/assets/vue.svg b/client/vue-src/assets/vue.svg new file mode 100644 index 00000000..770e9d33 --- /dev/null +++ b/client/vue-src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/vue-src/components/HelloWorld.vue b/client/vue-src/components/HelloWorld.vue new file mode 100644 index 00000000..52309103 --- /dev/null +++ b/client/vue-src/components/HelloWorld.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/client/vue-src/legacy-js/admin_builders/admin-panel.js b/client/vue-src/legacy-js/admin_builders/admin-panel.js new file mode 100644 index 00000000..a39e57f5 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/admin-panel.js @@ -0,0 +1,21 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('#clear-db-cache-btn').click(function () { + new ConfirmMessage('Clear Database Cache', '

Are you sure you want to clear the database\'s cache?

', 'Clear Cache', 'modal-clear-db-cache', 'modal-clear-db-cache-btn'); + $('#modal-clear-db-cache-btn').click(function () { + socket.emit("requestAdminClearCache"); + }); + }); + +}); + +socket.on("returnAdminClearCache", function () { + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/ancestry/builder-ancestry.js b/client/vue-src/legacy-js/admin_builders/ancestry/builder-ancestry.js new file mode 100644 index 00000000..241e4a97 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/ancestry/builder-ancestry.js @@ -0,0 +1,208 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + $("#inputLangs").chosen(); + $("#inputBonusLangs").chosen(); + + let heritageCount = 0; + $("#addHeritageButton").click(function(){ + heritageCount++; + + let heritageID = "heritage"+heritageCount; + + let newHeritage = $("#heritageLayout").clone(); + newHeritage.attr('id', heritageID); + newHeritage.removeClass('is-hidden'); + newHeritage.appendTo("#heritageContent"); + + let cardHeader = $("#"+heritageID).find(".card-header"); + let cardContent = $("#"+heritageID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+heritageID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+heritageID).remove(); + }); + + let inputHeritageName = $("#"+heritageID).find(".inputHeritageName"); + inputHeritageName.change(function(){ + $("#"+heritageID).find(".card-header-title").html('Heritage - '+inputHeritageName.val()); + }); + + }); + + + let featCount = 0; + $("#addFeatButton").click(function(){ + featCount++; + + let featID = "feat"+featCount; + + let newFeat = $("#featLayout").clone(); + newFeat.attr('id', featID); + newFeat.removeClass('is-hidden'); + newFeat.appendTo("#featContent"); + + let cardHeader = $("#"+featID).find(".card-header"); + let cardContent = $("#"+featID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+featID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+featID).remove(); + }); + + let inputFeatName = $("#"+featID).find(".inputFeatName"); + inputFeatName.change(function(){ + $("#"+featID).find(".card-header-title").html('Ancestry Feat - '+inputFeatName.val()); + }); + + $("#"+featID).find(".inputFeatTags").chosen(); + + }); + + + $("#createAncestryButton").click(function(){ + $(this).unbind(); + finishAncestry(false); + }); + +}); + +function finishAncestry(isUpdate){ + + let ancestryName = $("#inputName").val(); + let ancestryVersion = $("#inputVersion").val(); + let ancestryRarity = $("#inputRarity").val(); + let ancestryHitPoints = $("#inputHitPoints").val(); + let ancestrySize = $("#inputSize").val(); + let ancestrySpeed = $("#inputSpeed").val(); + let ancestryVisionSenseID = $("#inputVisionSense").val(); + let ancestryAdditionalSenseID = $("#inputAdditionalSense").val(); + let ancestryPhysicalFeatureOneID = $("#inputPhysicalFeatureOne").val(); + let ancestryPhysicalFeatureTwoID = $("#inputPhysicalFeatureTwo").val(); + let ancestryDescription = $("#inputDescription").val(); + let ancestryImageURL = $("#inputImageURL").val(); + let ancestryBoostsArray = $("#inputBoosts").val(); + let ancestryFlawsArray = $("#inputFlaws").val(); + let ancestryLangsArray = $("#inputLangs").val(); + let ancestryBonusLangsArray = $("#inputBonusLangs").val(); + let ancestryContentSrc = $("#inputContentSource").val(); + + let ancestryHeritagesArray = []; + $(".ancestryHeritage").each(function(){ + if($(this).is(":visible")) { + let heritageName = $(this).find(".inputHeritageName").val(); + let heritageDesc = $(this).find(".inputHeritageDesc").val(); + let heritageCode = $(this).find(".inputHeritageCode").val(); + ancestryHeritagesArray.push({ + name: heritageName, + description: heritageDesc, + code: heritageCode + }); + } + }); + + let ancestryFeatsArray = []; + $(".ancestryFeat").each(function(){ + if($(this).is(":visible")) { + let featName = $(this).find(".inputFeatName").val(); + let featLevel = $(this).find(".inputFeatLevel").val(); + let featActions = $(this).find(".inputFeatActions").val(); + let featRarity = $(this).find(".inputFeatRarity").val(); + let featTagsArray = $(this).find(".inputFeatTags").val(); + let featPrereq = $(this).find(".inputFeatPrereq").val(); + let featReq = $(this).find(".inputFeatReq").val(); + let featFreq = $(this).find(".inputFeatFreq").val(); + let featCost = $(this).find(".inputFeatCost").val(); + let featTrigger = $(this).find(".inputFeatTrigger").val(); + let featDesc = $(this).find(".inputFeatDesc").val(); + let featSpecial = $(this).find(".inputFeatSpecial").val(); + let featSelectMultiple = ($(this).find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + let featCode = $(this).find(".inputFeatCode").val(); + ancestryFeatsArray.push({ + name: featName, + actions: featActions, + level: featLevel, + rarity: featRarity, + prerequisites: featPrereq, + frequency: featFreq, + cost: featCost, + trigger: featTrigger, + requirements: featReq, + description: featDesc, + special: featSpecial, + canSelectMultiple: featSelectMultiple, + code: featCode, + featTagsArray + }); + } + }); + + let requestPacket = null; + let ancestryID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateAncestry"; + ancestryID = getAncestryEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddAncestry"; + } + + socket.emit(requestPacket,{ + ancestryID, + ancestryName, + ancestryVersion, + ancestryRarity, + ancestryHitPoints, + ancestrySize, + ancestrySpeed, + ancestryVisionSenseID, + ancestryAdditionalSenseID, + ancestryPhysicalFeatureOneID, + ancestryPhysicalFeatureTwoID, + ancestryDescription, + ancestryImageURL, + ancestryBoostsArray, + ancestryFlawsArray, + ancestryLangsArray, + ancestryBonusLangsArray, + ancestryHeritagesArray, + ancestryFeatsArray, + ancestryContentSrc + }); + +} + +socket.on("returnAdminCompleteAncestry", function() { + window.location.href = '/admin/manage/ancestry'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/ancestry/editor-ancestry.js b/client/vue-src/legacy-js/admin_builders/ancestry/editor-ancestry.js new file mode 100644 index 00000000..b20157a1 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/ancestry/editor-ancestry.js @@ -0,0 +1,159 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestAdminAncestryDetails"); + +}); + +socket.on("returnAdminAncestryDetails", function(ancestryObject, featsObject){ + + let ancestryMap = objToMap(ancestryObject); + let featMap = objToMap(featsObject); + + let ancestry = ancestryMap.get(getAncestryEditorIDFromURL()+""); + + if(ancestry == null){ + window.location.href = '/admin/manage/ancestry'; + return; + } + + $("#inputName").val(ancestry.Ancestry.name); + $("#inputVersion").val(ancestry.Ancestry.version); + $("#inputRarity").val(ancestry.Ancestry.rarity); + $("#inputHitPoints").val(ancestry.Ancestry.hitPoints); + $("#inputSize").val(ancestry.Ancestry.size); + $("#inputSpeed").val(ancestry.Ancestry.speed); + $("#inputVisionSense").val(ancestry.Ancestry.visionSenseID); + $("#inputAdditionalSense").val(ancestry.Ancestry.additionalSenseID); + $("#inputPhysicalFeatureOne").val(ancestry.Ancestry.physicalFeatureOneID); + $("#inputPhysicalFeatureTwo").val(ancestry.Ancestry.physicalFeatureTwoID); + $("#inputDescription").val(ancestry.Ancestry.description); + $("#inputImageURL").val(ancestry.Ancestry.artworkURL); + $("#inputContentSource").val(ancestry.Ancestry.contentSrc); + + // Ancestry Boosts and Flaws + let firstFreeSelected = false; + for(let boost of ancestry.Boosts){ + if(boost == 'Anything'){ + if(firstFreeSelected){ + $('#boostOptionAnything2').attr('selected','selected'); + } else { + $('#boostOptionAnything1').attr('selected','selected'); + firstFreeSelected = true; + } + } else { + $('#inputBoosts option[value="'+boost+'"]').attr('selected','selected'); + } + } + for(let flaw of ancestry.Flaws){ + $('#inputFlaws option[value="'+flaw+'"]').attr('selected','selected'); + } + + // Ancestry Langs + for(let lang of ancestry.Languages){ + $('#inputLangs option[name="'+lang.name+'"]').attr('selected','selected'); + } + $('#inputLangs').trigger("chosen:updated"); + for(let bonusLang of ancestry.BonusLanguages){ + $('#inputBonusLangs option[name="'+bonusLang.name+'"]').attr('selected','selected'); + } + $('#inputBonusLangs').trigger("chosen:updated"); + + // Ancestry Heritages + let filteredAncestryHeritages = []; + for(let heritage of ancestry.Heritages){ + if(heritage.indivAncestryName == null){ + filteredAncestryHeritages.push(heritage); + } + } + + for(let heritage of filteredAncestryHeritages){ + $("#addHeritageButton").trigger("click"); + } + + let ancestryHeritageCount = 0; + $(".ancestryHeritage").each(function(){ + if($(this).is(":visible")) { + let heritage = filteredAncestryHeritages[ancestryHeritageCount]; + ancestryHeritageCount++; + + let heritageName = heritage.name.replace(" "+ancestry.Ancestry.name,""); + $(this).find(".inputHeritageName").val(heritageName); + $(this).find(".inputHeritageDesc").val(heritage.description); + $(this).find(".inputHeritageCode").val(heritage.code); + + // Minimize Heritage + $(this).find(".card-header").trigger("click"); + // Trigger Heritage Name and Tags + $(this).find(".inputHeritageName").trigger("change"); + } + }); + + + // Ancestry Feats + let ancestryFeats = []; + for(const [key, value] of featMap.entries()){ + let ancestryTag = value.Tags.find(tag => { + return tag.id === ancestry.Tag.id; + }); + if(ancestryTag != null && value.Feat.genericType == null){ + $("#addFeatButton").trigger("click"); + ancestryFeats.push(value); + } + } + + ancestryFeats = ancestryFeats.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + let ancestryFeatCount = 0; + $(".ancestryFeat").each(function(){ + if($(this).is(":visible")) { + let feat = ancestryFeats[ancestryFeatCount]; + ancestryFeatCount++; + + $(this).find(".inputFeatName").val(feat.Feat.name); + $(this).find(".inputFeatLevel").val(feat.Feat.level); + $(this).find(".inputFeatActions").val(feat.Feat.actions); + $(this).find(".inputFeatRarity").val(feat.Feat.rarity); + $(this).find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $(this).find(".inputFeatReq").val(feat.Feat.requirements); + $(this).find(".inputFeatFreq").val(feat.Feat.frequency); + $(this).find(".inputFeatCost").val(feat.Feat.cost); + $(this).find(".inputFeatTrigger").val(feat.Feat.trigger); + $(this).find(".inputFeatDesc").val(feat.Feat.description); + $(this).find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $(this).find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $(this).find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != ancestry.Tag.id) { + $(this).find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + // Minimize Feat + $(this).find(".card-header").trigger("click"); + // Trigger Feat Name and Tags + $(this).find(".inputFeatName").trigger("change"); + $(this).find(".inputFeatTags").trigger("chosen:updated"); + } + }); + + + $("#updateAncestryButton").click(function(){ + $(this).unbind(); + finishAncestry(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/ancestry/manager-ancestry.js b/client/vue-src/legacy-js/admin_builders/ancestry/manager-ancestry.js new file mode 100644 index 00000000..d1d42b82 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/ancestry/manager-ancestry.js @@ -0,0 +1,62 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalAncestryID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let ancestryCards = $('.ancestry-card'); + for(const ancestryCard of ancestryCards){ + + let ancestryID = $(ancestryCard).attr('name'); + let cardEdit = $(ancestryCard).find('.ancestry-card-edit'); + let cardDelete = $(ancestryCard).find('.ancestry-card-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('card-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('card-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/ancestry/'+ancestryID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('card-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('card-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalAncestryID = ancestryID; + }); + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalAncestryID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalAncestryID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveAncestry", activeModalAncestryID); + }); + +}); + +socket.on("returnAdminRemoveAncestry", function() { + window.location.href = '/admin/manage/ancestry'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/archetype/builder-archetype.js b/client/vue-src/legacy-js/admin_builders/archetype/builder-archetype.js new file mode 100644 index 00000000..f17f6fef --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/archetype/builder-archetype.js @@ -0,0 +1,164 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + let cardDedicationHeader = $('#dedicationFeat').find(".card-header"); + let cardDedicationContent = $('#dedicationFeat').find(".card-content"); + cardDedicationHeader.click(function(){ + if(cardDedicationContent.is(":visible")) { + cardDedicationContent.addClass('is-hidden'); + } else { + cardDedicationContent.removeClass('is-hidden'); + } + }); + + $('#dedicationFeat').find(".inputFeatTags").chosen(); + + let featCount = 0; + $("#addFeatButton").click(function(){ + featCount++; + + let featID = "feat"+featCount; + + let newFeat = $("#featLayout").clone(); + newFeat.attr('id', featID); + newFeat.removeClass('is-hidden'); + newFeat.appendTo("#featContent"); + + let cardHeader = $("#"+featID).find(".card-header"); + let cardContent = $("#"+featID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+featID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+featID).remove(); + }); + + let inputFeatName = $("#"+featID).find(".inputFeatName"); + inputFeatName.change(function(){ + $("#"+featID).find(".card-header-title").html('Archetype Feat - '+inputFeatName.val()); + }); + + $("#"+featID).find(".inputFeatTags").chosen(); + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishArchetype(false); + }); + +}); + +function finishArchetype(isUpdate){ + + let archetypeName = $("#inputName").val(); + let archetypeVersion = $("#inputVersion").val(); + + let archetypeIsMulticlass = ($("#inputIsMulticlass:checked").val() == '1') ? 1 : 0; + + let archetypeDescription = $("#inputDescription").val(); + let archetypeContentSrc = $("#inputContentSource").val(); + + let archetypeFeatsArray = []; + $(".archetypeFeat").each(function(){ + if($(this).is(":visible")) { + let featName = $(this).find(".inputFeatName").val(); + let featLevel = $(this).find(".inputFeatLevel").val(); + let featActions = $(this).find(".inputFeatActions").val(); + let featRarity = $(this).find(".inputFeatRarity").val(); + let featTagsArray = $(this).find(".inputFeatTags").val(); + let featPrereq = $(this).find(".inputFeatPrereq").val(); + let featReq = $(this).find(".inputFeatReq").val(); + let featFreq = $(this).find(".inputFeatFreq").val(); + let featCost = $(this).find(".inputFeatCost").val(); + let featTrigger = $(this).find(".inputFeatTrigger").val(); + let featDesc = $(this).find(".inputFeatDesc").val(); + let featSpecial = $(this).find(".inputFeatSpecial").val(); + let featSelectMultiple = ($(this).find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + let featCode = $(this).find(".inputFeatCode").val(); + archetypeFeatsArray.push({ + name: featName, + actions: featActions, + level: featLevel, + rarity: featRarity, + prerequisites: featPrereq, + frequency: featFreq, + cost: featCost, + trigger: featTrigger, + requirements: featReq, + description: featDesc, + special: featSpecial, + canSelectMultiple: featSelectMultiple, + code: featCode, + featTagsArray + }); + } + }); + + + let archetypeDedicationFeat = { + level : $('#dedicationFeat').find(".inputFeatLevel").val(), + actions : $('#dedicationFeat').find(".inputFeatActions").val(), + rarity : $('#dedicationFeat').find(".inputFeatRarity").val(), + featTagsArray : $('#dedicationFeat').find(".inputFeatTags").val(), + prerequisites: $('#dedicationFeat').find(".inputFeatPrereq").val(), + requirements : $('#dedicationFeat').find(".inputFeatReq").val(), + frequency : $('#dedicationFeat').find(".inputFeatFreq").val(), + cost : $('#dedicationFeat').find(".inputFeatCost").val(), + trigger : $('#dedicationFeat').find(".inputFeatTrigger").val(), + description : $('#dedicationFeat').find(".inputFeatDesc").val(), + special : $('#dedicationFeat').find(".inputFeatSpecial").val(), + canSelectMultiple : ($('#dedicationFeat').find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0, + code : $('#dedicationFeat').find(".inputFeatCode").val(), + }; + + + let requestPacket = null; + let archetypeID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateArchetype"; + archetypeID = getArchetypeEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddArchetype"; + } + + socket.emit(requestPacket,{ + archetypeID, + archetypeName, + archetypeVersion, + archetypeIsMulticlass, + archetypeDescription, + archetypeDedicationFeat, + archetypeFeatsArray, + archetypeContentSrc + }); + +} + +socket.on("returnAdminCompleteArchetype", function() { + window.location.href = '/admin/manage/archetype'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/archetype/editor-archetype.js b/client/vue-src/legacy-js/admin_builders/archetype/editor-archetype.js new file mode 100644 index 00000000..5dac65ce --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/archetype/editor-archetype.js @@ -0,0 +1,132 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestAdminArchetypeDetails"); + +}); + +socket.on("returnAdminArchetypeDetails", function(archetypeArray, featsObject){ + + let featMap = objToMap(featsObject); + + let archetypeID = getArchetypeEditorIDFromURL(); + let archetype = archetypeArray.find(archetype => { + return archetype.id == archetypeID; + }); + + if(archetype == null){ + window.location.href = '/admin/manage/archetype'; + return; + } + + let dedicationFeat = null; + + $("#inputName").val(archetype.name); + $("#inputVersion").val(archetype.version); + + let multiclassCheckBoxState = (archetype.isMulticlass == 1) ? true : false; + $("#inputIsMulticlass").prop('checked', multiclassCheckBoxState); + + $("#inputDescription").val(archetype.description); + $("#inputContentSource").val(archetype.contentSrc); + + + // Archetype Feats // + let archetypeFeats = []; + for(const [key, value] of featMap.entries()){ + let archetypeTag = value.Tags.find(tag => { + return tag.id === archetype.tagID; + }); + if(archetypeTag != null){ + $("#addFeatButton").trigger("click"); + archetypeFeats.push(value); + } + + if(value.Feat.id === archetype.dedicationFeatID) { + dedicationFeat = value; + } + } + + archetypeFeats = archetypeFeats.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + let archetypeFeatCount = 0; + $(".archetypeFeat").each(function(){ + if($(this).is(":visible")) { + let feat = archetypeFeats[archetypeFeatCount]; + archetypeFeatCount++; + + $(this).find(".inputFeatName").val(feat.Feat.name); + $(this).find(".inputFeatLevel").val(feat.Feat.level); + $(this).find(".inputFeatActions").val(feat.Feat.actions); + $(this).find(".inputFeatRarity").val(feat.Feat.rarity); + $(this).find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $(this).find(".inputFeatReq").val(feat.Feat.requirements); + $(this).find(".inputFeatFreq").val(feat.Feat.frequency); + $(this).find(".inputFeatCost").val(feat.Feat.cost); + $(this).find(".inputFeatTrigger").val(feat.Feat.trigger); + $(this).find(".inputFeatDesc").val(feat.Feat.description); + $(this).find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $(this).find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $(this).find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != archetype.tagID) { + $(this).find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + // Minimize Feat + $(this).find(".card-header").trigger("click"); + // Trigger Feat Name and Tags + $(this).find(".inputFeatName").trigger("change"); + $(this).find(".inputFeatTags").trigger("chosen:updated"); + } + }); + + + if(dedicationFeat != null){ + let feat = dedicationFeat; + + $('#dedicationFeat').find(".inputFeatLevel").val(feat.Feat.level); + $('#dedicationFeat').find(".inputFeatActions").val(feat.Feat.actions); + $('#dedicationFeat').find(".inputFeatRarity").val(feat.Feat.rarity); + $('#dedicationFeat').find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $('#dedicationFeat').find(".inputFeatReq").val(feat.Feat.requirements); + $('#dedicationFeat').find(".inputFeatFreq").val(feat.Feat.frequency); + $('#dedicationFeat').find(".inputFeatCost").val(feat.Feat.cost); + $('#dedicationFeat').find(".inputFeatTrigger").val(feat.Feat.trigger); + $('#dedicationFeat').find(".inputFeatDesc").val(feat.Feat.description); + $('#dedicationFeat').find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $('#dedicationFeat').find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $('#dedicationFeat').find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != archetype.tagID) { + $('#dedicationFeat').find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + $('#dedicationFeat').find(".inputFeatTags").trigger("chosen:updated"); + + } + + + $("#updateButton").click(function(){ + $(this).unbind(); + finishArchetype(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/archetype/manager-archetype.js b/client/vue-src/legacy-js/admin_builders/archetype/manager-archetype.js new file mode 100644 index 00000000..b5d37e32 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/archetype/manager-archetype.js @@ -0,0 +1,63 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalArchetypeID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(const entry of entries){ + + let archetypeID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/archetype/'+archetypeID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalArchetypeID = archetypeID; + }); + + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalArchetypeID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalArchetypeID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveArchetype", activeModalArchetypeID); + }); + +}); + +socket.on("returnAdminRemoveArchetype", function() { + window.location.href = '/admin/manage/archetype'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/background/builder-background.js b/client/vue-src/legacy-js/admin_builders/background/builder-background.js new file mode 100644 index 00000000..132c52da --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/background/builder-background.js @@ -0,0 +1,67 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + $("#createButton").click(function(){ + $(this).unbind(); + finishBackground(false); + }); + +}); + +function finishBackground(isUpdate){ + + let backgroundName = $("#inputName").val(); + let backgroundVersion = $("#inputVersion").val(); + let backgroundRarity = $("#inputRarity").val(); + let backgroundDescription = $("#inputDescription").val(); + let backgroundBoostsArray = $("#inputBoosts").val(); + let backgroundCode = $("#inputCode").val(); + let backgroundContentSrc = $("#inputContentSource").val(); + + let backgroundBoosts = ''; + for(let backgroundBoost of backgroundBoostsArray) { + backgroundBoosts += backgroundBoost+','; + } + backgroundBoosts = backgroundBoosts.slice(0, -1); // Trim off that last ',' + + let requestPacket = null; + let backgroundID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateBackground"; + backgroundID = getBackgroundEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddBackground"; + } + + socket.emit(requestPacket,{ + backgroundID, + backgroundName, + backgroundVersion, + backgroundRarity, + backgroundDescription, + backgroundBoosts, + backgroundCode, + backgroundContentSrc + }); + +} + +socket.on("returnAdminCompleteBackground", function() { + window.location.href = '/admin/manage/background'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/background/editor-background.js b/client/vue-src/legacy-js/admin_builders/background/editor-background.js new file mode 100644 index 00000000..660c339f --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/background/editor-background.js @@ -0,0 +1,43 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestAdminBackgroundDetails"); + +}); + +socket.on("returnAdminBackgroundDetails", function(backgrounds){ + + let backgroundID = getBackgroundEditorIDFromURL(); + let background = backgrounds.find(background => { + return background.id == backgroundID; + }); + + if(background == null){ + window.location.href = '/admin/manage/background'; + return; + } + + $("#inputName").val(background.name); + $("#inputVersion").val(background.version); + $("#inputRarity").val(background.rarity); + $("#inputDescription").val(background.description); + $("#inputCode").val(background.code); + $("#inputContentSource").val(background.contentSrc); + + // Background Boost + if(background.boostOne != null){ + let boostArray = background.boostOne.split(','); + for(let boost of boostArray){ + $('#inputBoosts option[value="'+boost+'"]').attr('selected','selected'); + } + } + + $("#updateButton").click(function(){ + $(this).unbind(); + finishBackground(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/background/manager-background.js b/client/vue-src/legacy-js/admin_builders/background/manager-background.js new file mode 100644 index 00000000..796f682a --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/background/manager-background.js @@ -0,0 +1,62 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalBackgroundID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(const entry of entries){ + + let backgroundID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/background/'+backgroundID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalBackgroundID = backgroundID; + }); + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalBackgroundID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalBackgroundID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveBackground", activeModalBackgroundID); + }); + +}); + +socket.on("returnAdminRemoveBackground", function() { + window.location.href = '/admin/manage/background'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/cClass/builder-class.js b/client/vue-src/legacy-js/admin_builders/cClass/builder-class.js new file mode 100644 index 00000000..96a961c4 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/cClass/builder-class.js @@ -0,0 +1,335 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + $("#inputWeaponsTrained").chosen(); + $("#inputWeaponsExpert").chosen(); + + $("#inputArmorTrained").chosen(); + $("#inputArmorExpert").chosen(); + + + $("#inputKeyAbility").change(function(){ + if($(this).val() === 'OR') { + $("#abilityStoreOptionsSection").removeClass('is-hidden'); + } else { + $("#abilityStoreOptionsSection").addClass('is-hidden'); + } + }); + + + let classAbilityCount = 0; + $("#addClassFeatureButton").click(function(){ + classAbilityCount++; + + let classAbilityID = "classAbility"+classAbilityCount; + + let newClassAbility = $("#classFeatureLayout").clone(); + newClassAbility.attr('id', classAbilityID); + newClassAbility.removeClass('is-hidden'); + newClassAbility.removeClass('isLayout'); + newClassAbility.appendTo("#classFeatureContent"); + + let cardHeader = $("#"+classAbilityID).find(".card-header"); + let cardContent = $("#"+classAbilityID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+classAbilityID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+classAbilityID).remove(); + }); + + let inputClassFeatureName = $("#"+classAbilityID).find(".inputClassFeatureName:first"); + inputClassFeatureName.change(function(){ + let cFeatureLevel = $("#"+classAbilityID).find(".inputClassFeatureLevel:first").val(); + $("#"+classAbilityID).find(".card-header-title:first").html('Ability - '+inputClassFeatureName.val()+' (Level '+cFeatureLevel+')'); + }); + + let inputClassFeatureLevel = $("#"+classAbilityID).find(".inputClassFeatureLevel:first"); + inputClassFeatureLevel.change(function(){ + let cFeatureName = $("#"+classAbilityID).find(".inputClassFeatureName:first").val(); + $("#"+classAbilityID).find(".card-header-title:first").html('Ability - '+cFeatureName+' (Level '+inputClassFeatureLevel.val()+')'); + }); + + // When 'Is Selector' checkbox is changed + let inputClassFeatureIsSelector = $("#"+classAbilityID).find(".inputClassFeatureIsSelector"); + inputClassFeatureIsSelector.change(function(){ + + if ($(this).is(":checked")) { + + let classFeatureSelectionOptions = $("#"+classAbilityID).find(".classFeatureSelectionOptions"); + classFeatureSelectionOptions.removeClass('is-hidden'); + + let classFeatureOptionsContent = $("#"+classAbilityID).find(".classFeatureOptionsContent"); + let classFeatureAddOptionButton = $("#"+classAbilityID).find(".classFeatureAddOptionButton"); + let classAbilityOptionsCount = 0; + classFeatureAddOptionButton.click(function(){ + classAbilityOptionsCount++; + + let classAbilityOptionID = classAbilityID+"Option"+classAbilityOptionsCount; + + let newClassAbilityOption = $("#classFeatureLayout").clone(); + newClassAbilityOption.attr('id', classAbilityOptionID); + newClassAbilityOption.removeClass('is-hidden'); + newClassAbilityOption.removeClass('isLayout'); + newClassAbilityOption.removeClass('classFeature'); + newClassAbilityOption.addClass('classFeatureOption'); + newClassAbilityOption.find(".classFeatureLevelSection").remove(); + newClassAbilityOption.find(".classFeatureDisplayInSheetSection").remove(); + newClassAbilityOption.find(".classFeatureIsSelectorSection").remove(); + newClassAbilityOption.find(".classFeatureSelectionOptions").remove(); + newClassAbilityOption.find(".card-header-title").html('Option'); + newClassAbilityOption.appendTo(classFeatureOptionsContent); + + let cardHeader = $("#"+classAbilityOptionID).find(".card-header"); + let cardContent = $("#"+classAbilityOptionID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+classAbilityOptionID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+classAbilityOptionID).remove(); + }); + + }); + + } else { + + let classFeatureSelectionOptions = $("#"+classAbilityID).find(".classFeatureSelectionOptions"); + classFeatureSelectionOptions.addClass('is-hidden'); + + } + + }); + + }); + + + let featCount = 0; + $("#addFeatButton").click(function(){ + featCount++; + + let featID = "feat"+featCount; + + let newFeat = $("#featLayout").clone(); + newFeat.attr('id', featID); + newFeat.removeClass('is-hidden'); + newFeat.appendTo("#featContent"); + + let cardHeader = $("#"+featID).find(".card-header"); + let cardContent = $("#"+featID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+featID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+featID).remove(); + }); + + let inputFeatName = $("#"+featID).find(".inputFeatName"); + inputFeatName.change(function(){ + $("#"+featID).find(".card-header-title").html('Class Feat - '+inputFeatName.val()); + }); + + $("#"+featID).find(".inputFeatTags").chosen(); + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishClass(false); + }); + +}); + +function finishClass(isUpdate){ + + let className = $("#inputName").val(); + let classVersion = $("#inputVersion").val(); + let classHitPoints = $("#inputHitPoints").val(); + + let classKeyAbility = $("#inputKeyAbility").val(); + if(classKeyAbility === 'OR'){ + classKeyAbility = $("#inputKeyAbilityOptionOne").val()+' or '+$("#inputKeyAbilityOptionTwo").val(); + } + + let classPerception = $("#inputPerception").val(); + let classSkills = $("#inputSkills").val(); + let classSkillsMore = $("#inputSkillsMore").val(); + let classFortitude = $("#inputFortitude").val(); + let classReflex = $("#inputReflex").val(); + let classWill = $("#inputWill").val(); + + let classClassDC = $("#inputClassDC").val(); + + let classWeaponsTrainedArray = $("#inputWeaponsTrained").val(); + let classWeaponsExpertArray = $("#inputWeaponsExpert").val(); + let classWeapons = ''; + + for(let classWeaponsTrained of classWeaponsTrainedArray) { + classWeapons += 'T:::'+classWeaponsTrained+',,, '; + } + for(let classWeaponsExpert of classWeaponsExpertArray) { + classWeapons += 'E:::'+classWeaponsExpert+',,, '; + } + classWeapons = classWeapons.slice(0, -4); // Trim off that last ',,, ' + + + let classArmorTrainedArray = $("#inputArmorTrained").val(); + let classArmorExpertArray = $("#inputArmorExpert").val(); + let classArmor = ''; + + for(let classArmorTrained of classArmorTrainedArray) { + classArmor += 'T:::'+classArmorTrained+',,, '; + } + for(let classArmorExpert of classArmorExpertArray) { + classArmor += 'E:::'+classArmorExpert+',,, '; + } + classArmor = classArmor.slice(0, -4); // Trim off that last ',,, ' + + let classDescription = $("#inputDescription").val(); + let classImageURL = $("#inputImageURL").val(); + let classContentSrc = $("#inputContentSource").val(); + + + let classAbilitiesArray = []; + $(".classFeature").each(function(){ + if(!$(this).hasClass("isLayout")) { + let classFeatureName = $(this).find(".inputClassFeatureName").val(); + let classFeatureLevel = $(this).find(".inputClassFeatureLevel").val(); + let classFeatureDesc = $(this).find(".inputClassFeatureDesc").val(); + let classFeatureCode = $(this).find(".inputClassFeatureCode").val(); + let classFeatureDisplayInSheet = ($(this).find(".inputClassFeatureDisplayInSheet:checked").val() == '1') ? 1 : 0; + + let classFeatureOptions = []; + if($(this).find(".inputClassFeatureIsSelector").is(":checked")) { + if(!$(this).find(".classFeatureSelectionOptions").hasClass("isLayout")){ + $(this).find(".classFeatureOption").each(function(){ + classFeatureOptions.push({ + name: $(this).find(".inputClassFeatureName").val(), + description: $(this).find(".inputClassFeatureDesc").val(), + code: $(this).find(".inputClassFeatureCode").val(), + }); + }); + } + } + + classAbilitiesArray.push({ + name: classFeatureName, + level: classFeatureLevel, + description: classFeatureDesc, + code: classFeatureCode, + displayInSheet: classFeatureDisplayInSheet, + options: classFeatureOptions, + }); + } + }); + + let classFeatsArray = []; + $(".classFeat").each(function(){ + if($(this).is(":visible")) { + let featName = $(this).find(".inputFeatName").val(); + let featLevel = $(this).find(".inputFeatLevel").val(); + let featActions = $(this).find(".inputFeatActions").val(); + let featRarity = $(this).find(".inputFeatRarity").val(); + let featTagsArray = $(this).find(".inputFeatTags").val(); + let featPrereq = $(this).find(".inputFeatPrereq").val(); + let featReq = $(this).find(".inputFeatReq").val(); + let featFreq = $(this).find(".inputFeatFreq").val(); + let featCost = $(this).find(".inputFeatCost").val(); + let featTrigger = $(this).find(".inputFeatTrigger").val(); + let featDesc = $(this).find(".inputFeatDesc").val(); + let featSpecial = $(this).find(".inputFeatSpecial").val(); + let featSelectMultiple = ($(this).find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + let featCode = $(this).find(".inputFeatCode").val(); + classFeatsArray.push({ + name: featName, + actions: featActions, + level: featLevel, + rarity: featRarity, + prerequisites: featPrereq, + frequency: featFreq, + cost: featCost, + trigger: featTrigger, + requirements: featReq, + description: featDesc, + special: featSpecial, + canSelectMultiple: featSelectMultiple, + code: featCode, + featTagsArray + }); + } + }); + + let requestPacket = null; + let classID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateClass"; + classID = getClassEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddClass"; + } + + + socket.emit(requestPacket,{ + classID, + className, + classVersion, + classHitPoints, + classKeyAbility, + classPerception, + classSkills, + classSkillsMore, + classFortitude, + classReflex, + classWill, + classClassDC, + classWeapons, + classArmor, + classDescription, + classImageURL, + classAbilitiesArray, + classFeatsArray, + classContentSrc + }); + +} + +socket.on("returnAdminCompleteClass", function() { + window.location.href = '/admin/manage/class'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/cClass/editor-class.js b/client/vue-src/legacy-js/admin_builders/cClass/editor-class.js new file mode 100644 index 00000000..9a809a9f --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/cClass/editor-class.js @@ -0,0 +1,207 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestAdminClassDetails"); + +}); + +socket.on("returnAdminClassDetails", function(classObject, featsObject){ + + let classMap = objToMap(classObject); + let featMap = objToMap(featsObject); + + let cClass = classMap.get(getClassEditorIDFromURL()+""); + + if(cClass == null){ + window.location.href = '/admin/manage/class'; + return; + } + + $("#inputName").val(cClass.Class.name); + $("#inputVersion").val(cClass.Class.version); + $("#inputHitPoints").val(cClass.Class.hitPoints); + + let classKeyAbility = cClass.Class.keyAbility; + if(classKeyAbility === null){ + $("#inputKeyAbility").val(''); + } else if(classKeyAbility.includes(' or ')){ + $("#inputKeyAbility").val('OR'); + let keyAbilData = classKeyAbility.split(' or '); + $("#inputKeyAbilityOptionOne").val(keyAbilData[0]); + $("#inputKeyAbilityOptionTwo").val(keyAbilData[1]); + $("#inputKeyAbility").trigger("change"); + } else { + $("#inputKeyAbility").val(classKeyAbility); + } + + $("#inputPerception").val(cClass.Class.tPerception); + $("#inputSkills").val(cClass.Class.tSkills); + $("#inputSkillsMore").val(cClass.Class.tSkillsMore); + $("#inputFortitude").val(cClass.Class.tFortitude); + $("#inputReflex").val(cClass.Class.tReflex); + $("#inputWill").val(cClass.Class.tWill); + $("#inputClassDC").val(cClass.Class.tClassDC); + $("#inputDescription").val(cClass.Class.description); + $("#inputImageURL").val(cClass.Class.artworkURL); + $("#inputContentSource").val(cClass.Class.contentSrc); + + if(cClass.Class.tWeapons != null){ + let classWeaponsArray = cClass.Class.tWeapons.split(',,, '); + for(let classWeapon of classWeaponsArray) { + let weapData = classWeapon.split(':::'); + if(weapData[0] === 'T'){ + $('#inputWeaponsTrained option[value="'+weapData[1]+'"]').attr('selected','selected'); + } else if(weapData[0] === 'E'){ + $('#inputWeaponsExpert option[value="'+weapData[1]+'"]').attr('selected','selected'); + } + } + $('#inputWeaponsTrained').trigger("chosen:updated"); + $('#inputWeaponsExpert').trigger("chosen:updated"); + } + + if(cClass.Class.tArmor != null){ + let classArmorArray = cClass.Class.tArmor.split(',,, '); + for(let classArmor of classArmorArray) { + let armorData = classArmor.split(':::'); + if(armorData[0] === 'T'){ + $('#inputArmorTrained option[value="'+armorData[1]+'"]').attr('selected','selected'); + } else if(armorData[0] === 'E'){ + $('#inputArmorExpert option[value="'+armorData[1]+'"]').attr('selected','selected'); + } + } + $('#inputArmorTrained').trigger("chosen:updated"); + $('#inputArmorExpert').trigger("chosen:updated"); + } + + // Class Abilities // + let filteredClassAbils = []; + for(let classAbil of cClass.Abilities){ + if(classAbil.indivClassName == null){ + filteredClassAbils.push(classAbil); + } + } + + for(let classAbil of filteredClassAbils){ + if(classAbil.selectType != 'SELECT_OPTION') { + $("#addClassFeatureButton").trigger("click"); + } + } + + let classAbilCount = 0; + $(".classFeature").each(function(){ + if(!$(this).hasClass("isLayout")) { + let classAbil = filteredClassAbils[classAbilCount]; + classAbilCount++; + while (classAbil.selectType === 'SELECT_OPTION') { + classAbil = filteredClassAbils[classAbilCount]; + classAbilCount++; + } + + $(this).find(".inputClassFeatureName").val(classAbil.name); + $(this).find(".inputClassFeatureLevel").val(classAbil.level); + $(this).find(".inputClassFeatureDesc").val(classAbil.description); + $(this).find(".inputClassFeatureCode").val(classAbil.code); + let displayInSheet = (classAbil.displayInSheet == 1) ? true : false; + $(this).find(".inputClassFeatureDisplayInSheet").prop('checked', displayInSheet); + + // Minimize Class Ability + $(this).find(".card-header").trigger("click"); + // Trigger Class Ability Name and Tags + $(this).find(".inputClassFeatureName").trigger("change"); + + if(classAbil.selectType === 'SELECTOR'){ + $(this).find(".inputClassFeatureIsSelector").prop('checked', true); + $(this).find(".inputClassFeatureIsSelector").trigger("change"); + + let classAbilOptionsArray = []; + for(let classAbilOption of filteredClassAbils){ + if(classAbilOption.selectType === 'SELECT_OPTION' && classAbilOption.selectOptionFor === classAbil.id){ + classAbilOptionsArray.push(classAbilOption); + $(this).find(".classFeatureAddOptionButton").trigger("click"); + } + } + + let classAbilOptionCount = 0; + $(this).find(".classFeatureOption").each(function(){ + let classAbilOption = classAbilOptionsArray[classAbilOptionCount]; + classAbilOptionCount++; + + $(this).find(".inputClassFeatureName").val(classAbilOption.name); + $(this).find(".inputClassFeatureDesc").val(classAbilOption.description); + $(this).find(".inputClassFeatureCode").val(classAbilOption.code); + + }); + + } + + } + }); + + + // Class Feats // + let classFeats = []; + for(const [key, value] of featMap.entries()){ + let classTag = value.Tags.find(tag => { + return tag.id === cClass.Class.tagID; + }); + if(classTag != null && value.Feat.genericType == null){ + $("#addFeatButton").trigger("click"); + classFeats.push(value); + } + } + + classFeats = classFeats.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + let classFeatCount = 0; + $(".classFeat").each(function(){ + if($(this).is(":visible")) { + let feat = classFeats[classFeatCount]; + classFeatCount++; + + $(this).find(".inputFeatName").val(feat.Feat.name); + $(this).find(".inputFeatLevel").val(feat.Feat.level); + $(this).find(".inputFeatActions").val(feat.Feat.actions); + $(this).find(".inputFeatRarity").val(feat.Feat.rarity); + $(this).find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $(this).find(".inputFeatReq").val(feat.Feat.requirements); + $(this).find(".inputFeatFreq").val(feat.Feat.frequency); + $(this).find(".inputFeatCost").val(feat.Feat.cost); + $(this).find(".inputFeatTrigger").val(feat.Feat.trigger); + $(this).find(".inputFeatDesc").val(feat.Feat.description); + $(this).find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $(this).find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $(this).find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != cClass.Class.tagID) { + $(this).find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + // Minimize Feat + $(this).find(".card-header").trigger("click"); + // Trigger Feat Name and Tags + $(this).find(".inputFeatName").trigger("change"); + $(this).find(".inputFeatTags").trigger("chosen:updated"); + } + }); + + + $("#updateButton").click(function(){ + $(this).unbind(); + finishClass(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/cClass/manager-class.js b/client/vue-src/legacy-js/admin_builders/cClass/manager-class.js new file mode 100644 index 00000000..59176bd1 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/cClass/manager-class.js @@ -0,0 +1,66 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalClassID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let classCards = $('.class-card'); + for(const classCard of classCards){ + + let classID = $(classCard).attr('name'); + let cardEdit = $(classCard).find('.class-card-edit'); + let cardDelete = $(classCard).find('.class-card-delete'); + + let classIsArchived = $(classCard).attr('data-is-archived'); + + cardEdit.mouseenter(function(){ + $(this).addClass('card-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('card-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/class/'+classID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('card-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('card-footer-hover'); + }); + cardDelete.click(function() { + if(classIsArchived == 'true'){ + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalClassID = classID; + } + }); + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalClassID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalClassID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveClass", activeModalClassID); + }); + +}); + +socket.on("returnAdminRemoveClass", function() { + window.location.href = '/admin/manage/class'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/class-feature/builder-class-feature.js b/client/vue-src/legacy-js/admin_builders/class-feature/builder-class-feature.js new file mode 100644 index 00000000..236a1a5f --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/class-feature/builder-class-feature.js @@ -0,0 +1,233 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + socket.emit("requestAdminClassDetails"); + +}); + +socket.on("returnAdminClassDetails", function(classObject, featsObject){ + + let classMap = objToMap(classObject); + classMap = new Map([...classMap.entries()].sort( + function(a, b) { + return a[1].Class.name > b[1].Class.name ? 1 : -1; + }) + ); + + $('#inputClassFor').html(''); + for(const [classID, classData] of classMap.entries()){ + if(classData.Class.isArchived == 0){ + $('#inputClassFor').append(''); + } + } + + + $('#inputClassFor').change(function(){ + $('#inputClassFeatureFor').html(''); + for(const [classID, classData] of classMap.entries()){ + if($(this).val() == classData.Class.name){ + for(let ability of classData.Abilities){ + if(ability.isArchived == 0 && ability.selectType == 'SELECTOR'){ + $('#inputClassFeatureFor').append(''); + } + } + break; + } + } + }); + $('#inputClassFor').trigger("change"); + + let newClassAbility = $("#classFeatureLayout").clone(); + newClassAbility.attr('id', "classAbility0"); + newClassAbility.removeClass('is-hidden'); + newClassAbility.removeClass('isLayout'); + newClassAbility.find('.card-header').addClass('is-hidden'); + newClassAbility.appendTo("#classFeatureContent"); + + + $('#inputBuilderType').change(function(){ + if($(this).val() == 'FEATURE'){ + $('#sectionClassFeatureFor').addClass('is-hidden'); + $('#classAbility0').find(".classFeatureLevelSection").removeClass('is-hidden'); + $('#classAbility0').find(".classFeatureDisplayInSheetSection").removeClass('is-hidden'); + $('#classAbility0').find(".classFeatureIsSelectorSection").removeClass('is-hidden'); + if($("#classAbility0").find(".inputClassFeatureIsSelector").is(":checked")){ + $('#classAbility0').find(".classFeatureSelectionOptions").removeClass('is-hidden'); + } + } else if($(this).val() == 'FEATURE-OPTION'){ + $('#sectionClassFeatureFor').removeClass('is-hidden'); + $('#classAbility0').find(".classFeatureLevelSection").addClass('is-hidden'); + $('#classAbility0').find(".classFeatureDisplayInSheetSection").addClass('is-hidden'); + $('#classAbility0').find(".classFeatureIsSelectorSection").addClass('is-hidden'); + $('#classAbility0').find(".classFeatureSelectionOptions").addClass('is-hidden'); + } + }); + $('#inputBuilderType').trigger("change"); + + + // When 'Is Selector' checkbox is changed + let inputClassFeatureIsSelector = $("#classAbility0").find(".inputClassFeatureIsSelector"); + inputClassFeatureIsSelector.change(function(){ + + if ($(this).is(":checked")) { + + let classFeatureSelectionOptions = $("#classAbility0").find(".classFeatureSelectionOptions"); + classFeatureSelectionOptions.removeClass('is-hidden'); + + let classFeatureOptionsContent = $("#classAbility0").find(".classFeatureOptionsContent"); + let classFeatureAddOptionButton = $("#classAbility0").find(".classFeatureAddOptionButton"); + let classAbilityOptionsCount = 0; + classFeatureAddOptionButton.click(function(){ + classAbilityOptionsCount++; + + let classAbilityOptionID = "classAbility0Option"+classAbilityOptionsCount; + + let newClassAbilityOption = $("#classFeatureLayout").clone(); + newClassAbilityOption.attr('id', classAbilityOptionID); + newClassAbilityOption.removeClass('is-hidden'); + newClassAbilityOption.removeClass('isLayout'); + newClassAbilityOption.removeClass('classFeature'); + newClassAbilityOption.addClass('classFeatureOption'); + newClassAbilityOption.find(".classFeatureLevelSection").remove(); + newClassAbilityOption.find(".classFeatureDisplayInSheetSection").remove(); + newClassAbilityOption.find(".classFeatureIsSelectorSection").remove(); + newClassAbilityOption.find(".classFeatureSelectionOptions").remove(); + newClassAbilityOption.find(".card-header-title").html('Option'); + newClassAbilityOption.appendTo(classFeatureOptionsContent); + + let cardHeader = $("#"+classAbilityOptionID).find(".card-header"); + let cardContent = $("#"+classAbilityOptionID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+classAbilityOptionID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+classAbilityOptionID).remove(); + }); + + }); + + } else { + + let classFeatureSelectionOptions = $("#classAbility0").find(".classFeatureSelectionOptions"); + classFeatureSelectionOptions.addClass('is-hidden'); + + } + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishClassFeature(false); + }); + +}); + +function finishClassFeature(isUpdate){ + + let classFeatureClassName = $("#inputClassFor").val(); + let classFeatureClassAbilName = null; + if($("#inputClassFeatureFor").is(":visible")) { + classFeatureClassAbilName = $("#inputClassFeatureFor").val(); + } + let classFeatureContentSrc = $("#inputContentSource").val(); + + let classFeatureData = null; + + if($('#inputBuilderType').val() == 'FEATURE') { + + $(".classFeature").each(function(){ + if(!$(this).hasClass("isLayout")) { + let classFeatureName = $(this).find(".inputClassFeatureName").val(); + let classFeatureLevel = $(this).find(".inputClassFeatureLevel").val(); + let classFeatureDesc = $(this).find(".inputClassFeatureDesc").val(); + let classFeatureCode = $(this).find(".inputClassFeatureCode").val(); + let classFeatureDisplayInSheet = ($(this).find(".inputClassFeatureDisplayInSheet:checked").val() == '1') ? 1 : 0; + + let classFeatureOptions = []; + if($(this).find(".inputClassFeatureIsSelector").is(":checked")) { + if(!$(this).find(".classFeatureSelectionOptions").hasClass("isLayout")){ + $(this).find(".classFeatureOption").each(function(){ + classFeatureOptions.push({ + name: $(this).find(".inputClassFeatureName").val(), + description: $(this).find(".inputClassFeatureDesc").val(), + code: $(this).find(".inputClassFeatureCode").val(), + }); + }); + } + } + + classFeatureData = { + name: classFeatureName, + level: classFeatureLevel, + description: classFeatureDesc, + code: classFeatureCode, + displayInSheet: classFeatureDisplayInSheet, + options: classFeatureOptions, + }; + } + }); + + } else if($('#inputBuilderType').val() == 'FEATURE-OPTION') { + + $(".classFeature").each(function(){ + if(!$(this).hasClass("isLayout")) { + let classFeatureName = $(this).find(".inputClassFeatureName").val(); + let classFeatureDesc = $(this).find(".inputClassFeatureDesc").val(); + let classFeatureCode = $(this).find(".inputClassFeatureCode").val(); + + classFeatureData = { + name: classFeatureName, + description: classFeatureDesc, + code: classFeatureCode, + }; + } + }); + + } + + let requestPacket = null; + let classFeatureID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateClassFeature"; + classFeatureID = getClassFeatureEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddClassFeature"; + } + + socket.emit(requestPacket,{ + classFeatureID, + classFeatureData, + classFeatureClassName, + classFeatureClassAbilName, + classFeatureContentSrc + }); + +} + +socket.on("returnAdminCompleteClassFeature", function() { + window.location.href = '/admin/manage/class-feature'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/class-feature/editor-class-feature.js b/client/vue-src/legacy-js/admin_builders/class-feature/editor-class-feature.js new file mode 100644 index 00000000..9943ba8d --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/class-feature/editor-class-feature.js @@ -0,0 +1,88 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnAdminClassDetails", function(classObject, featsObject){ + + let classMap = objToMap(classObject); + + let classFeatureID = getClassFeatureEditorIDFromURL(); + + let cClass = null; + let classFeature = null; + for(const [classID, classData] of classMap.entries()){ + for(let ability of classData.Abilities){ + if(ability.id == classFeatureID){ + classFeature = ability; + cClass = classData; + break; + } + } + } + + if(classFeature == null){ + window.location.href = '/admin/manage/class-feature'; + return; + } + + $('#inputClassFor').val(classFeature.indivClassName); + $("#inputContentSource").val(classFeature.contentSrc); + + $('#inputClassFor').trigger("change"); + + if(classFeature.indivClassAbilName != null){ + $('#inputBuilderType').val('FEATURE-OPTION'); + $('#inputBuilderType').trigger("change"); + $('#inputClassFeatureFor').val(classFeature.indivClassAbilName); + } else { + $('#inputBuilderType').trigger("change"); + } + + $("#classAbility0").find(".inputClassFeatureName").val(classFeature.name); + if(classFeature.level == null) {classFeature.level = 1;} + $("#classAbility0").find(".inputClassFeatureLevel").val(classFeature.level); + $("#classAbility0").find(".inputClassFeatureDesc").val(classFeature.description); + $("#classAbility0").find(".inputClassFeatureCode").val(classFeature.code); + let displayInSheet = (classFeature.displayInSheet == 1) ? true : false; + $("#classAbility0").find(".inputClassFeatureDisplayInSheet").prop('checked', displayInSheet); + + // Minimize Class Ability + $("#classAbility0").find(".card-header").trigger("click"); + // Trigger Class Ability Name and Tags + $("#classAbility0").find(".inputClassFeatureName").trigger("change"); + + if(classFeature.selectType === 'SELECTOR'){ + $("#classAbility0").find(".inputClassFeatureIsSelector").prop('checked', true); + $("#classAbility0").find(".inputClassFeatureIsSelector").trigger("change"); + + let classAbilOptionsArray = []; + for(let classAbilOption of cClass.Abilities){ + if(classAbilOption.selectType === 'SELECT_OPTION' && classAbilOption.selectOptionFor === classFeature.id){ + classAbilOptionsArray.push(classAbilOption); + $("#classAbility0").find(".classFeatureAddOptionButton").trigger("click"); + } + } + + let classAbilOptionCount = 0; + $("#classAbility0").find(".classFeatureOption").each(function(){ + let classAbilOption = classAbilOptionsArray[classAbilOptionCount]; + classAbilOptionCount++; + + $(this).find(".inputClassFeatureName").val(classAbilOption.name); + $(this).find(".inputClassFeatureDesc").val(classAbilOption.description); + $(this).find(".inputClassFeatureCode").val(classAbilOption.code); + + }); + + } + + $("#updateButton").click(function(){ + $(this).unbind(); + finishClassFeature(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/class-feature/manager-class-feature.js b/client/vue-src/legacy-js/admin_builders/class-feature/manager-class-feature.js new file mode 100644 index 00000000..3fcda4da --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/class-feature/manager-class-feature.js @@ -0,0 +1,63 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalClassFeatureID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(const entry of entries){ + + let classFeatureID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/class-feature/'+classFeatureID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalClassFeatureID = classFeatureID; + }); + + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalClassFeatureID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalClassFeatureID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveClassFeature", activeModalClassFeatureID); + }); + +}); + +socket.on("returnAdminRemoveClassFeature", function() { + window.location.href = '/admin/manage/class-feature'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/creature/manager-creature.js b/client/vue-src/legacy-js/admin_builders/creature/manager-creature.js new file mode 100644 index 00000000..85f7d89c --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/creature/manager-creature.js @@ -0,0 +1,441 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalCreatureID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + creatureInitImport(); + + let entries = $('.entryListing'); + for (const entry of entries) { + + let creatureID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function () { + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function () { + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function () { + window.location.href = '/admin/edit/creature/' + creatureID; + }); + + cardDelete.mouseenter(function () { + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function () { + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function () { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalCreatureID = creatureID; + }); + + + $('.modal-card-close').click(function () { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalCreatureID = -1; + }); + $('.modal-background').click(function () { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalCreatureID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function () { + socket.emit("requestAdminRemoveCreature", activeModalCreatureID); + }); + +}); + +socket.on("returnAdminRemoveCreature", function () { + window.location.href = '/admin/manage/Creature'; +}); + + + + +function creatureInitImport() { + + startSpinnerLoader(); + + const fileInput = document.querySelector('#input-import-creature'); + fileInput.onchange = () => { + if (fileInput.files.length > 0) { + + for (const file of fileInput.files) { + + let fileReader = new FileReader(); + + // Closure to capture the file information. + fileReader.onload = (function (capturedFile) { + return function (e) { + if (capturedFile.name.endsWith('.json')) { + + let importData = JSON.parse(e.target.result); + + if (importData.type == `npc`) { + parseCreatureData(importData); + } else if (importData.type == `hazard`) { + //parseHazardData(importData); + } + + } + }; + })(file); + + fileReader.readAsText(file); + + } + + } + }; + + socket.emit("requestEncounterDetails"); + +} + +let g_allConditions; +let g_allTags; +let g_featMap; +let g_itemMap; +let g_spellMap; +socket.on("returnEncounterDetails", function(allCreatures, allTags, featsObject, itemsObject, spellsObject, allConditions){ + g_allConditions = allConditions; + g_allTags = allTags; + g_featMap = objToMap(featsObject); + g_itemMap = objToMap(itemsObject); + g_spellMap = objToMap(spellsObject); + stopSpinnerLoader(); +}); + + +function parseCreatureData(importData) { + + console.log(importData); + + let data = {}; + + data.id = importData._id; + + data.name = importData.name; + data.level = importData.system.details.level.value; + + data.rarity = convertToWGRarity(importData.system.traits.rarity); + data.alignment = importData.system.details.alignment.value; + data.size = convertToWGSize(importData.system.traits.size.value); + data.traitsJSON = JSON.stringify(importData.system.traits.value); + data.familyType = importData.system.details.creatureType; + + + data.perceptionBonus = importData.system.attributes.perception.value; + data.senses = importData.system.traits.senses.value; + + data.languagesJSON = JSON.stringify(importData.system.traits.languages.value); + data.languagesCustom = importData.system.traits.languages.custom; + + let skills = importData.items.filter((item) => { + return item.type == `lore`; + }); + let skillsDataArray = []; + for (let skill of skills) { + skillsDataArray.push({ name: skill.name, bonus: skill.system.mod.value }); + } + data.skillsJSON = JSON.stringify(skillsDataArray); + + let inventory = importData.items.filter((item) => { + return item.type == `equipment` || item.type == `weapon` || item.type == `armor` || item.type == `consumable`; + }); + let itemsDataArray = []; + for (let item of inventory) { + + let quantity = 1; + if (item.type == `consumable`) { + quantity = item.system.quantity; + } + + let name = null; + let doIndex = true; + if(item.system.baseItem != null){ + name = item.system.baseItem.replace(/-/g,' '); + + if(name.includes(' armor')){ + name = name.replace(' armor', ''); + } + + } else { + doIndex = false; + } + + let shieldStats = null; + if(item.system.category == 'shield'){ + shieldStats = { + armor: item.system.armor.value, + hardness: item.system.hardness, + hp: item.system.hp.max, + bt: item.system.hp.brokenThreshold, + }; + } + + itemsDataArray.push({ + displayName: item.name, + quantity: quantity, + name: name, + doIndex: doIndex, + shieldStats: shieldStats, + }); + } + data.itemsJSON = JSON.stringify(itemsDataArray); + + data.strMod = importData.system.abilities.str.mod; + data.dexMod = importData.system.abilities.dex.mod; + data.conMod = importData.system.abilities.con.mod; + data.intMod = importData.system.abilities.int.mod; + data.wisMod = importData.system.abilities.wis.mod; + data.chaMod = importData.system.abilities.cha.mod; + + let interactionAbilities = importData.items.filter((item) => { + return item.type == `action` && item.system.actionCategory.value == `interaction`; + }); + let interactionAbilitiesDataArray = []; + for (let ability of interactionAbilities) { + interactionAbilitiesDataArray.push({ + name: ability.name, + actions: convertToWGActions(ability.system.actionType.value, ability.system.actions.value), + traits: ability.system.traits.value, + description: ability.system.description.value, + }); + } + data.interactionAbilitiesJSON = JSON.stringify(interactionAbilitiesDataArray); + + data.acValue = importData.system.attributes.ac.value; + data.fortBonus = importData.system.saves.fortitude.value; + data.reflexBonus = importData.system.saves.reflex.value; + data.willBonus = importData.system.saves.will.value; + data.allSavesCustom = importData.system.attributes.allSaves.value; + + data.hpMax = importData.system.attributes.hp.max; + data.hpDetails = importData.system.attributes.hp.details; + data.immunitiesJSON = JSON.stringify(importData.system.traits.di.value); + data.weaknessesJSON = JSON.stringify(importData.system.traits.dv); + data.resistancesJSON = JSON.stringify(importData.system.traits.dr); + + let defensiveAbilities = importData.items.filter((item) => { + return item.type == `action` && item.system.actionCategory.value == `defensive`; + }); + let defensiveAbilitiesDataArray = []; + for (let ability of defensiveAbilities) { + defensiveAbilitiesDataArray.push({ + name: ability.name, + actions: convertToWGActions(ability.system.actionType.value, ability.system.actions.value), + traits: ability.system.traits.value, + description: ability.system.description.value, + }); + } + data.defensiveAbilitiesJSON = JSON.stringify(defensiveAbilitiesDataArray); + + data.speed = importData.system.attributes.speed.value; + data.otherSpeedsJSON = JSON.stringify(importData.system.attributes.speed.otherSpeeds); + + let attacks = importData.items.filter((item) => { + return item.type == `melee`; + }); + let attacksDataArray = []; + for (let attack of attacks) { + + let damageEffects = ``; + + if(attack.system.description.value != null){ + let matchP = /

@Localize\[PF2E\.PersistentDamage\.(\D+)(.+?)\.success]<\/p>/g.exec(attack.system.description.value); + if(matchP != null){ + damageEffects += `${matchP[2]} persistent ${matchP[1].toLowerCase()}`; + } else { + let match = /@Localize\[PF2E\.PersistentDamage\.(\D+)(.+?)\.success]/g.exec(attack.system.description.value); + if(match != null){ + damageEffects += `${match[2]} persistent ${match[1].toLowerCase()}`; + } + } + } + + if(damageEffects != ``){ + damageEffects += `, `; + } + damageEffects += attack.system.attackEffects.value; + + attacksDataArray.push({ + type: attack.system.weaponType.value, + name: attack.name, + bonus: attack.system.bonus.value, + traits: attack.system.traits.value, + damage: Object.values(attack.system.damageRolls), + effects: damageEffects, + }); + + } + data.attacksJSON = JSON.stringify(attacksDataArray); + + + let spellcastings = importData.items.filter((item) => { + return item.type == `spellcastingEntry`; + }); + let spellcastingDataArray = []; + for (let spellcasting of spellcastings) { + + + let focusPoints = 0; + if (spellcasting.system.prepared.value == `focus`) { + focusPoints = importData.system.resources.focus.max; + } + + let spells = importData.items.filter((item) => { + return item.type == `spell` && item.system.location.value == spellcasting._id; + }); + + let spellsDataArray = []; + let constantSpellsDataArray = []; + for (let spell of spells) { + + let level = spell.system.level.value; + if(spell.system.location.heightenedLevel != null){ + level = spell.system.location.heightenedLevel; + } + if(spell.system.traits.value.includes('cantrip')){ + level = 0; + } + + let spellName = spell.name.toLowerCase(); + + if(spellName.includes(` (constant)`)){ + + spellName = spellName.replace(` (constant)`,``); + constantSpellsDataArray.push({ + name: spellName, + level: level, + }); + + } else { + + let isAtWill = false; + if(spellName.includes(` (at will)`)){ + spellName = spellName.replace(` (at will)`,``); + isAtWill = true; + } + + spellsDataArray.push({ + name: spellName, + level: level, + isAtWill: isAtWill, + }); + + } + + } + + spellcastingDataArray.push({ + name: spellcasting.name, + dc: spellcasting.system.spelldc.dc, + attack: spellcasting.system.spelldc.value, + spells: spellsDataArray, + constantSpells: constantSpellsDataArray, + focus: focusPoints, + }); + } + data.spellcastingJSON = JSON.stringify(spellcastingDataArray); + + + let offensiveAbilities = importData.items.filter((item) => { + return item.type == `action` && item.system.actionCategory.value == `offensive`; + }); + let offensiveAbilitiesDataArray = []; + for (let ability of offensiveAbilities) { + offensiveAbilitiesDataArray.push({ + name: ability.name, + actions: convertToWGActions(ability.system.actionType.value, ability.system.actions.value), + traits: ability.system.traits.value, + description: ability.system.description.value, + }); + } + data.offensiveAbilitiesJSON = JSON.stringify(offensiveAbilitiesDataArray); + + data.flavorText = importData.system.details.publicNotes; + data.contentSrc = convertToWGSource(importData.system.details.source.value); + + socket.emit('requestAdminAddCreature', data); + + + openQuickView('creatureView', { + data: data, + conditions: [{name: 'flat-footed', value: null}], + eliteWeak: 'weak', + }); + +} + + + +function convertToWGRarity(rarity) { + switch (rarity) { + case 'common': return 'COMMON'; + case 'uncommon': return 'UNCOMMON'; + case 'rare': return 'RARE'; + case 'unique': return 'UNIQUE'; + default: return 'COMMON'; + } +} + +function convertToWGSize(size) { + switch (size) { + case 'tiny': return 'TINY'; + case 'sm': return 'SMALL'; + case 'med': return 'MEDIUM'; + case 'lg': return 'LARGE'; + case 'huge': return 'HUGE'; + case 'grg': return 'GARGANTUAN'; + default: return 'MEDIUM'; + } +} + +function convertToWGActions(actionType, actions) { + if (actionType == 'passive') { + return null; + } else if (actionType == 'reaction') { + return 'REACTION'; + } else if (actionType == 'free') { + return 'FREE-ACTION'; + } else if (actionType == 'action') { + if (actions == 1) { + return 'ONE-ACTION'; + } else if (actions == 2) { + return 'TWO-ACTIONS'; + } else if (actions == 3) { + return 'THREE-ACTIONS'; + } + } + return null; +} + +function convertToWGSource(source) { + switch (source) { + case 'Pathfinder Bestiary': return 'BEST-1'; + case 'Pathfinder Bestiary 2': return 'BEST-2'; + case 'Pathfinder Bestiary 3': return 'BEST-3'; + case 'Pathfinder Gamemastery Guide': return 'GM-GUIDE'; + case 'Pathfinder Lost Omens: The Mwangi Expanse': return 'LOST-MWANGI'; + case 'Pathfinder Adventure: Malevolence': return 'MALEVOLENCE'; + case 'Pathfinder #145: Hellknight Hill': return 'AGE-OF-ASHES'; + case 'Pathfinder Kingmaker': return 'KINGMAKER' + default: return source; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/eExtra/builder-extra.js b/client/vue-src/legacy-js/admin_builders/eExtra/builder-extra.js new file mode 100644 index 00000000..7dfb620f --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/eExtra/builder-extra.js @@ -0,0 +1,90 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + $("#inputTags").chosen(); + + $("#inputExtraType").change(function(){ + if($(this).val() == "VEHICLE" || $(this).val() == "OTHER"){ + $("#sectionHealth").removeClass('is-hidden'); + } else { + $("#sectionHealth").addClass('is-hidden'); + } + }); + $("#inputExtraType").trigger('change'); + + $("#createButton").click(function(){ + $(this).unbind(); + finishExtra(false); + }); + +}); + +function finishExtra(isUpdate){ + + let extraName = $("#inputName").val(); + let extraRarity = $("#inputRarity").val(); + let extraSize = $("#inputSize").val(); + let extraPrice = $("#inputPrice").val(); + let extraDescription = $("#inputDescription").val(); + let extraType = $("#inputExtraType").val(); + let extraLevel = $("#inputLevel").val(); + let extraTags = $("#inputTags").val(); + let extraContentSrc = $("#inputContentSource").val(); + + let extraHitPoints, extraBrokenThreshold, extraHardness = null; + if($("#sectionHealth").is(":visible")) { + extraHitPoints = $("#inputHitPoints").val(); + extraBrokenThreshold = $("#inputBrokenThreshold").val(); + extraHardness = $("#inputHardness").val(); + } else { + extraHitPoints = 0; + extraBrokenThreshold = 0; + extraHardness = 0; + } + + let requestPacket = null; + let extraID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateExtra"; + extraID = getExtraEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddExtra"; + } + + socket.emit(requestPacket,{ + extraID, + extraName, + extraRarity, + extraPrice, + extraSize, + extraDescription, + extraType, + extraLevel, + extraTags, + extraHitPoints, + extraBrokenThreshold, + extraHardness, + extraContentSrc + }); + +} + +socket.on("returnAdminCompleteExtra", function() { + window.location.href = '/admin/manage/extra'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/eExtra/editor-extra.js b/client/vue-src/legacy-js/admin_builders/eExtra/editor-extra.js new file mode 100644 index 00000000..5bc2a3db --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/eExtra/editor-extra.js @@ -0,0 +1,47 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestAdminExtraDetails"); + +}); + +socket.on("returnAdminExtraDetails", function(extrasObject){ + + let extraMap = objToMap(extrasObject); + + let extraData = extraMap.get(getExtraEditorIDFromURL()+""); + + if(extraData == null){ + window.location.href = '/admin/manage/extra'; + return; + } + + $("#inputName").val(extraData.Extra.name); + $("#inputExtraType").val(extraData.Extra.type); + $("#inputRarity").val(extraData.Extra.rarity); + $("#inputSize").val(extraData.Extra.size); + $("#inputLevel").val(extraData.Extra.level); + $("#inputDescription").val(extraData.Extra.description); + $("#inputPrice").val(extraData.Extra.price); + $("#inputContentSource").val(extraData.Extra.contentSrc); + + $("#inputHitPoints").val(extraData.Extra.hitPoints); + $("#inputBrokenThreshold").val(extraData.Extra.brokenThreshold); + $("#inputHardness").val(extraData.Extra.hardness); + + for(let extraTag of extraData.Tags){ + $("#inputTags").find('option[value='+extraTag.id+']').attr('selected','selected'); + } + $("#inputTags").trigger("chosen:updated"); + + $("#inputExtraType").trigger('change'); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishExtra(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/eExtra/manager-extra.js b/client/vue-src/legacy-js/admin_builders/eExtra/manager-extra.js new file mode 100644 index 00000000..670e274e --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/eExtra/manager-extra.js @@ -0,0 +1,62 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalExtraID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(const entry of entries){ + + let extraID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/extra/'+extraID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalExtraID = extraID; + }); + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalExtraID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalExtraID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveExtra", activeModalExtraID); + }); + +}); + +socket.on("returnAdminRemoveExtra", function() { + window.location.href = '/admin/manage/extra'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/editor-utils.js b/client/vue-src/legacy-js/admin_builders/editor-utils.js new file mode 100644 index 00000000..0d14d7bd --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/editor-utils.js @@ -0,0 +1,58 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getClassEditorIDFromURL(){ + let spl1 = window.location.pathname.split("class/"); + return parseInt(spl1[1]); +} + +function getAncestryEditorIDFromURL(){ + let spl1 = window.location.pathname.split("ancestry/"); + return parseInt(spl1[1]); +} + +function getBackgroundEditorIDFromURL(){ + let spl1 = window.location.pathname.split("background/"); + return parseInt(spl1[1]); +} + +function getFeatEditorIDFromURL(){ + let spl1 = window.location.pathname.split("feat-action/"); + return parseInt(spl1[1]); +} + +function getItemEditorIDFromURL(){ + let spl1 = window.location.pathname.split("item/"); + return parseInt(spl1[1]); +} + +function getSpellEditorIDFromURL(){ + let spl1 = window.location.pathname.split("spell/"); + return parseInt(spl1[1]); +} + +function getArchetypeEditorIDFromURL(){ + let spl1 = window.location.pathname.split("archetype/"); + return parseInt(spl1[1]); +} + +function getUniHeritageEditorIDFromURL(){ + let spl1 = window.location.pathname.split("uni-heritage/"); + return parseInt(spl1[1]); +} + +function getClassFeatureEditorIDFromURL(){ + let spl1 = window.location.pathname.split("class-feature/"); + return parseInt(spl1[1]); +} + +function getHeritageEditorIDFromURL(){ + let spl1 = window.location.pathname.split("heritage/"); + return parseInt(spl1[1]); +} + +function getExtraEditorIDFromURL(){ + let spl1 = window.location.pathname.split("extra/"); + return parseInt(spl1[1]); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/feat-action/builder-feat-action.js b/client/vue-src/legacy-js/admin_builders/feat-action/builder-feat-action.js new file mode 100644 index 00000000..a3fad9db --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/feat-action/builder-feat-action.js @@ -0,0 +1,252 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let g_classMap = null; +let g_ancestryMap = null; +let g_uniHeritageArray = null; +let g_archetypeArray = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + $("#inputFeatTags").chosen(); + + socket.emit("requestAdminFeatDetailsPlus"); + +}); + +socket.on("returnAdminFeatDetailsPlus", function(featsObject, classObject, ancestryObject, uniHeritageArray, archetypeArray){ + + g_classMap = objToMap(classObject); + g_classMap = new Map([...g_classMap.entries()].sort( + function(a, b) { + return a[1].Class.name > b[1].Class.name ? 1 : -1; + }) + ); + + g_ancestryMap = objToMap(ancestryObject); + g_ancestryMap = new Map([...g_ancestryMap.entries()].sort( + function(a, b) { + return a[1].Ancestry.name > b[1].Ancestry.name ? 1 : -1; + }) + ); + + g_uniHeritageArray = uniHeritageArray; + + g_archetypeArray = archetypeArray; + + + $('#inputClassOptions').html(''); + for(const [classID, classData] of g_classMap.entries()){ + if(classData.Class.isArchived === 0){ + $('#inputClassOptions').append(''); + } + } + + $('#inputArchetypeOptions').html(''); + for(const archetype of g_archetypeArray){ + if(archetype.isArchived === 0){ + $('#inputArchetypeOptions').append(''); + } + } + + $('#inputAncestryOptions').html(''); + for(const [ancestryID, ancestryData] of g_ancestryMap.entries()){ + if(ancestryData.Ancestry.isArchived === 0){ + $('#inputAncestryOptions').append(''); + } + } + $('#inputAncestryOptions').append(''); + for(const uniHeritage of g_uniHeritageArray){ + if(uniHeritage.isArchived === 0){ + $('#inputAncestryOptions').append(''); + } + } + + let builderTypeSelection = $("#inputBuilderType"); + builderTypeSelection.change(function(){ + let builderType = $(this).val(); + if(builderType == "GENERAL-FEAT"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "SKILL-FEAT"){ + $("#sectionSkill").removeClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "CLASS-FEAT"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").removeClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "ANCESTRY-FEAT"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").removeClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "ARCHETYPE-FEAT"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").removeClass('is-hidden'); + } else if(builderType == "BASIC-ACTION"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").addClass('is-hidden'); + $("#sectionSelectMultiple").addClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "SKILL-ACTION"){ + $("#sectionSkill").removeClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").addClass('is-hidden'); + $("#sectionSelectMultiple").addClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "CREATURE-ACTION"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").addClass('is-hidden'); + $("#sectionSelectMultiple").addClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "COMPANION-ACTION"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").addClass('is-hidden'); + $("#sectionSelectMultiple").addClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } + }); + builderTypeSelection.trigger("change"); + + + $("#createFeatButton").click(function(){ + $(this).unbind(); + finishFeat(false); + }); + +}); + +function finishFeat(isUpdate){ + + let builderType = $("#inputBuilderType").val(); + let featName = $("#inputFeatName").val(); + let featVersion = $("#inputFeatVersion").val(); + let featLevel = ($("#inputFeatLevel").is(":visible")) ? $("#inputFeatLevel").val() : null; + let featMinProf = ($("#inputFeatMinProf").is(":visible")) ? $("#inputFeatMinProf").val() : null; + let featSkillID = ($("#inputFeatSkill").is(":visible")) ? $("#inputFeatSkill").val() : null; + let featActions = $("#inputFeatActions").val(); + let featRarity = $("#inputFeatRarity").val(); + let featTagsArray = $("#inputFeatTags").val(); + let featPrereq = $("#inputFeatPrereq").val(); + let featReq = $("#inputFeatReq").val(); + let featFreq = $("#inputFeatFreq").val(); + let featCost = $("#inputFeatCost").val(); + let featTrigger = $("#inputFeatTrigger").val(); + let featDesc = $("#inputFeatDesc").val(); + let featSpecial = $("#inputFeatSpecial").val(); + let featSelectMultiple = null; + if($("#inputFeatSelectMultiple").is(":visible")) { + featSelectMultiple = ($("#inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + } + let featCode = $("#inputFeatCode").val(); + + let featContentSrc = $("#inputContentSource").val(); + + let featGenTypeName = null; + if($("#inputClassOptions").is(":visible")) { + let classID = $('#inputClassOptions').val(); + let classData = g_classMap.get(classID+""); + if(classData != null){ + featGenTypeName = classData.Class.name; + } + } else if($("#inputAncestryOptions").is(":visible")) { + let ancestryID = $('#inputAncestryOptions').val(); + if(isNaN(ancestryID)){ + featGenTypeName = ancestryID; // Must be UniHeritage Name + } else { + let ancestryData = g_ancestryMap.get(ancestryID+""); + if(ancestryData != null){ + featGenTypeName = ancestryData.Ancestry.name; + } + } + } else if($("#inputArchetypeOptions").is(":visible")) { + featGenTypeName = $('#inputArchetypeOptions').val()+' Archetype'; + } + + + let requestPacket = null; + let featID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateFeat"; + featID = getFeatEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddFeat"; + } + + + socket.emit(requestPacket,{ + featID, + builderType, + featName, + featVersion, + featLevel, + featMinProf, + featSkillID, + featActions, + featRarity, + featTagsArray, + featPrereq, + featReq, + featFreq, + featCost, + featTrigger, + featDesc, + featSpecial, + featSelectMultiple, + featCode, + featContentSrc, + featGenTypeName, + }); + +} + +socket.on("returnAdminCompleteFeat", function() { + window.location.href = '/admin/manage/feat-action'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/feat-action/editor-feat-action.js b/client/vue-src/legacy-js/admin_builders/feat-action/editor-feat-action.js new file mode 100644 index 00000000..c2ed45e4 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/feat-action/editor-feat-action.js @@ -0,0 +1,112 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnAdminFeatDetailsPlus", function(featsObject, classObject, ancestryObject, uniHeritageArray){ + + let featMap = objToMap(featsObject); + g_classMap = objToMap(classObject); + g_ancestryMap = objToMap(ancestryObject); + g_uniHeritageArray = uniHeritageArray; + + let feat = featMap.get(getFeatEditorIDFromURL()+""); + + if(feat == null){ + window.location.href = '/admin/manage/feat-action'; //MAKE IT SO IT POPULATES CLASS AND ANCESTRY SELECTOR + return; + } + + feat.Feat.genericType = feat.Feat.genericType.replace(/_/g, '-'); + $("#inputBuilderType").val(feat.Feat.genericType); + $("#inputFeatName").val(feat.Feat.name); + $("#inputFeatVersion").val(feat.Feat.version); + $("#inputFeatLevel").val(feat.Feat.level); + let minProf = (feat.Feat.minProf != null) ? feat.Feat.minProf : $("#inputFeatMinProf option:first").val(); + $("#inputFeatMinProf").val(minProf); + let skillID = (feat.Feat.skillID != null) ? feat.Feat.skillID : $("#inputFeatSkill option:first").val(); + $("#inputFeatSkill").val(skillID); + $("#inputFeatActions").val(feat.Feat.actions); + $("#inputFeatRarity").val(feat.Feat.rarity); + $("#inputFeatPrereq").val(feat.Feat.prerequisites); + $("#inputFeatReq").val(feat.Feat.requirements); + $("#inputFeatFreq").val(feat.Feat.frequency); + $("#inputFeatCost").val(feat.Feat.cost); + $("#inputFeatTrigger").val(feat.Feat.trigger); + $("#inputFeatDesc").val(feat.Feat.description); + $("#inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $("#inputFeatSelectMultiple").prop('checked', checkBoxState); + $("#inputFeatCode").val(feat.Feat.code); + + $("#inputContentSource").val(feat.Feat.contentSrc); + + const GENERAL_TAG_ID = 8; // Hardcoded General and Skill Tag IDs + const SKILL_TAG_ID = 9; + for(let featTag of feat.Tags){ + if(featTag.id != GENERAL_TAG_ID && featTag.id != SKILL_TAG_ID){ + $("#inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + $("#inputFeatTags").trigger("chosen:updated"); + $("#inputBuilderType").trigger("change"); + + + if(feat.Feat.genericType === 'CLASS-FEAT'){ + let classID = getClassIDFromFeat(feat); + if(classID != null){ + $('#inputClassOptions').val(classID); + } + } else if(feat.Feat.genericType === 'ANCESTRY-FEAT'){ + let ancestryID = getAncestryIDFromFeat(feat); + if(ancestryID != null){ + $('#inputAncestryOptions').val(ancestryID); + } + } else if(feat.Feat.genericType === 'ARCHETYPE-FEAT'){ + let archetypeID = getArchetypeIDFromFeat(feat); + if(archetypeID != null){ + $('#inputArchetypeOptions').val(archetypeID); + } + } + + $("#updateFeatButton").click(function(){ + $(this).unbind(); + finishFeat(true); + }); + +}); + +function getClassIDFromFeat(feat){ + for(const [classID, classData] of g_classMap.entries()){ + if(classData.Class.isArchived === 0 && classData.Class.name === feat.Feat.genTypeName){ + return classID; + } + } + return null; +} + +function getAncestryIDFromFeat(feat){ + for(const [ancestryID, ancestryData] of g_ancestryMap.entries()){ + if(ancestryData.Ancestry.isArchived === 0 && ancestryData.Ancestry.name === feat.Feat.genTypeName){ + return ancestryID; + } + } + for(const uniHeritage of g_uniHeritageArray){ + if(uniHeritage.isArchived === 0 && uniHeritage.name === feat.Feat.genTypeName){ + return uniHeritage.name; + } + } + return null; +} + +function getArchetypeIDFromFeat(feat){ + for(const archetype of g_archetypeArray){ + if(archetype.isArchived === 0 && archetype.name === feat.Feat.genTypeName){ + return archetype.name; + } + } + return null; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/feat-action/manager-feat-action.js b/client/vue-src/legacy-js/admin_builders/feat-action/manager-feat-action.js new file mode 100644 index 00000000..e6f8669b --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/feat-action/manager-feat-action.js @@ -0,0 +1,63 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalFeatID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(const entry of entries){ + + let featID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/feat-action/'+featID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalFeatID = featID; + }); + + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalFeatID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalFeatID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveFeat", activeModalFeatID); + }); + +}); + +socket.on("returnAdminRemoveFeat", function() { + window.location.href = '/admin/manage/feat-action'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/heritage/builder-heritage.js b/client/vue-src/legacy-js/admin_builders/heritage/builder-heritage.js new file mode 100644 index 00000000..8dc54e1a --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/heritage/builder-heritage.js @@ -0,0 +1,71 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + socket.emit("requestAdminHeritageDetails"); + +}); + +socket.on("returnAdminHeritageDetails", function(heritageArray, ancestryArray){ + + for(let ancestry of ancestryArray){ + if(ancestry.isArchived == 0){ + $('#inputHeritageFor').append(''); + } + } + + $("#createButton").click(function(){ + $(this).unbind(); + finishHeritage(false); + }); + +}); + +function finishHeritage(isUpdate){ + + let name = $("#inputName").val(); + let rarity = $("#inputRarity").val(); + let description = $("#inputDesc").val(); + let code = $("#inputCode").val(); + let indivAncestryName = $("#inputHeritageFor").val(); + let contentSrc = $("#inputContentSource").val(); + + let requestPacket = null; + let heritageID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateHeritage"; + heritageID = getHeritageEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddHeritage"; + } + + socket.emit(requestPacket,{ + heritageID, + name: name+' '+indivAncestryName, + rarity, + description, + code, + indivAncestryName, + contentSrc + }); + +} + +socket.on("returnAdminCompleteHeritage", function() { + window.location.href = '/admin/manage/heritage'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/heritage/editor-heritage.js b/client/vue-src/legacy-js/admin_builders/heritage/editor-heritage.js new file mode 100644 index 00000000..f856482c --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/heritage/editor-heritage.js @@ -0,0 +1,34 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnAdminHeritageDetails", function(heritageArray, ancestryArray){ + + let heritageID = getHeritageEditorIDFromURL(); + let heritage = heritageArray.find(heritage => { + return heritage.id == heritageID; + }); + + if(heritage == null){ + window.location.href = '/admin/manage/heritage'; + return; + } + + let heritageName = heritage.name.replace(" "+heritage.indivAncestryName,""); + $('#inputName').val(heritageName); + $('#inputRarity').val(heritage.rarity); + $('#inputDesc').val(heritage.description); + $('#inputCode').val(heritage.code); + $('#inputHeritageFor').val(heritage.indivAncestryName); + $("#inputContentSource").val(heritage.contentSrc); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishHeritage(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/heritage/manager-heritage.js b/client/vue-src/legacy-js/admin_builders/heritage/manager-heritage.js new file mode 100644 index 00000000..ad3a54c0 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/heritage/manager-heritage.js @@ -0,0 +1,63 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalHeritageID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(const entry of entries){ + + let heritageID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/heritage/'+heritageID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalHeritageID = heritageID; + }); + + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalHeritageID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalHeritageID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveHeritage", activeModalHeritageID); + }); + +}); + +socket.on("returnAdminRemoveHeritage", function() { + window.location.href = '/admin/manage/heritage'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/item/builder-item.js b/client/vue-src/legacy-js/admin_builders/item/builder-item.js new file mode 100644 index 00000000..66c453a5 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/item/builder-item.js @@ -0,0 +1,384 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_itemMap = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + // ~ Item Materials ~ // + $("#inputMaterial").append(''); + for(const [materialName, materialStruct] of g_materialsMap.entries()){ + $("#inputMaterial").append(''); + } + // ~ ~~~~~~~~~~~~~~ ~ // + + $("#inputTags").chosen(); + + socket.emit("requestAdminItemDetails"); + +}); + +socket.on("returnAdminItemDetails", function(itemObject){ + + g_itemMap = objToMap(itemObject); + g_itemMap = new Map([...g_itemMap.entries()].sort( + function(a, b) { + if (a[1].Item.level === b[1].Item.level) { + // Name is only important when levels are the same + return a[1].Item.name > b[1].Item.name ? 1 : -1; + } + return a[1].Item.level - b[1].Item.level; + }) + ); + + + let builderTypeSelection = $("#inputBuilderType"); + builderTypeSelection.change(function(){ + let builderType = $(this).val(); + $("#inputItemCopyOfOther").off('change'); + if(builderType == "GENERAL"){ + $("#inputItemCopyOfOther").html(''); + $("#sectionItemCopyOfOther").addClass('is-hidden'); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").removeClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").removeClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("OTHER"); + } else if(builderType == "STORAGE"){ + $("#inputItemCopyOfOther").html(''); + $("#sectionItemCopyOfOther").addClass('is-hidden'); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").removeClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").removeClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").addClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("STORAGE"); + } else if(builderType == "WEAPON"){ + let copyOfOtherItemHTML = ''; + for(const [itemID, itemDataStruct] of g_itemMap.entries()){ + if(itemDataStruct.WeaponData != null && itemDataStruct.Item.hidden === 0 && itemDataStruct.WeaponData.profName === itemDataStruct.Item.name){ + copyOfOtherItemHTML += ''; + } + } + $("#inputItemCopyOfOther").html(copyOfOtherItemHTML); + $("#sectionItemCopyOfOther").removeClass('is-hidden'); + $("#inputItemCopyOfOther").change(function(){ + if($(this).val() != ''){ + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionHealth").addClass('is-hidden'); + } + }); + + $("#sectionWeapon").removeClass('is-hidden'); + $("#sectionWeaponMelee").removeClass('is-hidden'); + $("#sectionWeaponRanged").removeClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").removeClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").removeClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("WEAPON"); + } else if(builderType == "ARMOR"){ + let copyOfOtherItemHTML = ''; + for(const [itemID, itemDataStruct] of g_itemMap.entries()){ + if(itemDataStruct.ArmorData != null && itemDataStruct.Item.hidden === 0 && itemDataStruct.ArmorData.profName === itemDataStruct.Item.name){ + copyOfOtherItemHTML += ''; + } + } + $("#inputItemCopyOfOther").html(copyOfOtherItemHTML); + $("#sectionItemCopyOfOther").removeClass('is-hidden'); + $("#inputItemCopyOfOther").change(function(){ + if($(this).val() != ''){ + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + $("#sectionHealth").addClass('is-hidden'); + } + }); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").removeClass('is-hidden'); + $("#sectionArmorPenalties").removeClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").addClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").addClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("ARMOR"); + } else if(builderType == "SHIELD"){ + let copyOfOtherItemHTML = ''; + for(const [itemID, itemDataStruct] of g_itemMap.entries()){ + if(itemDataStruct.ShieldData != null && itemDataStruct.Item.hidden === 0 && itemDataStruct.ShieldData.profName === itemDataStruct.Item.name){ + copyOfOtherItemHTML += ''; + } + } + $("#inputItemCopyOfOther").html(copyOfOtherItemHTML); + $("#sectionItemCopyOfOther").removeClass('is-hidden'); + $("#inputItemCopyOfOther").change(function(){ + if($(this).val() != ''){ + $("#sectionShield").addClass('is-hidden'); + } + }); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").removeClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").addClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").addClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("SHIELD"); + } else if(builderType == "RUNE"){ + $("#inputItemCopyOfOther").html(''); + $("#sectionItemCopyOfOther").addClass('is-hidden'); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").removeClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").addClass('is-hidden'); + $("#sectionSize").addClass('is-hidden'); + $("#sectionMaterial").addClass('is-hidden'); + $("#sectionHands").addClass('is-hidden'); + $("#sectionIsShoddy").addClass('is-hidden'); + $("#sectionQuantity").addClass('is-hidden'); + $("#sectionHealth").addClass('is-hidden'); + $("#inputCategory").val("RUNE"); + } + }); + builderTypeSelection.trigger("change"); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishItem(false); + }); + +}); + +function finishItem(isUpdate){ + + let builderType = $("#inputBuilderType").val(); + let itemName = $("#inputName").val(); + let itemVersion = $("#inputVersion").val(); + let itemPrice = $("#inputPrice").val(); + let itemLevel = $("#inputLevel").val(); + let itemCategory = $("#inputCategory").val(); + let itemRarity = $("#inputRarity").val(); + let itemTagsArray = $("#inputTags").val(); + let itemUsage = $("#inputUsage").val(); + let itemDesc = $("#inputDesc").val(); + let itemCraftReq = $("#inputCraftReq").val(); + let itemCode = $("#inputCode").val(); + + let itemContentSrc = $("#inputContentSource").val(); + + let itemBulk = null; + if($("#sectionBulk").is(":visible")) { + itemBulk = $("#inputBulk").val(); + } + let itemSize = null; + if($("#sectionSize").is(":visible")) { + itemSize = $("#inputSize").val(); + } + let itemMaterial = null; + if($("#sectionMaterial").is(":visible")) { + itemMaterial = $("#inputMaterial").val(); + } + let itemHands = null; + if($("#sectionHands").is(":visible")) { + itemHands = $("#inputHands").val(); + } + + let itemIsShoddy = null; + if($("#sectionIsShoddy").is(":visible")) { + itemIsShoddy = ($("#inputIsShoddy:checked").val() == '1') ? 1 : 0; + } + let itemHasQuantity, itemQuantity = null; + if($("#sectionQuantity").is(":visible")) { + itemHasQuantity = ($("#inputHasQuantity:checked").val() == '1') ? 1 : 0; + itemQuantity = $("#inputQuantity").val(); + } + + let itemHitPoints, itemBrokenThreshold, itemHardness = null; + if($("#sectionHealth").is(":visible")) { + itemHitPoints = $("#inputHitPoints").val(); + itemBrokenThreshold = $("#inputBrokenThreshold").val(); + itemHardness = $("#inputHardness").val(); + } + + let itemWeaponData = null; + if($("#sectionWeapon").is(":visible")) { + itemWeaponData = { + dieType: $("#inputDieType").val(), + damageType: $("#inputDamageType").val(), + weaponCategory: $("#inputWeaponCategory").val(), + isMelee: ($("#inputIsMelee:checked").val() == '1') ? 1 : 0, + meleeWeaponType: $("#inputMeleeWeaponType").val(), + isRanged: ($("#inputIsRanged:checked").val() == '1') ? 1 : 0, + rangedWeaponType: $("#inputRangedWeaponType").val(), + range: $("#inputRange").val(), + reload: $("#inputReload").val() + }; + } + + let itemStorageData = null; + if($("#sectionStorage").is(":visible")) { + itemStorageData = { + maxBulkStorage: $("#inputMaxBulkStorage").val(), + bulkIgnored: $("#inputBulkIgnored").val(), + ignoreSelfBulkIfWearing: ($("#inputIgnoreSelfBulkIfWearing:checked").val() == '1') ? 1 : 0 + }; + } + + let itemShieldData = null; + if($("#sectionShield").is(":visible")) { + itemShieldData = { + acBonus: $("#inputShieldACBonus").val(), + speedPenalty: $("#inputShieldSpeedPenalty").val() + }; + } + + let itemRuneData = null; + if($("#sectionRunestone").is(":visible")) { + itemRuneData = { + runeType: $("#inputRuneType").val(), + etchedType: $("#inputEtchedType").val() + }; + } + + let itemArmorData = null; + if($("#sectionArmor").is(":visible")) { + itemArmorData = { + acBonus: $("#inputArmorACBonus").val(), + dexCap: $("#inputArmorDexCap").val(), + type: $("#inputArmorType").val(), + category: $("#inputArmorCategory").val(), + checkPenalty: $("#inputArmorCheckPenalty").val(), + speedPenalty: $("#inputArmorSpeedPenalty").val(), + minStrength: $("#inputArmorMinStrength").val() + }; + } + + let itemCopyOfOther = null; + let copyOtherID = $("#inputItemCopyOfOther").val(); + if(copyOtherID != null && copyOtherID != ''){ + itemCopyOfOther = g_itemMap.get(copyOtherID); + } + + let requestPacket = null; + let itemID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateItem"; + itemID = getItemEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddItem"; + } + + socket.emit(requestPacket,{ + itemID, + builderType, + itemCopyOfOther, + itemName, + itemVersion, + itemPrice, + itemLevel, + itemCategory, + itemRarity, + itemTagsArray, + itemUsage, + itemDesc, + itemCraftReq, + itemCode, + itemBulk, + itemSize, + itemMaterial, + itemHands, + itemIsShoddy, + itemHasQuantity, + itemQuantity, + itemHitPoints, + itemBrokenThreshold, + itemHardness, + itemWeaponData, + itemArmorData, + itemShieldData, + itemStorageData, + itemRuneData, + itemContentSrc + }); + +} + +socket.on("returnAdminCompleteItem", function() { + window.location.href = '/admin/manage/item'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/item/editor-item.js b/client/vue-src/legacy-js/admin_builders/item/editor-item.js new file mode 100644 index 00000000..0170604d --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/item/editor-item.js @@ -0,0 +1,182 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnAdminItemDetails", function(itemObject){ + + let itemMap = objToMap(itemObject); + let item = itemMap.get(getItemEditorIDFromURL()+""); + + if(item == null){ + window.location.href = '/admin/manage/item'; + return; + } + + $("#inputBuilderType").val(item.Item.itemStructType); + $("#inputName").val(item.Item.name); + $("#inputVersion").val(item.Item.version); + $("#inputPrice").val(item.Item.price); + $("#inputLevel").val(item.Item.level); + $("#inputRarity").val(item.Item.rarity); + $("#inputUsage").val(item.Item.usage); + $("#inputDesc").val(item.Item.description); + $("#inputCraftReq").val(item.Item.craftRequirements); + $("#inputCode").val(item.Item.code); + + $("#inputContentSource").val(item.Item.contentSrc); + + $("#inputBulk").val(item.Item.bulk); + $("#inputSize").val(item.Item.size); + $("#inputMaterial").val(item.Item.materialType); + $("#inputHands").val(item.Item.hands); + let isShoddy = (item.Item.isShoddy == 1) ? true : false; + $("#inputIsShoddy").prop('checked', isShoddy); + let hasQuantity = (item.Item.hasQuantity == 1) ? true : false; + $("#inputHasQuantity").prop('checked', hasQuantity); + $("#inputQuantity").val(item.Item.quantity); + $("#inputHitPoints").val(item.Item.hitPoints); + $("#inputBrokenThreshold").val(item.Item.brokenThreshold); + $("#inputHardness").val(item.Item.hardness); + + if(item.WeaponData != null){ + if(item.WeaponData.profName == item.Item.name || item.WeaponData.profName == 'Alchemical Bombs'){ + $("#inputDieType").val(item.WeaponData.dieType); + $("#inputDamageType").val(item.WeaponData.damageType); + $("#inputWeaponCategory").val(item.WeaponData.category); + let isMelee = (item.WeaponData.isMelee == 1) ? true : false; + $("#inputIsMelee").prop('checked', isMelee); + $("#inputMeleeWeaponType").val(item.WeaponData.meleeWeaponType); + let isRanged = (item.WeaponData.isRanged == 1) ? true : false; + $("#inputIsRanged").prop('checked', isRanged); + $("#inputRangedWeaponType").val(item.WeaponData.rangedWeaponType); + $("#inputRange").val(item.WeaponData.rangedRange); + $("#inputReload").val(item.WeaponData.rangedReload); + } + } + + if(item.ArmorData != null){ + if(item.ArmorData.profName == item.Item.name){ + $("#inputArmorACBonus").val(item.ArmorData.acBonus); + $("#inputArmorDexCap").val(item.ArmorData.dexCap); + $("#inputArmorType").val(item.ArmorData.armorType); + $("#inputArmorCategory").val(item.ArmorData.category); + $("#inputArmorCheckPenalty").val(item.ArmorData.checkPenalty); + $("#inputArmorSpeedPenalty").val(item.ArmorData.speedPenalty); + $("#inputArmorMinStrength").val(item.ArmorData.minStrength); + } + } + + if(item.ShieldData != null){ + if(item.ShieldData.profName == item.Item.name){ + $("#inputShieldACBonus").val(item.ShieldData.acBonus); + $("#inputShieldSpeedPenalty").val(item.ShieldData.speedPenalty); + } + } + + if(item.StorageData != null){ + $("#inputMaxBulkStorage").val(item.StorageData.maxBulkStorage); + $("#inputBulkIgnored").val(item.StorageData.bulkIgnored); + let ignoreSelfBulkIfWearing = (item.StorageData.ignoreSelfBulkIfWearing == 1) ? true : false; + $("#inputIgnoreSelfBulkIfWearing").prop('checked', ignoreSelfBulkIfWearing); + } + + if(item.RuneData != null){ + let runeType = (item.RuneData.isFundamental == 1) ? 'FUNDAMENTAL' : 'PROPERTY'; + $("#inputRuneType").val(runeType); + $("#inputEtchedType").val(item.RuneData.etchedType); + + // Remove these to prevent a continued stacking + let itemName = item.Item.name.replace(' Runestone',''); + let itemPrice = item.Item.price - 300; + $("#inputName").val(itemName); + $("#inputPrice").val(itemPrice); + } + + $("#inputBuilderType").trigger("change"); + $("#inputCategory").val(item.Item.itemType); + + if(item.WeaponData != null && item.WeaponData.profName != item.Item.name){ + let copyItemID = null; + for(const [itemID, itemDataStruct] of itemMap.entries()){ + if(itemDataStruct.Item.hidden == 0){ + if(itemDataStruct.Item.name === item.WeaponData.profName){ + copyItemID = itemID; + item.TagArray = tagArrayDifference(item.TagArray, itemDataStruct.TagArray); + break; + } + } + } + if(copyItemID != null){ + $("#inputItemCopyOfOther").val(copyItemID); + $("#inputItemCopyOfOther").trigger("change"); + } + } + + if(item.ArmorData != null && item.ArmorData.profName != item.Item.name){ + let copyItemID = null; + for(const [itemID, itemDataStruct] of itemMap.entries()){ + if(itemDataStruct.Item.hidden == 0){ + if(itemDataStruct.Item.name === item.ArmorData.profName){ + copyItemID = itemID; + item.TagArray = tagArrayDifference(item.TagArray, itemDataStruct.TagArray); + break; + } + } + } + if(copyItemID != null){ + $("#inputItemCopyOfOther").val(copyItemID); + $("#inputItemCopyOfOther").trigger("change"); + } + } + + if(item.ShieldData != null && item.ShieldData.profName != item.Item.name){ + let copyItemID = null; + for(const [itemID, itemDataStruct] of itemMap.entries()){ + if(itemDataStruct.Item.hidden == 0){ + if(itemDataStruct.Item.name === item.ShieldData.profName){ + copyItemID = itemID; + item.TagArray = tagArrayDifference(item.TagArray, itemDataStruct.TagArray); + break; + } + } + } + if(copyItemID != null){ + $("#inputItemCopyOfOther").val(copyItemID); + $("#inputItemCopyOfOther").trigger("change"); + } + } + + for(let tag of item.TagArray){ + $("#inputTags").find('option[value='+tag.id+']').attr('selected','selected'); + } + $("#inputTags").trigger("chosen:updated"); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishItem(true); + }); + +}); + +function tagArrayDifference(arr1, arr2) { + let newArr1 = []; + for(let tag of arr1){ + newArr1.push(tag.id); + } + let newArr2 = []; + for(let tag of arr2){ + newArr2.push(tag.id); + } + let diffArr = newArr1 + .filter(x => !newArr2.includes(x)) + .concat(newArr2.filter(x => !newArr1.includes(x))); + let finalDiffArr = []; + for(let tagID of diffArr){ + finalDiffArr.push({id: tagID}); + } + return finalDiffArr; + } \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/item/manager-item.js b/client/vue-src/legacy-js/admin_builders/item/manager-item.js new file mode 100644 index 00000000..7c0081a5 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/item/manager-item.js @@ -0,0 +1,62 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalItemID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(const entry of entries){ + + let itemID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/item/'+itemID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalItemID = itemID; + }); + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalItemID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalItemID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveItem", activeModalItemID); + }); + +}); + +socket.on("returnAdminRemoveItem", function() { + window.location.href = '/admin/manage/item'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/spell/builder-spell.js b/client/vue-src/legacy-js/admin_builders/spell/builder-spell.js new file mode 100644 index 00000000..89bc13cd --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/spell/builder-spell.js @@ -0,0 +1,104 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + $("#inputTags").chosen(); + + $("#createButton").click(function(){ + $(this).unbind(); + finishSpell(false); + }); + +}); + +function finishSpell(isUpdate){ + + let spellName = $("#inputName").val(); + let spellVersion = $("#inputVersion").val(); + let spellIsFocus = ($("#inputIsFocusSpell:checked").val() == '1') ? 1 : 0; + let spellLevel = $("#inputLevel").val(); + let spellRarity = $("#inputRarity").val(); + let spellTraditions = $("#inputTraditions").val(); + let spellCasting = $("#inputCasting").val(); + let spellComponents = $("#inputCastingComponents").val(); + let spellCost = $("#inputCost").val(); + let spellTrigger = $("#inputTrigger").val(); + let spellRequirements = $("#inputRequirements").val(); + let spellTagsArray = $("#inputTags").val(); + let spellRange = $("#inputRange").val(); + let spellArea = $("#inputArea").val(); + let spellTargets = $("#inputTargets").val(); + let spellSavingThrow = $("#inputSavingThrow").val(); + let spellDuration = $("#inputDuration").val(); + let spellDesc = $("#inputDesc").val(); + let spellHeightenedOneVal = $("#inputHeightenedOneVal").val(); + let spellHeightenedOneText = $("#inputHeightenedOneText").val(); + let spellHeightenedTwoVal = $("#inputHeightenedTwoVal").val(); + let spellHeightenedTwoText = $("#inputHeightenedTwoText").val(); + let spellHeightenedThreeVal = $("#inputHeightenedThreeVal").val(); + let spellHeightenedThreeText = $("#inputHeightenedThreeText").val(); + let spellHeightenedFourVal = $("#inputHeightenedFourVal").val(); + let spellHeightenedFourText = $("#inputHeightenedFourText").val(); + + let spellContentSrc = $("#inputContentSource").val(); + + let requestPacket = null; + let spellID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateSpell"; + spellID = getSpellEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddSpell"; + } + + socket.emit(requestPacket,{ + spellID, + spellName, + spellVersion, + spellIsFocus, + spellLevel, + spellRarity, + spellTraditions, + spellCasting, + spellComponents, + spellCost, + spellTrigger, + spellRequirements, + spellTagsArray, + spellRange, + spellArea, + spellTargets, + spellSavingThrow, + spellDuration, + spellDesc, + spellHeightenedOneVal, + spellHeightenedOneText, + spellHeightenedTwoVal, + spellHeightenedTwoText, + spellHeightenedThreeVal, + spellHeightenedThreeText, + spellHeightenedFourVal, + spellHeightenedFourText, + spellContentSrc, + }); + +} + +socket.on("returnAdminCompleteSpell", function() { + window.location.href = '/admin/manage/spell'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/spell/editor-spell.js b/client/vue-src/legacy-js/admin_builders/spell/editor-spell.js new file mode 100644 index 00000000..bb37747d --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/spell/editor-spell.js @@ -0,0 +1,73 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestAdminSpellDetails"); + +}); + +socket.on("returnAdminSpellDetails", function(spellObject){ + + let spellMap = objToMap(spellObject); + let spell = spellMap.get(getSpellEditorIDFromURL()+""); + + if(spell == null){ + window.location.href = '/admin/manage/spell'; + return; + } + + $("#inputName").val(spell.Spell.name); + $("#inputVersion").val(spell.Spell.version); + $("#inputLevel").val(spell.Spell.level); + $("#inputCasting").val(spell.Spell.cast); + $("#inputCost").val(spell.Spell.cost); + $("#inputTrigger").val(spell.Spell.trigger); + $("#inputRequirements").val(spell.Spell.requirements); + $("#inputRange").val(spell.Spell.range); + $("#inputArea").val(spell.Spell.area); + $("#inputTargets").val(spell.Spell.targets); + $("#inputSavingThrow").val(spell.Spell.savingThrow); + $("#inputDuration").val(spell.Spell.duration); + $("#inputRarity").val(spell.Spell.rarity); + $("#inputDesc").val(spell.Spell.description); + $("#inputHeightenedOneVal").val(spell.Spell.heightenedOneVal); + $("#inputHeightenedOneText").val(spell.Spell.heightenedOneText); + $("#inputHeightenedTwoVal").val(spell.Spell.heightenedTwoVal); + $("#inputHeightenedTwoText").val(spell.Spell.heightenedTwoText); + $("#inputHeightenedThreeVal").val(spell.Spell.heightenedThreeVal); + $("#inputHeightenedThreeText").val(spell.Spell.heightenedThreeText); + $("#inputHeightenedFourVal").val(spell.Spell.heightenedFourVal); + $("#inputHeightenedFourText").val(spell.Spell.heightenedFourText); + + $("#inputContentSource").val(spell.Spell.contentSrc); + + let isFocusSpell = (spell.Spell.isFocusSpell == 1) ? true : false; + $("#inputIsFocusSpell").prop('checked', isFocusSpell); + + if(spell.Spell.traditions != null){ + let traditionsArray = JSON.parse(spell.Spell.traditions); + for(let tradition of traditionsArray){ + $("#inputTraditions").find('option[value='+tradition+']').attr('selected','selected'); + } + } + + if(spell.Spell.castingComponents != null){ + let componentsArray = JSON.parse(spell.Spell.castingComponents); + for(let component of componentsArray){ + $("#inputCastingComponents").find('option[value='+component+']').attr('selected','selected'); + } + } + + for(let tag of spell.Tags){ + $("#inputTags").find('option[value='+tag.id+']').attr('selected','selected'); + } + $("#inputTags").trigger("chosen:updated"); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishSpell(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/spell/manager-spell.js b/client/vue-src/legacy-js/admin_builders/spell/manager-spell.js new file mode 100644 index 00000000..9c3b385b --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/spell/manager-spell.js @@ -0,0 +1,131 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalSpellID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(let entry of entries){ + + let spellID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/spell/'+spellID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalSpellID = spellID; + }); + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalSpellID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalSpellID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveSpell", activeModalSpellID); + }); + + initSearchBar(); + +}); + +socket.on("returnAdminRemoveSpell", function() { + window.location.href = '/admin/manage/spell'; +}); + +function initSearchBar(){ + + const searchBarID = 'spellsSearch'; + const levelFilterID = 'spellsFilterByLevel'; + + $('#'+searchBarID).change(function(){ + filterEntries(searchBarID, levelFilterID); + }); + $('#'+levelFilterID).change(function(){ + filterEntries(searchBarID, levelFilterID); + }); + +} + +function filterEntries(searchBarID, levelFilterID){ + + let searchBar = $('#'+searchBarID); + let searchBarValue = (searchBar.val() === "") ? null : searchBar.val(); + if(searchBarValue == null){ + searchBar.removeClass('is-info'); + } else { + searchBar.addClass('is-info'); + } + + let levelFilter = $('#'+levelFilterID); + let levelFilterValue = levelFilter.val(); + if(levelFilterValue === "All"){ + levelFilter.parent().removeClass('is-info'); + } else { + levelFilter.parent().addClass('is-info'); + } + levelFilter.blur(); + + if(searchBarValue != null){ + searchBarValue = searchBarValue.toUpperCase(); + } + + let entries = $('.entryListing'); + for(let entry of entries){ + + let entryName = $(entry).attr('data-entry-name').toUpperCase(); + let entryLevel = $(entry).attr('data-entry-level'); + + let isHidden = false; + + if(searchBarValue != null){ + if(!entryName.includes(searchBarValue)){ + isHidden = true; + } + } + + if(levelFilterValue !== "All"){ + if(entryLevel != levelFilterValue){ + isHidden = true; + } + } + + if(isHidden){ + $(entry).addClass('is-hidden'); + } else { + $(entry).removeClass('is-hidden'); + } + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/uni-heritage/builder-uni-heritage.js b/client/vue-src/legacy-js/admin_builders/uni-heritage/builder-uni-heritage.js new file mode 100644 index 00000000..25154de3 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/uni-heritage/builder-uni-heritage.js @@ -0,0 +1,135 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Content Sources ~ // + for(let contSrcData of g_contentSources){ + if(g_currentContentSource === contSrcData.CodeName){ + $("#inputContentSource").append(''); + } else { + $("#inputContentSource").append(''); + } + } + // ~ ~~~~~~~~~~~~~~~ ~ // + + let featCount = 0; + $("#addFeatButton").click(function(){ + featCount++; + + let featID = "feat"+featCount; + + let newFeat = $("#featLayout").clone(); + newFeat.attr('id', featID); + newFeat.removeClass('is-hidden'); + newFeat.appendTo("#featContent"); + + let cardHeader = $("#"+featID).find(".card-header"); + let cardContent = $("#"+featID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+featID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+featID).remove(); + }); + + let inputFeatName = $("#"+featID).find(".inputFeatName"); + inputFeatName.change(function(){ + $("#"+featID).find(".card-header-title").html('Heritage Feat - '+inputFeatName.val()); + }); + + $("#"+featID).find(".inputFeatTags").chosen(); + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishUniHeritage(false); + }); + +}); + +function finishUniHeritage(isUpdate){ + + let heritageName = $("#inputName").val(); + let heritageVersion = $("#inputVersion").val(); + let heritageRarity = $("#inputRarity").val(); + let heritageDescription = $("#inputDescription").val(); + let heritageImageURL = $("#inputImageURL").val(); + let heritageContentSrc = $("#inputContentSource").val(); + let heritageCode = $("#inputCode").val(); + + let heritageFeatsArray = []; + $(".heritageFeat").each(function(){ + if($(this).is(":visible")) { + let featName = $(this).find(".inputFeatName").val(); + let featLevel = $(this).find(".inputFeatLevel").val(); + let featActions = $(this).find(".inputFeatActions").val(); + let featRarity = $(this).find(".inputFeatRarity").val(); + let featTagsArray = $(this).find(".inputFeatTags").val(); + let featPrereq = $(this).find(".inputFeatPrereq").val(); + let featReq = $(this).find(".inputFeatReq").val(); + let featFreq = $(this).find(".inputFeatFreq").val(); + let featCost = $(this).find(".inputFeatCost").val(); + let featTrigger = $(this).find(".inputFeatTrigger").val(); + let featDesc = $(this).find(".inputFeatDesc").val(); + let featSpecial = $(this).find(".inputFeatSpecial").val(); + let featSelectMultiple = ($(this).find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + let featCode = $(this).find(".inputFeatCode").val(); + heritageFeatsArray.push({ + name: featName, + actions: featActions, + level: featLevel, + rarity: featRarity, + prerequisites: featPrereq, + frequency: featFreq, + cost: featCost, + trigger: featTrigger, + requirements: featReq, + description: featDesc, + special: featSpecial, + canSelectMultiple: featSelectMultiple, + code: featCode, + featTagsArray + }); + } + }); + + let requestPacket = null; + let uniHeritageID = null; + if(isUpdate){ + requestPacket = "requestAdminUpdateUniHeritage"; + uniHeritageID = getUniHeritageEditorIDFromURL(); + } else { + requestPacket = "requestAdminAddUniHeritage"; + } + + socket.emit(requestPacket,{ + uniHeritageID, + heritageName, + heritageVersion, + heritageRarity, + heritageDescription, + heritageImageURL, + heritageContentSrc, + heritageCode, + heritageFeatsArray, + }); + +} + +socket.on("returnAdminCompleteUniHeritage", function() { + window.location.href = '/admin/manage/uni-heritage'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/uni-heritage/editor-uni-heritage.js b/client/vue-src/legacy-js/admin_builders/uni-heritage/editor-uni-heritage.js new file mode 100644 index 00000000..afd73f6d --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/uni-heritage/editor-uni-heritage.js @@ -0,0 +1,96 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestAdminUniHeritageDetails"); + +}); + +socket.on("returnAdminUniHeritageDetails", function(uniHeritageArray, featsObject){ + + let featMap = objToMap(featsObject); + + let uniHeritageID = getUniHeritageEditorIDFromURL(); + let uniHeritage = uniHeritageArray.find(uniHeritage => { + return uniHeritage.id == uniHeritageID; + }); + + if(uniHeritage == null){ + window.location.href = '/admin/manage/uni-heritage'; + return; + } + + $("#inputName").val(uniHeritage.name); + $("#inputVersion").val(uniHeritage.version); + $("#inputRarity").val(uniHeritage.rarity); + $("#inputDescription").val(uniHeritage.description); + $("#inputImageURL").val(uniHeritage.artworkURL); + $("#inputContentSource").val(uniHeritage.contentSrc); + $("#inputCode").val(uniHeritage.code); + + // Heritage Feats + let heritageFeats = []; + for(const [key, value] of featMap.entries()){ + let heritageTag = value.Tags.find(tag => { + return tag.id === uniHeritage.tagID; + }); + if(heritageTag != null){ + $("#addFeatButton").trigger("click"); + heritageFeats.push(value); + } + } + + heritageFeats = heritageFeats.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + let heritageFeatCount = 0; + $(".heritageFeat").each(function(){ + if($(this).is(":visible")) { + let feat = heritageFeats[heritageFeatCount]; + heritageFeatCount++; + + $(this).find(".inputFeatName").val(feat.Feat.name); + $(this).find(".inputFeatLevel").val(feat.Feat.level); + $(this).find(".inputFeatActions").val(feat.Feat.actions); + $(this).find(".inputFeatRarity").val(feat.Feat.rarity); + $(this).find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $(this).find(".inputFeatReq").val(feat.Feat.requirements); + $(this).find(".inputFeatFreq").val(feat.Feat.frequency); + $(this).find(".inputFeatCost").val(feat.Feat.cost); + $(this).find(".inputFeatTrigger").val(feat.Feat.trigger); + $(this).find(".inputFeatDesc").val(feat.Feat.description); + $(this).find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $(this).find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $(this).find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != uniHeritage.tagID) { + $(this).find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + // Minimize Feat + $(this).find(".card-header").trigger("click"); + // Trigger Feat Name and Tags + $(this).find(".inputFeatName").trigger("change"); + $(this).find(".inputFeatTags").trigger("chosen:updated"); + } + }); + + + $("#updateButton").click(function(){ + $(this).unbind(); + finishUniHeritage(true); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/admin_builders/uni-heritage/manager-uni-heritage.js b/client/vue-src/legacy-js/admin_builders/uni-heritage/manager-uni-heritage.js new file mode 100644 index 00000000..e28dffa1 --- /dev/null +++ b/client/vue-src/legacy-js/admin_builders/uni-heritage/manager-uni-heritage.js @@ -0,0 +1,63 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let activeModalHeritageID = -1; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let entries = $('.entryListing'); + for(const entry of entries){ + + let heritageID = $(entry).attr('name'); + let cardEdit = $(entry).find('.entry-update'); + let cardDelete = $(entry).find('.entry-delete'); + + cardEdit.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardEdit.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardEdit.click(function() { + window.location.href = '/admin/edit/uni-heritage/'+heritageID; + }); + + cardDelete.mouseenter(function(){ + $(this).addClass('entry-footer-hover'); + }); + cardDelete.mouseleave(function(){ + $(this).removeClass('entry-footer-hover'); + }); + cardDelete.click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + activeModalHeritageID = heritageID; + }); + + + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalHeritageID = -1; + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalHeritageID = -1; + }); + + } + + $('#delete-confirmation-btn').click(function() { + socket.emit("requestAdminRemoveUniHeritage", activeModalHeritageID); + }); + +}); + +socket.on("returnAdminRemoveUniHeritage", function() { + window.location.href = '/admin/manage/uni-heritage'; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/api/api-request-access.js b/client/vue-src/legacy-js/api/api-request-access.js new file mode 100644 index 00000000..917ea6eb --- /dev/null +++ b/client/vue-src/legacy-js/api/api-request-access.js @@ -0,0 +1,31 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // Remove Header and Footer // + $('#main-top').html(''); + $('#wanderers-guide-footer').html(''); + $('#main-container').addClass('is-paddingless'); + + $('#character-access-btn').click(function() { + let clientID = $('#access-container').attr('data-client-id'); + let charID = $('#access-container').attr('data-char-id'); + let accessRights = $('#access-container').attr('data-access-rights'); + socket.emit("requestAPIRequestAccess", clientID, charID, accessRights); + }); + +}); + +socket.on("returnAPIRequestAccess", function(accessData) { + let stateQueryParam = ''; + let stateText = $('#access-container').attr('data-state'); + if(stateText != null && stateText != '') { + stateQueryParam = '&state='+stateText; + } + window.location.href = accessData.redirectURI+'?code='+accessData.singleUseCode+stateQueryParam; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/api/profile-api-clients.js b/client/vue-src/legacy-js/api/profile-api-clients.js new file mode 100644 index 00000000..2b3ec64b --- /dev/null +++ b/client/vue-src/legacy-js/api/profile-api-clients.js @@ -0,0 +1,223 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_allAPIClients = null; +let g_openAPIClient = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + socket.emit("requestAllAPIClients"); + + $('#add-new-client-btn').click(function() { + $('.create-modal').find(".inputAppName").val(null); + $('.create-modal').find(".inputAppDescription").val(null); + $('.create-modal').find(".inputCompanyName").val(null); + $('.create-modal').find(".inputIconURL").val(null); + $('.create-modal').find(".inputRedirectURI").val(null); + $('.create-modal').find(".inputAppPermissions").val('READ-ONLY'); + + $('.create-modal').addClass('is-active'); + $('html').addClass('is-clipped'); + }); + $('.modal-card-close').click(function() { + closeModals(); + g_openAPIClient = null; + }); + $('.modal-background').click(function() { + closeModals(); + g_openAPIClient = null; + }); + + $('#create-client-btn').click(function() { + let appName = $('.create-modal').find(".inputAppName").val(); + let description = $('.create-modal').find(".inputAppDescription").val(); + let companyName = $('.create-modal').find(".inputCompanyName").val(); + let iconURL = $('.create-modal').find(".inputIconURL").val(); + let redirectURI = $('.create-modal').find(".inputRedirectURI").val(); + let appPermissions = $('.create-modal').find(".inputAppPermissions").val(); + + let rURIMatch = redirectURI.match(/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/); + if(appName != "" && (redirectURI != "" && rURIMatch != null)) { + $('.create-modal').find(".inputAppName").removeClass("is-danger"); + $('.create-modal').find(".inputRedirectURI").removeClass("is-danger"); + socket.emit("requestAPIClientAdd",{ + appName, + description, + companyName, + iconURL, + redirectURI, + appPermissions + }); + } else { + if(appName == "") { + $('.create-modal').find(".inputAppName").addClass("is-danger"); + } else { + $('.create-modal').find(".inputAppName").removeClass("is-danger"); + } + if(redirectURI == "" || rURIMatch == null) { + $('.create-modal').find(".inputRedirectURI").addClass("is-danger"); + } else { + $('.create-modal').find(".inputRedirectURI").removeClass("is-danger"); + } + } + }); + + $('#update-client-btn').click(function() { + let clientID = g_openAPIClient.clientID; + let apiKey = g_openAPIClient.apiKey; + + let appName = $('.update-modal').find(".inputAppName").val(); + let description = $('.update-modal').find(".inputAppDescription").val(); + let companyName = $('.update-modal').find(".inputCompanyName").val(); + let iconURL = $('.update-modal').find(".inputIconURL").val(); + let redirectURI = $('.update-modal').find(".inputRedirectURI").val(); + let appPermissions = $('.update-modal').find(".inputAppPermissions").val(); + + let rURIMatch = redirectURI.match(/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/); + if(appName != "" && (redirectURI != "" && rURIMatch != null)) { + $('.update-modal').find(".inputAppName").removeClass("is-danger"); + $('.update-modal').find(".inputRedirectURI").removeClass("is-danger"); + socket.emit("requestAPIClientUpdate",{ + clientID, + apiKey, + appName, + description, + companyName, + iconURL, + redirectURI, + appPermissions + }); + } else { + if(appName == "") { + $('.update-modal').find(".inputAppName").addClass("is-danger"); + } else { + $('.update-modal').find(".inputAppName").removeClass("is-danger"); + } + if(redirectURI == "" || rURIMatch == null) { + $('.update-modal').find(".inputRedirectURI").addClass("is-danger"); + } else { + $('.update-modal').find(".inputRedirectURI").removeClass("is-danger"); + } + } + }); + + $('#delete-client-btn').click(function() { + let clientID = g_openAPIClient.clientID; + let apiKey = g_openAPIClient.apiKey; + socket.emit("requestAPIClientDelete",{ + clientID, + apiKey, + }); + }); + +}); + +socket.on("returnAllAPIClients", function(allAPIClients) { + displayAllClients(allAPIClients); +}); + +socket.on("returnAPIClientAdd", function(apiClient, allAPIClients) { + displayAllClients(allAPIClients); + closeModals(); +}); + +socket.on("returnAPIClientDelete", function(allAPIClients) { + displayAllClients(allAPIClients); + closeModals(); +}); + +socket.on("returnAPIClientUpdate", function(allAPIClients) { + displayAllClients(allAPIClients); + closeModals(); +}); + +socket.on("returnAPIClientRefreshKey", function(allAPIClients) { + displayAllClients(allAPIClients); +}); + +function closeModals(){ + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); +} + +function checkClientLimit(){ + if(g_allAPIClients.length >= 3){ + $('#add-new-client-btn').addClass('is-hidden'); + } else { + $('#add-new-client-btn').removeClass('is-hidden'); + } +} + +function displayAllClients(allAPIClients) { + g_allAPIClients = allAPIClients; + checkClientLimit(); + + $('#clients-section').html(''); + + for(let apiClient of allAPIClients){ + + let clientDataEntryID = 'clientEntry-'+apiClient.clientID; + let clientEntryDetailsID = clientDataEntryID+'-details'; + let clientEditIconID = clientDataEntryID+'-editIcon'; + let clientDeleteIconID = clientDataEntryID+'-deleteIcon'; + let clientViewIconID = clientDataEntryID+'-viewIcon'; + let clientChevronID = clientDataEntryID+'-viewChevron'; + let clientRefreshKeyID = clientDataEntryID+'-refreshKey'; + + $('#clients-section').append('

'+apiClient.appName+'

'); + + $('#'+clientEditIconID).click(function() { + g_openAPIClient = apiClient; + openUpdateClientModal(); + }); + + $('#'+clientDeleteIconID).click(function() { + g_openAPIClient = apiClient; + openDeleteClientModal(); + }); + + $('#'+clientViewIconID).click(function() { + if($('#'+clientEntryDetailsID).hasClass("is-hidden")) { + $('#'+clientEntryDetailsID).removeClass('is-hidden'); + $('#'+clientChevronID).removeClass('fa-chevron-down'); + $('#'+clientChevronID).addClass('fa-chevron-up'); + } else { + $('#'+clientEntryDetailsID).addClass('is-hidden'); + $('#'+clientChevronID).removeClass('fa-chevron-up'); + $('#'+clientChevronID).addClass('fa-chevron-down'); + } + }); + + $('#'+clientRefreshKeyID).click(function() { + socket.emit("requestAPIClientRefreshKey",{ + clientID: apiClient.clientID, + apiKey: apiClient.apiKey, + }); + }); + + } + +} + +function openUpdateClientModal(){ + let apiClient = g_openAPIClient; + if(apiClient == null) {return;} + + $('.update-modal').find(".inputAppName").val(apiClient.appName); + $('.update-modal').find(".inputAppDescription").val(apiClient.description); + $('.update-modal').find(".inputCompanyName").val(apiClient.companyName); + $('.update-modal').find(".inputIconURL").val(apiClient.iconURL); + $('.update-modal').find(".inputRedirectURI").val(apiClient.redirectURI); + $('.update-modal').find(".inputAppPermissions").val(apiClient.accessRights); + + $('.update-modal').addClass('is-active'); + $('html').addClass('is-clipped'); + +} + +function openDeleteClientModal(){ + $('.delete-modal').addClass('is-active'); + $('html').addClass('is-clipped'); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/back-to-top.js b/client/vue-src/legacy-js/back-to-top.js new file mode 100644 index 00000000..02a27afa --- /dev/null +++ b/client/vue-src/legacy-js/back-to-top.js @@ -0,0 +1,49 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + setInterval(() => { + $('.has-back-to-top').each(function() { + + let surroundingDiv = $(this); + let backToTopBtn = $(this).children('.back-to-top-btn'); + + if(backToTopBtn.length == 0){ + + if(surroundingDiv.hasClass('no-tooltip')){ + surroundingDiv.append(` + + `); + } else { + surroundingDiv.append(` + + `); + } + + backToTopBtn = surroundingDiv.find('.back-to-top-btn'); + backToTopBtn.off(); + backToTopBtn.click(function() { + surroundingDiv[0].scrollIntoView(); + }); + + } + + if(surroundingDiv[0].scrollHeight > $(window).height()){ + if(!backToTopBtn.is(":visible")){ + backToTopBtn.removeClass('is-hidden'); + } + } else { + if(backToTopBtn.is(":visible")){ + backToTopBtn.addClass('is-hidden'); + } + } + + }); + + }, 1000);// Every 1 second +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/ancestry/ancestry-browse.js b/client/vue-src/legacy-js/browse/ancestry/ancestry-browse.js new file mode 100644 index 00000000..0a3dc9dd --- /dev/null +++ b/client/vue-src/legacy-js/browse/ancestry/ancestry-browse.js @@ -0,0 +1,81 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function filterAncestrySearch(){ + + let nameFilter = $('#filterNameInput').val(); + let rarityFilter = $('#filterRarityInput').val(); + let sourceFilter = $('#filterSourceInput').val(); + + + let allAncestries = new Set(g_allAncestries); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const ancestry of allAncestries){ + if(!textContainsWords(ancestry.name, parts)){ + allAncestries.delete(ancestry); + } + } + } + + if(rarityFilter != 'ANY'){ + console.log('Filtering by Rarity...'); + for(const ancestry of allAncestries){ + if(ancestry.rarity !== rarityFilter){ + allAncestries.delete(ancestry); + } + } + } + + if(sourceFilter != 'ANY'){ + console.log('Filtering by Source...'); + for(const ancestry of allAncestries){ + if(ancestry.contentSrc !== sourceFilter){ + allAncestries.delete(ancestry); + } + } + } + + displayAncestryResults(allAncestries); +} + +function displayAncestryResults(allAncestries){ + $('#browsingList').html(''); + + if(allAncestries.size <= 0){ + $('#browsingList').html('

No results found!

'); + $('#searchResultCountContainer').html('

(0 results found)

'); + return; + } + + let foundCount = 0; + for(const ancestry of allAncestries){ + if(ancestry.isArchived == 1) {continue;} + if(g_hiddenFromBrowseContentSources.includes(ancestry.contentSrc)) {continue;} + foundCount++; + + let entryID = 'ancestry-'+ancestry.id; + let name = ancestry.name; + let rarity = ancestry.rarity; + + $('#browsingList').append('
'+name+'
'+convertRarityToHTML(rarity)+'
'); + + $('#'+entryID).click(function(){ + new DisplayAncestry('tabContent', ancestry.id, g_featMap); + updateBrowseURL('id', ancestry.id); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + $('#searchResultCountContainer').html('

('+foundCount+' results found)

'); + $('#browsingList').scrollTop(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/archetype/archetype-browse.js b/client/vue-src/legacy-js/browse/archetype/archetype-browse.js new file mode 100644 index 00000000..07844d6e --- /dev/null +++ b/client/vue-src/legacy-js/browse/archetype/archetype-browse.js @@ -0,0 +1,116 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function filterArchetypeSearch(){ + + let nameFilter = $('#filterNameInput').val(); + let levelRelationFilter = $('#filterLevelRelationInput').val(); + let levelFilter = $('#filterLevelInput').val(); + let rarityFilter = $('#filterRarityInput').val(); + let sourceFilter = $('#filterSourceInput').val(); + + + let allArchetypes = new Set(g_allArchetypes); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const archetype of allArchetypes){ + if(!textContainsWords(archetype.name, parts)){ + allArchetypes.delete(archetype); + } + } + } + + if(levelFilter != ''){ + console.log('Filtering by Level...'); + let level = parseInt(levelFilter); + for(const archetype of allArchetypes){ + const dedFeatStruct = g_featMap.get(archetype.dedicationFeatID+''); + switch(levelRelationFilter) { + case 'EQUAL': if(dedFeatStruct.Feat.level === level) {} else {allArchetypes.delete(archetype);} break; + case 'LESS': if(dedFeatStruct.Feat.level < level) {} else {allArchetypes.delete(archetype);} break; + case 'GREATER': if(dedFeatStruct.Feat.level > level) {} else {allArchetypes.delete(archetype);} break; + case 'LESS-EQUAL': if(dedFeatStruct.Feat.level <= level) {} else {allArchetypes.delete(archetype);} break; + case 'GREATER-EQUAL': if(dedFeatStruct.Feat.level >= level) {} else {allArchetypes.delete(archetype);} break; + case 'NOT-EQUAL': if(dedFeatStruct.Feat.level !== level) {} else {allArchetypes.delete(archetype);} break; + default: break; + } + } + } + + if(rarityFilter != 'ANY'){ + console.log('Filtering by Rarity...'); + for(const archetype of allArchetypes){ + const dedFeatStruct = g_featMap.get(archetype.dedicationFeatID+''); + if(dedFeatStruct.Feat.rarity !== rarityFilter){ + allArchetypes.delete(archetype); + } + } + } + + if(sourceFilter != 'ANY'){ + console.log('Filtering by Source...'); + for(const archetype of allArchetypes){ + if(archetype.contentSrc !== sourceFilter){ + allArchetypes.delete(archetype); + } + } + } + + displayArchetypeResults(allArchetypes); +} + +function displayArchetypeResults(allArchetypes){ + $('#browsingList').html(''); + + if(allArchetypes.size <= 0){ + $('#browsingList').html('

No results found!

'); + $('#searchResultCountContainer').html('

(0 results found)

'); + return; + } + + allArchetypes = Array.from(allArchetypes).sort( + function(a, b) { + const dedFeatStructA = g_featMap.get(a.dedicationFeatID+''); + const dedFeatStructB = g_featMap.get(b.dedicationFeatID+''); + if (dedFeatStructA.Feat.level === dedFeatStructB.Feat.level) { + // Name is only important when levels are the same + return dedFeatStructA.Feat.name > dedFeatStructB.Feat.name ? 1 : -1; + } + return dedFeatStructA.Feat.level - dedFeatStructB.Feat.level; + } + ); + + let foundCount = 0; + for(const archetype of allArchetypes){ + if(archetype.isArchived == 1) {continue;} + if(g_hiddenFromBrowseContentSources.includes(archetype.contentSrc)) {continue;} + foundCount++; + + let entryID = 'archetype-'+archetype.id; + let name = archetype.name; + + const dedFeatStruct = g_featMap.get(archetype.dedicationFeatID+''); + let rarity = dedFeatStruct.Feat.rarity; + let level = dedFeatStruct.Feat.level; + + $('#browsingList').append('
'+name+'
'+convertRarityToHTML(rarity)+''+level+'
'); + + $('#'+entryID).click(function(){ + new DisplayArchetype('tabContent', archetype.id, g_featMap); + updateBrowseURL('id', archetype.id); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + $('#searchResultCountContainer').html('

('+foundCount+' results found)

'); + $('#browsingList').scrollTop(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/background/background-browse.js b/client/vue-src/legacy-js/browse/background/background-browse.js new file mode 100644 index 00000000..82d93cd6 --- /dev/null +++ b/client/vue-src/legacy-js/browse/background/background-browse.js @@ -0,0 +1,92 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function filterBackgroundSearch(){ + + let nameFilter = $('#filterNameInput').val(); + let descFilter = $('#filterDescInput').val(); + let rarityFilter = $('#filterRarityInput').val(); + let sourceFilter = $('#filterSourceInput').val(); + + + let allBackgrounds = new Set(g_allBackgrounds); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const background of allBackgrounds){ + if(!textContainsWords(background.name, parts)){ + allBackgrounds.delete(background); + } + } + } + + if(descFilter != ''){ + console.log('Filtering by Description...'); + let parts = descFilter.toUpperCase().split(' '); + for(const background of allBackgrounds){ + if(!textContainsWords(background.description, parts)){ + allBackgrounds.delete(background); + } + } + } + + if(rarityFilter != 'ANY'){ + console.log('Filtering by Rarity...'); + for(const background of allBackgrounds){ + if(background.rarity !== rarityFilter){ + allBackgrounds.delete(background); + } + } + } + + if(sourceFilter != 'ANY'){ + console.log('Filtering by Source...'); + for(const background of allBackgrounds){ + if(background.contentSrc !== sourceFilter){ + allBackgrounds.delete(background); + } + } + } + + displayBackgroundResults(allBackgrounds); +} + +function displayBackgroundResults(allBackgrounds){ + $('#browsingList').html(''); + + if(allBackgrounds.size <= 0){ + $('#browsingList').html('

No results found!

'); + $('#searchResultCountContainer').html('

(0 results found)

'); + return; + } + + let foundCount = 0; + for(const background of allBackgrounds){ + if(background.isArchived == 1) {continue;} + if(g_hiddenFromBrowseContentSources.includes(background.contentSrc)) {continue;} + foundCount++; + + let entryID = 'background-'+background.id; + let name = background.name; + let rarity = background.rarity; + + $('#browsingList').append('
'+name+'
'+convertRarityToHTML(rarity)+'
'); + + $('#'+entryID).click(function(){ + new DisplayBackground('tabContent', background.id); + updateBrowseURL('id', background.id); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + $('#searchResultCountContainer').html('

('+foundCount+' results found)

'); + $('#browsingList').scrollTop(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/browse-utils.js b/client/vue-src/legacy-js/browse/browse-utils.js new file mode 100644 index 00000000..6e845b21 --- /dev/null +++ b/client/vue-src/legacy-js/browse/browse-utils.js @@ -0,0 +1,40 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getFirstSentence(text){ + let rSent = text.match(/^.*?[\.!\?](?:\s|$)/); + if(rSent != null){ + return rSent[0]; + } else { + return ''; + } +} + +function textContainsWords(text, wordArray){ + if(text == null || wordArray.length == 0) {return false;} + text = text.toUpperCase(); + + // If words are in quotes, treat as a singular word. + let firstLetter = wordArray[0].slice(0,1); + let lastLetter = wordArray[wordArray.length-1].slice(-1); + if(firstLetter == '\'' || firstLetter == '"' || firstLetter == '`'){ + if(firstLetter === lastLetter){ + let oneWord = ''; + for(let word of wordArray){ + if(oneWord != '') { oneWord += ' '; } + oneWord += word; + } + oneWord = oneWord.substring(1); // Remove first character + oneWord = oneWord.substring(0, oneWord.length-1); // Remove last character + wordArray = [oneWord]; + } + } + + for(let word of wordArray){ + if(!text.includes(word)){ + return false; + } + } + return true; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/cClass/class-browse.js b/client/vue-src/legacy-js/browse/cClass/class-browse.js new file mode 100644 index 00000000..48ca316a --- /dev/null +++ b/client/vue-src/legacy-js/browse/cClass/class-browse.js @@ -0,0 +1,81 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function filterClassSearch(){ + + let nameFilter = $('#filterNameInput').val(); + let rarityFilter = $('#filterRarityInput').val(); + let sourceFilter = $('#filterSourceInput').val(); + + + let allClasses = new Set(g_allClasses); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const cClass of allClasses){ + if(!textContainsWords(cClass.name, parts)){ + allClasses.delete(cClass); + } + } + } + + if(rarityFilter != 'ANY'){ + console.log('Filtering by Rarity...'); + for(const cClass of allClasses){ + if(cClass.rarity !== rarityFilter){ + allClasses.delete(cClass); + } + } + } + + if(sourceFilter != 'ANY'){ + console.log('Filtering by Source...'); + for(const cClass of allClasses){ + if(cClass.contentSrc !== sourceFilter){ + allClasses.delete(cClass); + } + } + } + + displayClassResults(allClasses); +} + +function displayClassResults(allClasses){ + $('#browsingList').html(''); + + if(allClasses.size <= 0){ + $('#browsingList').html('

No results found!

'); + $('#searchResultCountContainer').html('

(0 results found)

'); + return; + } + + let foundCount = 0; + for(const cClass of allClasses){ + if(cClass.isArchived == 1) {continue;} + if(g_hiddenFromBrowseContentSources.includes(cClass.contentSrc)) {continue;} + foundCount++; + + let entryID = 'class-'+cClass.id; + let name = cClass.name; + let rarity = cClass.rarity; + + $('#browsingList').append('
'+name+'
'+convertRarityToHTML(rarity)+'
'); + + $('#'+entryID).click(function(){ + new DisplayClass('tabContent', cClass.id, g_featMap); + updateBrowseURL('id', cClass.id); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + $('#searchResultCountContainer').html('

('+foundCount+' results found)

'); + $('#browsingList').scrollTop(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/feat/feat-browse.js b/client/vue-src/legacy-js/browse/feat/feat-browse.js new file mode 100644 index 00000000..580fc124 --- /dev/null +++ b/client/vue-src/legacy-js/browse/feat/feat-browse.js @@ -0,0 +1,176 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function filterFeatSearch(){ + + let nameFilter = $('#filterNameInput').val(); + let tagsFilter = $('#filterTagsInput').val(); + let prereqFilter = $('#filterFeatPrereqInput').val(); + let descFilter = $('#filterDescInput').val(); + let actionsFilter = $('#filterActionsInput').val(); + let levelRelationFilter = $('#filterLevelRelationInput').val(); + let levelFilter = $('#filterLevelInput').val(); + let rarityFilter = $('#filterRarityInput').val(); + let skillFilter = $('#filterFeatSkillInput').val(); + let sourceFilter = $('#filterSourceInput').val(); + + let featMap = new Map(g_featMap); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const [featID, featStruct] of featMap.entries()){ + if(!textContainsWords(featStruct.Feat.name, parts)){ + featMap.delete(featID); + } + } + } + + if(tagsFilter.length > 0){ + console.log('Filtering by Traits...'); + for(const [featID, featStruct] of featMap.entries()){ + let foundTags = featStruct.Tags.filter(tag => { + return tagsFilter.includes(tag.id+""); + }); + if(foundTags.length !== tagsFilter.length){ + featMap.delete(featID); + } + } + } + + if(prereqFilter != ''){ + console.log('Filtering by Prereqs...'); + let parts = prereqFilter.toUpperCase().split(' '); + for(const [featID, featStruct] of featMap.entries()){ + if(!textContainsWords(featStruct.Feat.prerequisites, parts)){ + featMap.delete(featID); + } + } + } + + if(descFilter != ''){ + console.log('Filtering by Description...'); + let parts = descFilter.toUpperCase().split(' '); + for(const [featID, featStruct] of featMap.entries()){ + if(!textContainsWords(featStruct.Feat.description, parts)){ + featMap.delete(featID); + } + } + } + + if(actionsFilter != 'ANY'){ + console.log('Filtering by Actions...'); + for(const [featID, featStruct] of featMap.entries()){ + if(featStruct.Feat.actions !== actionsFilter){ + featMap.delete(featID); + } + } + } + + if(levelFilter != ''){ + console.log('Filtering by Level...'); + let level = parseInt(levelFilter); + for(const [featID, featStruct] of featMap.entries()){ + switch(levelRelationFilter) { + case 'EQUAL': if(featStruct.Feat.level === level) {} else {featMap.delete(featID);} break; + case 'LESS': if(featStruct.Feat.level < level) {} else {featMap.delete(featID);} break; + case 'GREATER': if(featStruct.Feat.level > level) {} else {featMap.delete(featID);} break; + case 'LESS-EQUAL': if(featStruct.Feat.level <= level) {} else {featMap.delete(featID);} break; + case 'GREATER-EQUAL': if(featStruct.Feat.level >= level) {} else {featMap.delete(featID);} break; + case 'NOT-EQUAL': if(featStruct.Feat.level !== level) {} else {featMap.delete(featID);} break; + default: break; + } + } + } + + if(rarityFilter != 'ANY'){ + console.log('Filtering by Rarity...'); + for(const [featID, featStruct] of featMap.entries()){ + if(featStruct.Feat.rarity !== rarityFilter){ + featMap.delete(featID); + } + } + } + + if(skillFilter != 'ANY'){ + console.log('Filtering by Skill...'); + for(const [featID, featStruct] of featMap.entries()){ + if(featStruct.Feat.skillID != skillFilter){ + featMap.delete(featID); + } + } + } + + if(sourceFilter != 'ANY'){ + console.log('Filtering by Source...'); + for(const [featID, featStruct] of featMap.entries()){ + if(featStruct.Feat.contentSrc !== sourceFilter){ + featMap.delete(featID); + } + } + } + + displayFeatResults(featMap); +} + +function displayFeatResults(featMap){ + $('#browsingList').html(''); + + if(featMap.size <= 0){ + $('#browsingList').html('

No results found!

'); + $('#searchResultCountContainer').html('

(0 results found)

'); + return; + } + + featMap = new Map([...featMap.entries()].sort( + function(a, b) { + if (a[1].Feat.level === b[1].Feat.level) { + // Name is only important when levels are the same + return a[1].Feat.name > b[1].Feat.name ? 1 : -1; + } + return a[1].Feat.level - b[1].Feat.level; + }) + ); + + let foundCount = 0; + for(const [featID, featStruct] of featMap.entries()){ + if(featStruct.Feat.genericType == 'BASIC-ACTION' + || featStruct.Feat.genericType == 'SKILL-ACTION' + || featStruct.Feat.genericType == 'CREATURE-ACTION' + || featStruct.Feat.genericType == 'COMPANION-ACTION') {continue;} + if(featStruct.Feat.isArchived == 1) {continue;} + if(g_hiddenFromBrowseContentSources.includes(featStruct.Feat.contentSrc)) {continue;} + foundCount++; + + let entryID = 'feat-'+featID; + let name = featStruct.Feat.name; + let actions = featStruct.Feat.actions; + + let rarity = featStruct.Feat.rarity; + let level = featStruct.Feat.level; + if(level <= 0 || level >= 99) { level = ''; } + + $('#browsingList').append('
'+name+''+convertActionToHTML(actions)+'
'+convertRarityToHTML(rarity)+''+level+'
'); + + $('#'+entryID).click(function(){ + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags + }); + updateBrowseURL('id', featID); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + $('#searchResultCountContainer').html('

('+foundCount+' results found)

'); + $('#browsingList').scrollTop(); +} + + diff --git a/client/vue-src/legacy-js/browse/general-browse.js b/client/vue-src/legacy-js/browse/general-browse.js new file mode 100644 index 00000000..37c15bbc --- /dev/null +++ b/client/vue-src/legacy-js/browse/general-browse.js @@ -0,0 +1,548 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// Core Quickview Data // +let g_isDeveloper = false; + +let g_enabledSources = null; + +let g_featMap = null; +let g_skillMap = null; +let g_itemMap = null; +let g_spellMap = null; +let g_allLanguages = null; +let g_allConditions = null; +let g_allTags = null; +let g_allClasses = null; +let g_allAncestries = null; +let g_allArchetypes = null; +let g_allBackgrounds = null; +let g_allUniHeritages = null; +// ~~~~~~~~~~~~~~~~~ // + +let activeSearchTab = 'ancestry'; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $.get('/mloads/browse').done(function(searchStruct){ + + g_isDeveloper = searchStruct.isDeveloper; + + let featMap = objToMap(searchStruct.featsObject); + let skillMap = objToMap(searchStruct.skillObject); + let itemMap = objToMap(searchStruct.itemObject); + let spellMap = objToMap(searchStruct.spellObject); + + initBrowse(featMap, skillMap, itemMap, spellMap, searchStruct.allLanguages, searchStruct.allConditions, searchStruct.allTags, searchStruct.classes, searchStruct.ancestries, searchStruct.archetypes, searchStruct.backgrounds, searchStruct.uniHeritages, searchStruct.sourceBooks); + + }); + + startDiceLoader(); + +}); + +function initBrowse(featMap, skillMap, itemMap, spellMap, allLanguages, allConditions, allTags, classes, ancestries, archetypes, backgrounds, uniHeritages, sourceBooks) { + finishLoadingPage(); + + g_featMap = featMap; + g_skillMap = skillMap; + g_itemMap = itemMap; + g_spellMap = spellMap; + g_allLanguages = allLanguages; + g_allConditions = allConditions; + g_allTags = allTags; + g_allClasses = classes; + g_allAncestries = ancestries; + g_allArchetypes = archetypes; + g_allBackgrounds = backgrounds; + g_allUniHeritages = uniHeritages; + + g_enabledSources = sourceBooks; + + // Run All SourceBook Code, variable code only // + g_expr_hasInit = true;// pretend to init expr processor + let sourceBookCount = 0; + for(let enabledSource of g_enabledSources){ + processVariables(enabledSource.code, 'SourceBook-'+sourceBookCount); + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + // Tags + for(let tag of g_allTags){ + $('#filterTagsInput').append(''); + } + $("#filterTagsInput").chosen({width: "100%"}); + $("#filterTagsInput").chosen(); + + // Sources + $('#filterSourceInput').append(''); + for(let source of g_contentSources){ + if(source.Unreleased == null || !source.Unreleased) { + $('#filterSourceInput').append(''); + } + } + + // Skill + $('#filterFeatSkillInput').append(''); + for(const [skillName, skillData] of g_skillMap.entries()){ + $('#filterFeatSkillInput').append(''); + } + + + // Highlighting Applied Filters // + $("#filterNameInput").blur(function(){ + if($('#filterNameInput').val() != ''){ + $('#filterNameInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterNameInput').val(), 'Name'); + } else { + $('#filterNameInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'Name'); + } + }); + $("#filterFeatPrereqInput").blur(function(){ + if($('#filterFeatPrereqInput').val() != ''){ + $('#filterFeatPrereqInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterFeatPrereqInput').val(), 'FeatPrereq'); + } else { + $('#filterFeatPrereqInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'FeatPrereq'); + } + }); + $("#filterItemUsageInput").blur(function(){ + if($('#filterItemUsageInput').val() != ''){ + $('#filterItemUsageInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterItemUsageInput').val(), 'ItemUsage'); + } else { + $('#filterItemUsageInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'ItemUsage'); + } + }); + $("#filterAreaInput").blur(function(){ + if($('#filterAreaInput').val() != ''){ + $('#filterAreaInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterAreaInput').val(), 'Area'); + } else { + $('#filterAreaInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'Area'); + } + }); + $("#filterRangeInput").blur(function(){ + if($('#filterRangeInput').val() != ''){ + $('#filterRangeInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterRangeInput').val(), 'Range'); + } else { + $('#filterRangeInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'Range'); + } + }); + $("#filterTargetsInput").blur(function(){ + if($('#filterTargetsInput').val() != ''){ + $('#filterTargetsInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterTargetsInput').val(), 'Targets'); + } else { + $('#filterTargetsInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'Targets'); + } + }); + $("#filterDescInput").blur(function(){ + if($('#filterDescInput').val() != ''){ + $('#filterDescInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterDescInput').val(), 'Desc'); + } else { + $('#filterDescInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'Desc'); + } + }); + $("#filterSpellTraditionInput").blur(function(){ + if($('#filterSpellTraditionInput').val() != 'ANY'){ + $('#filterSpellTraditionInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterSpellTraditionInput').val(), 'SpellTradition'); + } else { + $('#filterSpellTraditionInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'SpellTradition'); + } + }); + $("#filterActionsInput").blur(function(){ + if($('#filterActionsInput').val() != 'ANY'){ + $('#filterActionsInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterActionsInput').val(), 'Actions'); + } else { + $('#filterActionsInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'Actions'); + } + }); + $("#filterCastTimeInput").blur(function(){ + if($('#filterCastTimeInput').val() != 'ANY'){ + $('#filterCastTimeInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterCastTimeInput').val(), 'CastTime'); + } else { + $('#filterCastTimeInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'CastTime'); + } + }); + $("#filterComponentsInput").blur(function(){ + if($('#filterComponentsInput').val() != 'ANY'){ + $('#filterComponentsInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterComponentsInput').val(), 'Components'); + } else { + $('#filterComponentsInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'Components'); + } + }); + $("#filterSpellSavingThrowInput").blur(function(){ + if($('#filterSpellSavingThrowInput').val() != 'ANY'){ + $('#filterSpellSavingThrowInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterSpellSavingThrowInput').val(), 'SpellSavingThrow'); + } else { + $('#filterSpellSavingThrowInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'SpellSavingThrow'); + } + }); + $("#filterSpellHeightenInput").blur(function(){ + if($('#filterSpellHeightenInput').val() != 'ANY'){ + $('#filterSpellHeightenInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterSpellHeightenInput').val(), 'SpellHeighten'); + } else { + $('#filterSpellHeightenInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'SpellHeighten'); + } + }); + $("#filterSpellFocusInput").blur(function(){ + if($('#filterSpellFocusInput').val() != 'ANY'){ + $('#filterSpellFocusInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterSpellFocusInput').val(), 'SpellFocus'); + } else { + $('#filterSpellFocusInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'SpellFocus'); + } + }); + $("#filterLevelInput").blur(function(){ + if($('#filterLevelInput').val() != ''){ + $('#filterLevelInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterLevelInput').val(), 'Level'); + } else { + $('#filterLevelInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'Level'); + } + }); + $("#filterItemPriceInput").blur(function(){ + if($('#filterItemPriceInput').val() != ''){ + $('#filterItemPriceInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterItemPriceInput').val(), 'ItemPrice'); + } else { + $('#filterItemPriceInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'ItemPrice'); + } + }); + $("#filterItemBulkInput").blur(function(){ + if($('#filterItemBulkInput').val() != ''){ + $('#filterItemBulkInput').addClass('is-info'); + addToBrowseURL('filter', $('#filterItemBulkInput').val(), 'ItemBulk'); + } else { + $('#filterItemBulkInput').removeClass('is-info'); + removeFromBrowseURL('filter', 'ItemBulk'); + } + }); + $("#filterRarityInput").blur(function(){ + if($('#filterRarityInput').val() != 'ANY'){ + $('#filterRarityInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterRarityInput').val(), 'Rarity'); + } else { + $('#filterRarityInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'Rarity'); + } + }); + $("#filterFeatSkillInput").blur(function(){ + if($('#filterFeatSkillInput').val() != 'ANY'){ + $('#filterFeatSkillInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterFeatSkillInput').val(), 'FeatSkill'); + } else { + $('#filterFeatSkillInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'FeatSkill'); + } + }); + $("#filterItemCategoryInput").blur(function(){ + if($('#filterItemCategoryInput').val() != 'ANY'){ + $('#filterItemCategoryInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterItemCategoryInput').val(), 'ItemCategory'); + } else { + $('#filterItemCategoryInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'ItemCategory'); + } + }); + $("#filterSourceInput").blur(function(){ + if($('#filterSourceInput').val() != 'ANY'){ + $('#filterSourceInput').parent().addClass('is-info'); + addToBrowseURL('filter', $('#filterSourceInput').val(), 'Source'); + } else { + $('#filterSourceInput').parent().removeClass('is-info'); + removeFromBrowseURL('filter', 'Source'); + } + }); + + // + + $("#filterLevelRelationInput").blur(function(){ + if($('#filterLevelRelationInput').val() != 'EQUAL'){ + addToBrowseURL('filter', $('#filterLevelRelationInput').val(), 'LevelRelation'); + } else { + removeFromBrowseURL('filter', 'LevelRelation'); + } + }); + $("#filterItemPriceRelationInput").blur(function(){ + if($('#filterItemPriceRelationInput').val() != 'EQUAL'){ + addToBrowseURL('filter', $('#filterItemPriceRelationInput').val(), 'ItemPriceRelation'); + } else { + removeFromBrowseURL('filter', 'ItemPriceRelation'); + } + }); + $("#filterItemBulkRelationInput").blur(function(){ + if($('#filterItemBulkRelationInput').val() != 'EQUAL'){ + addToBrowseURL('filter', $('#filterItemBulkRelationInput').val(), 'ItemBulkRelation'); + } else { + removeFromBrowseURL('filter', 'ItemBulkRelation'); + } + }); + + // + + $("#filterTagsInput").chosen().change(function(){ + let traitsStr = JSON.stringify($('#filterTagsInput').val()); + if(traitsStr != '[]'){ + addToBrowseURL('filter', traitsStr, 'Traits'); + } else { + removeFromBrowseURL('filter', 'Traits'); + } + }); + + // Changing Tabs // + $('.searchTab').click(function(){ + let tabName = $(this).attr('data-tab-name'); + openTab(tabName); + }); + openTab(activeSearchTab); + + // Search Filtering // + $('#updateFilterButton').click(function(){ + filterSearch(); + }); + $(document).on('keypress',function(e) { + if(e.which == 13) { + filterSearch(); + } + }); + + // Check query parameters for search + queryBrowseContent(); + +} + +function openTab(tabName){ + activeSearchTab = tabName; + let searchOnTabOpen = false; + + $('#ancestriesSearchTab').parent().removeClass("is-active"); + $('#archetypesSearchTab').parent().removeClass("is-active"); + $('#backgroundsSearchTab').parent().removeClass("is-active"); + $('#classesSearchTab').parent().removeClass("is-active"); + $('#featsSearchTab').parent().removeClass("is-active"); + $('#itemsSearchTab').parent().removeClass("is-active"); + $('#spellsSearchTab').parent().removeClass("is-active"); + $('#vHeritagesSearchTab').parent().removeClass("is-active"); + + $('.filterFieldSection').each(function(){ + $(this).addClass('is-hidden'); + }); + + // Reset Filter Sections // + $('#filterNameInput').val(''); + $('#filterTagsInput').val(''); + $('#filterTagsInput').trigger("chosen:updated"); + $('#filterTagsInput').trigger('change'); + $('#filterFeatPrereqInput').val(''); + $('#filterItemUsageInput').val(''); + $('#filterAreaInput').val(''); + $('#filterRangeInput').val(''); + $('#filterTargetsInput').val(''); + $('#filterDescInput').val(''); + $('#filterSpellTraditionInput').val('ANY'); + $('#filterActionsInput').val('ANY'); + $('#filterCastTimeInput').val('ANY'); + $('#filterComponentsInput').val('ANY'); + $('#filterLevelRelationInput').val('EQUAL'); + $('#filterLevelInput').val(''); + $('#filterSpellSavingThrowInput').val('ANY'); + $('#filterSpellHeightenInput').val('ANY'); + $('#filterSpellFocusInput').val('ANY'); + $('#filterItemPriceRelationInput').val('EQUAL'); + $('#filterItemPriceInput').val(''); + $('#filterItemBulkRelationInput').val('EQUAL'); + $('#filterItemBulkInput').val(''); + $('#filterRarityInput').val('ANY'); + $('#filterFeatSkillInput').val('ANY'); + $('#filterItemCategoryInput').val('ANY'); + $('#filterSourceInput').val('ANY'); + + switch(tabName){ + case 'ancestry': + $('#filterNameSection').removeClass('is-hidden'); + $('#filterRaritySection').removeClass('is-hidden'); + $('#filterSourceSection').removeClass('is-hidden'); + + $('#ancestriesSearchTab').parent().addClass("is-active"); + + searchOnTabOpen = true; + break; + case 'archetype': + $('#filterNameSection').removeClass('is-hidden'); + $('#filterLevelSection').removeClass('is-hidden'); + $('#filterRaritySection').removeClass('is-hidden'); + $('#filterSourceSection').removeClass('is-hidden'); + + $('#archetypesSearchTab').parent().addClass("is-active"); + + // Defaults // + $('#filterLevelInput').attr('max', 20); + $('#filterLevelInput').attr('min', 0); + searchOnTabOpen = true; + break; + case 'background': + $('#filterNameSection').removeClass('is-hidden'); + $('#filterDescSection').removeClass('is-hidden'); + $('#filterRaritySection').removeClass('is-hidden'); + $('#filterSourceSection').removeClass('is-hidden'); + + $('#backgroundsSearchTab').parent().addClass("is-active"); + + searchOnTabOpen = true; + break; + case 'class': + $('#filterNameSection').removeClass('is-hidden'); + $('#filterRaritySection').removeClass('is-hidden'); + $('#filterSourceSection').removeClass('is-hidden'); + + $('#classesSearchTab').parent().addClass("is-active"); + + searchOnTabOpen = true; + break; + case 'feat': + $('#filterNameSection').removeClass('is-hidden'); + $('#filterTagsSection').removeClass('is-hidden'); + $('#filterFeatPrereqSection').removeClass('is-hidden'); + $('#filterDescSection').removeClass('is-hidden'); + $('#filterActionsSection').removeClass('is-hidden'); + $('#filterLevelSection').removeClass('is-hidden'); + $('#filterRaritySection').removeClass('is-hidden'); + $('#filterFeatSkillSection').removeClass('is-hidden'); + $('#filterSourceSection').removeClass('is-hidden'); + + $('#featsSearchTab').parent().addClass("is-active"); + + // Defaults // + $('#filterLevelRelationInput').val('GREATER-EQUAL'); + $('#filterLevelInput').val('1'); + $('#filterLevelInput').attr('max', 20); + $('#filterLevelInput').attr('min', -1); + break; + case 'item': + $('#filterNameSection').removeClass('is-hidden'); + $('#filterTagsSection').removeClass('is-hidden'); + $('#filterItemUsageSection').removeClass('is-hidden'); + $('#filterDescSection').removeClass('is-hidden'); + $('#filterLevelSection').removeClass('is-hidden'); + $('#filterItemPriceSection').removeClass('is-hidden'); + $('#filterItemBulkSection').removeClass('is-hidden'); + $('#filterRaritySection').removeClass('is-hidden'); + $('#filterItemCategorySection').removeClass('is-hidden'); + $('#filterSourceSection').removeClass('is-hidden'); + + $('#itemsSearchTab').parent().addClass("is-active"); + + // Defaults // + $('#filterLevelInput').attr('max', 30); + $('#filterLevelInput').attr('min', 0); + break; + case 'spell': + $('#filterNameSection').removeClass('is-hidden'); + $('#filterTagsSection').removeClass('is-hidden'); + $('#filterDescSection').removeClass('is-hidden'); + $('#filterSpellTraditionSection').removeClass('is-hidden'); + $('#filterComponentsSection').removeClass('is-hidden'); + $('#filterCastTimeSection').removeClass('is-hidden'); + $('#filterAreaSection').removeClass('is-hidden'); + $('#filterRangeSection').removeClass('is-hidden'); + $('#filterTargetsSection').removeClass('is-hidden'); + $('#filterLevelSection').removeClass('is-hidden'); + $('#filterSpellSavingThrowSection').removeClass('is-hidden'); + $('#filterSpellHeightenSection').removeClass('is-hidden'); + $('#filterSpellFocusSection').removeClass('is-hidden'); + $('#filterRaritySection').removeClass('is-hidden'); + $('#filterSourceSection').removeClass('is-hidden'); + + $('#spellsSearchTab').parent().addClass("is-active"); + + // Defaults // + $('#filterLevelInput').attr('max', 10); + $('#filterLevelInput').attr('min', 0); + break; + case 'v-heritage': + $('#filterNameSection').removeClass('is-hidden'); + $('#filterSourceSection').removeClass('is-hidden'); + + $('#vHeritagesSearchTab').parent().addClass("is-active"); + + searchOnTabOpen = true; + break; + default: break; + } + + // Update content (tab) query parameters + updateBrowseURL('content', tabName, true); + updateBrowseURL('id', null); + + // Triggers all blur events, updating highlights + $('.input').blur(); + $('.select select').blur(); + + // Default Search Results + if(searchOnTabOpen){ + filterSearch(); + } else { + $('#searchResultCountContainer').html(''); + displayDefaultResults(); + } +} + +function filterSearch(){ + + updateBrowseURL('id', null); + + // Triggers all blur events, updating highlights + $('.input').blur(); + $('.select select').blur(); + + switch(activeSearchTab){ + case 'ancestry': filterAncestrySearch(); return; + case 'archetype': filterArchetypeSearch(); return; + case 'background': filterBackgroundSearch(); return; + case 'class': filterClassSearch(); return; + case 'feat': filterFeatSearch(); return; + case 'item': filterItemSearch(); return; + case 'spell': filterSpellSearch(); return; + case 'v-heritage': filterUniHeritageSearch(); return; + default: return; + } +} + +function displayDefaultResults(){ + $('#browsingList').html('

Apply some filters and click to search!

'); +} + +function finishLoadingPage() { + // Turn off page loading + stopDiceLoader(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/item/item-browse.js b/client/vue-src/legacy-js/browse/item/item-browse.js new file mode 100644 index 00000000..e79033ff --- /dev/null +++ b/client/vue-src/legacy-js/browse/item/item-browse.js @@ -0,0 +1,195 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function filterItemSearch(){ + + let nameFilter = $('#filterNameInput').val(); + let tagsFilter = $('#filterTagsInput').val(); + let usageFilter = $('#filterItemUsageInput').val(); + let descFilter = $('#filterDescInput').val(); + let levelRelationFilter = $('#filterLevelRelationInput').val(); + let levelFilter = $('#filterLevelInput').val(); + let priceRelationFilter = $('#filterItemPriceRelationInput').val(); + let priceFilter = $('#filterItemPriceInput').val(); + let bulkRelationFilter = $('#filterItemBulkRelationInput').val(); + let bulkFilter = $('#filterItemBulkInput').val(); + let rarityFilter = $('#filterRarityInput').val(); + let categoryFilter = $('#filterItemCategoryInput').val(); + let sourceFilter = $('#filterSourceInput').val(); + + + let itemMap = new Map(g_itemMap); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const [itemID, itemStruct] of itemMap.entries()){ + if(!textContainsWords(itemStruct.Item.name, parts)){ + itemMap.delete(itemID); + } + } + } + + if(tagsFilter.length > 0){ + console.log('Filtering by Traits...'); + for(const [itemID, itemStruct] of itemMap.entries()){ + let foundTags = itemStruct.TagArray.filter(tag => { + return tagsFilter.includes(tag.id+""); + }); + if(foundTags.length !== tagsFilter.length){ + itemMap.delete(itemID); + } + } + } + + if(usageFilter != ''){ + console.log('Filtering by Usage...'); + let parts = usageFilter.toUpperCase().split(' '); + for(const [itemID, itemStruct] of itemMap.entries()){ + if(!textContainsWords(itemStruct.Item.usage, parts)){ + itemMap.delete(itemID); + } + } + } + + if(descFilter != ''){ + console.log('Filtering by Description...'); + let parts = descFilter.toUpperCase().split(' '); + for(const [itemID, itemStruct] of itemMap.entries()){ + if(!textContainsWords(itemStruct.Item.description, parts)){ + itemMap.delete(itemID); + } + } + } + + if(levelFilter != ''){ + console.log('Filtering by Level...'); + let level = parseInt(levelFilter); + for(const [itemID, itemStruct] of itemMap.entries()){ + switch(levelRelationFilter) { + case 'EQUAL': if(itemStruct.Item.level === level) {} else {itemMap.delete(itemID);} break; + case 'LESS': if(itemStruct.Item.level < level) {} else {itemMap.delete(itemID);} break; + case 'GREATER': if(itemStruct.Item.level > level) {} else {itemMap.delete(itemID);} break; + case 'LESS-EQUAL': if(itemStruct.Item.level <= level) {} else {itemMap.delete(itemID);} break; + case 'GREATER-EQUAL': if(itemStruct.Item.level >= level) {} else {itemMap.delete(itemID);} break; + case 'NOT-EQUAL': if(itemStruct.Item.level !== level) {} else {itemMap.delete(itemID);} break; + default: break; + } + } + } + + if(priceFilter != ''){ + console.log('Filtering by Price...'); + let price = parseInt(priceFilter); + for(const [itemID, itemStruct] of itemMap.entries()){ + switch(priceRelationFilter) { + case 'EQUAL': if(itemStruct.Item.price === price) {} else {itemMap.delete(itemID);} break; + case 'LESS': if(itemStruct.Item.price < price) {} else {itemMap.delete(itemID);} break; + case 'GREATER': if(itemStruct.Item.price > price) {} else {itemMap.delete(itemID);} break; + case 'LESS-EQUAL': if(itemStruct.Item.price <= price) {} else {itemMap.delete(itemID);} break; + case 'GREATER-EQUAL': if(itemStruct.Item.price >= price) {} else {itemMap.delete(itemID);} break; + case 'NOT-EQUAL': if(itemStruct.Item.price !== price) {} else {itemMap.delete(itemID);} break; + default: break; + } + } + } + + if(bulkFilter != ''){ + console.log('Filtering by Bulk...'); + let bulk = parseInt(bulkFilter); + for(const [itemID, itemStruct] of itemMap.entries()){ + switch(bulkRelationFilter) { + case 'EQUAL': if(itemStruct.Item.bulk === bulk) {} else {itemMap.delete(itemID);} break; + case 'LESS': if(itemStruct.Item.bulk < bulk) {} else {itemMap.delete(itemID);} break; + case 'GREATER': if(itemStruct.Item.bulk > bulk) {} else {itemMap.delete(itemID);} break; + case 'LESS-EQUAL': if(itemStruct.Item.bulk <= bulk) {} else {itemMap.delete(itemID);} break; + case 'GREATER-EQUAL': if(itemStruct.Item.bulk >= bulk) {} else {itemMap.delete(itemID);} break; + case 'NOT-EQUAL': if(itemStruct.Item.bulk !== bulk) {} else {itemMap.delete(itemID);} break; + default: break; + } + } + } + + if(rarityFilter != 'ANY'){ + console.log('Filtering by Rarity...'); + for(const [itemID, itemStruct] of itemMap.entries()){ + if(itemStruct.Item.rarity !== rarityFilter){ + itemMap.delete(itemID); + } + } + } + + if(categoryFilter != 'ANY'){ + console.log('Filtering by Category...'); + for(const [itemID, itemStruct] of itemMap.entries()){ + if(itemStruct.Item.itemType != categoryFilter){ + itemMap.delete(itemID); + } + } + } + + if(sourceFilter != 'ANY'){ + console.log('Filtering by Source...'); + for(const [itemID, itemStruct] of itemMap.entries()){ + if(itemStruct.Item.contentSrc !== sourceFilter){ + itemMap.delete(itemID); + } + } + } + + displayItemResults(itemMap); +} + +function displayItemResults(itemMap){ + $('#browsingList').html(''); + + if(itemMap.size <= 0){ + $('#browsingList').html('

No results found!

'); + $('#searchResultCountContainer').html('

(0 results found)

'); + return; + } + + itemMap = new Map([...itemMap.entries()].sort( + function(a, b) { + if (a[1].Item.level === b[1].Item.level) { + // Name is only important when levels are the same + return a[1].Item.name > b[1].Item.name ? 1 : -1; + } + return a[1].Item.level - b[1].Item.level; + }) + ); + + let foundCount = 0; + for(const [itemID, itemStruct] of itemMap.entries()){ + if(itemStruct.Item.hidden == 1 || itemStruct.Item.isArchived == 1) {continue;} + if(g_hiddenFromBrowseContentSources.includes(itemStruct.Item.contentSrc)) {continue;} + foundCount++; + + let entryID = 'item-'+itemID; + let name = itemStruct.Item.name; + + let rarity = itemStruct.Item.rarity; + let level = itemStruct.Item.level; + if(level <= 0 || level >= 99) { level = ''; } + + $('#browsingList').append('
'+name+'
'+convertRarityToHTML(rarity)+''+level+'
'); + + $('#'+entryID).click(function(){ + openQuickView('itemView', { + ItemDataStruct : itemStruct + }); + updateBrowseURL('id', itemID); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + $('#searchResultCountContainer').html('

('+foundCount+' results found)

'); + $('#browsingList').scrollTop(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/query-params.js b/client/vue-src/legacy-js/browse/query-params.js new file mode 100644 index 00000000..a903e1c7 --- /dev/null +++ b/client/vue-src/legacy-js/browse/query-params.js @@ -0,0 +1,162 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let is_queryBrowseInit = false; + +function queryBrowseContent(){ + + let contentFilter = $('#tabContent').attr('data-content-filter'); + let contentSection = $('#tabContent').attr('data-content-section'); + let contentID = $('#tabContent').attr('data-content-id'); + + if(contentSection != ''){ + + openTab(contentSection); + + contentID = parseInt(contentID); + if(!isNaN(contentID)){ + + switch(contentSection){ + case 'ancestry': + new DisplayAncestry('tabContent', contentID, g_featMap); + break; + case 'archetype': + new DisplayArchetype('tabContent', contentID, g_featMap); + break; + case 'background': + new DisplayBackground('tabContent', contentID); + break; + case 'class': + new DisplayClass('tabContent', contentID, g_featMap); + break; + case 'feat': + let featStruct = g_featMap.get(contentID+''); + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags + }, true); + break; + case 'item': + let itemStruct = g_itemMap.get(contentID+''); + openQuickView('itemView', { + ItemDataStruct : itemStruct + }, true); + break; + case 'spell': + let spellStruct = g_spellMap.get(contentID+''); + openQuickView('spellView', { + SpellDataStruct: spellStruct, + }, true); + break; + case 'v-heritage': + new DisplayUniHeritage('tabContent', contentID, g_featMap); + break; + default: break; + } + + } + + } + + if(contentFilter != ''){ + + let filterMap = getFilterMapFromURL(); + for(const [key, value] of filterMap.entries()){ + if(key == 'Traits'){ + let tagArray = JSON.parse(value); + for(let tagID of tagArray){ + $("#filterTagsInput").find('option[value='+tagID+']').attr('selected','selected'); + } + $("#filterTagsInput").trigger("chosen:updated"); + } else { + $('#filter'+key+'Input').val(value); + } + } + + // Triggers all blur events, updating highlights + $('.input').blur(); + $('.select select').blur(); + + filterSearch(); + } + + is_queryBrowseInit = true; +} + +function updateBrowseURL(paramKey, paramValue, override=false){ + if(!is_queryBrowseInit && !override) { return; } + + const urlParams = new URLSearchParams(location.search); + if(paramValue == null){ + urlParams.delete(paramKey); + } else { + urlParams.set(paramKey, paramValue); + } + window.history.pushState('browse', '', 'browse?'+urlParams.toString()); +} + +function filterIllegalURLCharacters(str){ + return str.replace(/[\?\#\@\$\&\*\;\=\.\~]/g, ''); +} + +function getFilterMapFromURL(){ + let filterMap = new Map(); + try{ + const urlParams = new URLSearchParams(location.search); + let paramFilter = decodeURIComponent(urlParams.get('filter')); + if(!paramFilter.includes('~')) { return filterMap; } + + let filterParts = paramFilter.split('.'); + for(const filterPart of filterParts) { + + let filterPartEntry = filterPart.split('~'); + const filterPartKey = filterPartEntry[0]; + const filterPartValue = filterPartEntry[1]; + + filterMap.set(filterPartKey, filterPartValue); + + } + + return filterMap; + } catch (err) { + return filterMap; + } +} + +function setFilterMapToURL(filterMap){ + + let queryParam = ''; + for(const [key, value] of filterMap.entries()){ + + let newVal = filterIllegalURLCharacters(value); + queryParam += key+'~'+newVal+'.'; + + } + queryParam = queryParam.slice(0, -1); // Remove last '.' + + const urlParams = new URLSearchParams(location.search); + if(queryParam == '') { + urlParams.delete('filter'); + } else { + urlParams.set('filter', encodeURIComponent(queryParam)); + } + window.history.pushState('browse', '', 'browse?'+urlParams.toString()); + +} + +function addToBrowseURL(paramKey, paramAddedValue, subKeyName){ + // Assumes paramKey='filter' + if(!is_queryBrowseInit) { return; } + let filterMap = getFilterMapFromURL(); + filterMap.set(subKeyName, paramAddedValue); + setFilterMapToURL(filterMap); +} + +function removeFromBrowseURL(paramKey, subKeyName){ + // Assumes paramKey='filter' + if(!is_queryBrowseInit) { return; } + let filterMap = getFilterMapFromURL(); + filterMap.delete(subKeyName); + setFilterMapToURL(filterMap); +} diff --git a/client/vue-src/legacy-js/browse/spell/spell-browse.js b/client/vue-src/legacy-js/browse/spell/spell-browse.js new file mode 100644 index 00000000..113ebcdc --- /dev/null +++ b/client/vue-src/legacy-js/browse/spell/spell-browse.js @@ -0,0 +1,252 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function filterSpellSearch(){ + + let nameFilter = $('#filterNameInput').val(); + let tagsFilter = $('#filterTagsInput').val(); + let areaFilter = $('#filterAreaInput').val(); + let rangeFilter = $('#filterRangeInput').val(); + let targetsFilter = $('#filterTargetsInput').val(); + let descFilter = $('#filterDescInput').val(); + let traditionFilter = $('#filterSpellTraditionInput').val(); + let castTimeFilter = $('#filterCastTimeInput').val(); + let componentsFilter = $('#filterComponentsInput').val(); + let levelRelationFilter = $('#filterLevelRelationInput').val(); + let levelFilter = $('#filterLevelInput').val(); + let savingThrowFilter = $('#filterSpellSavingThrowInput').val(); + let heightenFilter = $('#filterSpellHeightenInput').val(); + let focusFilter = $('#filterSpellFocusInput').val(); + let rarityFilter = $('#filterRarityInput').val(); + let sourceFilter = $('#filterSourceInput').val(); + + let spellMap = new Map(g_spellMap); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(!textContainsWords(spellStruct.Spell.name, parts)){ + spellMap.delete(spellID); + } + } + } + + if(tagsFilter.length > 0){ + console.log('Filtering by Traits...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + let foundTags = spellStruct.Tags.filter(tag => { + return tagsFilter.includes(tag.id+""); + }); + if(foundTags.length !== tagsFilter.length){ + spellMap.delete(spellID); + } + } + } + + if(areaFilter != ''){ + console.log('Filtering by Area...'); + let parts = areaFilter.toUpperCase().split(' '); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(!textContainsWords(spellStruct.Spell.area, parts)){ + spellMap.delete(spellID); + } + } + } + + if(rangeFilter != ''){ + console.log('Filtering by Range...'); + let parts = rangeFilter.toUpperCase().split(' '); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(!textContainsWords(spellStruct.Spell.range, parts)){ + spellMap.delete(spellID); + } + } + } + + if(targetsFilter != ''){ + console.log('Filtering by Targets...'); + let parts = targetsFilter.toUpperCase().split(' '); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(!textContainsWords(spellStruct.Spell.targets, parts)){ + spellMap.delete(spellID); + } + } + } + + if(descFilter != ''){ + console.log('Filtering by Description...'); + let parts = descFilter.toUpperCase().split(' '); + for(const [spellID, spellStruct] of spellMap.entries()){ + + let spellDesc = textContainsWords(spellStruct.Spell.description, parts); + let h1Desc = textContainsWords(spellStruct.Spell.heightenedOneText, parts); + let h2Desc = textContainsWords(spellStruct.Spell.heightenedTwoText, parts); + let h3Desc = textContainsWords(spellStruct.Spell.heightenedThreeText, parts); + let h4Desc = textContainsWords(spellStruct.Spell.heightenedFourText, parts); + + if(!spellDesc && !h1Desc && !h2Desc && !h3Desc && !h4Desc){ + spellMap.delete(spellID); + } + } + } + + if(traditionFilter != 'ANY'){ + console.log('Filtering by Tradition...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(!spellStruct.Spell.traditions.includes(traditionFilter)){ + spellMap.delete(spellID); + } + } + } + + if(castTimeFilter != 'ANY'){ + console.log('Filtering by Cast Time...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(spellStruct.Spell.cast !== castTimeFilter){ + spellMap.delete(spellID); + } + } + } + + if(componentsFilter != 'ANY'){ + console.log('Filtering by Components...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(!spellStruct.Spell.castingComponents.includes(componentsFilter)){ + spellMap.delete(spellID); + } + } + } + + if(levelFilter != ''){ + console.log('Filtering by Level...'); + let level = parseInt(levelFilter); + for(const [spellID, spellStruct] of spellMap.entries()){ + switch(levelRelationFilter) { + case 'EQUAL': if(spellStruct.Spell.level === level) {} else {spellMap.delete(spellID);} break; + case 'LESS': if(spellStruct.Spell.level < level) {} else {spellMap.delete(spellID);} break; + case 'GREATER': if(spellStruct.Spell.level > level) {} else {spellMap.delete(spellID);} break; + case 'LESS-EQUAL': if(spellStruct.Spell.level <= level) {} else {spellMap.delete(spellID);} break; + case 'GREATER-EQUAL': if(spellStruct.Spell.level >= level) {} else {spellMap.delete(spellID);} break; + case 'NOT-EQUAL': if(spellStruct.Spell.level !== level) {} else {spellMap.delete(spellID);} break; + default: break; + } + } + } + + if(savingThrowFilter != 'ANY'){ + console.log('Filtering by Saving Throw...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(spellStruct.Spell.savingThrow !== savingThrowFilter){ + spellMap.delete(spellID); + } + } + } + + if(heightenFilter != 'ANY'){ + console.log('Filtering by Heighten...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + + if(heightenFilter == 'NONE'){ + if(spellStruct.Spell.heightenedOneVal == null && spellStruct.Spell.heightenedTwoVal == null && spellStruct.Spell.heightenedThreeVal == null && spellStruct.Spell.heightenedFourVal == null) { + // Found spell with no heightening + } else { + spellMap.delete(spellID); + } + } else { + if(spellStruct.Spell.heightenedOneVal !== heightenFilter && spellStruct.Spell.heightenedTwoVal !== heightenFilter && spellStruct.Spell.heightenedThreeVal !== heightenFilter && spellStruct.Spell.heightenedFourVal !== heightenFilter) { + spellMap.delete(spellID); + } + } + + } + } + + if(focusFilter != 'ANY'){ + console.log('Filtering by Focus...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(spellStruct.Spell.isFocusSpell != focusFilter){ + spellMap.delete(spellID); + } + } + } + + if(rarityFilter != 'ANY'){ + console.log('Filtering by Rarity...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(spellStruct.Spell.rarity !== rarityFilter){ + spellMap.delete(spellID); + } + } + } + + if(sourceFilter != 'ANY'){ + console.log('Filtering by Source...'); + for(const [spellID, spellStruct] of spellMap.entries()){ + if(spellStruct.Spell.contentSrc !== sourceFilter){ + spellMap.delete(spellID); + } + } + } + + displaySpellResults(spellMap); +} + +function displaySpellResults(spellMap){ + $('#browsingList').html(''); + + if(spellMap.size <= 0){ + $('#browsingList').html('

No results found!

'); + $('#searchResultCountContainer').html('

(0 results found)

'); + return; + } + + spellMap = new Map([...spellMap.entries()].sort( + function(a, b) { + if (a[1].Spell.level === b[1].Spell.level) { + // Name is only important when levels are the same + return a[1].Spell.name > b[1].Spell.name ? 1 : -1; + } + return a[1].Spell.level - b[1].Spell.level; + }) + ); + + let foundCount = 0; + for(const [spellID, spellStruct] of spellMap.entries()){ + if(spellStruct.Spell.isArchived == 1) {continue;} + if(g_hiddenFromBrowseContentSources.includes(spellStruct.Spell.contentSrc)) {continue;} + foundCount++; + + let entryID = 'spell-'+spellID; + let name = spellStruct.Spell.name; + let actions = spellStruct.Spell.cast; + + let rarity = spellStruct.Spell.rarity; + let level = spellStruct.Spell.level; + if(level < 0 || level >= 99) { level = ''; } + if(level == 0) { level = 'Cantrip'; } + + let focus = (spellStruct.Spell.isFocusSpell == 1) ? ' Focus Spell' : ''; + let raritySpacing = (level == 'Cantrip') ? 'mr-4' : ''; + + $('#browsingList').append('
'+name+''+convertActionToHTML(actions)+''+focus+'
'+convertRarityToHTML(rarity)+'
'+level+'
'); + + $('#'+entryID).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellStruct, + }); + updateBrowseURL('id', spellID); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + $('#searchResultCountContainer').html('

('+foundCount+' results found)

'); + $('#browsingList').scrollTop(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/browse/uni_heritage/uni-heritage-browse.js b/client/vue-src/legacy-js/browse/uni_heritage/uni-heritage-browse.js new file mode 100644 index 00000000..2cc803c0 --- /dev/null +++ b/client/vue-src/legacy-js/browse/uni_heritage/uni-heritage-browse.js @@ -0,0 +1,71 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function filterUniHeritageSearch(){ + + let nameFilter = $('#filterNameInput').val(); + let sourceFilter = $('#filterSourceInput').val(); + + + let allUniHeritages = new Set(g_allUniHeritages); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const uniHeritage of allUniHeritages){ + if(!textContainsWords(uniHeritage.name, parts)){ + allUniHeritages.delete(uniHeritage); + } + } + } + + if(sourceFilter != 'ANY'){ + console.log('Filtering by Source...'); + for(const uniHeritage of allUniHeritages){ + if(uniHeritage.contentSrc !== sourceFilter){ + allUniHeritages.delete(uniHeritage); + } + } + } + + displayUniHeritageResults(allUniHeritages); +} + +function displayUniHeritageResults(allUniHeritages){ + $('#browsingList').html(''); + + if(allUniHeritages.size <= 0){ + $('#browsingList').html('

No results found!

'); + $('#searchResultCountContainer').html('

(0 results found)

'); + return; + } + + let foundCount = 0; + for(const uniHeritage of allUniHeritages){ + if(uniHeritage.isArchived == 1) {continue;} + if(g_hiddenFromBrowseContentSources.includes(uniHeritage.contentSrc)) {continue;} + foundCount++; + + let entryID = 'uni-heritage-'+uniHeritage.id; + let name = uniHeritage.name; + let rarity = uniHeritage.rarity; + + $('#browsingList').append('
'+name+'
'+convertRarityToHTML(rarity, true)+'
'); + + $('#'+entryID).click(function(){ + new DisplayUniHeritage('tabContent', uniHeritage.id, g_featMap); + updateBrowseURL('id', uniHeritage.id); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + $('#searchResultCountContainer').html('

('+foundCount+' results found)

'); + $('#browsingList').scrollTop(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/data_mapping/data-map-ext.js b/client/vue-src/legacy-js/build_planner/data_mapping/data-map-ext.js new file mode 100644 index 00000000..189b5adc --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/data_mapping/data-map-ext.js @@ -0,0 +1,250 @@ + + +function setDataProficiencies(srcStruct, fFor, tTo, prof, sourceName, deleteSelfData=true){ + + // Data-Map + let value = fFor+getSeparator()+tTo+getSeparator()+prof+getSeparator()+sourceName; + setData(DATA_SOURCE.PROFICIENCY, srcStruct, value, deleteSelfData); + + // Variable-Processing + let varName = profConversion_convertOldNameToVarName(tTo); + variables_addRank(varName, prof, sourceName, JSON.stringify(parameterizeSrcStruct(DATA_SOURCE.PROFICIENCY, srcStruct))); + + displayStats(); + +} + +function getDataSingleProficiency(srcStruct){ + let data = getDataSingle(DATA_SOURCE.PROFICIENCY, srcStruct); + if(data.value != null){ + let vParts = data.value.split(getSeparator()); + data.For = vParts[0]; + data.To = vParts[1]; + data.Prof = vParts[2]; + if(vParts.length == 4){ data.SourceName = vParts[3]; } else { data.SourceName = 'Unknown'; } + } + return data; +} + +function getDataAllProficiencies(){ + let dataArray = getDataAll(DATA_SOURCE.PROFICIENCY); + for(let data of dataArray){ + let vParts = data.value.split(getSeparator()); + data.For = vParts[0]; + data.To = vParts[1]; + data.Prof = vParts[2]; + if(vParts.length == 4){ data.SourceName = vParts[3]; } else { data.SourceName = 'Unknown'; } + } + return dataArray; +} + +// + +function setDataAbilityBonus(srcStruct, ability, bonus){ + + // Data-Map + let value = ability+getSeparator()+bonus; + setData(DATA_SOURCE.ABILITY_BONUS, srcStruct, value); + + // Variable-Processing + if(bonus == 'Boost'){ + variables_addToBonuses('SCORE_'+ability, 2, JSON.stringify(parameterizeSrcStruct(DATA_SOURCE.ABILITY_BONUS, srcStruct)), 'Metadata'); + } else if(bonus == 'Flaw'){ + variables_addToBonuses('SCORE_'+ability, -2, JSON.stringify(parameterizeSrcStruct(DATA_SOURCE.ABILITY_BONUS, srcStruct)), 'Metadata'); + } else { + variables_addToBonuses('SCORE_'+ability, parseInt(bonus), JSON.stringify(parameterizeSrcStruct(DATA_SOURCE.ABILITY_BONUS, srcStruct)), 'Metadata'); + } + + displayStats(); + +} + +function getDataSingleAbilityBonus(srcStruct){ + let dataValue = getDataSingle(DATA_SOURCE.ABILITY_BONUS, srcStruct); + if(dataValue != null && dataValue.value != null) { + let vParts = dataValue.value.split(getSeparator()); + return { Ability: vParts[0], Bonus: vParts[1] }; + } else { + return null; + } +} + +function getDataAllAbilityBonus(){ + let dataArray = getDataAll(DATA_SOURCE.ABILITY_BONUS); + for(let data of dataArray){ + let vParts = data.value.split(getSeparator()); + data.Ability = vParts[0]; + data.Bonus = vParts[1]; + } + return dataArray; +} + +// + +function setDataClassChoice(srcStruct, selectorID, optionID){ + let value = selectorID+getSeparator()+optionID; + setData(DATA_SOURCE.CLASS_FEATURE_CHOICE, srcStruct, value); +} + +function getDataAllClassChoice(){ + let dataArray = getDataAll(DATA_SOURCE.CLASS_FEATURE_CHOICE); + for(let data of dataArray){ + let vParts = data.value.split(getSeparator()); + data.SelectorID = vParts[0]; + data.OptionID = vParts[1]; + } + return dataArray; +} + +function getDataSingleClassChoice(srcStruct){ + let data = getDataSingle(DATA_SOURCE.CLASS_FEATURE_CHOICE, srcStruct); + if(data != null && data.value != null) { + let vParts = data.value.split(getSeparator()); + data.SelectorID = vParts[0]; + data.OptionID = vParts[1]; + return data; + } else { + return null; + } +} + +// + +function setDataInnateSpell(srcStruct, spellID, spellLevel, spellTradition, timesPerDay){ + let value = spellID+getSeparator()+spellLevel+getSeparator()+spellTradition+getSeparator()+timesPerDay+getSeparator()+'CHA'; + /* + "You use your Charisma modifier as your spellcasting ability + modifier for innate spells unless otherwise specified." + */ + setData(DATA_SOURCE.INNATE_SPELL, srcStruct, value); +} + +function getDataSingleInnateSpell(srcStruct){ + let data = getDataSingle(DATA_SOURCE.INNATE_SPELL, srcStruct); + if(data.value != null){ + let vParts = data.value.split(getSeparator()); + data.SpellID = vParts[0]; + data.SpellLevel = vParts[1]; + data.SpellTradition = vParts[2]; + data.TimesPerDay = vParts[3]; + data.KeyAbility = vParts[4]; + } + return data; +} + +function getDataAllInnateSpell(){ + let dataArray = getDataAll(DATA_SOURCE.INNATE_SPELL); + for(let data of dataArray){ + let vParts = data.value.split(getSeparator()); + data.SpellID = vParts[0]; + data.SpellLevel = vParts[1]; + data.SpellTradition = vParts[2]; + data.TimesPerDay = vParts[3]; + data.KeyAbility = vParts[4]; + } + return dataArray; +} + +// + +function setDataLanguage(srcStruct, langID){ + + // Data-Map + setDataOnly(DATA_SOURCE.LANGUAGE, srcStruct, langID); + + // Variable-Processing + variables_addToExtras(VARIABLE.LANGUAGES, langID, JSON.stringify(parameterizeSrcStruct(DATA_SOURCE.LANGUAGE, srcStruct)), 'Metadata'); + + displayStats(); + +} + +function getDataAllLanguage(){ + return getDataAll(DATA_SOURCE.LANGUAGE); +} + +// + +function setDataResistance(srcStruct, resistType, resistAmount){ + let value = resistType+getSeparator()+resistAmount; + + // Data-Map + setData(DATA_SOURCE.RESISTANCE, srcStruct, value); + + // Variable-Processing + variables_addToExtras(VARIABLE.RESISTANCES, value, JSON.stringify(parameterizeSrcStruct(DATA_SOURCE.RESISTANCE, srcStruct)), 'Metadata'); + + displayStats(); + +} + +function getDataAllResistance(){ + let dataArray = getDataAll(DATA_SOURCE.RESISTANCE); + for(let data of dataArray){ + let vParts = data.value.split(getSeparator()); + data.Type = vParts[0]; + data.Amount = vParts[1]; + } + return dataArray; +} + +// + +function setDataVulnerability(srcStruct, vulnerableType, vulnerableAmount){ + let value = vulnerableType+getSeparator()+vulnerableAmount; + + // Data-Map + setData(DATA_SOURCE.WEAKNESS, srcStruct, value); + + // Variable-Processing + variables_addToExtras(VARIABLE.WEAKNESSES, value, JSON.stringify(parameterizeSrcStruct(DATA_SOURCE.WEAKNESS, srcStruct)), 'Metadata'); + + displayStats(); + +} + +function getDataAllVulnerability(){ + let dataArray = getDataAll(DATA_SOURCE.WEAKNESS); + for(let data of dataArray){ + let vParts = data.value.split(getSeparator()); + data.Type = vParts[0]; + data.Amount = vParts[1]; + } + return dataArray; +} + +// + +function setDataOtherSpeed(srcStruct, speedType, speedAmount){ + let value = speedType+getSeparator()+speedAmount; + setData(DATA_SOURCE.OTHER_SPEED, srcStruct, value); +} + +function getDataAllOtherSpeed(){ + let dataArray = getDataAll(DATA_SOURCE.OTHER_SPEED); + for(let data of dataArray){ + let vParts = data.value.split(getSeparator()); + data.Type = vParts[0]; + data.Amount = vParts[1]; + } + return dataArray; +} + +// + +function getDataAllExtraClassFeature(){ + let dataArray = getDataAll(DATA_SOURCE.EXTRA_CLASS_FEATURE); + for(let data of dataArray){ + let vParts = data.value.split(getSeparator()); + data.FeatureID = vParts[0]; + data.DontRunCode = vParts[1]; + if(data.DontRunCode == null) { data.DontRunCode = false; } + } + return dataArray; +} + +// + +function getSeparator(){ + return ':::'; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/data_mapping/data-map.js b/client/vue-src/legacy-js/build_planner/data_mapping/data-map.js new file mode 100644 index 00000000..b602e9b2 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/data_mapping/data-map.js @@ -0,0 +1,238 @@ + + +const DATA_SOURCE = { + ABILITY_BONUS: 'abilityBonus', + OTHER_SPEED: 'otherSpeeds', + RESISTANCE: 'resistance', + WEAKNESS: 'vulnerability', + INNATE_SPELL: 'innateSpell', + LANGUAGE: 'languages', + CLASS_FEATURE_CHOICE: 'classChoice', + CLASS_ARCHETYPE_CHOICE: 'classArchetypeChoice', + PROFICIENCY: 'proficiencies', + LORE: 'loreCategories', + CHAR_TRAIT: 'charTag', + UNSELECTED_DATA: 'unselectedData', + FEAT_CHOICE: 'chosenFeats', + EXTRA_CLASS_FEATURE: 'classAbilityExtra', + EXTRA_HERITAGE: 'heritageExtra', + DOMAIN: 'domains', + ADVANCED_DOMAIN: 'advancedDomains', + FOCUS_SPELL: 'focusSpell', + FOCUS_POINT: 'focusPoint', + NOTES_FIELD: 'notesField', + PHYSICAL_FEATURE: 'phyFeats', + SENSE: 'senses', + WEAPON_SPECIAL: 'weaponSpecialization', + ARMOR_SPECIAL: 'armorSpecialization', + WEAPON_CRIT_SPECIAL: 'weaponCriticalSpecialization', + WEAPON_FAMILIARITY: 'weaponFamiliarity', + SCFS: 'scfs', +}; + +let g_dataMap = null; + +function initDataMap(charMetaData){ + g_dataMap = new Map(); + for(let metaData of charMetaData){ + + // Don't load init class profs (for backwards compatibility with old builder). + if(metaData.source == DATA_SOURCE.PROFICIENCY && metaData.sourceCode.startsWith('inits-') && metaData.sourceCode != 'inits-bonus-prof' && metaData.value.endsWith('Initial Class')){ + continue; + } + + let srcStruct = { + source: metaData.source+'', + sourceType: metaData.sourceType+'', + sourceLevel: metaData.sourceLevel+'', + sourceCode: metaData.sourceCode+'', + sourceCodeSNum: metaData.sourceCodeSNum+'', + }; + g_dataMap.set(JSON.stringify(srcStruct), metaData.value); + } +} + +function setData(in_source, in_srcStruct, in_value, deleteSelfData=true){ + let new_srcStruct = parameterizeSrcStruct(in_source, in_srcStruct); + deleteDataSNumChildren(new_srcStruct); + + if(deleteSelfData){ + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let srcStruct = JSON.parse(JSON_srcStruct); + if(srcStruct.sourceType == new_srcStruct.sourceType + && srcStruct.sourceLevel == new_srcStruct.sourceLevel + && srcStruct.sourceCode == new_srcStruct.sourceCode + && srcStruct.sourceCodeSNum == new_srcStruct.sourceCodeSNum){ + g_dataMap.delete(JSON_srcStruct); + deleteVarDataFromSrcStruct(JSON_srcStruct); + } + } + } + + g_dataMap.set(JSON.stringify(new_srcStruct), in_value); + displayStats(); +} + +function setDataOnly(in_source, in_srcStruct, in_value){ + g_dataMap.set(JSON.stringify(parameterizeSrcStruct(in_source, in_srcStruct)), in_value); + displayStats(); +} + +function getDataSingle(in_source, in_srcStruct){ + let new_srcStruct = parameterizeSrcStruct(in_source, in_srcStruct); + let value = cloneObj(g_dataMap.get(JSON.stringify(new_srcStruct))); + + // If value isn't set, default to build data (if character has one) + if(value == null && g_buildInfo != null){ + let buildSrcStruct = g_buildInfo.buildData.find(buildSrcStruct => { + // Check all srcStruct parts, including source + return (buildSrcStruct.source == new_srcStruct.source + && buildSrcStruct.sourceType == new_srcStruct.sourceType + && buildSrcStruct.sourceLevel == new_srcStruct.sourceLevel + && buildSrcStruct.sourceCode == new_srcStruct.sourceCode + && buildSrcStruct.sourceCodeSNum == new_srcStruct.sourceCodeSNum); + }); + if(buildSrcStruct != null){ + value = buildSrcStruct.value; + + if(buildSrcStruct.value != null){ + g_dataMap.set(JSON.stringify(parameterizeSrcStruct(buildSrcStruct.source, buildSrcStruct)), buildSrcStruct.value); + socket.emit("requestMetaDataSetOnly", + g_char_id, + buildSrcStruct.source, + buildSrcStruct, + buildSrcStruct.value); + } + + } + } + + new_srcStruct.value = value; + return new_srcStruct; +} + +function getDataAll(in_source){ + let dataArray = []; + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let newStruct = JSON.parse(JSON_srcStruct); + if(newStruct.source == in_source){ + newStruct.value = value; + dataArray.push(newStruct); + } + } + return dataArray; +} + +// Delete Data // +function deleteVarDataFromSrcStruct(JSON_srcStruct, varType=null){ + for(let [varName, varData] of g_variableMap.entries()){ + if(varType != null && varData.Type != varType) { continue; } + + if(varData.Type == VAR_TYPE.INTEGER){ + varData.Bonuses.delete(JSON_srcStruct); + } else if(varData.Type == VAR_TYPE.STRING){ + varData.Extras.delete(JSON_srcStruct); + } else if(varData.Type == VAR_TYPE.ABILITY_SCORE){ + varData.Value.Bonuses.delete(JSON_srcStruct); + } else if(varData.Type == VAR_TYPE.PROFICIENCY){ + varData.Value.RankHistory.delete(JSON_srcStruct); + } + + } +} + +function deleteData(in_source, in_srcStruct){ + deleteDataSNumChildren(in_srcStruct); + deleteDataOnly(in_source, in_srcStruct); +} + +function deleteDataOnly(in_source, in_srcStruct){ + g_dataMap.delete(JSON.stringify(parameterizeSrcStruct(in_source, in_srcStruct))); + deleteVarDataFromSrcStruct(JSON.stringify(parameterizeSrcStruct(in_source, in_srcStruct))); + displayStats(); +} + +function deleteDataBySourceStruct(in_srcStruct){ + deleteDataSNumChildren(in_srcStruct); + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let srcStruct = JSON.parse(JSON_srcStruct); + if(srcStruct.sourceType == in_srcStruct.sourceType + && srcStruct.sourceLevel == in_srcStruct.sourceLevel + && srcStruct.sourceCode == in_srcStruct.sourceCode + && srcStruct.sourceCodeSNum == in_srcStruct.sourceCodeSNum){ + g_dataMap.delete(JSON_srcStruct); + deleteVarDataFromSrcStruct(JSON_srcStruct); + } + } + displayStats(); +} + +function deleteDataSNumChildren(in_srcStruct){ + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let srcStruct = JSON.parse(JSON_srcStruct); + if(srcStruct.sourceCodeSNum.endsWith(in_srcStruct.sourceCodeSNum) + && srcStruct.sourceCodeSNum != in_srcStruct.sourceCodeSNum + && srcStruct.sourceType == in_srcStruct.sourceType + && srcStruct.sourceLevel == in_srcStruct.sourceLevel + && srcStruct.sourceCode == in_srcStruct.sourceCode){ + g_dataMap.delete(JSON_srcStruct); + deleteVarDataFromSrcStruct(JSON_srcStruct); + } + } + displayStats(); +} + +function deleteDataBySource(in_source){ + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let srcStruct = JSON.parse(JSON_srcStruct); + if(srcStruct.source == in_source){ + g_dataMap.delete(JSON_srcStruct); + deleteVarDataFromSrcStruct(JSON_srcStruct); + } + } + displayStats(); +} + +function deleteDataBySourceType(in_sourceType){ + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let srcStruct = JSON.parse(JSON_srcStruct); + if(srcStruct.sourceType == in_sourceType){ + g_dataMap.delete(JSON_srcStruct); + deleteVarDataFromSrcStruct(JSON_srcStruct); + } + } + displayStats(); +} + +function deleteDataBySourceAndType(in_source, in_sourceType){ + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let srcStruct = JSON.parse(JSON_srcStruct); + if(srcStruct.source == in_source && srcStruct.sourceType == in_sourceType){ + g_dataMap.delete(JSON_srcStruct); + deleteVarDataFromSrcStruct(JSON_srcStruct); + } + } + displayStats(); +} + +function deleteDataByGreaterThanSourceLevel(in_level){ + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let srcStruct = JSON.parse(JSON_srcStruct); + if(srcStruct.sourceLevel > in_level){ + g_dataMap.delete(JSON_srcStruct); + deleteVarDataFromSrcStruct(JSON_srcStruct); + } + } + displayStats(); +} + +function deleteDataBySourceCode(in_sourceCode){ + for(const [JSON_srcStruct, value] of g_dataMap.entries()){ + let srcStruct = JSON.parse(JSON_srcStruct); + if(srcStruct.sourceCode == in_sourceCode){ + g_dataMap.delete(JSON_srcStruct); + deleteVarDataFromSrcStruct(JSON_srcStruct); + } + } + displayStats(); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/data_mapping/retrieval.js b/client/vue-src/legacy-js/build_planner/data_mapping/retrieval.js new file mode 100644 index 00000000..6c169a65 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/data_mapping/retrieval.js @@ -0,0 +1,75 @@ + +function getProfMap(){ + + let profMap = new Map(); + for(const profData of getDataAllProficiencies()){ + + // Convert lores to be the same + if(profData.To.includes('_LORE')){ + profData.To = capitalizeWords(profData.To.replace('_LORE',' Lore')); + } + + let profMapValue = profMap.get(profData.To); + if(profMapValue != null){ + profMapValue.push(profData); + profMap.set(profData.To, profMapValue); + } else { + profMap.set(profData.To, [profData]); + } + + } + return profMap; + +} + +function getCharClass(){ + let classStruct = cloneObj(g_classMap.get(g_character.classID+'')); + if(classStruct == null){ return null; } + + // Add support for Free Archetype Variant if enabled... + if(gOption_hasFreeArchetype){ + classStruct = addFreeArchetypeVariant(classStruct); + } + + // Add support for Auto Bonus Progression Variant if enabled... + if(gOption_hasAutoBonusProgression){ + classStruct = addAutoBonusProgressionVariant(classStruct); + } + + // Add support for Gradual Ability Boosts Variant if enabled... + if(gOption_hasGradualAbilityBoosts){ + classStruct = addGradualAbilityBoostsVariant(classStruct); + } + + return classStruct; +} +function getCharAncestry(){ + return cloneObj(g_ancestryMap.get(g_character.ancestryID+'')); +} +function getCharHeritage(){ + if(g_character.heritageID != null){ + let ancestry = getCharAncestry(); + if(ancestry != null){ + return cloneObj(ancestry.Heritages.find(heritage => { + return heritage.id == g_character.heritageID; + })); + } else { + return null; + } + } else if(g_character.uniHeritageID != null){ + return cloneObj(g_uniHeritages.find(uniHeritage => { + return uniHeritage.id == g_character.uniHeritageID; + })); + } else { + return null; + } +} +function getCharBackground(){ + if(g_character.backgroundID == null) { return null; } + return cloneObj(g_backgrounds.find(background => { + return background.id == g_character.backgroundID; + })); +} + + + diff --git a/client/vue-src/legacy-js/build_planner/libraries/selector.js b/client/vue-src/legacy-js/build_planner/libraries/selector.js new file mode 100644 index 00000000..5097a4ac --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/libraries/selector.js @@ -0,0 +1,117 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + selectionTitle + optionsArray: [{id, name},{id, name},{id, name}...] + selectedOptionID + selectorID + locationID + srcStruct + selectionTagInfo + extra_description: {id: descriptionID, map: Map(optionID -> description)} + extra_code: {id: codeID, sourceName, map: Map(optionID -> code)} + extra_socket: {socketRequestName, charID, extraSendData} +*/ + +class Selector { + constructor(selectionTitle, optionsArray, selectedOptionID, selectorID, locationID, srcStruct, selectionTagInfo, extra_socket=null, extra_description=null, extra_code=null) { + this.selectionTitle = selectionTitle; + this.optionsArray = optionsArray; + this.selectedOptionID = selectedOptionID; + this.selectorID = selectorID; + this.locationID = locationID; + this.srcStruct = srcStruct; + this.selectionTagInfo = selectionTagInfo; + + this.extra_socket = extra_socket; + this.extra_description = extra_description; + this.extra_code = extra_code; + + $('#'+locationID).append(` +
+
+ +
+
+ `); + if(extra_description != null) { + $('#'+locationID).append(`
`); + } + if(extra_code != null) { + $('#'+locationID).append(`
`); + } + + $('#'+selectorID).append(``); + $('#'+selectorID).append(``); + for(const option of optionsArray){ + if(selectedOptionID != null && selectedOptionID == option.id) { + $('#'+selectorID).append(``); + } else { + $('#'+selectorID).append(``); + } + } + + if(extra_socket != null || extra_description != null || extra_code != null){ + + $('#'+selectorID).change(function() { + + if($(this).val() == "chooseDefault"){ + + $(this).parent().addClass("is-info"); + + setChoice(srcStruct, null); + + if(extra_description != null){ + $('#'+extra_description.id).html(''); + } + + if(extra_code != null){ + $('#'+extra_code.id).html(''); + } + + if(extra_socket != null){ + socket.emit(extra_socket.socketRequestName, + extra_socket.charID, + srcStruct, + null, + extra_socket.extraSendData); + } + + } else { + + $(this).parent().removeClass("is-info"); + + setChoice(srcStruct, $(this).val()); + + if(extra_description != null){ + let description = extra_description.map.get($(this).val()); + $('#'+extra_description.id).html(processText(description, false, null)); + } + + if(extra_code != null){ + let code = extra_code.map.get($(this).val()); + $('#'+extra_code.id).html(''); + processCode(code, srcStruct, extra_code.id, extra_code.sourceName); + } + + if(extra_socket != null){ + socket.emit(extra_socket.socketRequestName, + extra_socket.charID, + srcStruct, + $(this).val(), + extra_socket.extraSendData); + } + + } + + $(this).blur(); + + }); + + } + + + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/main.js b/client/vue-src/legacy-js/build_planner/main.js new file mode 100644 index 00000000..3224d3e6 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/main.js @@ -0,0 +1,1115 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ +"use strict"; + +let socket = io(); + +let isBuilderInit = false; +let g_builder_type = null;// 'by-abc' or 'by-level' +let g_page_num = null; + +let g_creationSectionScroll = null; + +let g_char_id = null; +let g_char_level = null; + +let g_build_id = null; + +$(function () { + + g_builder_type = $('#builder-data').attr('data-builder-type'); + g_page_num = parseInt($('#builder-data').attr('data-page-num')); + + if($('#builder-data').attr('data-char-id') != 'none'){ + + g_char_id = parseInt($('#builder-data').attr('data-char-id')); + g_char_level = parseInt($('#builder-data').attr('data-char-lvl')); + g_build_id = null; + + } else { + + g_char_id = null; + g_char_level = 20; + g_build_id = parseInt($('#builder-data').attr('data-build-id')); + + } + + startDiceLoader(); + $.get(`/mloads/char-builder/?char_id=${g_char_id}&build_id=${g_build_id}`).done(function(data){ + stopDiceLoader(); + g_buildInfo = data.buildInfo; + mainLoaded(data.coreStruct.plannerStruct, data.coreStruct.choiceStruct); + }); + + // Create the container for each level + $(`#creation-section`).html(` +
+ + + + +
+ +
+
+ Initial Stats (Level 1) + + + + +
+ +
+ `); + for(let lvl = 1; lvl <= g_char_level; lvl++){ + $(`#creation-section`).append(` +
+
+ Level ${lvl} + + + + +
+ +
+ `); + } + +}); + + + + +let g_buildInfo = null; + +let g_character = null; + +/* Internal Builder-Char Options */ +let gOption_hasProfWithoutLevel = false; +let gOption_hasVariantAncestryParagon = false; +let gOption_hasFreeArchetype = false; +let gOption_hasAutoBonusProgression = false; +let gOption_hasGradualAbilityBoosts = false; +let gOption_hasClassArchetypes = false; +let gOption_hasAutoDetectPreReqs = false; +/* ~~~~~~~~~~~~~~~~~~~ */ + +/* Internal Sheet-State Options */ +let gState_hasFinesseMeleeUseDexDamage = false; +let gState_armoredStealth = false; +let gState_mightyBulwark = false; +let gState_unburdenedIron = false; +let gState_improvisedWeaponNoPenalty = false; +let gState_addLevelToUntrainedWeaponAttack = false; +let gState_addLevelToUntrainedSkill = false; +let gState_displayCompanionTab = false; +let gState_MAP = 'TIER_1'; +// TIER_1 = (5/10 or 4/8 agile) +// TIER_2 = (4/8 or 3/6 agile) +// TIER_3 = (3/6 or 2/4 agile) +// TIER_4 = (2/4 or 1/2 agile) +/* ~~~~~~~~~~~~~~~~~~~ */ + +let temp_classNum = 1; + +let g_enabledSources = null; + +let g_featMap = null; +let g_itemMap = null; +let g_spellMap = null; +let g_skillMap = null; + +let g_allLanguages = null; +let g_allConditions = null; +let g_allTags = null; +let g_allPhyFeats = null; +let g_allSenses = null; + +let g_classMap = null; +let g_ancestryMap = null; +let g_archetypes = null; +let g_backgrounds = null; +let g_uniHeritages = null; + +let g_domains = null; +let g_classArchetypes = null; + +function mainLoaded(plannerCoreStruct, choiceStruct){ + + console.log('~ LOADING BUILDER ~'); + + // Core Data // + g_featMap = objToMap(plannerCoreStruct.featsObject); + g_itemMap = objToMap(plannerCoreStruct.itemObject); + g_spellMap = objToMap(plannerCoreStruct.spellObject); + g_skillMap = objToMap(plannerCoreStruct.skillObject); + + g_allLanguages = plannerCoreStruct.allLanguages; + g_allConditions = plannerCoreStruct.allConditions; + g_allTags = plannerCoreStruct.allTags; + g_allPhyFeats = plannerCoreStruct.allPhyFeats; + g_allSenses = plannerCoreStruct.allSenses; + + g_classMap = objToMap(plannerCoreStruct.classes); + g_ancestryMap = objToMap(plannerCoreStruct.ancestries); + g_archetypes = plannerCoreStruct.archetypes; + g_backgrounds = plannerCoreStruct.backgrounds; + g_uniHeritages = plannerCoreStruct.uniHeritages; + + g_domains = plannerCoreStruct.allDomains; + g_classArchetypes = plannerCoreStruct.classArchetypes; + g_enabledSources = plannerCoreStruct.sourceBooks; + // // + + g_character = choiceStruct.character; + + // Set g_character.level = g_char_level for the build creator + g_character.level = g_char_level; + + if(g_char_id == null){// If build creator, enable AutoDetectPreReqs + g_character.optionAutoDetectPreReqs = 1; + } + + // Init char meta data + initDataMap(choiceStruct.charMetaData); + + // First expression and variable init + initExpressionProcessor(); + initVariables(); + + // Predetermine Prereq Match + for(const [featID, featStruct] of g_featMap.entries()){ + g_featPrereqMap.set(featID+'', meetsPrereqs(featStruct.Feat)); + } + + // Init Class Archetypes + initClassArchetypes(getDataSingle(DATA_SOURCE.CLASS_ARCHETYPE_CHOICE, { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'classArchetype', + sourceCodeSNum: 'a', + }).value); + + // Bind step buttons + $('.builder-basics-page-btn').click(function(event, initLoad){ + window.location.href = '/profile/characters/builder/basics/?id='+g_char_id; + }); + $('.builder-ancestry-page-btn').click(function(event, initLoad){ + + $('#builder-home-step').addClass('is-completed'); + $('#builder-ancestry-step').removeClass('is-completed'); + $('#builder-background-step').removeClass('is-completed'); + $('#builder-class-step').removeClass('is-completed'); + + $('#builder-ancestry-step').addClass('is-active'); + $('#builder-background-step').removeClass('is-active'); + $('#builder-class-step').removeClass('is-active'); + + $('#builder-ancestry-step').addClass('is-info'); + $('#builder-background-step').removeClass('is-info'); + $('#builder-class-step').removeClass('is-info'); + + $('#builder-ancestry-step-symbol').removeClass('has-text-bck-color'); + $('#builder-background-step-symbol').addClass('has-text-bck-color'); + $('#builder-class-step-symbol').addClass('has-text-bck-color'); + + $('#builder-ancestry-step-symbol').addClass('has-text-info'); + $('#builder-background-step-symbol').removeClass('has-text-info'); + $('#builder-class-step-symbol').removeClass('has-text-info'); + + if(!initLoad){ + startSpinnerSubLoader('planner-subpageloader'); + } + + g_page_num = 2; + window.history.pushState('profile/characters/builder', '', '/profile/characters/builder/?id='+g_char_id+'&page=2');// Update URL + + if(!initLoad){ + setTimeout(() => { + stateLoad(); + stopSpinnerSubLoader('planner-subpageloader'); + }, 50);// After 0.05 second + } + }); + $('.builder-background-page-btn').click(function(event, initLoad){ + + $('#builder-home-step').addClass('is-completed'); + $('#builder-ancestry-step').addClass('is-completed'); + $('#builder-background-step').removeClass('is-completed'); + $('#builder-class-step').removeClass('is-completed'); + + $('#builder-ancestry-step').removeClass('is-active'); + $('#builder-background-step').addClass('is-active'); + $('#builder-class-step').removeClass('is-active'); + + $('#builder-ancestry-step').addClass('is-info'); + $('#builder-background-step').addClass('is-info'); + $('#builder-class-step').removeClass('is-info'); + + $('#builder-ancestry-step-symbol').addClass('has-text-bck-color'); + $('#builder-background-step-symbol').removeClass('has-text-bck-color'); + $('#builder-class-step-symbol').addClass('has-text-bck-color'); + + $('#builder-ancestry-step-symbol').removeClass('has-text-info'); + $('#builder-background-step-symbol').addClass('has-text-info'); + $('#builder-class-step-symbol').removeClass('has-text-info'); + + if(!initLoad){ + startSpinnerSubLoader('planner-subpageloader'); + } + + g_page_num = 3; + window.history.pushState('profile/characters/builder', '', '/profile/characters/builder/?id='+g_char_id+'&page=3');// Update URL + + if(!initLoad){ + setTimeout(() => { + stateLoad(); + stopSpinnerSubLoader('planner-subpageloader'); + }, 50);// After 0.05 second + } + }); + $('.builder-class-page-btn').click(function(event, initLoad){ + + $('#builder-home-step').addClass('is-completed'); + $('#builder-ancestry-step').addClass('is-completed'); + $('#builder-background-step').addClass('is-completed'); + $('#builder-class-step').removeClass('is-completed'); + + $('#builder-ancestry-step').removeClass('is-active'); + $('#builder-background-step').removeClass('is-active'); + $('#builder-class-step').addClass('is-active'); + + $('#builder-ancestry-step').addClass('is-info'); + $('#builder-background-step').addClass('is-info'); + $('#builder-class-step').addClass('is-info'); + + $('#builder-ancestry-step-symbol').addClass('has-text-bck-color'); + $('#builder-background-step-symbol').addClass('has-text-bck-color'); + $('#builder-class-step-symbol').removeClass('has-text-bck-color'); + + $('#builder-ancestry-step-symbol').removeClass('has-text-info'); + $('#builder-background-step-symbol').removeClass('has-text-info'); + $('#builder-class-step-symbol').addClass('has-text-info'); + + if(!initLoad){ + startSpinnerSubLoader('planner-subpageloader'); + } + + g_page_num = 4; + window.history.pushState('profile/characters/builder', '', '/profile/characters/builder/?id='+g_char_id+'&page=4');// Update URL + + if(!initLoad){ + setTimeout(() => { + stateLoad(); + stopSpinnerSubLoader('planner-subpageloader'); + }, 50);// After 0.05 second + } + }); + $('.builder-finalize-page-btn').click(function(event, initLoad){ + if(g_character.name != null && g_character.ancestryID != null && g_character.backgroundID != null && g_character.classID != null){ + window.location.href ='/profile/characters/'+g_char_id; + } else { + let charRequirements = ''; + if(g_character.name == null){ charRequirements += '
Name'; } + if(g_character.ancestryID == null){ charRequirements += '
Ancestry'; } + if(g_character.backgroundID == null){ charRequirements += '
Background'; } + if(g_character.classID == null){ charRequirements += '
Class'; } + new ConfirmMessage('Incomplete Character', 'Your character requires the following before you can view their sheet:'+charRequirements, 'Okay', 'modal-incomplete-character', 'modal-incomplete-character-btn', 'is-info'); + } + }); + + + // ABC Selections // + let ancestrySelections = []; + for(const [ancestryID, ancestryData] of g_ancestryMap.entries()){ + if(ancestryData.Ancestry.isArchived == 1){ continue; } + ancestrySelections.push({ + id: ancestryID, + name: ancestryData.Ancestry.name, + rarity: ancestryData.Ancestry.rarity, + homebrewID: ancestryData.Ancestry.homebrewID + }); + } + ancestrySelections = ancestrySelections.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + ancestrySelections = [{id: 'none', name: 'None', rarity: 'COMMON', homebrewID: null}, ...ancestrySelections]; + + let ancestryModalSelect = function() { + new ModalSelection('Select Ancestry', 'Confirm Ancestry', ancestrySelections, 'ancestry', 'modal-select-ancestry', 'modal-select-ancestry-confirm-btn', g_featMap, g_character); + $('#modal-select-ancestry-confirm-btn').click(function() { + let newAncestryID = $('#modal-select-ancestry-confirm-btn').attr('data-selectedOptionID'); + if(newAncestryID == 'none'){ newAncestryID = null; } + + // Update ancestry in builder + deleteAncestry(); + setAncestry(newAncestryID); + + // Update ancestry in db + if(g_char_id != null){ + socket.emit("requestAncestryChange", + g_char_id, + newAncestryID); + socket.once("returnAncestryChange", function() { + animatedStateLoad(); + }); + } else { + saveBuildInfo(); + animatedStateLoad(); + } + + }); + }; + + let backgroundSelections = []; + for(const background of g_backgrounds){ + if(background.isArchived == 1){ continue; } + backgroundSelections.push({ + id: background.id, + name: background.name, + rarity: background.rarity, + homebrewID: background.homebrewID + }); + } + backgroundSelections = backgroundSelections.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + backgroundSelections = [{id: 'none', name: 'None', rarity: 'COMMON', homebrewID: null}, ...backgroundSelections]; + + let backgroundModalSelect = function() { + new ModalSelection('Select Background', 'Confirm Background', backgroundSelections, 'background', 'modal-select-background', 'modal-select-background-confirm-btn', g_featMap, g_character); + $('#modal-select-background-confirm-btn').click(function() { + let newBackgroundID = $('#modal-select-background-confirm-btn').attr('data-selectedOptionID'); + if(newBackgroundID == 'none'){ newBackgroundID = null; } + + // Update background in builder + deleteBackground(); + setBackground(newBackgroundID); + + // Update background in db + if(g_char_id != null){ + socket.emit("requestBackgroundChange", + g_char_id, + newBackgroundID); + socket.once("returnBackgroundChange", function() { + animatedStateLoad(); + }); + } else { + saveBuildInfo(); + animatedStateLoad(); + } + + }); + }; + + let classSelections = []; + for(const [classID, classData] of g_classMap.entries()){ + if(classData.Class.isArchived == 1){ continue; } + classSelections.push({ + id: classID, + name: classData.Class.name, + rarity: classData.Class.rarity, + homebrewID: classData.Class.homebrewID + }); + } + classSelections = classSelections.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + classSelections = [{id: 'none', name: 'None', rarity: 'COMMON', homebrewID: null}, ...classSelections]; + + let classModalSelect = function() { + new ModalSelection('Select Class', 'Confirm Class', classSelections, 'class', 'modal-select-class', 'modal-select-class-confirm-btn', g_featMap, g_character); + $('#modal-select-class-confirm-btn').click(function() { + let newClassID = $('#modal-select-class-confirm-btn').attr('data-selectedOptionID'); + if(newClassID == 'none'){ newClassID = null; } + + // Update class in builder + deleteClass(); + setClass(newClassID); + + // Update class in db + if(g_char_id != null){ + socket.emit("requestClassChange", + g_char_id, + newClassID, + 1); + socket.once("returnClassChange", function() { + animatedStateLoad(); + }); + } else { + saveBuildInfo(); + animatedStateLoad(); + } + + }); + }; + + // Selector for changing ABCs + if(g_builder_type == 'by-level'){ + + $('#selected-ancestry').click(function() { + ancestryModalSelect(); + }); + $('#selected-background').click(function() { + backgroundModalSelect(); + }); + $('#selected-class').click(function() { + classModalSelect(); + }); + + } else if(g_builder_type == 'by-abc'){ + + $('#selected-abc').click(function() { + if(g_page_num == 2){ + ancestryModalSelect(); + } else if(g_page_num == 3){ + backgroundModalSelect(); + } else if(g_page_num == 4){ + classModalSelect(); + } + }); + + } + + // Set Builder State, don't load from it + if(g_page_num == 2){ + $('.builder-ancestry-page-btn').trigger('click', [true]); + } else if(g_page_num == 3){ + $('.builder-background-page-btn').trigger('click', [true]); + } else if(g_page_num == 4){ + $('.builder-class-page-btn').trigger('click', [true]); + } + + // Load State by calling + stateLoad(true); + + isBuilderInit = true; + +} + +function stateLoad(isInitLoad=false){ + + g_creationSectionScroll = $('#creation-section').scrollTop(); + + // Clear each level container + for(let lvl = 1; lvl <= g_char_level; lvl++){ + $(`#level-${lvl}-body`).html(''); + } + + gOption_hasProfWithoutLevel = (g_character.variantProfWithoutLevel === 1); + gOption_hasVariantAncestryParagon = (g_character.variantAncestryParagon === 1); + gOption_hasFreeArchetype = (g_character.variantFreeArchetype === 1); + gOption_hasAutoBonusProgression = (g_character.variantAutoBonusProgression === 1); + gOption_hasGradualAbilityBoosts = (g_character.variantGradualAbilityBoosts === 1); + gOption_hasClassArchetypes = (g_character.optionClassArchetypes === 1); + gOption_hasAutoDetectPreReqs = (g_character.optionAutoDetectPreReqs === 1); + + initExpressionProcessor(); + initVariables(); + + // Process Modules // + processAncestry(); + processBackground(); + processClass(); + + processCustomCode(); + + // Process Extra Ancestry Langs and Class Skill Trainings + processExtraSkillsAndLangs(); + + // Display Results // + displayStats(); + + // If level body is empty, hide accord + if(g_builder_type == 'by-level'){ + for(let lvl = 1; lvl <= g_char_level; lvl++){ + if($(`#level-${lvl}-body`).html() == ''){ + $(`#level-${lvl}-body`).parent().addClass('is-hidden'); + } else { + $(`#level-${lvl}-body`).parent().removeClass('is-hidden'); + } + } + } else if(g_builder_type == 'by-abc'){ + for(let lvl = 1; lvl <= g_char_level; lvl++){ + if(g_page_num == 2){ + if($(`#level-${lvl}-body`).find('.ancestry-feature-section').length > 0){ + $(`#level-${lvl}-body`).parent().removeClass('is-hidden'); + } else { + $(`#level-${lvl}-body`).parent().addClass('is-hidden'); + } + } else if(g_page_num == 3){ + if($(`#level-${lvl}-body`).find('.background-feature-section').length > 0){ + $(`#level-${lvl}-body`).parent().removeClass('is-hidden'); + } else { + $(`#level-${lvl}-body`).parent().addClass('is-hidden'); + } + } else if(g_page_num == 4){ + if($(`#level-${lvl}-body`).find('.class-feature-section').length > 0){ + $(`#level-${lvl}-body`).parent().removeClass('is-hidden'); + } else { + $(`#level-${lvl}-body`).parent().addClass('is-hidden'); + } + } + } + } + + // Set name of current ancestry / background / class in selector + if(g_builder_type == 'by-level'){ + if(getCharAncestry() != null){ + $('#selected-ancestry').text(getCharAncestry().Ancestry.name); + } else { + $('#selected-ancestry').text('None'); + } + if(getCharBackground() != null){ + $('#selected-background').text(getCharBackground().name); + } else { + $('#selected-background').text('None'); + } + if(getCharClass() != null){ + $('#selected-class').text(getCharClass().Class.name); + } else { + $('#selected-class').text('None'); + } + } else if(g_builder_type == 'by-abc'){ + if(g_page_num == 2){ + $('#selected-abc-title').text('Ancestry'); + if(getCharAncestry() != null){ + $('#selected-abc').text(getCharAncestry().Ancestry.name); + } else { + $('#selected-abc').text('None'); + } + } else if(g_page_num == 3){ + $('#selected-abc-title').text('Background'); + if(getCharBackground() != null){ + $('#selected-abc').text(getCharBackground().name); + } else { + $('#selected-abc').text('None'); + } + } else if(g_page_num == 4){ + $('#selected-abc-title').text('Class'); + if(getCharClass() != null){ + $('#selected-abc').text(getCharClass().Class.name); + } else { + $('#selected-abc').text('None'); + } + } + } + + // If ancestry, background, and/or class is none, hide init stats + if(g_builder_type == 'by-level'){ + if(getCharAncestry() == null && getCharBackground() == null && getCharClass() == null){ + $('#accord-container-init-stats').addClass('is-hidden'); + $('#creation-select-msg-by-level').removeClass('is-hidden'); + } else { + $('#accord-container-init-stats').removeClass('is-hidden'); + $('#creation-select-msg-by-level').addClass('is-hidden'); + } + } else if(g_builder_type == 'by-abc'){ + $('#creation-select-msg-by-abc-a').addClass('is-hidden'); + $('#creation-select-msg-by-abc-b').addClass('is-hidden'); + $('#creation-select-msg-by-abc-c').addClass('is-hidden'); + if(g_page_num == 2){ + if(getCharAncestry() == null){ + $('#accord-container-init-stats').addClass('is-hidden'); + $('#creation-select-msg-by-abc-a').removeClass('is-hidden'); + } else { + $('#accord-container-init-stats').removeClass('is-hidden'); + } + } else if(g_page_num == 3){ + if(getCharBackground() == null){ + $('#accord-container-init-stats').addClass('is-hidden'); + $('#creation-select-msg-by-abc-b').removeClass('is-hidden'); + } else { + $('#accord-container-init-stats').removeClass('is-hidden'); + } + } else if(g_page_num == 4){ + if(getCharClass() == null){ + $('#accord-container-init-stats').addClass('is-hidden'); + $('#creation-select-msg-by-abc-c').removeClass('is-hidden'); + } else { + $('#accord-container-init-stats').removeClass('is-hidden'); + } + } + } + + // If is in abc, hide other sections + if(g_builder_type == 'by-abc'){ + if(g_page_num == 2){ + $('.ancestry-feature-section').removeClass('is-hidden'); + $('.background-feature-section').addClass('is-hidden'); + $('.class-feature-section').addClass('is-hidden'); + + $('.background-feature-section').find('li').removeClass("active"); + + } else if(g_page_num == 3){ + $('.ancestry-feature-section').addClass('is-hidden'); + $('.background-feature-section').removeClass('is-hidden'); + $('.class-feature-section').addClass('is-hidden'); + } else if(g_page_num == 4){ + $('.ancestry-feature-section').addClass('is-hidden'); + $('.background-feature-section').addClass('is-hidden'); + $('.class-feature-section').removeClass('is-hidden'); + } + } + + if(isInitLoad){ + if(g_char_id == null){// If build creator, open first accord + $('#accord-container-init-stats').find('.accord-header').trigger('click'); + } else {// Else, open last + // Open Level's Accordion // + $(`#level-${g_char_level}-body`).parent().find('.accord-header').trigger('click'); + // Scroll down to Accordion + $(`#level-${g_char_level}-body`).parent()[0].scrollIntoView(); + } + } else { + // If is reload, scroll back to previous location + $('#creation-section').scrollTop(g_creationSectionScroll); + } + +} + +function displayStats(){ + + // Scores + $('#str-score').text(variables_getTotal(VARIABLE.SCORE_STR)); + $('#dex-score').text(variables_getTotal(VARIABLE.SCORE_DEX)); + $('#con-score').text(variables_getTotal(VARIABLE.SCORE_CON)); + $('#int-score').text(variables_getTotal(VARIABLE.SCORE_INT)); + $('#wis-score').text(variables_getTotal(VARIABLE.SCORE_WIS)); + $('#cha-score').text(variables_getTotal(VARIABLE.SCORE_CHA)); + + // Hit Points + let maxHealth = variables_getTotal(VARIABLE.MAX_HEALTH); + let maxHealthPerLevel = 0; + if(getCharClass() != null){ + maxHealthPerLevel = (getCharClass().Class.hitPoints+getMod(variables_getTotal(VARIABLE.SCORE_CON))+variables_getTotal(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL))*g_character.level; + } + $('#hit-points-total').text(maxHealth+maxHealthPerLevel); + + // Class DC + $('#class-dc-total').html((variables_hasConditionals(VARIABLE.CLASS_DC)) ? variables_getTotal(VARIABLE.CLASS_DC)+10+'*' : variables_getTotal(VARIABLE.CLASS_DC)+10); + $('#class-dc-rank').text(variables_getFinalRank(VARIABLE.CLASS_DC)); + + // Perception + $('#perception-total').html((variables_hasConditionals(VARIABLE.PERCEPTION)) ? signNumber(variables_getTotal(VARIABLE.PERCEPTION))+'*' : signNumber(variables_getTotal(VARIABLE.PERCEPTION))); + $('#perception-rank').text(variables_getFinalRank(VARIABLE.PERCEPTION)); + + // Saves + let saves = [ + { + Value1: 'Fortitude', + Value2: (variables_hasConditionals(VARIABLE.SAVE_FORT)) ? signNumber(variables_getTotal(VARIABLE.SAVE_FORT))+'*' : signNumber(variables_getTotal(VARIABLE.SAVE_FORT)), + Value3: variables_getFinalRank(VARIABLE.SAVE_FORT), + VarName: VARIABLE.SAVE_FORT, + }, + { + Value1: 'Reflex', + Value2: (variables_hasConditionals(VARIABLE.SAVE_REFLEX)) ? signNumber(variables_getTotal(VARIABLE.SAVE_REFLEX))+'*' : signNumber(variables_getTotal(VARIABLE.SAVE_REFLEX)), + Value3: variables_getFinalRank(VARIABLE.SAVE_REFLEX), + VarName: VARIABLE.SAVE_REFLEX, + }, + { + Value1: 'Will', + Value2: (variables_hasConditionals(VARIABLE.SAVE_WILL)) ? signNumber(variables_getTotal(VARIABLE.SAVE_WILL))+'*' : signNumber(variables_getTotal(VARIABLE.SAVE_WILL)), + Value3: variables_getFinalRank(VARIABLE.SAVE_WILL), + VarName: VARIABLE.SAVE_WILL, + }, + ]; + populateAccord('saves-body', saves); + + // Skills + let skills = [ + { + Value1: 'Acrobatics', + Value2: (variables_hasConditionals(VARIABLE.SKILL_ACROBATICS)) ? signNumber(variables_getTotal(VARIABLE.SKILL_ACROBATICS))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_ACROBATICS)), + Value3: variables_getFinalRank(VARIABLE.SKILL_ACROBATICS), + VarName: VARIABLE.SKILL_ACROBATICS, + }, + { + Value1: 'Arcana', + Value2: (variables_hasConditionals(VARIABLE.SKILL_ARCANA)) ? signNumber(variables_getTotal(VARIABLE.SKILL_ARCANA))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_ARCANA)), + Value3: variables_getFinalRank(VARIABLE.SKILL_ARCANA), + VarName: VARIABLE.SKILL_ARCANA, + }, + { + Value1: 'Athletics', + Value2: (variables_hasConditionals(VARIABLE.SKILL_ATHLETICS)) ? signNumber(variables_getTotal(VARIABLE.SKILL_ATHLETICS))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_ATHLETICS)), + Value3: variables_getFinalRank(VARIABLE.SKILL_ATHLETICS), + VarName: VARIABLE.SKILL_ATHLETICS, + }, + { + Value1: 'Crafting', + Value2: (variables_hasConditionals(VARIABLE.SKILL_CRAFTING)) ? signNumber(variables_getTotal(VARIABLE.SKILL_CRAFTING))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_CRAFTING)), + Value3: variables_getFinalRank(VARIABLE.SKILL_CRAFTING), + VarName: VARIABLE.SKILL_CRAFTING, + }, + { + Value1: 'Deception', + Value2: (variables_hasConditionals(VARIABLE.SKILL_DECEPTION)) ? signNumber(variables_getTotal(VARIABLE.SKILL_DECEPTION))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_DECEPTION)), + Value3: variables_getFinalRank(VARIABLE.SKILL_DECEPTION), + VarName: VARIABLE.SKILL_DECEPTION, + }, + { + Value1: 'Diplomacy', + Value2: (variables_hasConditionals(VARIABLE.SKILL_DIPLOMACY)) ? signNumber(variables_getTotal(VARIABLE.SKILL_DIPLOMACY))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_DIPLOMACY)), + Value3: variables_getFinalRank(VARIABLE.SKILL_DIPLOMACY), + VarName: VARIABLE.SKILL_DIPLOMACY, + }, + { + Value1: 'Intimidation', + Value2: (variables_hasConditionals(VARIABLE.SKILL_INTIMIDATION)) ? signNumber(variables_getTotal(VARIABLE.SKILL_INTIMIDATION))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_INTIMIDATION)), + Value3: variables_getFinalRank(VARIABLE.SKILL_INTIMIDATION), + VarName: VARIABLE.SKILL_INTIMIDATION, + }, + { + Value1: 'Medicine', + Value2: (variables_hasConditionals(VARIABLE.SKILL_MEDICINE)) ? signNumber(variables_getTotal(VARIABLE.SKILL_MEDICINE))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_MEDICINE)), + Value3: variables_getFinalRank(VARIABLE.SKILL_MEDICINE), + VarName: VARIABLE.SKILL_MEDICINE, + }, + { + Value1: 'Nature', + Value2: (variables_hasConditionals(VARIABLE.SKILL_NATURE)) ? signNumber(variables_getTotal(VARIABLE.SKILL_NATURE))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_NATURE)), + Value3: variables_getFinalRank(VARIABLE.SKILL_NATURE), + VarName: VARIABLE.SKILL_NATURE, + }, + { + Value1: 'Occultism', + Value2: (variables_hasConditionals(VARIABLE.SKILL_OCCULTISM)) ? signNumber(variables_getTotal(VARIABLE.SKILL_OCCULTISM))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_OCCULTISM)), + Value3: variables_getFinalRank(VARIABLE.SKILL_OCCULTISM), + VarName: VARIABLE.SKILL_OCCULTISM, + }, + { + Value1: 'Performance', + Value2: (variables_hasConditionals(VARIABLE.SKILL_PERFORMANCE)) ? signNumber(variables_getTotal(VARIABLE.SKILL_PERFORMANCE))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_PERFORMANCE)), + Value3: variables_getFinalRank(VARIABLE.SKILL_PERFORMANCE), + VarName: VARIABLE.SKILL_PERFORMANCE, + }, + { + Value1: 'Religion', + Value2: (variables_hasConditionals(VARIABLE.SKILL_RELIGION)) ? signNumber(variables_getTotal(VARIABLE.SKILL_RELIGION))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_RELIGION)), + Value3: variables_getFinalRank(VARIABLE.SKILL_RELIGION), + VarName: VARIABLE.SKILL_RELIGION, + }, + { + Value1: 'Society', + Value2: (variables_hasConditionals(VARIABLE.SKILL_SOCIETY)) ? signNumber(variables_getTotal(VARIABLE.SKILL_SOCIETY))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_SOCIETY)), + Value3: variables_getFinalRank(VARIABLE.SKILL_SOCIETY), + VarName: VARIABLE.SKILL_SOCIETY, + }, + { + Value1: 'Stealth', + Value2: (variables_hasConditionals(VARIABLE.SKILL_STEALTH)) ? signNumber(variables_getTotal(VARIABLE.SKILL_STEALTH))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_STEALTH)), + Value3: variables_getFinalRank(VARIABLE.SKILL_STEALTH), + VarName: VARIABLE.SKILL_STEALTH, + }, + { + Value1: 'Survival', + Value2: (variables_hasConditionals(VARIABLE.SKILL_SURVIVAL)) ? signNumber(variables_getTotal(VARIABLE.SKILL_SURVIVAL))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_SURVIVAL)), + Value3: variables_getFinalRank(VARIABLE.SKILL_SURVIVAL), + VarName: VARIABLE.SKILL_SURVIVAL, + }, + { + Value1: 'Thievery', + Value2: (variables_hasConditionals(VARIABLE.SKILL_THIEVERY)) ? signNumber(variables_getTotal(VARIABLE.SKILL_THIEVERY))+'*' : signNumber(variables_getTotal(VARIABLE.SKILL_THIEVERY)), + Value3: variables_getFinalRank(VARIABLE.SKILL_THIEVERY), + VarName: VARIABLE.SKILL_THIEVERY, + }, + ]; + + const sortedLoreDataArray = getDataAll(DATA_SOURCE.LORE).sort( + function(a, b) { + return a.value > b.value ? 1 : -1; + } + ); + for(const loreData of sortedLoreDataArray){ + let loreTotal = signNumber(variables_getTotal(`SKILL_${profConversion_convertOldName(loreData.value)}_LORE`)); + if(variables_hasConditionals(`SKILL_${profConversion_convertOldName(loreData.value)}_LORE`)){ + loreTotal += '*'; + } + skills.push({ + Value1: capitalizeWords(loreData.value)+' Lore', + Value2: loreTotal, + Value3: variables_getFinalRank(`SKILL_${profConversion_convertOldName(loreData.value)}_LORE`), + VarName: `SKILL_${profConversion_convertOldName(loreData.value)}_LORE`, + }); + } + populateAccord('skills-body', skills); + + // Attacks + let attacks = [ + { + Value1: 'Simple Weapons', + Value2: variables_getFinalRank(VARIABLE.SIMPLE_WEAPONS), + VarName: VARIABLE.SIMPLE_WEAPONS, + }, + { + Value1: 'Martial Weapons', + Value2: variables_getFinalRank(VARIABLE.MARTIAL_WEAPONS), + VarName: VARIABLE.MARTIAL_WEAPONS, + }, + { + Value1: 'Advanced Weapons', + Value2: variables_getFinalRank(VARIABLE.ADVANCED_WEAPONS), + VarName: VARIABLE.ADVANCED_WEAPONS, + }, + { + Value1: 'Unarmed Attacks', + Value2: variables_getFinalRank(VARIABLE.UNARMED_ATTACKS), + VarName: VARIABLE.UNARMED_ATTACKS, + }, + ]; + populateAccord('attacks-body', attacks); + + // Armor + let defenses = [ + { + Value1: 'Light Armor', + Value2: variables_getFinalRank(VARIABLE.LIGHT_ARMOR), + VarName: VARIABLE.LIGHT_ARMOR, + }, + { + Value1: 'Medium Armor', + Value2: variables_getFinalRank(VARIABLE.MEDIUM_ARMOR), + VarName: VARIABLE.MEDIUM_ARMOR, + }, + { + Value1: 'Heavy Armor', + Value2: variables_getFinalRank(VARIABLE.HEAVY_ARMOR), + VarName: VARIABLE.HEAVY_ARMOR, + }, + { + Value1: 'Unarmored Defense', + Value2: variables_getFinalRank(VARIABLE.UNARMORED_DEFENSE), + VarName: VARIABLE.UNARMORED_DEFENSE, + }, + ]; + populateAccord('defenses-body', defenses); + + // Spellcasting + let spellcasting = []; + const arcaneSpellAttacksRank = variables_getFinalRank(VARIABLE.ARCANE_SPELL_ATTACK); + if(arcaneSpellAttacksRank != 'U'){ + spellcasting.push({ + Value1: 'Arcane Spell Attacks', + Value2: arcaneSpellAttacksRank, + VarName: VARIABLE.ARCANE_SPELL_ATTACK, + }); + } + const arcaneSpellDCsRank = variables_getFinalRank(VARIABLE.ARCANE_SPELL_DC); + if(arcaneSpellDCsRank != 'U'){ + spellcasting.push({ + Value1: 'Arcane Spell DCs', + Value2: arcaneSpellDCsRank, + VarName: VARIABLE.ARCANE_SPELL_DC, + }); + } + + const divineSpellAttacksRank = variables_getFinalRank(VARIABLE.DIVINE_SPELL_ATTACK); + if(divineSpellAttacksRank != 'U'){ + spellcasting.push({ + Value1: 'Divine Spell Attacks', + Value2: divineSpellAttacksRank, + VarName: VARIABLE.DIVINE_SPELL_ATTACK, + }); + } + const divineSpellDCsRank = variables_getFinalRank(VARIABLE.DIVINE_SPELL_DC); + if(divineSpellDCsRank != 'U'){ + spellcasting.push({ + Value1: 'Divine Spell DCs', + Value2: divineSpellDCsRank, + VarName: VARIABLE.DIVINE_SPELL_DC, + }); + } + + const occultSpellAttacksRank = variables_getFinalRank(VARIABLE.OCCULT_SPELL_ATTACK); + if(occultSpellAttacksRank != 'U'){ + spellcasting.push({ + Value1: 'Occult Spell Attacks', + Value2: occultSpellAttacksRank, + VarName: VARIABLE.OCCULT_SPELL_ATTACK, + }); + } + const occultSpellDCsRank = variables_getFinalRank(VARIABLE.OCCULT_SPELL_DC); + if(occultSpellDCsRank != 'U'){ + spellcasting.push({ + Value1: 'Occult Spell DCs', + Value2: occultSpellDCsRank, + VarName: VARIABLE.OCCULT_SPELL_DC, + }); + } + + const primalSpellAttacksRank = variables_getFinalRank(VARIABLE.PRIMAL_SPELL_ATTACK); + if(primalSpellAttacksRank != 'U'){ + spellcasting.push({ + Value1: 'Primal Spell Attacks', + Value2: primalSpellAttacksRank, + VarName: VARIABLE.PRIMAL_SPELL_ATTACK, + }); + } + const primalSpellDCsRank = variables_getFinalRank(VARIABLE.PRIMAL_SPELL_DC); + if(primalSpellDCsRank != 'U'){ + spellcasting.push({ + Value1: 'Primal Spell DCs', + Value2: primalSpellDCsRank, + VarName: VARIABLE.PRIMAL_SPELL_DC, + }); + } + populateAccord('spellcasting-body', spellcasting); + + // Languages + let sortedLangsArray = []; + for(const [key, data] of variables_getExtrasMap(VARIABLE.LANGUAGES).entries()){ + let lang = g_allLanguages.find(lang => { + return lang.id == data.Value; + }); + if(lang != null){ + sortedLangsArray.push(lang); + } + } + sortedLangsArray = sortedLangsArray.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + let languages = []; + for(let lang of sortedLangsArray){ + languages.push({ + Value1: lang.name, + Value2: '', + CustomQuickview: {name: 'languageView', data: {Language: lang}}, + }); + } + populateAccord('languages-body', languages); + + let resistWeaks = []; + + // Process Resists into array that can be passed into processResistsOrWeaksToMap() + const resistsArray = []; + for(const [key, data] of variables_getExtrasMap(VARIABLE.RESISTANCES).entries()){ + let dParts = data.Value.split(getSeparator()); + resistsArray.push({ Type: dParts[0], Amount: dParts[1] }); + } + const resistsMap = processResistsOrWeaksToMap(resistsArray, g_character.level); + + for(const [type, amount] of resistsMap.entries()){ + resistWeaks.push({ + Value1: type+' '+amount, + Value2: 'Resist.', + }); + } + + // Process Weaks into array that can be passed into processResistsOrWeaksToMap() + const weaksArray = []; + for(const [key, data] of variables_getExtrasMap(VARIABLE.WEAKNESSES).entries()){ + let dParts = data.Value.split(getSeparator()); + weaksArray.push({ Type: dParts[0], Amount: dParts[1] }); + } + const weaksMap = processResistsOrWeaksToMap(weaksArray, g_character.level); + + for(const [type, amount] of weaksMap.entries()){ + resistWeaks.push({ + Value1: type+' '+amount, + Value2: 'Weak.', + }); + } + populateAccord('resist-weaks-body', resistWeaks); + +} + + +function getAllAbilityTypes() { + return ['Strength','Dexterity','Constitution','Intelligence','Wisdom','Charisma']; +} + +function finishLoadingPage(){ + displayStats(); +} + +function animatedStateLoad() { + startSpinnerSubLoader('planner-subpageloader'); + setTimeout(() => { + stateLoad(); + stopSpinnerSubLoader('planner-subpageloader'); + }, 50);// After 0.05 second +} + +function hasDuplicateFeat(featID){ + for(const feat of getDataAll(DATA_SOURCE.FEAT_CHOICE)){ + if(feat.value != null && feat.value == featID) { + return true; + } + } + return false; +} + +function hasDuplicateSelected(selectOptions) { + let optionValArray = []; + $(selectOptions).each(function() { + if($(this).val() != "chooseDefault"){ + optionValArray.push($(this).val()); + } + }); + return (new Set(optionValArray)).size !== optionValArray.length; +} + +function getSkillNameAbbrev(skillName){ + skillName = skillName.toUpperCase(); + switch(skillName) { + case 'ACROBATICS': return 'Acro.'; + case 'ARCANA': return 'Arcana'; + case 'ATHLETICS': return 'Athletics'; + case 'CRAFTING': return 'Crafting'; + case 'DECEPTION': return 'Deception'; + case 'DIPLOMACY': return 'Diplomacy'; + case 'INTIMIDATION': return 'Intim.'; + case 'LORE': return 'Lore'; + case 'MEDICINE': return 'Medicine'; + case 'NATURE': return 'Nature'; + case 'OCCULTISM': return 'Occultism'; + case 'PERFORMANCE': return 'Perform.'; + case 'RELIGION': return 'Religion'; + case 'SOCIETY': return 'Society'; + case 'STEALTH': return 'Stealth'; + case 'SURVIVAL': return 'Survival'; + case 'THIEVERY': return 'Thievery'; + default: return ''; + } +} + +function getSkillIDToName(skillID){ + switch(skillID) { // Hardcoded - Skill IDs + case 1: return 'Acrobatics'; + case 3: return 'Arcana'; + case 4: return 'Athletics'; + case 5: return 'Crafting'; + case 6: return 'Deception'; + case 7: return 'Diplomacy'; + case 8: return 'Intimidation'; + case 9: return 'Lore'; + case 10: return 'Medicine'; + case 11: return 'Nature'; + case 12: return 'Occultism'; + case 14: return 'Performance'; + case 15: return 'Religion'; + case 16: return 'Society'; + case 17: return 'Stealth'; + case 18: return 'Survival'; + case 19: return 'Thievery'; + default: return 'Unknown'; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/modules/process-ancestry.js b/client/vue-src/legacy-js/build_planner/modules/process-ancestry.js new file mode 100644 index 00000000..4bea99c2 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/modules/process-ancestry.js @@ -0,0 +1,487 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +const ancestryTrait_srcStruct = { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'defaultTag', + sourceCodeSNum: 'a', +}; + +function processAncestry() { + + const charAncestry = getCharAncestry(); + $(`#initial-stats-ancestry`).html(''); + if(charAncestry != null){ + + // Process initial ancestry stats // + $(`#initial-stats-ancestry`).html(` + +
+
+
+

Ancestry

+
+
+ +
+
+

Boosts

+

+
+
+

Flaws

+

+
+
+
+
+

Hit Points

+

+
+
+

Size

+

+
+
+
+
+

Speed

+

+
+
+

Languages

+

+
+
+
+
+

Senses

+

+
+
+

Extra Features

+

+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + `); + processAncestryStats(charAncestry, { + + boosts: { + displayID: 'ancestry-initial-stats-display-boosts', + codeID: 'ancestry-initial-stats-code-boosts', + }, + flaws: { + displayID: 'ancestry-initial-stats-display-flaws', + codeID: 'ancestry-initial-stats-code-flaws', + }, + + hitPoints: { + displayID: 'ancestry-initial-stats-display-hitPoints', + codeID: 'ancestry-initial-stats-code-hitPoints', + }, + size: { + displayID: 'ancestry-initial-stats-display-size', + codeID: 'ancestry-initial-stats-code-size', + }, + speed: { + displayID: 'ancestry-initial-stats-display-speed', + codeID: 'ancestry-initial-stats-code-speed', + }, + + languages: { + displayID: 'ancestry-initial-stats-display-languages', + codeID: 'ancestry-initial-stats-code-languages', + }, + senses: { + displayID: 'ancestry-initial-stats-display-senses', + codeID: 'ancestry-initial-stats-code-senses', + }, + physicalFeatures: { + displayID: 'ancestry-initial-stats-display-physicalFeatures', + codeID: 'ancestry-initial-stats-code-physicalFeatures', + }, + + }, PROCESS_ANCESTRY_STATS_TYPE.BOTH); + + // Make sure there is the ancestry's trait (important for creating from build) + setData(DATA_SOURCE.CHAR_TRAIT, ancestryTrait_srcStruct, charAncestry.Ancestry.name); + + // Ancestry Heritage + $(`#level-1-body`).append(` + +
+
+
+

Heritage

+
+ ${processText('You select a heritage at 1st level to reflect abilities passed down to you from your ancestors or common among those of your ancestry in the environment where you were born or grew up.', false, null)} +
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+ + `); + + processAncestry_displayHeritageSelectOptions(charAncestry, getCharHeritage(), false); + + // Heritage Selection // + $('#ancestry-feature-selector-heritage').change(function(event, triggerSave) { + $('#ancestry-feature-selector-artwork-heritage').attr('src', ''); + + let heritageID = $(this).val(); + + if(heritageID != "chooseDefault"){ + $('#ancestry-feature-selector-result-heritage').removeClass("is-hidden"); + $(this).parent().removeClass("is-info"); + + // Save heritage + let isUniversal = processAncestry_isUniversalHeritage(); + if(triggerSave == null || triggerSave) { + + if(isUniversal){ + g_character.uniHeritageID = heritageID; + } else { + g_character.heritageID = heritageID; + } + + if(g_char_id != null){ + socket.emit("requestHeritageChange", + g_char_id, + heritageID, + isUniversal); + } else { + saveBuildInfo(); + } + + deleteDataBySourceCode('heritage'); + + } + + processAncestry_displayCurrentHeritage(charAncestry, heritageID, isUniversal); + + } else { + $('#ancestry-feature-selector-result-heritage').addClass("is-hidden"); + $(this).parent().addClass("is-info"); + + $('#ancestry-feature-selector-code-heritage').html(''); + + let isUniversal = processAncestry_isUniversalHeritage(); + if(triggerSave == null || triggerSave) { + + g_character.heritageID = null; + g_character.uniHeritageID = null; + + if(g_char_id != null){ + socket.emit("requestHeritageChange", + g_char_id, + null, + isUniversal); + } else { + saveBuildInfo(); + } + + deleteDataBySourceCode('heritage'); + + // Update ancestry feats + processAncestry_reprocessAncestryFeats(); + + } + + } + + }); + + $('.heritageTab').unbind(); + $('.heritageTab').click(function(event, autoPageLoad){ + if($(this).parent().hasClass('is-active')) { return; } + $(this).parent().parent().find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + + // Triggersave, which will reselect heritage again, only if autoPageLoad is false or null + const triggersave = (!autoPageLoad || autoPageLoad == null); + processAncestry_displayHeritageSelectOptions(charAncestry, getCharHeritage(), triggersave); + }); + + if(getCharHeritage() != null){ + if(getCharHeritage().tagID != null){ + $('#universalHeritageTab').trigger("click", [true]); + } else { + $('#ancestryHeritageTab').trigger("click", [true]); + } + } else { + $('#ancestryHeritageTab').trigger("click", [true]); + } + + + // Ancestry Feat Progression // + const ancestryProgression = (gOption_hasVariantAncestryParagon) ? ['1', '1-2', '3', '5', '7', '9', '11', '13', '15', '17', '19'] : ['1', '5', '9', '13', '17']; + + let ancestryFeatCount = 0; + for(const ancestryFeatLevelID of ancestryProgression){ + let featLevel = (ancestryFeatLevelID == '1-2') ? '1' : ancestryFeatLevelID; + + $(`#level-${featLevel}-body`).append(` + +
+
+
+

Ancestry Feat

+
+ ${processText('You gain an ancestry feat.', false, null)} +
+
+ +
+ +
+
+
+
+ + `); + + // Run code + processCode( + 'GIVE-ANCESTRY-FEAT='+featLevel, + { + sourceType: 'ancestry', + sourceLevel: featLevel, + sourceCode: 'ancestryFeat-'+ancestryFeatCount, + sourceCodeSNum: 'a' + }, + 'ancestry-feature-code-'+ancestryFeatLevelID, + {source: 'Ancestry Feat', sourceName: 'Ancestry Feat (Lvl '+featLevel+')'}); + + ancestryFeatCount++; + + } + + } + +} + +function processAncestry_reprocessAncestryFeats(){ + + const ancestryProgression = (gOption_hasVariantAncestryParagon) ? ['1', '1-2', '3', '5', '7', '9', '11', '13', '15', '17', '19'] : ['1', '5', '9', '13', '17']; + + let ancestryFeatCount = 0; + for(const ancestryFeatLevelID of ancestryProgression){ + let featLevel = (ancestryFeatLevelID == '1-2') ? '1' : ancestryFeatLevelID; + + $('#ancestry-feature-code-'+ancestryFeatLevelID).html(''); + + // Run code + processCode( + 'GIVE-ANCESTRY-FEAT='+featLevel, + { + sourceType: 'ancestry', + sourceLevel: featLevel, + sourceCode: 'ancestryFeat-'+ancestryFeatCount, + sourceCodeSNum: 'a' + }, + 'ancestry-feature-code-'+ancestryFeatLevelID, + {source: 'Ancestry Feat', sourceName: 'Ancestry Feat (Lvl '+featLevel+')'}); + + ancestryFeatCount++; + + } + +} + +function processAncestry_displayHeritageSelectOptions(charAncestry, charHeritage, triggerSave){ + + let selectHeritage = $('#ancestry-feature-selector-heritage'); + selectHeritage.html(''); + + selectHeritage.append(''); + selectHeritage.append(''); + + if(processAncestry_isUniversalHeritage()){ + for(const uniHeritage of g_uniHeritages){ + if(charHeritage != null && charHeritage.tagID != null && charHeritage.id == uniHeritage.id) { + selectHeritage.append(''); + } else { + selectHeritage.append(''); + } + } + } else { + if(charAncestry != null){ + for(const heritage of charAncestry.Heritages){ + if(charHeritage != null && charHeritage.tagID == null && charHeritage.id == heritage.id) { + selectHeritage.append(''); + } else { + selectHeritage.append(''); + } + } + } + } + + + $('#ancestry-feature-selector-heritage').trigger("change", [triggerSave]); + +} + +function processAncestry_isUniversalHeritage(){ + return $('#universalHeritageTab').parent().hasClass('is-active'); +} + +function processAncestry_displayCurrentHeritage(charAncestry, heritageID, isUniversal) { + $('#ancestry-feature-selector-heritage').blur(); + + if(heritageID != "chooseDefault" && charAncestry != null){ + + let heritage; + if(isUniversal) { + heritage = g_uniHeritages.find(uniHeritage => { + return uniHeritage.id == heritageID; + }); + g_character.heritageID = null; + g_character.uniHeritageID = heritageID; + } else { + heritage = charAncestry.Heritages.find(heritage => { + return heritage.id == heritageID; + }); + g_character.heritageID = heritageID; + g_character.uniHeritageID = null; + } + + // Rarity // + $('#ancestry-feature-selector-rarity-heritage').html(convertRarityToHTML(heritage.rarity, true)); + + let heritageDescription = $('#ancestry-feature-selector-description-heritage'); + heritageDescription.html(processText(heritage.description, false, false, 'MEDIUM', false)); + heritageDescription.removeClass('is-hidden'); + + if(heritage.artworkURL != null){ + $('#ancestry-feature-selector-artwork-heritage').removeClass('is-hidden'); + $('#ancestry-feature-selector-artwork-heritage').attr('src', heritage.artworkURL); + } else { + $('#ancestry-feature-selector-artwork-heritage').addClass('is-hidden'); + $('#ancestry-feature-selector-artwork-heritage').attr('src', ''); + } + + $('#ancestry-feature-selector-code-heritage').html(''); + + processCode( + heritage.code, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'heritage', + sourceCodeSNum: 'a' + }, + 'ancestry-feature-selector-code-heritage', + {source: 'Heritage', sourceName: 'Heritage'}); + + } else { + + g_character.heritageID = null; + g_character.uniHeritageID = null; + + $('#ancestry-feature-selector-rarity-heritage').html(''); + + let heritageDescription = $('#ancestry-feature-selector-description-heritage'); + heritageDescription.html(''); + heritageDescription.addClass('is-hidden'); + $('#ancestry-feature-selector-artwork-heritage').addClass('is-hidden'); + $('#ancestry-feature-selector-artwork-heritage').attr('src', ''); + $('#ancestry-feature-selector-code-heritage').html(''); + + } + + // Update ancestry feats + processAncestry_reprocessAncestryFeats(); + +} + + + + + +function deleteAncestry(){ + + deleteDataBySourceType('ancestry'); + g_character.ancestryID = null; + g_character.heritageID = null; + g_character.uniHeritageID = null; + +} + +function setAncestry(ancestryID){ + + g_character.ancestryID = ancestryID; + const newAncestry = getCharAncestry(); + if(newAncestry != null){ + setData(DATA_SOURCE.CHAR_TRAIT, ancestryTrait_srcStruct, newAncestry.Ancestry.name); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/modules/process-background.js b/client/vue-src/legacy-js/build_planner/modules/process-background.js new file mode 100644 index 00000000..b442eb63 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/modules/process-background.js @@ -0,0 +1,78 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function processBackground() { + + const charBackground = getCharBackground(); + $(`#initial-stats-background`).html(''); + if(charBackground != null){ + + // Process initial class stats // + $(`#initial-stats-background`).html(` + +
+
+
+

Background

+
+ ${processText(charBackground.description, false, null, 'MEDIUM', false)} +
+
+ +
+ +
+
+
+
+
+
+
+ + `); + + // Code + let codeSrcStruct = { + sourceType: 'background', + sourceLevel: 1, + sourceCode: 'background', + sourceCodeSNum: 'a', + }; + processCode( + charBackground.code, + codeSrcStruct, + 'background-initial-code', + {source: 'Background', sourceName: 'Background'}); + + // Boosts + let boostSrcStruct = { + sourceType: 'background', + sourceLevel: 1, + sourceCode: 'boost-choose', + sourceCodeSNum: 'a', + }; + if(charBackground.boostOne != null && charBackground.boostTwo != null) { + processCode( + 'GIVE-ABILITY-BOOST-SINGLE='+charBackground.boostOne+'\n GIVE-ABILITY-BOOST-SINGLE='+charBackground.boostTwo, + boostSrcStruct, + 'background-initial-boosts', + {source: 'Background', sourceName: 'Background Boosts'}); + } + + } + +} + +function deleteBackground(){ + + deleteDataBySourceType('background'); + g_character.backgroundID = null; + +} + +function setBackground(backgroundID){ + + g_character.backgroundID = backgroundID; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/modules/process-class.js b/client/vue-src/legacy-js/build_planner/modules/process-class.js new file mode 100644 index 00000000..f7025f5f --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/modules/process-class.js @@ -0,0 +1,320 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function processClass() { + + const charClass = getCharClass(); + $(`#initial-stats-class`).html(''); + if(charClass != null){ + + // Process initial class stats // + $(`#initial-stats-class`).html(` + +
+
+
+

Class

+
+
+ +
+
+

Key Ability

+

+
+
+

Hit Points

+

+
+
+
+
+

Perception

+

+
+
+

Skills

+

+
+
+
+
+

Saving Throws

+

+
+
+

Class DC

+

+
+
+
+
+

Attacks

+

+
+
+

Defenses

+

+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + `); + processClassStats(charClass.Class, { + + keyAbility: { + displayID: 'class-feature-initial-stats-display-key-ability', + codeID: 'class-feature-initial-stats-code-key-ability', + }, + hitPoints: { + displayID: 'class-feature-initial-stats-display-hit-points', + codeID: 'class-feature-initial-stats-code-hit-points', + }, + + perception: { + displayID: 'class-feature-initial-stats-display-perception', + codeID: 'class-feature-initial-stats-code-perception', + }, + skills: { + displayID: 'class-feature-initial-stats-display-skills', + codeID: 'class-feature-initial-stats-code-skills', + }, + savingThrows: { + displayID: 'class-feature-initial-stats-display-saving-throws', + codeID: 'class-feature-initial-stats-code-saving-throws', + }, + classDC: { + displayID: 'class-feature-initial-stats-display-class-dc', + codeID: 'class-feature-initial-stats-code-class-dc', + }, + attacks: { + displayID: 'class-feature-initial-stats-display-attacks', + codeID: 'class-feature-initial-stats-code-attacks', + }, + defenses: { + displayID: 'class-feature-initial-stats-display-defenses', + codeID: 'class-feature-initial-stats-code-defenses', + }, + + }, PROCESS_CLASS_STATS_TYPE.BOTH); + + // Process each class feature // + for(const classFeature of charClass.Abilities){ + if(classFeature.selectType != 'SELECT_OPTION' && classFeature.level <= g_char_level){ + $(`#level-${classFeature.level}-body`).append(` + +
+
+
+

${classFeature.name}

+
+
+
+ +
+ +
+ +
+
+
+
+ + `); + + const classFeature_srcStruct = { + sourceType: 'class', + sourceLevel: classFeature.level, + sourceCode: 'classAbility-'+classFeature.id, + sourceCodeSNum: 'a' + }; + const classFeatureChoice_srcStruct = { + sourceType: 'class', + sourceLevel: classFeature.level, + sourceCode: 'classAbilitySelector-'+classFeature.id, + sourceCodeSNum: 'a', + }; + + const classArchetypeResult = applyClassArchetypeChoice(classFeature); + if(classArchetypeResult != null){ + $(`#class-feature-container-${classFeature.id}`).append(classArchetypeResult.tabsHTML); + assembleClassArchetypeTabs(classArchetypeResult.tabsID, classFeature.id, classFeature.description, classFeature_srcStruct); + } else { + $(`#class-feature-container-${classFeature.id}`).append(processText(classFeature.description, false, null)); + } + + // Run code + processCode( + replaceClassFeatureCodeFromClassArchetype(classFeature.id, classFeature.code, classFeature_srcStruct), + classFeature_srcStruct, + `class-feature-code-${classFeature.id}`, + {source: 'Class Feature', sourceName: classFeature.name+' (Lvl '+classFeature.level+')'}); + + // Hide top hr if no code result is generated + if($(`#class-feature-code-${classFeature.id}`).html() == '' || $(`#class-feature-code-${classFeature.id}`).find('div').html() == ''){ + $(`#class-feature-code-hr-${classFeature.id}`).addClass('is-hidden'); + } + + // Selection Options + if(classFeature.selectType === 'SELECTOR') { + + let selectionOptionListHTML = ` + + + `; + + const choice = getDataSingleClassChoice(classFeatureChoice_srcStruct); + + for(const classFeatureOption of charClass.Abilities) { + if(classFeatureOption.selectType === 'SELECT_OPTION' && (classFeatureOption.selectOptionFor === classFeature.id || classFeatureOption.indivClassAbilName === classFeature.name)) { + + if(choice != null && choice.OptionID == classFeatureOption.id) { + selectionOptionListHTML += ''; + } else { + selectionOptionListHTML += ''; + } + + } + } + + $(`#class-feature-selector-section-${classFeature.id}`).html(` + +
+
+ +
+
+ + + `); + + // Class Feature Selector + $(`#class-feature-selector-${classFeature.id}`).change(function(event, triggerSave){ + + $(`#class-feature-selector-description-${classFeature.id}`).html(''); + $(`#class-feature-selector-code-${classFeature.id}`).html(''); + + if($(this).val() == 'chooseDefault'){ + $(this).parent().addClass("is-info"); + $(`#class-feature-selector-result-${classFeature.id}`).addClass('is-hidden'); + + // Save choice + if(g_char_id != null){ + socket.emit("requestClassChoiceChange", + g_char_id, + classFeatureChoice_srcStruct, + null); + + // Clear all data under srcStruct + socket.emit("requestDataClearAtSrcStruct", + g_char_id, + classFeatureChoice_srcStruct); + } else { + saveBuildMetaData(); + } + + deleteDataBySourceStruct(classFeatureChoice_srcStruct); + + if(triggerSave == null || triggerSave) { + initExpressionProcessor();// Update getCurrentClassAbilityNameArray() + } + + } else { + $(this).parent().removeClass("is-info"); + $(`#class-feature-selector-result-${classFeature.id}`).removeClass('is-hidden'); + + const chosenClassFeature = charClass.Abilities.find(cf => { + return cf.id == $(this).val(); + }); + + const classArchetypeOptionResult = applyClassArchetypeChoice(chosenClassFeature); + if(classArchetypeOptionResult != null){ + $(`#class-feature-selector-description-${classFeature.id}`).html(classArchetypeOptionResult.tabsHTML); + assembleClassArchetypeTabs(classArchetypeOptionResult.tabsID, chosenClassFeature.id, chosenClassFeature.description, classFeatureChoice_srcStruct); + } else { + $(`#class-feature-selector-description-${classFeature.id}`).html(processText(chosenClassFeature.description, false, null)); + } + + // Save choice + if(triggerSave == null || triggerSave) { + if(g_char_id != null){ + socket.emit("requestClassChoiceChange", + g_char_id, + classFeatureChoice_srcStruct, + { SelectorID : classFeature.id, OptionID : chosenClassFeature.id }); + } else { + saveBuildMetaData(); + } + setDataClassChoice(classFeatureChoice_srcStruct, classFeature.id, chosenClassFeature.id); + initExpressionProcessor();// Update getCurrentClassAbilityNameArray() + } + + // Run class feature option code + processCode( + replaceClassFeatureCodeFromClassArchetype(chosenClassFeature.id, chosenClassFeature.code, classFeatureChoice_srcStruct), + classFeatureChoice_srcStruct, + `class-feature-selector-code-${classFeature.id}`, + {source: 'Class Feature Option', sourceName: classFeature.name+' - '+chosenClassFeature.name}); + + } + + $(this).blur(); + }); + $(`#class-feature-selector-${classFeature.id}`).trigger('change', [false]); + + } + + } + } + + } + +} + +function deleteClass(){ + + resetClassArchetypes(); + deleteDataBySourceType('class'); + g_character.classID = null; + +} + +function setClass(classID){ + + g_character.classID = classID; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/modules/process-custom-code.js b/client/vue-src/legacy-js/build_planner/modules/process-custom-code.js new file mode 100644 index 00000000..b097e3d7 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/modules/process-custom-code.js @@ -0,0 +1,46 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function processCustomCode() { + + $(`#initial-stats-custom-code`).html(''); + if(g_character.optionCustomCodeBlock === 1){ + + $(`#initial-stats-custom-code`).html(` +
+
+
+

Custom Code

+

Anything generated from the code you wrote in the code block on the Home page will appear below.

+
+
+
+ +
+
+
+
+ `); + + processCode( + g_character.customCode, + { + sourceType: 'custom-code', + sourceLevel: 0, + sourceCode: 'custom-code', + sourceCodeSNum: 'a', + }, + `custom-code-block-code`, + {source: 'Custom Code Block', sourceName: 'Custom Code Block'}); + + } else { + if(g_char_id != null){ + socket.emit("requestCustomCodeBlockDataClear", + g_char_id); + } else { + saveBuildMetaData(); + } + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/core-processor.js b/client/vue-src/legacy-js/build_planner/processor/core-processor.js new file mode 100644 index 00000000..20cdbd18 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/core-processor.js @@ -0,0 +1,282 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ========================================================================================= // +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Wanderer's Guide Code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // +// ========================================================================================= // + +const processingDebug = false; + +// Global Variables // +let codeQueue = []; +let runningCodeQueue = false; +let gCode_statements, gCode_srcStruct, gCode_locationID, gCode_extraData; +const PROCESS_RETURN = { + NEXT: 'NEXT', + END: 'END', + UNKNOWN: 'UNKNOWN', +}; +// // + +function processCode(wscCode, srcStruct, locationID, extraData){ + if(wscCode == null || wscCode.trim() == ''){ return; } + if(extraData == null){ extraData = {source: 'Unknown', sourceName: ''}; } + + // Process Variables + wscCode = processVariables(wscCode, `newCoreCode-${srcStructToCompositeKey(srcStruct)}`); + + // Add Loading Animiation // + $('#'+locationID).append('
'); + + // Clone srcStruct object (to prevent some concurrency issues) + let newSrcStruct = cloneObj(srcStruct); + + codeDecompiling(wscCode, newSrcStruct, locationID, extraData); + +} + +function codeDecompiling(wscCode, srcStruct, locationID, extraData){ + + codeQueue.push({ wscCode, srcStruct, locationID, extraData }); + + if(!runningCodeQueue){ + shiftCodeQueue(); + } + +} + +function stopCodeProcessing(){ + codeQueue = []; + gCode_statements = null; + gCode_srcStruct = null; + gCode_locationID = null; + gCode_extraData = null; +} + +function shiftCodeQueue(){ + + runningCodeQueue = true; + let code = codeQueue.shift(); + + if(processingDebug) {console.log("Starting Code Queue:");} + if(processingDebug) {console.log(code);} + if(code != null){ + gCode_statements = code.wscCode.split(/\n/); + gCode_locationID = code.locationID; + gCode_extraData = code.extraData; + + code.srcStruct.sourceCodeSNum = 'a'+code.srcStruct.sourceCodeSNum; + gCode_srcStruct = code.srcStruct; + + // Start running statements, + statementNext(); + } else { + runningCodeQueue = false; + if(processingDebug) {console.log("No More Code Queues Remaining :)");} + finishLoadingPage(); + } + +} + +function statementNext(){ + const stateReturn = runQueuedStatement(); + if(stateReturn === PROCESS_RETURN.END){ + if(processingDebug) {console.log("Code Queue Complete");} + shiftCodeQueue(); + } else if(stateReturn === PROCESS_RETURN.NEXT){ + statementComplete_new(); + } +} + +function statementComplete_new(){ + if(gCode_srcStruct == null) { return; } + if(processingDebug) {console.log("Statement Complete, onto next statement...");} + + if(processingDebug) {console.log(gCode_srcStruct.sourceCodeSNum);} + // Up ticks the first digit in the sourceCodeSNum string. + let sourceCodeSNum = gCode_srcStruct.sourceCodeSNum; + let firstChar = sourceCodeSNum[0]; // Get first char + sourceCodeSNum = sourceCodeSNum.substr(1); // Remove first char + firstChar = processor_charIncrease(firstChar); + if(firstChar == null){ + displayError("Attempted to run more WSC statements than maximum!"); + return; + } + sourceCodeSNum = firstChar+sourceCodeSNum; + gCode_srcStruct.sourceCodeSNum = sourceCodeSNum; + if(processingDebug) {console.log(gCode_srcStruct.sourceCodeSNum);} + + // Run next statement, + statementNext(); +} + +//let timeTrackCount = null; +function statementComplete(calledSource='Unknown'){ + + /* + if(timeTrackCount != null){ + console.timeEnd('track-'+timeTrackCount); + console.log(' Src: '+calledSource); + timeTrackCount++; + } else { + timeTrackCount = 0; + } + + console.time('track-'+timeTrackCount); + */ + +} + +function runQueuedStatement(){ + + let wscStatement = gCode_statements.shift(); + let srcStruct = { + sourceType: gCode_srcStruct.sourceType, + sourceLevel: gCode_srcStruct.sourceLevel, + sourceCode: gCode_srcStruct.sourceCode, + sourceCodeSNum: gCode_srcStruct.sourceCodeSNum, + }; + let locationID = gCode_locationID; + let extraData = gCode_extraData; + + if(processingDebug) {console.log('SRC-STRUCT');} + if(processingDebug) {console.log(srcStruct);} + if(processingDebug) {console.log(wscStatement);} + + // Remove Loading Animiation // + $('#'+locationID+' .wsc-statement-roller').remove(); + + if(wscStatement != null){ + if(wscStatement.trim() == ''){ return PROCESS_RETURN.NEXT; } + if(wscStatement.endsWith(',')){ wscStatement = wscStatement.slice(0, -1); } + + // Test/Check Statement for Expressions // + wscStatement = testExpr(wscStatement, srcStruct); + if(wscStatement == null) { + if(g_char_id != null){ + socket.emit("requestDataClearAtSrcStruct", + g_char_id, + srcStruct); + } else { + saveBuildMetaData(); + } + deleteDataBySourceStruct(srcStruct); + return PROCESS_RETURN.NEXT; + } + if(wscStatement.trim() == ''){ return PROCESS_RETURN.NEXT; } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + let wscStatementUpper = wscStatement.toUpperCase(); + // + + // If it's a removal statement, continue + if(wscStatementUpper.startsWith('REMOVAL-')){ + return PROCESS_RETURN.NEXT; + } + + // MiscFeats is run even on tests, which is how the code is run for character builder. + // - Probably should change this to a better system in the future. + const miscFeat_stateReturn = runMiscFeatStatements(wscStatement, wscStatementUpper); + if(miscFeat_stateReturn != PROCESS_RETURN.UNKNOWN){ + return miscFeat_stateReturn; + } + + // Builder Compiler + const builder_stateReturn = runBuilderStatements(wscStatement, wscStatementUpper, srcStruct, locationID, extraData); + if(builder_stateReturn != PROCESS_RETURN.UNKNOWN){ + return builder_stateReturn; + } + + // Sheet Compiler + const sheet_stateReturn = runSheetStatements(wscStatement, wscStatementUpper, srcStruct, locationID, extraData); + if(sheet_stateReturn != PROCESS_RETURN.UNKNOWN){ + return sheet_stateReturn; + } + + // AddText will return true or false based on if it successfully processed the statement + const addText_foundReturn = processStatement_AddText(wscStatement, locationID, true); + if(addText_foundReturn){ + return PROCESS_RETURN.NEXT; + } + + + displayError("Unknown statement (1): \'"+wscStatement+"\'"); + return PROCESS_RETURN.END; + + } else { + return PROCESS_RETURN.END; + } + +} + + +socket.on("returnWSCStatementFailure", function(details){ + if(details != null){ + displayError("Statement failure: \'"+details+"\'"); + } else { + displayError("Unknown statement failure"); + } +}); + + +// WSC statement maximum: 52 +function processor_charIncrease(char){ + switch(char) { + case 'a': return 'b'; + case 'b': return 'c'; + case 'c': return 'd'; + case 'd': return 'e'; + case 'e': return 'f'; + case 'f': return 'g'; + case 'g': return 'h'; + case 'h': return 'i'; + case 'i': return 'j'; + case 'j': return 'k'; + case 'k': return 'l'; + case 'l': return 'm'; + case 'm': return 'n'; + case 'n': return 'o'; + case 'o': return 'p'; + case 'p': return 'q'; + case 'q': return 'r'; + case 'r': return 's'; + case 's': return 't'; + case 't': return 'u'; + case 'u': return 'v'; + case 'v': return 'w'; + case 'w': return 'x'; + case 'x': return 'y'; + case 'y': return 'z'; + case 'z': return 'A'; + + case 'A': return 'B'; + case 'B': return 'C'; + case 'C': return 'D'; + case 'D': return 'E'; + case 'E': return 'F'; + case 'F': return 'G'; + case 'G': return 'H'; + case 'H': return 'I'; + case 'I': return 'J'; + case 'J': return 'K'; + case 'K': return 'L'; + case 'L': return 'M'; + case 'M': return 'N'; + case 'N': return 'O'; + case 'O': return 'P'; + case 'P': return 'Q'; + case 'Q': return 'R'; + case 'R': return 'S'; + case 'S': return 'T'; + case 'T': return 'U'; + case 'U': return 'V'; + case 'V': return 'W'; + case 'W': return 'X'; + case 'X': return 'Y'; + case 'Y': return 'Z'; + case 'Z': return null; + + default: return null; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder-statements.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder-statements.js new file mode 100644 index 00000000..77d8701c --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder-statements.js @@ -0,0 +1,133 @@ + + +function runBuilderStatements(wscStatement, wscStatementUpper, srcStruct, locationID, extraData){ + + if(wscStatementUpper == "CLEAR-DATA-FROM-CODE-BLOCK"){ + + let newSrcStruct = cloneObj(srcStruct); + newSrcStruct.sourceCodeSNum = newSrcStruct.sourceCodeSNum.substring(1); + if(g_char_id != null){ + socket.emit("requestWSCSrcStructDataClear", + g_char_id, + newSrcStruct); + } else { + saveBuildMetaData(); + } + deleteDataSNumChildren(newSrcStruct); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-SCFS")){ // Needs to come before the rest + processingSCFS(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-CHAR-TRAIT")){ + processingCharTags(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-PHYSICAL-FEATURE")){ + processingPhysicalFeatures(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-SENSE")){ + processingSenses(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-CLASS-FEATURE")){ + processingClassFeatures(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-FEAT")){ + processingFeats(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-PROF")){ + processingProf(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("GIVE-SKILL")){ + processingSkills(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-LANG")){ + processingLangs(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-ABILITY-BOOST") || wscStatementUpper.includes("-ABILITY-FLAW")){ + processingAbilityBoosts(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-INNATE")){ + processingInnateSpells(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-FOCUS")){ + processingFocusSpells(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-SPELL")){ + processingSpells(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-LORE")){ + processingLore(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-RESISTANCE") || wscStatementUpper.includes("-WEAKNESS")){ + processingResistances(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-DOMAIN")){ + processingDomains(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-SPECIALIZATION")){ + processingSpecializations(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-FAMILIARITY")){ + processingFamiliarities(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-NOTES")){ + processingNotes(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("GIVE-SPEED")){ + processingSpeeds(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-KEY-ABILITY")){ + processingKeyAbilities(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.includes("-HERITAGE-EFFECTS")){ + processingHeritageEffects(wscStatementUpper, srcStruct, locationID, extraData); + return PROCESS_RETURN.NEXT; + } + + return PROCESS_RETURN.UNKNOWN; + +} diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/display-structs.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/display-structs.js new file mode 100644 index 00000000..290fc7ff --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/display-structs.js @@ -0,0 +1,23 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + + +function displaySpell(locationID, spell){ + let buttonClass = locationID+'-spellView-'+spell.Spell.id; + $('#'+locationID).html(''); + + let inSpellName = spell.Spell.name.replace(/’/g,'\'').toUpperCase(); + for(const [spellID, spellDataStruct] of g_spellMap.entries()){ + let spellName = spellDataStruct.Spell.name.toUpperCase(); + if(inSpellName === spellName && spellDataStruct.Spell.isArchived == 0) { + $('.'+buttonClass).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + return; + } + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/feats-selection.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/feats-selection.js new file mode 100644 index 00000000..beb5b2ae --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/feats-selection.js @@ -0,0 +1,475 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_featPrereqMap = new Map(); +let g_featSelectionMap = new Map(); + +function giveFeatSelection(locationID, srcStruct, selectionName, selectionMap, sourceName){ + + // Sort selectionMap by key (level) -> highest to loweest + selectionMap = new Map([...selectionMap.entries()].sort( + function(a, b) { + return b[0] - a[0]; + }) + ); + + let featSelectionLocID = "featSelect-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + $('#'+locationID).append('
'); + generateFeatSelection(featSelectionLocID, srcStruct, selectionName, selectionMap, sourceName); + +} + +function generateFeatSelection(contentLocID, srcStruct, selectionName, selectionMap, sourceName){ + g_featSelectionMap.set(contentLocID, { + SrcStruct: srcStruct, + SelectionName: selectionName, + SelectionMap: selectionMap, + SourceName: sourceName, + }); + + // Find selectedFeat // + let selectedFeatData = getDataSingle(DATA_SOURCE.FEAT_CHOICE, srcStruct); + let selectedFeat = null; + if(selectedFeatData != null && selectedFeatData.value != null){ + selectedFeat = g_featMap.get(selectedFeatData.value+""); + } + + // Selected feat must be one of the selection options, + if(selectedFeat != null){ + let findSelectedFeatInSelectionMap = function(){ + for(let [featLevel, featArray] of selectionMap.entries()){ + for(let feat of featArray){ + if(feat.Feat.name == selectedFeat.Feat.name){ + return true; + } + } + } + return false; + }; + if(!findSelectedFeatInSelectionMap()){ + selectedFeat = null; + setData(DATA_SOURCE.FEAT_CHOICE, srcStruct, null); + } + } + // ~~~~~~~~~~~~~~~~~ // + + let openFeatDetailsClass = "openFeat-"+contentLocID; + let openFeatListClass = "openList-"+contentLocID; + + let featListSectionID = "featListSection-"+contentLocID; + let featDropdownIconID = "featDropdownIcon-"+contentLocID; + + let featCodeSectionID = "featCode-"+contentLocID; + + let featSelectButtonClass = "featSelectBtn-"+contentLocID; + let featRemoveButtonClass = "featRemoveBtn-"+contentLocID; + + if(selectedFeat == null) { + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Feat', 'UNSELECTED'); + + $('#'+contentLocID).html(` +
+
+
+
+ ${selectionName} +
+
+ +
+
+ +
+
+ `); + } else { + const selectionTagInfo = (meetsPrereqs(selectedFeat.Feat) == 'FALSE') ? getTagFromData(srcStruct, sourceName, 'Prerequisites Not Met', 'INCORRECT') : getTagFromData(srcStruct, sourceName, '', ''); + + let featNameHTML = ''+selectedFeat.Feat.name+''; + if(selectedFeat.Feat.isArchived === 1){ featNameHTML += ' - Archived'; } + let featLevelHTML = ''; + if(selectedFeat.Feat.level > 0){ featLevelHTML = ' Lvl '+selectedFeat.Feat.level+''; } + $('#'+contentLocID).html(` +
+
+
+
+ ${featNameHTML}${featLevelHTML} +
+
+ +
+
+ +
+
+ `); + } + + + if(selectedFeat != null) { + $('.'+openFeatDetailsClass).click(function(event) { + openQuickView('featView', { + Feat : selectedFeat.Feat, + Tags : selectedFeat.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }); + }); + + $('.'+openFeatDetailsClass).mouseenter(function(){ + $('.'+openFeatDetailsClass).addClass('feat-selection-is-hovered'); + }); + $('.'+openFeatDetailsClass).mouseleave(function(){ + $('.'+openFeatDetailsClass).removeClass('feat-selection-is-hovered'); + }); + + $('.'+openFeatListClass).mouseenter(function(){ + $(this).addClass('feat-selection-is-hovered'); + }); + $('.'+openFeatListClass).mouseleave(function(){ + $(this).removeClass('feat-selection-is-hovered'); + }); + } + + $('.'+openFeatListClass).click(function() { + if($('#'+featListSectionID).hasClass('is-hidden')){ + $('#'+featDropdownIconID).removeClass('fa-chevron-down'); + $('#'+featDropdownIconID).addClass('fa-chevron-up'); + + generateFeatSelectionList(contentLocID, srcStruct, selectedFeat, selectionMap, { + featListSectionID, + featSelectButtonClass, + featRemoveButtonClass, + featCodeSectionID, + }); + + $('#'+featListSectionID).removeClass('is-hidden'); + } else { + + $('#'+featDropdownIconID).removeClass('fa-chevron-up'); + $('#'+featDropdownIconID).addClass('fa-chevron-down'); + $('#'+featListSectionID).addClass('is-hidden'); + + $('#'+featListSectionID).html(''); + + } + }); + + if(selectedFeat != null){ + processCode( + selectedFeat.Feat.code, + srcStruct, + featCodeSectionID, + {source: 'Feat', sourceName: selectedFeat.Feat.name+' (Lvl '+srcStruct.sourceLevel+')'}); + } + +} + +function generateFeatSelectionList(contentLocID, srcStruct, selectedFeat, selectionMap, featListStruct){ + + let featListSectionID = featListStruct.featListSectionID; + let featCodeSectionID = featListStruct.featCodeSectionID; + + let featSelectButtonClass = featListStruct.featSelectButtonClass; + let featRemoveButtonClass = featListStruct.featRemoveButtonClass; + + + // Update prereqs + if(gOption_hasAutoDetectPreReqs) { + for(let [featLevel, featArray] of selectionMap.entries()){ + for(let featData of featArray) { + const preReqResult = meetsPrereqs(featData.Feat); + g_featPrereqMap.set(featData.Feat.id+'', preReqResult); + } + } + } + + let sortedSelectionMap = new Map(); + for(let [featLevel, featArray] of selectionMap.entries()){ + + // Sort feat array by level -> prereq -> name + let sortedFeatArray = featArray.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + if(gOption_hasAutoDetectPreReqs) { + // Prereq is only important when levels are the same + let a_meets = prereqToValue(g_featPrereqMap.get(a.Feat.id+'')); + let b_meets = prereqToValue(g_featPrereqMap.get(b.Feat.id+'')); + if(a_meets === b_meets) { + // Name is only important when prereqs are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return b_meets - a_meets; + } else { + return a.Feat.name > b.Feat.name ? 1 : -1; + } + } + return a.Feat.level - b.Feat.level; + } + ); + sortedSelectionMap.set(featLevel, sortedFeatArray); + + } + + let featListHTML = ''; + let displayedFeat = false; + for(let [featLevel, featArray] of sortedSelectionMap.entries()){ + + if(featLevel > 0){ + featListHTML += '
Level '+featLevel+'
'; + } + + // If all the feats of a given level start with the same 'Text - ...', remove the 'Text - ' + let detectSameBeginningDashText = function(){ + let beginningDashText = null; + for(const featData of featArray){ + if(beginningDashText == null){ + if(featData.Feat.name.includes(' - ')){ + beginningDashText = featData.Feat.name.split(' - ')[0]; + } else { + return null; + } + } else { + if(!featData.Feat.name.startsWith(beginningDashText+' - ')){ + return null; + } + } + } + return beginningDashText; + }; + const beginningDashText = detectSameBeginningDashText(); + + for(let featData of featArray) { + + let featNameHTML = ''+featData.Feat.name.replace(beginningDashText+' - ', '')+''+convertActionToHTML(featData.Feat.actions)+''; + + if(featData.Feat.isArchived === 1){ + if(selectedFeat != null && selectedFeat.Feat.id == featData.Feat.id){ + featNameHTML += ' - Archived'; + } else { + continue; + } + } + + + let preReqIconHTML = ''; + if(gOption_hasAutoDetectPreReqs){ + const preReqResult = g_featPrereqMap.get(featData.Feat.id+''); + if(preReqResult == 'TRUE'){ + preReqIconHTML = ' '+preReqGetIconTrue(); + } else if(preReqResult == 'FALSE'){ + preReqIconHTML = ' '+preReqGetIconFalse(); + } else if(preReqResult == 'UNKNOWN'){ + preReqIconHTML = ' '+preReqGetIconUnknown(); + } + } + + let rightInfoHTML = ` +
+ ${convertRarityToIconHTML(featData.Feat.rarity)} + ${preReqIconHTML} +
+ `; + + let topLeftHTML = ''; + if(featData.Feat.skillID != null){ + topLeftHTML = ''+getSkillNameAbbrev(getSkillIDToName(featData.Feat.skillID))+''; + } + + /* + let featRarityClass = ''; + if(featData.Feat.rarity == 'UNCOMMON'){ + featRarityClass = 'is-uncommon'; + } else if(featData.Feat.rarity == 'RARE'){ + featRarityClass = 'is-rare'; + } else if(featData.Feat.rarity == 'UNIQUE'){ + featRarityClass = 'is-unique'; + }*/ + + let hasFeat = (featData.Feat.canSelectMultiple == 0 && hasDuplicateFeat(featData.Feat.id)); + if(selectedFeat != null && selectedFeat.Feat.id == featData.Feat.id){ + featListHTML += ` +
+
+
+
${featNameHTML}
+
${rightInfoHTML}
+
+ +
+
${topLeftHTML}
+
+ `; + } else if(hasFeat) { + featListHTML += ` +
+
+
+
${featNameHTML}
+
${rightInfoHTML}
+
+
${topLeftHTML}
+
+ `; + } else { + featListHTML += ` +
+
+
+
${featNameHTML}
+
${rightInfoHTML}
+
+ +
+
${topLeftHTML}
+
+ `; + } + displayedFeat = true; + + } + } + if(!displayedFeat){ + // No feat displayed, + featListHTML = ` +
+
None
+ `; + } + $('#'+featListSectionID).html('
'+featListHTML+'
'); + + // Events // + $('.'+featSelectButtonClass).click(function() { + $(this).addClass('is-loading'); + let featID = $(this).attr('data-feat-id'); + let feat = g_featMap.get(featID); + + setData(DATA_SOURCE.FEAT_CHOICE, srcStruct, featID); + if(g_char_id != null){ + socket.emit("requestFeatChange", + g_char_id, + {srcStruct, feat, featID, codeLocationID : featCodeSectionID }); + } else { + saveBuildMetaData(); + } + handleFeatChange(feat, contentLocID); + }); + + $('.'+featRemoveButtonClass).click(function() { + $(this).addClass('is-loading'); + + setData(DATA_SOURCE.FEAT_CHOICE, srcStruct, null); + if(g_char_id != null){ + socket.emit("requestFeatChange", + g_char_id, + {srcStruct, feat : null, featID : null, codeLocationID : featCodeSectionID }); + } else { + saveBuildMetaData(); + } + handleFeatChange(null, contentLocID); + }); + + updateFeatSelectionEntryEvents(); + +} + +//socket.on("returnFeatChange", function(featChangePacket){}); + +function handleFeatChange(feat, contentLocID){ + + // Updating feat selections will run code for all feats (including this one) + let featData = g_featSelectionMap.get(contentLocID); + if(featData != null){ + generateFeatSelection(contentLocID, + featData.SrcStruct, + featData.SelectionName, + featData.SelectionMap, + featData.SourceName); + } + //updateAllFeatSelections(); + selectorUpdated(); + + // Get number of character archetypes + let charArchetypesArray = []; + for(let featChoice of getDataAll(DATA_SOURCE.FEAT_CHOICE)){ + if(featChoice.value != null) { + let feat = g_featMap.get(featChoice.value+""); + if(feat != null){ + let dedicationTag = feat.Tags.find(featTag => { + return featTag.name === 'Dedication'; + }); + if(dedicationTag != null){ + charArchetypesArray.push(featChoice.value); + } + } + } + } + + // Get number of current archetype tabs + let maxArchetypesLength = 0; + $('.classFeatTabs').each(function() { + let archetypesTabClass = $(this).attr('data-arch-tab-class'); + let archLength = $('.'+archetypesTabClass).length; + if (archLength > maxArchetypesLength) { + maxArchetypesLength = archLength; + } + }); + + // Changed feat has Dedication tag + let featDedicationTag = null; + if(feat != null){ + featDedicationTag = feat.Tags.find(featTag => { + return featTag.name === 'Dedication'; + }); + } + + // If they aren't the same amount, reload state + if(maxArchetypesLength != charArchetypesArray.length || featDedicationTag != null) { + animatedStateLoad(); + } + +} + +/* +function updateAllFeatSelections(){ + + $(".feat-selection").each(function(){ + + let contentLocID = $(this).attr('data-contentLoc-id'); + let featData = g_featSelectionMap.get(contentLocID); + if(featData != null){ + generateFeatSelection(contentLocID, + featData.SrcStruct, + featData.SelectionName, + featData.SelectionMap, + featData.SourceName); + } + + }); + +}*/ + +function updateFeatSelectionEntryEvents(){ + + // Feat Selection Entry Events // + $('.feat-selection-list-entry').unbind(); + $('.feat-selection-list-entry').mouseenter(function(){ + $(this).addClass('is-selected'); + }); + $('.feat-selection-list-entry').mouseleave(function(){ + $(this).removeClass('is-selected'); + }); + + $('.feat-selection-list-entry-view').unbind(); + $('.feat-selection-list-entry-view').click(function(){ + let featID = $(this).parent().attr('data-feat-id'); + let feat = g_featMap.get(featID); + openQuickView('featView', { + Feat : feat.Feat, + Tags : feat.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }); + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/prereq-parser.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/prereq-parser.js new file mode 100644 index 00000000..fc87d3db --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/prereq-parser.js @@ -0,0 +1,491 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function preReqGetIconTrue(){ + return ''; +} +function preReqGetIconFalse(){ + return ''; +} +function preReqGetIconUnknown(){ + return ''; +} + +function preReq_skillList(){ + let skills = []; + for(let loreData of getDataAll(DATA_SOURCE.LORE)){ + skills.push(loreData.value+' Lore'); + } + for(const [skillName, skillData] of g_skillMap.entries()){ + skills.push(skillName); + } + return skills; +} + +function preReqFeatLink(dataLinkClass, inFeatName){ + inFeatName = inFeatName.replace(/’/g,'\'').toUpperCase(); + for(const [featID, featStruct] of g_featMap.entries()){ + let featName = featStruct.Feat.name.toUpperCase(); + if(inFeatName === featName && featStruct.Feat.isArchived == 0) { + setTimeout(function() { + $('.'+dataLinkClass).off('click'); + $('.'+dataLinkClass).click(function(){ + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + }, 100); + } + } +} + +function preReqResultArray(featPrereq){ + let resultArray = []; + + let prereqParts = []; + let prereqSemicolonParts = featPrereq.replace(/’/g,"'").split('; '); + for(let prereq of prereqSemicolonParts){ + if(prereq.includes(', or ') || prereq.includes(', and ')){ + prereqParts.push(prereq); + } else { + let prereqCommaParts = prereq.split(', '); + prereqParts = prereqParts.concat(prereqCommaParts); + } + } + + for(let prereq of prereqParts){ + if(prereq == '') { continue; } + let uPreReq = prereq.toUpperCase(); + + let result; + result = preReqCheckProfs(uPreReq); + if(result != null) { resultArray.push({Type: 'SKILL-PROF', Result: result, PreReqPart: prereq}); continue; } + + result = prereqListChecking('ABILITY-SCORE', uPreReq, prereq); + if(result != null) { resultArray.push({Type: 'ABILITY-SCORE', Result: result, PreReqPart: prereq}); continue; } + + result = preReqCheckHeritages(uPreReq, prereq); + if(result != null) { resultArray.push({Type: 'HERITAGE', Result: result, PreReqPart: prereq}); continue; } + + result = prereqListChecking('FEAT', uPreReq, prereq); + if(result != null) { resultArray.push({Type: 'FEAT', Result: result, PreReqPart: prereq}); continue; } + + result = prereqListChecking('CLASS-FEATURE', uPreReq, prereq); + if(result != null) { resultArray.push({Type: 'CLASS-FEATURE', Result: result, PreReqPart: prereq}); continue; } + + resultArray.push({Type: 'UNKNOWN', Result: 'UNKNOWN', PreReqPart: prereq}); + } + return resultArray; +} + +function meetsPrereqs(feat){ + // Returns TRUE, FALSE, UNKNOWN, and null + if(feat.prerequisites == null) { return null; } + + let resultArray = preReqResultArray(feat.prerequisites); + + let totalResult = 'TRUE'; + for(let resultData of resultArray){ + if(resultData.Result == 'TRUE') { continue; } + if(resultData.Result == 'FALSE') { return 'FALSE'; } + if(resultData.Result == 'UNKNOWN') { totalResult = 'UNKNOWN'; continue; } + } + return totalResult; +} + +function prereqToValue(prereq){ + if(prereq == 'TRUE'){ return 0; } + if(prereq == 'UNKNOWN'){ return -1; } + if(prereq == 'FALSE'){ return -2; } + return 0;// No prereq +} + +// Prereq Ability Score Checking // +function preReqCheckAbilityScores(prereq){ + let rStr = prereq.match(/STRENGTH (\d+)/); + if(rStr != null){ + return preReqConfirmAbilityScore('STR', rStr[1]); + } + let rDex = prereq.match(/DEXTERITY (\d+)/); + if(rDex != null){ + return preReqConfirmAbilityScore('DEX', rDex[1]); + } + let rCon = prereq.match(/CONSTITUTION (\d+)/); + if(rCon != null){ + return preReqConfirmAbilityScore('CON', rCon[1]); + } + let rInt = prereq.match(/INTELLIGENCE (\d+)/); + if(rInt != null){ + return preReqConfirmAbilityScore('INT', rInt[1]); + } + let rWis = prereq.match(/WISDOM (\d+)/); + if(rWis != null){ + return preReqConfirmAbilityScore('WIS', rWis[1]); + } + let rCha = prereq.match(/CHARISMA (\d+)/); + if(rCha != null){ + return preReqConfirmAbilityScore('CHA', rCha[1]); + } + return null; +} + +function preReqConfirmAbilityScore(scoreType, amt){ + let scoreAmt = variables_getTotal('SCORE_'+scoreType); + if(scoreAmt != null){ + return scoreAmt >= amt ? 'TRUE' : 'FALSE'; + } else { + return 'UNKNOWN'; + } +} + + +// Prereq List Middleware // +function prereqListChecking(type, prereq, oData) { + + // For cases like the feat: 'Come and Get Me' + if(type == 'FEAT'){ + let preFeatResult = preReqCheckFeats(prereq, oData); + if(preFeatResult != null) { return preFeatResult; } + } + + let orCheck = false; + let listPrereqs; + if(prereq.includes(' OR ')){ + listPrereqs = prereq.split(/, OR | OR |, /); + orCheck = true; + } else if(prereq.includes(' AND ')){ + listPrereqs = prereq.split(/, AND | AND |, /); + } else { + listPrereqs = [prereq]; + } + + let totalResult = 'TRUE'; + for(let subPre of listPrereqs){ + let result; + if(type == 'PROF'){ + result = preReqConfirmSkillProf(subPre, oData); + } else if(type == 'FEAT'){ + result = preReqCheckFeats(subPre, oData); + } else if(type == 'CLASS-FEATURE'){ + result = preReqCheckClassAbilities(subPre, oData); + } else if(type == 'HERITAGE'){ + result = preReqConfirmHeritage(subPre); + } else if (type == 'ABILITY-SCORE'){ + result = preReqCheckAbilityScores(subPre); + } else { + result = 'FALSE'; + } + if(result == null) { return null; } + if(orCheck) { + if(result == 'TRUE'){ + return 'TRUE'; + } else if(result == 'FALSE'){ + totalResult = 'FALSE'; + } else if(result == 'UNKNOWN'){ + if(totalResult != 'FALSE') { + totalResult = 'UNKNOWN'; + } + } + } else { + if(result == 'FALSE'){ + totalResult = 'FALSE'; + } else if(result == 'UNKNOWN'){ + return 'UNKNOWN'; + } + } + } + return totalResult; +} + + +// Prereq Heritage Checking // +function preReqCheckHeritages(prereq, normalPreReq){ + if(prereq.toLowerCase() === normalPreReq){ + let rHeritage = prereq.match(/(.+) HERITAGE$/); + if(rHeritage != null){ + return prereqListChecking('HERITAGE', rHeritage[1], null); + } else { + return null; + } + } else { + return null; + } +} + +function preReqConfirmHeritage(heritageName){ + let heritage = getCharHeritage(); + if(heritage != null && heritageName === heritage.name.toUpperCase()){ + return 'TRUE'; + } else { + + let findHeritageName = function(heritageID){ + for(const [ancestryID, ancestryData] of g_ancestryMap.entries()){ + for(const heritage of ancestryData.Heritages){ + if(heritage.id == heritageID){ + return heritage.name; + } + } + } + return null; + }; + + // Check extra heritages + for(const heritageData of getDataAll(DATA_SOURCE.EXTRA_HERITAGE)){ + if(heritageData.value != null){ + let foundHeritageName = findHeritageName(heritageData.value); + if(foundHeritageName != null){ + if(heritageName === foundHeritageName.toUpperCase()){ + return 'TRUE'; + } + } + } + } + + return 'FALSE'; + } +} + +// Prereq Profs Checking // +function preReqCheckProfs(prereq){ + let rTrained = prereq.match(/TRAINED IN (.+)/); + if(rTrained != null){ + return prereqListChecking('PROF', rTrained[1], 1); + } + let rExpert = prereq.match(/EXPERT IN (.+)/); + if(rExpert != null){ + return prereqListChecking('PROF', rExpert[1], 2); + } + let rMaster = prereq.match(/MASTER IN (.+)/); + if(rMaster != null){ + return prereqListChecking('PROF', rMaster[1], 3); + } + let rLegendary = prereq.match(/LEGENDARY IN (.+)/); + if(rLegendary != null){ + return prereqListChecking('PROF', rLegendary[1], 4); + } + return null; +} + +function preReqConfirmSkillProf(skillName, numUps){ + let customChecksResult = checkCustomSkillProfs(skillName, numUps); + if(customChecksResult != null) { return customChecksResult; } + const varName = profConversion_convertOldNameToVarName(skillName); + if(varName != ''){ + const skillNumUps = profToNumUp(variables_getFinalRank(varName)); + if(skillNumUps != null){ + return skillNumUps >= numUps ? 'TRUE' : 'FALSE'; + } else { + if(skillName.endsWith(' LORE')){ return 'FALSE'; } + return 'UNKNOWN'; + } + } else { + return 'UNKNOWN'; + } +} + +function checkCustomSkillProfs(name, numUps){ + + if(name === 'LORE'){ + for(const loreData of getDataAll(DATA_SOURCE.LORE)){ + const skillNumUps = profToNumUp(variables_getFinalRank(`SKILL_${profConversion_convertOldName(loreData.value)}_LORE`)); + if(skillNumUps >= numUps){ + return 'TRUE'; + } + } + return 'FALSE'; + } + + if(name === 'AT LEAST ONE SKILL'){ + for(const skillName of preReq_skillList()){ + const varName = profConversion_convertOldNameToVarName(skillName); + if(varName != ''){ + const skillNumUps = profToNumUp(variables_getFinalRank(varName)); + if(skillNumUps >= numUps){ + return 'TRUE'; + } + } + } + return 'FALSE'; + } + + if(name === 'A SKILL WITH THE RECALL KNOWLEDGE ACTION' || name === 'AT LEAST ONE SKILL TO RECALL KNOWLEDGE' || name === 'A RECALL KNOWLEDGE SKILL'){ + for(const skillName of preReq_skillList()){ + const varName = profConversion_convertOldNameToVarName(skillName); + if(varName != ''){ + const skillNumUps = profToNumUp(variables_getFinalRank(varName)); + if(skillNumUps >= numUps){ + if(skillName.endsWith(' Lore') || + skillName == 'Arcana' || + skillName == 'Crafting' || + skillName == 'Medicine' || + skillName == 'Nature' || + skillName == 'Occultism' || + skillName == 'Religion' || + skillName == 'Society'){ + return 'TRUE'; + } + } + } + } + return 'FALSE'; + } + + if(name === 'A SKILL WITH THE DECIPHER WRITING ACTION' || name === 'AT LEAST ONE SKILL TO DECIPHER WRITING' || name === 'A DECIPHER WRITING SKILL'){ + for(const skillName of preReq_skillList()){ + const varName = profConversion_convertOldNameToVarName(skillName); + if(varName != ''){ + const skillNumUps = profToNumUp(variables_getFinalRank(varName)); + if(skillNumUps >= numUps){ + if(skillName == 'Arcana' || + skillName == 'Occultism' || + skillName == 'Religion' || + skillName == 'Society'){ + return 'TRUE'; + } + } + } + } + return 'FALSE'; + } + + if(name === 'AT LEAST ONE SAVING THROW'){ + const fortNumUps = profToNumUp(variables_getFinalRank(VARIABLE.SAVE_FORT)); + const reflexNumUps = profToNumUp(variables_getFinalRank(VARIABLE.SAVE_REFLEX)); + const willNumUps = profToNumUp(variables_getFinalRank(VARIABLE.SAVE_WILL)); + if(fortNumUps >= numUps || reflexNumUps >= numUps || willNumUps >= numUps){ + return 'TRUE'; + } else { + return 'FALSE'; + } + } + + if(name === 'PERCEPTION'){ + let profNumUps = profToNumUp(variables_getFinalRank(VARIABLE.PERCEPTION)); + if(profNumUps >= numUps){ + return 'TRUE'; + } + return 'FALSE'; + } + + return null; + +} + + + +// Prereq Feats Checking // +function preReqCheckFeats(prereq, normalPreReq){ + // Feats aren't all lowercase, that'd likely be a class feature + if(normalPreReq == normalPreReq.toLowerCase()) { return null; } + + for(let featData of getDataAll(DATA_SOURCE.FEAT_CHOICE)){ + if(featData.value != null){ + const featStruct = g_featMap.get(featData.value+''); + if(featStruct != null && featStruct.Feat.name.toUpperCase() === prereq){ + return 'TRUE'; + } + } + } + for(const [featID, featStruct] of g_featMap.entries()){ + if(featStruct.Feat != null && featStruct.Feat.isArchived == 0){ + if(featStruct.Feat.name.toUpperCase() === prereq){ + return 'FALSE'; + } + } + } + return null; +} + + +// Prereq Class Feature Checking // +function preReqCheckClassAbilities(prereq, normalPreReq){ + let classAbilityNameArray = getCurrentClassAbilityNameArray(); + if(classAbilityNameArray != null && + getCharClass() != null && + getCharClass().Abilities != null){ + if(prereq.toLowerCase() === normalPreReq){ + + for(let abilityName of classAbilityNameArray){ + let abilName = abilityName.toLowerCase(); + if(normalPreReq === abilName){ return 'TRUE'; } + + if(normalPreReq.endsWith(' cause')){ + if(abilName.startsWith(normalPreReq.replace(' cause', ''))){ + return 'TRUE'; + } + } + if(normalPreReq.startsWith('divine ally (')){ + if(normalPreReq == 'divine ally ('+abilName+')'){ + return 'TRUE'; + } + } + + if(normalPreReq.includes(abilName) || abilName.includes(normalPreReq)){ + + // For cases like ANTIPALADIN and PALADIN + if(normalPreReq.includes(abilName)){ + let preReqWithoutAbilName = normalPreReq.replace(abilName,':::'); + let lastChar = preReqWithoutAbilName.substring(0,preReqWithoutAbilName.indexOf(':::')).slice(-1); + if(!(/\s|(^$)/g.test(lastChar))){// Is whitespace or '' + return 'FALSE'; + } + } + + let ability = prereqFindClassAbility(abilityName); + if(ability != null){ + if(ability.selectType != 'SELECTOR'){ + // For long prereqs that go into more detail, the answer is most likely unknown. + if(abilName.split(' ').length+3 >= normalPreReq.split(' ').length){ + return 'TRUE'; + } else { + return 'UNKNOWN'; + } + } + } + } + } + + for(let ability of getCharClass().Abilities){ + let abilName = ability.name.toLowerCase().split('(')[0]; + if(normalPreReq === abilName){ return 'FALSE'; } + if(normalPreReq.includes(abilName) || abilName.includes(normalPreReq)){ + if(ability.selectType != 'SELECTOR'){ + // For long prereqs that go into more detail, the answer is most likely unknown. + if(abilName.split(' ').length+3 >= normalPreReq.split(' ').length){ + return 'FALSE'; + } else { + return 'UNKNOWN'; + } + } + } + } + + return 'UNKNOWN'; + + } else { + return null; + } + } else { + return null; + } +} + +function prereqFindClassAbility(abilityName){ + abilityName = abilityName.toLowerCase(); + for(let ability of getCharClass().Abilities){ + if(abilityName === ability.name.toLowerCase()) { + return ability; + } + } + for(const [classID, classData] of g_classMap.entries()){ + for(const classAbility of classData.Abilities){ + if(abilityName === classAbility.name.toLowerCase()) { + return classAbility; + } + } + } + return null; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-boosts.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-boosts.js new file mode 100644 index 00000000..c97cf2c4 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-boosts.js @@ -0,0 +1,213 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Ability Boosts --------------------// +function processingAbilityBoosts(wscStatement, srcStruct, locationID, extraData){ + + // GIVE-ABILITY-BOOST-SINGLE=ALL + // GIVE-ABILITY-BOOST-SINGLE=INT,WIS,CHA + if(wscStatement.includes("GIVE-ABILITY-BOOST-SINGLE")){ + let selectionOptions = wscStatement.split('=')[1]; + giveAbilityBoostSingle(srcStruct, selectionOptions, locationID, extraData); + } else if(wscStatement.includes("GIVE-ABILITY-FLAW-SINGLE")){ + let selectionOptions = wscStatement.split('=')[1]; + giveAbilityBoostSingle(srcStruct, selectionOptions, locationID, extraData, true); + } else if(wscStatement.includes("GIVE-ABILITY-BOOST-MULTIPLE")){// GIVE-ABILITY-BOOST-MULTIPLE=3 + let numberOfBoosts = wscStatement.split('=')[1]; + giveAbilityBoostMultiple(srcStruct, numberOfBoosts, locationID, extraData); + } else { + displayError("Unknown statement (2-Boost): \'"+wscStatement+"\'"); + statementComplete('Boost - Unknown Statement'); + } + +} + +//////////////////////////////// Give Ability Boost - Single /////////////////////////////////// + +function giveAbilityBoostMultiple(srcStruct, numberOfBoosts, locationID, extraData) { + statementComplete('Boost - Multiple'); + if(numberOfBoosts > 6){ + displayError("Attempted to create more than 6 ability boosts!"); + } else { + let multiBoostCodeStr = ''; + for (let i = 0; i < numberOfBoosts; i++) { + multiBoostCodeStr += 'GIVE-ABILITY-BOOST-SINGLE=ALL\n'; + } + if(multiBoostCodeStr != ''){ + let newLocationID = locationID+'-BoostContent'; + $('#'+locationID).append('
'); + processCode( + multiBoostCodeStr, + srcStruct, + newLocationID, + extraData); + } + } +} + +function giveAbilityBoostSingle(srcStruct, selectionOptions, locationID, extraData, isFlaw=false){ + const boostFlaw = (isFlaw) ? 'Flaw' : 'Boost'; + + selectionOptions = selectionOptions.toUpperCase(); + + if(selectionOptions == "ALL"){ + displayAbilityBoostSingle(srcStruct, locationID, getAllAbilityTypes(), extraData, boostFlaw); + } else { + + let selectionOptionsArray = selectionOptions.split(","); + if(selectionOptionsArray.length < 8){ + let abilityTypes = []; + for(let selectionOption of selectionOptionsArray){ + let abilityType = lengthenAbilityType(selectionOption); + if(!abilityTypes.includes(abilityType)){ + abilityTypes.push(abilityType); + } + } + if(abilityTypes.length != 0){ + if(abilityTypes.length != 1) { + displayAbilityBoostSingle(srcStruct, locationID, abilityTypes, extraData, boostFlaw); + } else { + setDataAbilityBonus(srcStruct, shortenAbilityType(abilityTypes[0]), boostFlaw); + + // When boost is changed, reprocess Extra Ancestry Langs and Class Skill Trainings + processExtraSkillsAndLangs(); + // + + if(g_char_id != null){ + socket.emit("requestWSCAbilityBonusChange", + g_char_id, + srcStruct, + {Ability: shortenAbilityType(abilityTypes[0]), Bonus: boostFlaw}, + null); + } else { + saveBuildMetaData(); + } + removeUnselectedData(srcStruct); // Fixes bug with ability boost selector becoming no selector + statementComplete('Boost - Single'); + } + } else { + displayError("Attempted to produce an invalid ability boost! (2)"); + statementComplete('Boost - Error'); + } + } else { + displayError("Attempted to produce an invalid ability boost! (1)"); + statementComplete('Boost - Error'); + } + + } + + +} + +function displayAbilityBoostSingle(srcStruct, locationID, abilityTypes, extraData, boostFlaw){ + + let selectBoostID = "selectBoost-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectBoostSet = "selectBoostSet-"+locationID; + let selectBoostControlShellClass = selectBoostSet+'ControlShell'; + + const selectionTagInfo = getTagFromData(srcStruct, extraData.sourceName, 'Unselected Ability Boost', 'UNSELECTED'); + + $('#'+locationID).append(''); + + let selectBoost = $('#'+selectBoostID); + selectBoost.parent().parent().addClass('text-center'); + + if(srcStruct == g_keyAbility_SrcStruct){ + selectBoost.append(''); + } else { + selectBoost.append(''); + } + + selectBoost.append(''); + for(const ability of abilityTypes){ + selectBoost.append(''); + } + + let bonus = getDataSingleAbilityBonus(srcStruct); + if(bonus != null){ + let longAbilityType = lengthenAbilityType(bonus.Ability); + + $(selectBoost).val(longAbilityType); + if ($(selectBoost).val() != longAbilityType){ + $(selectBoost).val($("#"+selectBoostID+" option:first").val()); + $(selectBoost).parent().addClass("is-info"); + } + } else { + $(selectBoost).parent().addClass("is-info"); + } + + $(selectBoost).change(function(){ + + if(hasDuplicateSelected($('.'+selectBoostSet))){ + $('.'+selectBoostControlShellClass).addClass("is-danger"); + if($(this).val() != "chooseDefault"){ + $(this).parent().removeClass("is-info"); + } else { + $(this).parent().addClass("is-info"); + } + } else { + $('.'+selectBoostControlShellClass).removeClass("is-danger"); + $('.'+selectBoostControlShellClass).addClass("is-loading"); + + if($(this).val() != "chooseDefault"){ + $(this).parent().removeClass("is-info"); + if(srcStruct == g_keyAbility_SrcStruct){ + g_variableMap.get(VARIABLE.CLASS_DC).Value.AbilityScore = 'SCORE_'+shortenAbilityType($(this).val()); + } + setDataAbilityBonus(srcStruct, shortenAbilityType($(this).val()), boostFlaw); + + // When boost is changed, reprocess Extra Ancestry Langs and Class Skill Trainings + processExtraSkillsAndLangs(); + // + + if(g_char_id != null){ + socket.emit("requestWSCAbilityBonusChange", + g_char_id, + srcStruct, + {Ability: shortenAbilityType($(this).val()), Bonus: boostFlaw}, + selectBoostControlShellClass); + } else { + saveBuildMetaData(); + $('.'+selectBoostControlShellClass).removeClass("is-loading"); + $('.'+selectBoostControlShellClass+'>select').blur(); + } + } else { + $(this).parent().addClass("is-info"); + if(srcStruct == g_keyAbility_SrcStruct){ + g_variableMap.get(VARIABLE.CLASS_DC).Value.AbilityScore = VARIABLE.SCORE_NONE; + } + deleteData(DATA_SOURCE.ABILITY_BONUS, srcStruct); + + // When boost is changed, reprocess Extra Ancestry Langs and Class Skill Trainings + processExtraSkillsAndLangs(); + // + + if(g_char_id != null){ + socket.emit("requestWSCAbilityBonusChange", + g_char_id, + srcStruct, + null, + selectBoostControlShellClass); + } else { + saveBuildMetaData(); + $('.'+selectBoostControlShellClass).removeClass("is-loading"); + $('.'+selectBoostControlShellClass+'>select').blur(); + } + } + + } + + }); + + statementComplete('Boost - Single, Display'); + +} + +socket.on("returnWSCAbilityBonusChange", function(selectBoostControlShellClass){ + if(selectBoostControlShellClass != null){ + $('.'+selectBoostControlShellClass).removeClass("is-loading"); + $('.'+selectBoostControlShellClass+'>select').blur(); + } + selectorUpdated(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-charTags.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-charTags.js new file mode 100644 index 00000000..30b23b02 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-charTags.js @@ -0,0 +1,175 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Char Tags --------------------// +function processingCharTags(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-CHAR-TRAIT-NAME")){ // GIVE-CHAR-TRAIT-NAME=Elf + let charTagName = wscStatement.split('=')[1]; + giveCharTag(srcStruct, charTagName); + } else if(wscStatement.includes("GIVE-CHAR-TRAIT-COMMON")){ // GIVE-CHAR-TRAIT-COMMON + displayCharTagChoice(srcStruct, locationID, extraData, true); + } else if(wscStatement.includes("GIVE-CHAR-TRAIT")){ // GIVE-CHAR-TRAIT + displayCharTagChoice(srcStruct, locationID, extraData); + } else { + displayError("Unknown statement (2-CharTrait): \'"+wscStatement+"\'"); + statementComplete('CharTrait - Unknown Statement'); + } + +} + +//////////////////////////////// Give Char Tag /////////////////////////////////// + +function giveCharTag(srcStruct, charTagName){ + charTagName = capitalizeWords(charTagName); + + setData(DATA_SOURCE.CHAR_TRAIT, srcStruct, charTagName); + + if(g_char_id != null){ + socket.emit("requestCharTagChange", + g_char_id, + srcStruct, + charTagName); + } else { + saveBuildMetaData(); + } + + statementComplete('CharTrait - Give'); +} + +/* +socket.on("returnCharTagChange", function(charTagsArray){ + if($('#quickviewLeftDefault').hasClass('is-active')){ + openLeftQuickView('skillsView', null); + } + statementComplete('CharTrait - Change'); +}); +*/ + +//////////////////////////////// Give Char Tag Selector /////////////////////////////////// + +function displayCharTagChoice(srcStruct, locationID, extraData, commonOnly=false){ + + let selectCharTagID = "selectCharTag"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectCharTagControlShellClass = selectCharTagID+'ControlShell'; + + const selectionTagInfo = getTagFromData(srcStruct, extraData.sourceName, 'Unselected Option', 'UNSELECTED'); + + $('#'+locationID).append('
'); + + $('#'+selectCharTagID).append(''); + $('#'+selectCharTagID).append(''); + + let triggerChange = false; + // Set saved char trait choices + const charTagsData = getDataSingle(DATA_SOURCE.CHAR_TRAIT, srcStruct); + + let selectedCharTag = null; + if(charTagsData != null && charTagsData.value != null){ + selectedCharTag = charTagsData; + triggerChange = true; + } + + let sortedAncestriesMap = new Map([...g_ancestryMap.entries()].sort( + function(a, b) { + return a[1].Ancestry.name > b[1].Ancestry.name ? 1 : -1; + }) + ); + + if(commonOnly) { + + for(const [ancestryID, ancestryData] of sortedAncestriesMap.entries()){ + if(ancestryData.Ancestry.isArchived === 0 && ancestryData.Ancestry.rarity === 'COMMON'){ + $('#'+selectCharTagID).append(''); + } + } + $('#'+selectCharTagID).append(''); + for(const [ancestryID, ancestryData] of sortedAncestriesMap.entries()){ + if(ancestryData.Ancestry.isArchived === 0 && ancestryData.Ancestry.rarity !== 'COMMON'){ + $('#'+selectCharTagID).append(''); + } + } + + } else { + + for(const [ancestryID, ancestryData] of sortedAncestriesMap.entries()){ + if(ancestryData.Ancestry.isArchived === 0){ + $('#'+selectCharTagID).append(''); + } + } + + } + + if(selectedCharTag != null){ + $('#'+selectCharTagID).val(selectedCharTag.value); + if ($('#'+selectCharTagID).val() != selectedCharTag.value){ + $('#'+selectCharTagID).val('chooseDefault'); + $('#'+selectCharTagID).parent().addClass("is-info"); + } + } + + // On char tag choice change + $('#'+selectCharTagID).change(function(event, triggerSave, triggerReload) { + if(triggerReload == null){ triggerReload = true; } + + let charTagName = $(this).val(); + + if($(this).val() == "chooseDefault"){ + $('.'+selectCharTagControlShellClass).addClass("is-info"); + deleteData(DATA_SOURCE.CHAR_TRAIT, srcStruct); + + if(g_char_id != null){ + socket.emit("requestWSCCharTagChange", + g_char_id, + srcStruct, + null, + selectCharTagControlShellClass, + triggerReload); + } else { + saveBuildMetaData(); + } + + } else { + $('.'+selectCharTagControlShellClass).removeClass("is-info"); + + // Save char tag + if(triggerSave == null || triggerSave) { + $('.'+selectCharTagControlShellClass).addClass("is-loading"); + setData(DATA_SOURCE.CHAR_TRAIT, srcStruct, charTagName); + + if(g_char_id != null){ + socket.emit("requestWSCCharTagChange", + g_char_id, + srcStruct, + charTagName, + selectCharTagControlShellClass, + triggerReload); + } else { + saveBuildMetaData(); + } + } + + } + + }); + + $('#'+selectCharTagID).trigger("change", [triggerChange, false]); + + statementComplete('CharTrait - Display Choice'); + +} + +socket.on("returnWSCCharTagChange", function(charTagsArray, selectControlShellClass, triggerReload){ + if(selectControlShellClass != null) { + $('.'+selectControlShellClass).removeClass("is-loading"); + $('.'+selectControlShellClass+'>select').blur(); + } + selectorUpdated(); + + // Reload builder state, + if(triggerReload){ + animatedStateLoad(); + } + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-class-feature.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-class-feature.js new file mode 100644 index 00000000..2928f64e --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-class-feature.js @@ -0,0 +1,212 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Class Features -------------------------// +function processingClassFeatures(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-CLASS-FEATURE-NAME")){ // GIVE-CLASS-FEATURE-NAME=Polymath + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + value = value.split('[')[0]; + optionals = optionals[1].split(','); + } + let dontRunCode = (optionals != null && optionals.length > 0 && optionals[0].toUpperCase() == 'NO-CODE'); + giveClassFeatureByName(srcStruct, locationID, value, extraData, dontRunCode); + } else { + displayError("Unknown statement (2-ClassFeature): \'"+wscStatement+"\'"); + statementComplete('ClassFeature - Unknown Statement'); + } + +} + +//////////////////////////////// Give Class Feature /////////////////////////////////// + +function giveClassFeatureByName(srcStruct, locationID, featureName, extraData, dontRunCode=false){ + + if(g_char_id != null){ // TODO - Support builds + socket.emit("requestAddClassFeature", + g_char_id, + srcStruct, + featureName, + { locationID, sourceName: extraData.sourceName, dontRunCode }); + } + +} + +socket.on("returnAddClassFeature", function(srcStruct, classAbility, allClassAbilityOptions, inputPacket){ + console.log(`Waited for 'returnAddClassFeature'.`); + if(classAbility == null) { statementComplete('ClassFeature - Add Null'); return; } + + // TODO; return if classAbility removal and remove class features in allClassAbilityOptions that have had removal + + let classAbilityID = inputPacket.locationID+"-wsc-cf-"+srcStruct.sourceCodeSNum+"-classAbility"+classAbility.id; + let classAbilityHeaderID = inputPacket.locationID+"-wsc-cf-"+srcStruct.sourceCodeSNum+"-classAbilityHeader"+classAbility.id; + let classAbilityContentID = inputPacket.locationID+"-wsc-cf-"+srcStruct.sourceCodeSNum+"-classAbilityContent"+classAbility.id; + let classAbilityCodeID = inputPacket.locationID+"-wsc-cf-"+srcStruct.sourceCodeSNum+"-classAbilityCode"+classAbility.id; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+classAbilityID).length != 0) { statementComplete('ClassFeature - Add Error'); return; } + + $('#'+inputPacket.locationID).append('
'); + + /// + let classAbilitySection = $('#'+classAbilityID); + classAbilitySection.append(''+classAbility.name+''); + classAbilitySection.append('
'); + + /// + let classAbilityContent = $('#'+classAbilityContentID); + classAbilityContent.append(` +
+
${processText(classAbility.description, false, null)}
+ +
+ `); + + classAbilityContent.append('
'); + + /// + if(classAbility.selectType === 'SELECTOR') { + + let classAbilityOptionSelectorID = inputPacket.locationID+'-wsc-cf-'+srcStruct.sourceCodeSNum+'-classAbilSelection'+classAbility.id; + let descriptionID = classAbilityOptionSelectorID+'Description'; + let abilityCodeID = classAbilityOptionSelectorID+'Code'; + + const selectionTagInfo = getTagFromData(srcStruct, inputPacket.sourceName, 'Unselected Option', 'UNSELECTED'); + + let classAbilitySelectorInnerHTML = ''; + classAbilitySelectorInnerHTML += '
'; + classAbilitySelectorInnerHTML += ''; + classAbilitySelectorInnerHTML += '
'; + + classAbilitySelectorInnerHTML += ` + + `; + + classAbilityContent.append(classAbilitySelectorInnerHTML); + + + // Class Ability Option Selector // + $('#'+classAbilityOptionSelectorID).change(function(event, triggerSave){ + + let descriptionID = $(this).attr('id')+'Description'; + let abilityCodeID = $(this).attr('id')+'Code'; + $('#'+descriptionID).html(''); + $('#'+abilityCodeID).html(''); + + /* Don't use the class ability's normal srcStruct, use the code block's + let srcStruct = { + sourceType: 'class',// <- Issue here too with 2 classes + sourceLevel: classAbility.level, + sourceCode: 'classAbilitySelector-'+classAbility.id, + sourceCodeSNum: 'a', + };*/ + + if($(this).val() == "chooseDefault"){ + $(this).parent().addClass("is-info"); + $('#'+descriptionID).parent().parent().parent().parent().parent().addClass('is-hidden'); + + // Save ability choice + deleteData(DATA_SOURCE.CLASS_FEATURE_CHOICE, srcStruct); + + socket.emit("requestClassChoiceChange", + g_char_id, + srcStruct, + null, + false); + + } else { + $(this).parent().removeClass("is-info"); + $('#'+descriptionID).parent().parent().parent().parent().parent().removeClass('is-hidden'); + + let chosenAbilityID = $(this).val(); + + let chosenClassAbility = allClassAbilityOptions.find(classAbility => { + return classAbility.id == chosenAbilityID; + }); + + $('#'+descriptionID).html(processText(chosenClassAbility.description, false, null)); + + // Save ability choice + setDataClassChoice(srcStruct, classAbility.id+'', chosenAbilityID); + + socket.emit("requestClassChoiceChange", + g_char_id, + srcStruct, + { SelectorID : classAbility.id+'', OptionID : chosenAbilityID }, + false); + + if(inputPacket.dontRunCode) { + processCode( + 'ADD-TEXT=__You don’t gain any of this option’s other effects, just the class feature option itself.__', + srcStruct, + abilityCodeID, + {source: 'Extra Class Feature', sourceName: chosenClassAbility.name}); + } else { + // Run ability choice code + processCode( + chosenClassAbility.code, + srcStruct, + abilityCodeID, + {source: 'Extra Class Feature', sourceName: chosenClassAbility.name}); + } + + } + $(this).blur(); + selectorUpdated(); + }); + $('#'+classAbilityOptionSelectorID).trigger("change", [false]); + + } + + if(inputPacket.dontRunCode) { + processCode( + 'ADD-TEXT=__You don’t gain any of this class feature’s other effects, just the feature itself.__', + srcStruct, + classAbilityCodeID, + {source: 'Extra Class Feature', sourceName: classAbility.name}); + } else { + processCode( + classAbility.code, + srcStruct, + classAbilityCodeID, + {source: 'Extra Class Feature', sourceName: classAbility.name}); + } + + setData(DATA_SOURCE.EXTRA_CLASS_FEATURE, srcStruct, classAbility.id+':::'+inputPacket.dontRunCode, false); + + statementComplete('ClassFeature - Add'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-domains.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-domains.js new file mode 100644 index 00000000..1d0f860c --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-domains.js @@ -0,0 +1,202 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Domains --------------------// +function processingDomains(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-DOMAIN-ADVANCEMENT=")){ // GIVE-DOMAIN-ADVANCEMENT=Cleric + let spellSRC = wscStatement.split('=')[1]; + giveDomainAdvancement(srcStruct, locationID, spellSRC, extraData); + } else if(wscStatement.includes("GIVE-DOMAIN=")){ // GIVE-DOMAIN=Cleric + let spellSRC = wscStatement.split('=')[1]; + giveDomain(srcStruct, locationID, spellSRC, extraData); + } else { + displayError("Unknown statement (2-Domain): \'"+wscStatement+"\'"); + statementComplete('Domain - Unknown Statement'); + } + +} + +//////////////////////////////// Give Domain /////////////////////////////////// + +function giveDomain(srcStruct, locationID, spellSRC, extraData){ + + let selectID = "selectDomain-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectControlShellClass = selectID+'ControlShell'; + let descriptionID = "selectDomainDescription-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + + const selectionTagInfo = getTagFromData(srcStruct, extraData.sourceName, 'Unselected Domain', 'UNSELECTED'); + + $('#'+locationID).append('
'); + + $('#'+locationID).append('
'); + + $('#'+selectID).append(''); + $('#'+selectID).append(''); + + // Set saved domain choice + let savedDomainData = getDataSingle(DATA_SOURCE.DOMAIN, srcStruct); + + for(const domain of g_domains){ + + if(savedDomainData != null && savedDomainData.value == domain.id) { + $('#'+selectID).append(''); + } else { + $('#'+selectID).append(''); + } + + } + + // On select change + $('#'+selectID).change(function(event, triggerSave) { + + if($(this).val() == "chooseDefault"){ + + $('.'+selectControlShellClass).addClass("is-info"); + + $('#'+descriptionID).html(''); + + deleteData(DATA_SOURCE.DOMAIN, srcStruct); + + if(g_char_id != null){ + socket.emit("requestDomainChange", + g_char_id, + srcStruct, + null); + } else { + saveBuildMetaData(); + } + + } else { + + $('.'+selectControlShellClass).removeClass("is-info"); + + let domainID = $(this).val(); + let domain = g_domains.find(domain => { + return domain.id == domainID; + }); + + $('#'+descriptionID).html(processText(domain.description, false, null)); + + setData(DATA_SOURCE.DOMAIN, srcStruct, domain.id); + setData(DATA_SOURCE.FOCUS_SPELL, srcStruct, spellSRC+"="+domain.initialSpellID, false); + + if(g_char_id != null){ + socket.emit("requestDomainChange", + g_char_id, + srcStruct, + {Domain: domain, SpellSRC: spellSRC}); + } else { + saveBuildMetaData(); + } + + } + + $(this).blur(); + + }); + + $('#'+selectID).trigger("change", [false]); + + statementComplete('Domain - Display'); + +} + +socket.on("returnDomainChange", function(){ + selectorUpdated(); +}); + + +//////////////////////////////// Give Domain Advancement /////////////////////////////////// + +function giveDomainAdvancement(srcStruct, locationID, spellSRC, extraData){ + + let selectID = "selectDomainAdvancement-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectControlShellClass = selectID+'ControlShell'; + let descriptionID = "selectDomainAdvancementDescription-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + + const selectionTagInfo = getTagFromData(srcStruct, extraData.sourceName, 'Unselected Domain Advancement', 'UNSELECTED'); + + $('#'+locationID).append('
'); + + $('#'+locationID).append('
'); + + $('#'+selectID).append(''); + $('#'+selectID).append(''); + + // Set saved domain choice + const savedDomainData = getDataSingle(DATA_SOURCE.ADVANCED_DOMAIN, srcStruct); + + for(const domainData of getDataAll(DATA_SOURCE.DOMAIN)){ + + let domain = g_domains.find(domain => { + return domain.id == domainData.value; + }); + + if(savedDomainData != null && savedDomainData.value == domainData.value) { + $('#'+selectID).append(''); + } else { + $('#'+selectID).append(''); + } + + } + + // On select change + $('#'+selectID).change(function(event, triggerSave) { + + if($(this).val() == "chooseDefault"){ + + $('.'+selectControlShellClass).addClass("is-info"); + + $('#'+descriptionID).html(''); + + deleteData(DATA_SOURCE.ADVANCED_DOMAIN, srcStruct); + + if(g_char_id != null){ + socket.emit("requestDomainAdvancementChange", + g_char_id, + srcStruct, + null); + } else { + saveBuildMetaData(); + } + + } else { + + $('.'+selectControlShellClass).removeClass("is-info"); + + let domainID = $(this).val(); + let domain = g_domains.find(domain => { + return domain.id == domainID; + }); + + $('#'+descriptionID).html(processText(domain.description, false, null)); + + setData(DATA_SOURCE.ADVANCED_DOMAIN, srcStruct, domain.id); + setData(DATA_SOURCE.FOCUS_SPELL, srcStruct, spellSRC+"="+domain.advancedSpellID, false); + + if(g_char_id != null){ + socket.emit("requestDomainAdvancementChange", + g_char_id, + srcStruct, + {Domain: domain, SpellSRC: spellSRC}); + } else { + saveBuildMetaData(); + } + + } + + $(this).blur(); + + }); + + $('#'+selectID).trigger("change", [false]); + + statementComplete('Domain - Advancement Display'); + +} + +socket.on("returnDomainAdvancementChange", function(){ + selectorUpdated(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-familiarity.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-familiarity.js new file mode 100644 index 00000000..c8d3490e --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-familiarity.js @@ -0,0 +1,37 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Familiarities --------------------// +function processingFamiliarities(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-WEAPON-FAMILIARITY")){ // GIVE-WEAPON-FAMILIARITY=Goblin + let trait = wscStatement.split('=')[1]; + giveWeaponFamiliarity(srcStruct, trait); + } else { + displayError("Unknown statement (2-Familiarity): \'"+wscStatement+"\'"); + statementComplete('Familiarity - Unknown Statement'); + } + +} + +//////////////////////////////// Give Weapon Familiarity /////////////////////////////////// + +function giveWeaponFamiliarity(srcStruct, trait){ + + setData(DATA_SOURCE.WEAPON_FAMILIARITY, srcStruct, trait); + + if(g_char_id != null){ + socket.emit("requestWeaponFamiliarityChange", + g_char_id, + srcStruct, + trait); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnWeaponFamiliarityChange", function(){ + statementComplete('Familiarity - Add'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-feats.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-feats.js new file mode 100644 index 00000000..b7459ce1 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-feats.js @@ -0,0 +1,549 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Feats -------------------------// +function processingFeats(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-GENERAL-FEAT=")){ // GIVE-GENERAL-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = g_character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(g_character.level/2); + } else { + level = parseInt(value); + } + giveGeneralFeat(srcStruct, locationID, level, optionals, extraData); + } + else if(wscStatement.includes("GIVE-FEAT=")){ // GIVE-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = g_character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(g_character.level/2); + } else { + level = parseInt(value); + } + giveFeat(srcStruct, locationID, level, optionals, extraData); + } + else if(wscStatement.includes("GIVE-ANCESTRY-FEAT=")){ // GIVE-ANCESTRY-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = g_character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(g_character.level/2); + } else { + level = parseInt(value); + } + let charTagsArray = []; + for(let dataTag of getDataAll(DATA_SOURCE.CHAR_TRAIT)){ + charTagsArray.push(dataTag.value); + } + giveAncestryFeat(srcStruct, locationID, level, charTagsArray, optionals, extraData); + } + else if(wscStatement.includes("GIVE-CLASS-FEAT=")){ // GIVE-CLASS-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = g_character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(g_character.level/2); + } else { + level = parseInt(value); + } + let className = (getCharClass() != null) ? getCharClass().Class.name : null; + giveClassFeat(srcStruct, locationID, level, className, optionals, extraData); + } + else if(wscStatement.includes("GIVE-ARCHETYPE-FEAT=")){ // GIVE-ARCHETYPE-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = g_character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(g_character.level/2); + } else { + level = parseInt(value); + } + giveArchetypeFeat(srcStruct, locationID, level, optionals, extraData); + } + else if(wscStatement.includes("GIVE-SKILL-FEAT=")){ // GIVE-SKILL-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = g_character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(g_character.level/2); + } else { + level = parseInt(value); + } + giveSkillFeat(srcStruct, locationID, level, optionals, extraData); + } + else if(wscStatement.includes("GIVE-FEAT-FROM=")){ // GIVE-FEAT-FROM=Choose a Tradition:feat 1,feat 2,feat 2 + let value = wscStatement.split('=')[1]; + let valueParts = value.split(':'); + let chooseTitle = valueParts[0]; + let customListParts = valueParts[1].split(','); + giveFeatCustomList(srcStruct, locationID, chooseTitle, customListParts, extraData); + } + else if(wscStatement.includes("GIVE-FEAT-NAME=")){ // GIVE-FEAT-NAME=Ancestral_Paragon + let value = wscStatement.split('=')[1]; + + let featName = null; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + featName = value.split('[')[0]; + } else { + featName = value; + } + + featName = featName.replace(/_/g," "); + giveFeatByName(srcStruct, featName, locationID, optionals, extraData); + } else { + displayError("Unknown statement (2-Feat): \'"+wscStatement+"\'"); + statementComplete('Feat - Unknown Statement'); + } + +} + + +////////////////////////////////// Choose Feats ///////////////////////////////////////////// + +function giveFeatCustomList(srcStruct, locationID, chooseTitle, customList, extraData){ + + chooseTitle = capitalizeWords(chooseTitle).replace(/( The )/,' the ').replace(/( A )/,' a ').replace(/( An )/,' an '); + displayFeatChoice( + srcStruct, + locationID, + chooseTitle, + [], + 100, + [], + extraData, + 'AUTO_PAGE_LOAD', + customList + ); + + statementComplete('Feat - Give Custom List'); + +} + +function giveFeat(srcStruct, locationID, featLevel, optionalTags, extraData){ + + displayFeatChoice( + srcStruct, + locationID, + "Choose a Feat", + [], + featLevel, + optionalTags, + extraData + ); + + statementComplete('Feat - Give Generic'); + +} + +function giveGeneralFeat(srcStruct, locationID, featLevel, optionalTags, extraData){ + + displayFeatChoice( + srcStruct, + locationID, + "Choose a General Feat", + ["General"], + featLevel, + optionalTags, + extraData + ); + + statementComplete('Feat - Give General'); + +} + +function giveSkillFeat(srcStruct, locationID, featLevel, optionalTags, extraData){ + + displayFeatChoice( + srcStruct, + locationID, + "Choose a Skill Feat", + ["Skill"], + featLevel, + optionalTags, + extraData + ); + + statementComplete('Feat - Give Skill'); + +} + +function giveAncestryFeat(srcStruct, locationID, featLevel, charTagsArray, optionalTags, extraData){ + + if(charTagsArray.length == 0){ charTagsArray = ['No Ancestry Selected']; } + + displayFeatChoice( + srcStruct, + locationID, + "Choose an Ancestry Feat", + charTagsArray, + featLevel, + optionalTags, + extraData + ); + + statementComplete('Feat - Give Ancestry'); + +} + +function giveArchetypeFeat(srcStruct, locationID, featLevel, optionalTags, extraData){ + + giveClassFeat(srcStruct, locationID, featLevel, null, optionalTags, extraData, true); + +} + +function giveClassFeat(srcStruct, locationID, featLevel, className, optionalTags, extraData, isArchetypeOnlyFeat=false){ + + // Include sourceCodeSNum at the end for if a code field gives multiple class feats + let classFeatTabsID = locationID+'-classFeatTabs-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + let containerLocationID = locationID+'-ClassFeatContainer-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + + let classTabClass = locationID+'-classFeatClassTab-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + let archetypesTabClass = locationID+'-classFeatArchetypesTab-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + let dedicationTabClass = locationID+'-classFeatDedicationTab-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + + $('#'+locationID).append('
'); + let tabsContent = $('#'+classFeatTabsID); + tabsContent.html(''); // <- Fixes bug with multiple tabs being created + + if(!isArchetypeOnlyFeat) { + tabsContent.append('
  • '+((className == null) ? 'Unselected' : className)+' Class
  • '); + } + + let charArchetypesArray = []; + for(let featData of getDataAll(DATA_SOURCE.FEAT_CHOICE)){ + if(featData.value != null) { + let feat = g_featMap.get(featData.value+""); + if(feat != null){ + let dedicationTag = feat.Tags.find(featTag => { + return featTag.name === 'Dedication'; + }); + if(dedicationTag != null){ + charArchetypesArray.push(featData.value); + } + } + } + } + + for(let charArchetypeDedFeatID of charArchetypesArray){ + let archetype = g_archetypes.find(archetype => { + return archetype.dedicationFeatID == charArchetypeDedFeatID; + }); + if(archetype != null){ + tabsContent.append('
  • '+archetype.name+' Archetype
  • '); + } + } + + tabsContent.append('
  • Add Dedication
  • '); + + $('#'+locationID).append('
    '); + + if(!isArchetypeOnlyFeat) { + $('.'+classTabClass).click(function(event, autoPageLoad){ + event.stopImmediatePropagation(); + if (autoPageLoad != 'AUTO_PAGE_LOAD') { autoPageLoad = null; } + if($(this).parent().hasClass('is-active')) { return; } + + $('#'+containerLocationID).html(''); + $('#'+classFeatTabsID).find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + + displayFeatChoice( + srcStruct, + containerLocationID, + "Choose a Class Feat", + [( (className == null) ? 'No Class Selected' : className )], + featLevel, + optionalTags, + extraData, + autoPageLoad + ); + + }); + } + + $('.'+archetypesTabClass).click(function(event, autoPageLoad){ + event.stopImmediatePropagation(); + if (autoPageLoad != 'AUTO_PAGE_LOAD') { autoPageLoad = null; } + if($(this).parent().hasClass('is-active')) { return; } + + $('#'+containerLocationID).html(''); + $('#'+classFeatTabsID).find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + let archetypeName = $(this).attr('name'); + + displayFeatChoice( + srcStruct, + containerLocationID, + "Choose an Archetype Feat", + [archetypeName+' Archetype'], + featLevel, + optionalTags, + extraData, + autoPageLoad + ); + + }); + + $('.'+dedicationTabClass).click(function(event){ + event.stopImmediatePropagation(); + if($(this).parent().hasClass('is-active')) { return; } + + $('#'+containerLocationID).html(''); + $('#'+classFeatTabsID).find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + + displayFeatChoice( + srcStruct, + containerLocationID, + "Choose a Dedication", + ['Dedication'], + featLevel, + optionalTags, + extraData + ); + + }); + + let clickedTab = false; + let featData = getDataSingle(DATA_SOURCE.FEAT_CHOICE, srcStruct); + if(featData != null && featData.value != null){ + if(charArchetypesArray.includes(featData.value)){ + // Click Dedication Tab + $('.'+dedicationTabClass).trigger("click"); + clickedTab = true; + + // Remove Self-Archetype Tab + let archetype = g_archetypes.find(archetype => { + return archetype.dedicationFeatID == featData.value; + }); + if(archetype != null) { + let selfArchetypeTabClass = archetypesTabClass+'-'+archetype.name.replace(/\W/g,'_'); + $('#'+classFeatTabsID).find('.'+selfArchetypeTabClass).parent().remove(); + } + } else { + let feat = g_featMap.get(featData.value+""); + if(feat != null){ + for(let charArchetypeDedFeatID of charArchetypesArray){ + let archetype = g_archetypes.find(archetype => { + return archetype.dedicationFeatID == charArchetypeDedFeatID; + }); + if(archetype != null){ + let archetypeTag = feat.Tags.find(featTag => { + return featTag.name === archetype.name+' Archetype'; + }); + if(archetypeTag != null){ + // Click Archetype Tab + $('.'+archetypesTabClass+'-'+archetype.name.replace(/\W/g,'_')).trigger("click", ['AUTO_PAGE_LOAD']); + clickedTab = true; + break; + } + } + } + } + } + } + + if(!isArchetypeOnlyFeat) { + if(!clickedTab){ + $('.'+classTabClass).trigger("click", ['AUTO_PAGE_LOAD']); + } + } else { + if(!clickedTab){ + $('.'+dedicationTabClass).trigger("click", ['AUTO_PAGE_LOAD']); + } + } + + statementComplete('Feat - Give Class'); + +} + +function displayFeatChoice(srcStruct, locationID, selectionName, tagsArray, featLevel, optionalTags, extraData, + autoPageLoad = 'AUTO_PAGE_LOAD', customList = null) { + + // Make optional tags lowercase + if(optionalTags != null){ + for (let i = 0; i < optionalTags.length; i++) { + optionalTags[i] = optionalTags[i].toLowerCase().trim(); + } + } + // Make custom list feat names lowercase + if(customList != null){ + for (let i = 0; i < customList.length; i++) { + customList[i] = customList[i].toLowerCase().trim(); + } + } + + let className = (getCharClass() != null) ? getCharClass().Class.name : null; + + let featSelectionMap = new Map(); + for(const featStruct of g_featMap){ + let feat = featStruct[1]; + if(feat.Feat.level < 1 && customList == null){ continue; } + + // You cannot select the dedication for your own class + if(className != null && feat.Feat.name === className+' Dedication'){ continue; } + + let hasCorrectTags = false; + if(customList == null) { + let sameOpsTagsArray = []; + for(let featTag of feat.Tags){ + if(tagsArray.length > 0){ + if(tagsArray.includes(featTag.name)){ + hasCorrectTags = true; + } + } else { + hasCorrectTags = true; + } + if(optionalTags != null){ + let featTagNameLower = featTag.name.toLowerCase(); + if(optionalTags.includes(featTagNameLower)){ + sameOpsTagsArray.push(featTagNameLower); + } + } + } + if(optionalTags != null && hasCorrectTags){ + hasCorrectTags = (optionalTags.sort().join(',') === sameOpsTagsArray.sort().join(',')); + } + } else { + if(customList.includes(feat.Feat.name.toLowerCase())){ + hasCorrectTags = true; + } + } + + /* If feat is an archetype feat, has the skill trait, and tagsArray doesn't include the skill trait, + do not include feat. This follows the rule about archetype skill feats CRB pg. 219. + */ + if(!tagsArray.includes('Skill') && feat.Tags.find(tag => { return tag.name.includes(' Archetype'); }) != null && feat.Tags.find(tag => { return tag.name == 'Skill'; }) != null){ + hasCorrectTags = false; + } + + if(feat.Feat.level <= featLevel && hasCorrectTags){ + + let selectionArray = featSelectionMap.get(feat.Feat.level); + if(selectionArray == null) { selectionArray = []; } + selectionArray.push(feat); + featSelectionMap.set(feat.Feat.level, selectionArray); + + } + + } + + giveFeatSelection(locationID, srcStruct, selectionName, featSelectionMap, extraData.sourceName); + +} + + +//////////////////////////////// Give Feat (by Name) /////////////////////////////////// + +function giveFeatByName(srcStruct, featName, locationID, optionalTags, extraData){ + featName = featName.replace(/_/g," "); + featName = featName.replace(/’/g,"'"); + featName = featName.toUpperCase(); + + // Make optional tags lowercase + if(optionalTags != null){ + for (let i = 0; i < optionalTags.length; i++) { + optionalTags[i] = optionalTags[i].toLowerCase().trim(); + } + } + + let findFeatByNameAndTraits = function(){ + for(const [featID, featData] of g_featMap.entries()){ + if(featData.Feat.isArchived === 0) { + if(featData.Feat.name.toUpperCase() === featName){ + + if(optionalTags != null) { + let hasCorrectTags = false; + let sameOpsTagsArray = []; + for(let featTag of featData.Tags){ + let featTagNameLower = featTag.name.toLowerCase(); + if(optionalTags.includes(featTagNameLower)){ + sameOpsTagsArray.push(featTagNameLower); + } + } + hasCorrectTags = (optionalTags.sort().join(',') === sameOpsTagsArray.sort().join(',')); + + if(hasCorrectTags) { + return featData; + } + } else { + return featData; + } + } + } + } + return null; + }; + + let featEntry = findFeatByNameAndTraits(); + if(featEntry == null){ + if(!isFeatHidden(featName)){ + if(optionalTags != null) { + displayError("Cannot find feat with the given traits: \'"+featName+" ["+optionalTags+"]\'"); + } else { + displayError("Cannot find feat: \'"+featName+"\'"); + } + } + statementComplete('Feat - Give By Name Error'); + return; + } + + let featCodeSectionID = "featCode-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + $('#'+locationID).append('
    '); + + setDataOnly(DATA_SOURCE.FEAT_CHOICE, srcStruct, featEntry.Feat.id); + + if(g_char_id != null){ + socket.emit("requestFeatChangeByID", + g_char_id, + {srcStruct, feat: featEntry, codeLocationID: featCodeSectionID}); + } else { + saveBuildMetaData(); + } + + processCode( + featEntry.Feat.code, + srcStruct, + featCodeSectionID, + {source: 'Feat', sourceName: featEntry.Feat.name}); + + statementComplete('Feat - Give By Name'); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-heritage.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-heritage.js new file mode 100644 index 00000000..7d368d49 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-heritage.js @@ -0,0 +1,183 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Heritage Effects -------------------------// +function processingHeritageEffects(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-HERITAGE-EFFECTS-NAME")){ // GIVE-HERITAGE-EFFECTS-NAME=Ancient Elf + let value = wscStatement.split('=')[1]; + giveHeritageEffectsByName(srcStruct, locationID, value, extraData); + } else if(wscStatement.includes("GIVE-HERITAGE-EFFECTS-ANCESTRY")){ // GIVE-HERITAGE-EFFECTS-ANCESTRY=Elf + let value = wscStatement.split('=')[1]; + giveHeritageEffectsFindHeritages(srcStruct, locationID, value, extraData); + } else { + displayError("Unknown statement (2-HeritageEffects): \'"+wscStatement+"\'"); + statementComplete('Heritage - Unknown Statement'); + } + +} + + +//////////////////////////////// Give Heritage Effects Selection /////////////////////////////////// +function giveHeritageEffectsFindHeritages(srcStruct, locationID, ancestryName, extraData){ + + if(g_char_id != null){ // TODO - Support builds + socket.emit("requestFindHeritagesFromAncestryName", + g_char_id, + srcStruct, + ancestryName, + { locationID, sourceName: extraData.sourceName }); + } + +} + +socket.on("returnFindHeritagesFromAncestryName", function(srcStruct, heritages, inputPacket){ + console.log(`Waited for 'returnFindHeritagesFromAncestryName'.`); + + let selectHeritageEffectsID = "selectHeritageEffects-"+inputPacket.locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectHeritageEffectsControlShellClass = selectHeritageEffectsID+'-ControlShell'; + let selectHeritageEffectsDescriptionID = selectHeritageEffectsID+"-Description"; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+selectHeritageEffectsID).length != 0) { statementComplete('Heritage - Add Error'); return; } + + const selectionTagInfo = getTagFromData(srcStruct, inputPacket.sourceName, 'Unselected Heritage', 'UNSELECTED'); + + $('#'+inputPacket.locationID).append('
    '); + + $('#'+inputPacket.locationID).append('
    '); + + $('#'+selectHeritageEffectsID).append(''); + $('#'+selectHeritageEffectsID).append(''); + + // Get saved extra heritage + const savedHeritage = getDataSingle(DATA_SOURCE.EXTRA_HERITAGE, srcStruct); + + for(const heritage of heritages){ + if(savedHeritage != null && savedHeritage.value != null && savedHeritage.value == heritage.id) { + $('#'+selectHeritageEffectsID).append(''); + } else { + $('#'+selectHeritageEffectsID).append(''); + } + } + + // On heritage choice change + $('#'+selectHeritageEffectsID).change(function(event, triggerSave) { + + if($(this).val() == "chooseDefault"){ + + $('.'+selectHeritageEffectsControlShellClass).addClass("is-info"); + + $('#'+selectHeritageEffectsDescriptionID).html(''); + + // Save heritage effects + if(triggerSave == null || triggerSave) { + + deleteData(DATA_SOURCE.EXTRA_HERITAGE, srcStruct); + + socket.emit("requestHeritageEffectsChange", + g_char_id, + srcStruct, + null, + true); + } + + } else { + + $('.'+selectHeritageEffectsControlShellClass).removeClass("is-info"); + + $('#'+selectHeritageEffectsDescriptionID).html(''); + + let heritageID = $(this).val(); + + const heritage = heritages.find(heritage => { + return heritage.id == heritageID; + }); + + // Save heritage effects + if(triggerSave == null || triggerSave) { + + setData(DATA_SOURCE.EXTRA_HERITAGE, srcStruct, heritageID); + + socket.emit("requestHeritageEffectsChange", + g_char_id, + srcStruct, + heritageID, + true); + + socket.once("returnHeritageEffectsChange", function(){ + console.log(`Waited for 'returnHeritageEffectsChange'.`); + displayAndProcessHeritageEffects( + srcStruct, heritage, selectHeritageEffectsDescriptionID, inputPacket.sourceName); + }); + + } else { + + displayAndProcessHeritageEffects(srcStruct, heritage, selectHeritageEffectsDescriptionID, inputPacket.sourceName); + + } + + + } + + $(this).blur(); + + }); + + $('#'+selectHeritageEffectsID).trigger("change", [false]); + + statementComplete('Heritage - Add'); + +}); + + + + +function giveHeritageEffectsByName(srcStruct, locationID, heritageName, extraData) { + + if(g_char_id != null){ // TODO - Support builds + socket.emit("requestAddHeritageEffect", + g_char_id, + srcStruct, + heritageName, + { locationID, sourceName: extraData.sourceName }); + } + +} + +socket.on("returnAddHeritageEffect", function(srcStruct, heritage, inputPacket){ + console.log(`Waited for 'returnAddHeritageEffect'.`); + if(heritage == null) { statementComplete('Heritage - Add By Name Null'); return; } + + displayAndProcessHeritageEffects(srcStruct, heritage, inputPacket.locationID, inputPacket.sourceName); + + statementComplete('Heritage - Add By Name'); + +}); + + +function displayAndProcessHeritageEffects(srcStruct, heritage, locationID, sourceName){ + + let heritageLocationCodeID = locationID+'-heritageCode'; + + $('#'+locationID).append(` +
    +

    ${heritage.name}

    +
    +
    + ${processText(heritage.description, false, null)} +
    + +
    +
    +
    + `); + + processCode( + heritage.code, + srcStruct, + heritageLocationCodeID, + {source: sourceName, sourceName: 'Extra Heritage'}); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-keyAbility.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-keyAbility.js new file mode 100644 index 00000000..a81950e4 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-keyAbility.js @@ -0,0 +1,25 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +const g_keyAbility_SrcStruct = { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'keyAbility', + sourceCodeSNum: 'a' +}; + +//--------------------- Processing Key Ability --------------------// +function processingKeyAbilities(wscStatement, srcStruct, locationID, extraData){ + + // SET-KEY-ABILITY=ALL + // SET-KEY-ABILITY=INT,WIS,CHA + if(wscStatement.includes("SET-KEY-ABILITY")){ + let selectionOptions = wscStatement.split('=')[1]; + giveAbilityBoostSingle(g_keyAbility_SrcStruct, selectionOptions, locationID, extraData); + } else { + displayError("Unknown statement (2-KeyAbility): \'"+wscStatement+"\'"); + statementComplete('KeyAbility - Unknown Statement'); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-langs.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-langs.js new file mode 100644 index 00000000..c6089e46 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-langs.js @@ -0,0 +1,210 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Langs -------------------------// +function processingLangs(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-LANG-NAME")){ // GIVE-LANG-NAME=Elven + let langName = wscStatement.split('=')[1]; + giveLangByName(srcStruct, langName, extraData); + } + else if(wscStatement.includes("GIVE-LANG-BONUS-ONLY")){// GIVE-LANG-BONUS-ONLY + giveLang(srcStruct, locationID, extraData, true); + } + else if(wscStatement.includes("GIVE-LANG")){// GIVE-LANG + giveLang(srcStruct, locationID, extraData, false); + } else { + displayError("Unknown statement (2-Lang): \'"+wscStatement+"\'"); + statementComplete('Lang - Unknown Statement'); + } + +} + +//////////////////////////////// Give Lang /////////////////////////////////// + +function giveLang(srcStruct, locationID, extraData, bonusOnly){ + + let selectLangID = "selectLang"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectLangControlShellClass = selectLangID+'ControlShell'; + let langDescriptionID = selectLangID+"Description"; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+selectLangID).length != 0) { statementComplete('Lang - Add Null'); return; } + + const selectionTagInfo = getTagFromData(srcStruct, extraData.sourceName, 'Unselected Language', 'UNSELECTED'); + + $('#'+locationID).append('
    '); + + $('#'+locationID).append('
    '); + + $('#'+selectLangID).append(''); + $('#'+selectLangID).append(''); + + let availableLangsHTML = ''; + let nonAvailableLangsHTML = ''; + + // Set saved prof choices to savedProfData + let savedLang = getDataSingle(DATA_SOURCE.LANGUAGE, srcStruct); + + let sortedLangArray = g_allLanguages.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + for(const lang of sortedLangArray){ + + let langIsBonus = false; + if(bonusOnly){ + let currentAncestry = getCharAncestry(); + if(currentAncestry != null){ + let bonusLang = currentAncestry.BonusLanguages.find(l => { + return l.id == lang.id; + }); + langIsBonus = (bonusLang != null); + } + } + + if(savedLang != null && savedLang.value != null && savedLang.value == lang.id) { + if(bonusOnly && !langIsBonus){ + nonAvailableLangsHTML += ''; + } else { + availableLangsHTML += ''; + } + } else { + if(bonusOnly && !langIsBonus){ + nonAvailableLangsHTML += ''; + } else { + availableLangsHTML += ''; + } + } + + } + + $('#'+selectLangID).append(availableLangsHTML); + if(bonusOnly){ + $('#'+selectLangID).append(''); + $('#'+selectLangID).append(nonAvailableLangsHTML); + } + + // On lang choice change + $('#'+selectLangID).change(function(event, triggerSave) { + + if($(this).val() == "chooseDefault"){ + + $('.'+selectLangControlShellClass).removeClass("is-danger"); + $('.'+selectLangControlShellClass).addClass("is-info"); + + deleteData(DATA_SOURCE.LANGUAGE, srcStruct); + + if(g_char_id != null){ + socket.emit("requestLanguageChange", + g_char_id, + srcStruct, + null); + } else { + saveBuildMetaData(); + } + + } else { + + $('.'+selectLangControlShellClass).removeClass("is-danger"); + $('.'+selectLangControlShellClass).removeClass("is-info"); + + let langID = $(this).val(); + + // Save lang + if(triggerSave == null || triggerSave) { + + if(!checkDuplicateLang(langID)) { + + $('#'+langDescriptionID).html(''); + + setDataLanguage(srcStruct, langID); + + if(g_char_id != null){ + socket.emit("requestLanguageChange", + g_char_id, + srcStruct, + langID); + } else { + saveBuildMetaData(); + } + + } else { + $('.'+selectLangControlShellClass).addClass("is-danger"); + + $('#'+langDescriptionID).html('

    You already know this language!

    '); + + } + + } else { + + $('#'+langDescriptionID).html(''); + + setDataLanguage(srcStruct, langID); + + if(g_char_id != null){ + socket.emit("requestLanguageChange", + g_char_id, + srcStruct, + langID); + } else { + saveBuildMetaData(); + } + + } + + } + + $(this).blur(); + + }); + + $('#'+selectLangID).trigger("change", [false]); + + statementComplete('Lang - Add'); + +} + +socket.on("returnLanguageChange", function(){ + selectorUpdated(); +}); + +function checkDuplicateLang(langID){ + for(const [key, data] of variables_getExtrasMap(VARIABLE.LANGUAGES).entries()){ + if(data.Value == langID){ + return true; + } + } + return false; +} + +//////////////////////////////// Give Lang (by Lang Name) /////////////////////////////////// + +function giveLangByName(srcStruct, langName, extraData){ + + let language = g_allLanguages.find(language => { + return language.name.toUpperCase() == langName.toUpperCase(); + }); + if(language != null){ + setDataLanguage(srcStruct, language.id); + } + + if(g_char_id != null){ + if(language != null){ + socket.emit("requestLanguageChangeByID", + g_char_id, + srcStruct, + language.id); + } else { + console.error('Could not find language: '+langName); + } + } else { + saveBuildMetaData(); + } + + statementComplete('Lang - Add By Name'); + +} diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-lore.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-lore.js new file mode 100644 index 00000000..ad1e532f --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-lore.js @@ -0,0 +1,152 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Lore --------------------// +function processingLore(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-LORE=")){ // GIVE-LORE=Sailing + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + + giveLore(srcStruct, segments[0], extraData, segments[1]); + } else if(wscStatement.includes("GIVE-LORE-CHOOSE-INCREASING")){ // GIVE-LORE-CHOOSE-INCREASING + giveLoreChooseIncreasing(srcStruct, locationID, extraData); + } else if(wscStatement.includes("GIVE-LORE-CHOOSE")){ // GIVE-LORE-CHOOSE + giveLoreChoose(srcStruct, locationID, extraData); + } else { + displayError("Unknown statement (2-Lore): \'"+wscStatement+"\'"); + statementComplete('Lore - Unknown Statement'); + } + +} + +//////////////////////////////// Give Lore Choose /////////////////////////////////// + +function giveLoreChooseIncreasing(srcStruct, locationID, extraData){ + // At 3rd, 7th, and 15th level automatically increase lore + let charLevel = g_character.level; + if(charLevel >= 15){ + giveLoreChoose(srcStruct, locationID, extraData, 'L'); + } else if(charLevel >= 7){ + giveLoreChoose(srcStruct, locationID, extraData, 'M'); + } else if(charLevel >= 3){ + giveLoreChoose(srcStruct, locationID, extraData, 'E'); + } else { + giveLoreChoose(srcStruct, locationID, extraData, 'T'); + } +} + +function giveLoreChoose(srcStruct, locationID, extraData, prof='T'){ + + let inputLoreID = "inputLore"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let inputLoreControlShell = inputLoreID+'ControlShell'; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+inputLoreID).length != 0) { statementComplete('Lore - Add Null'); return; } + + $('#'+locationID).append('
    '); + + // Set saved lore input data + let savedLoreData = getDataSingle(DATA_SOURCE.LORE, srcStruct); + + + $('#'+inputLoreID).change(function(event, isAutoLoad){ + isAutoLoad = (isAutoLoad == null) ? false : isAutoLoad; + + if($(this).val() == ''){ + + $(this).addClass("is-info"); + $(this).removeClass("is-danger"); + + deleteData(DATA_SOURCE.LORE, srcStruct); + deleteData(DATA_SOURCE.PROFICIENCY, srcStruct); + + if(g_char_id != null){ + $('#'+inputLoreControlShell).addClass("is-loading"); + socket.emit("requestLoreChange", + g_char_id, + srcStruct, + null, + { ControlShellID: inputLoreControlShell, isAutoLoad}, + prof, + extraData.sourceName); + } else { + saveBuildMetaData(); + } + + } else { + + let validNameRegex = /^[A-Za-z0-9 \-_']+$/; + if(validNameRegex.test($(this).val())) { + $(this).removeClass("is-danger"); + $(this).removeClass("is-info"); + + let loreName = $(this).val().toUpperCase(); + + setData(DATA_SOURCE.LORE, srcStruct, loreName); + setDataProficiencies(srcStruct, 'Skill', loreName+'_LORE', prof, extraData.sourceName, false); + + if(g_char_id != null){ + $('#'+inputLoreControlShell).addClass("is-loading"); + socket.emit("requestLoreChange", + g_char_id, + srcStruct, + loreName, + { ControlShellID: inputLoreControlShell, isAutoLoad}, + prof, + extraData.sourceName); + } else { + saveBuildMetaData(); + } + + } else { + $(this).addClass("is-danger"); + $(this).removeClass("is-info"); + } + + } + + }); + + if(savedLoreData != null){ + $('#'+inputLoreID).val(capitalizeWords(savedLoreData.value)); + } + $('#'+inputLoreID).trigger("change", [true]); + + statementComplete('Lore - Add'); + +} + +//////////////////////////////// Give Lore /////////////////////////////////// + +function giveLore(srcStruct, loreName, extraData, altAbilityScore=null){ + + setData(DATA_SOURCE.LORE, srcStruct, loreName); + setDataProficiencies(srcStruct, 'Skill', loreName+'_LORE', 'T', extraData.sourceName, false); + + if(g_char_id != null){ + socket.emit("requestLoreChange", + g_char_id, + srcStruct, + loreName, + null, + 'T', + extraData.sourceName, + altAbilityScore); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnLoreChange", function(srcStruct, loreName, inputPacket, prof){ + + if(inputPacket != null){ + $('#'+inputPacket.ControlShellID).removeClass("is-loading"); + selectorUpdated(); + } else { + statementComplete('Lore - Add By Name'); + } + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-notes.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-notes.js new file mode 100644 index 00000000..c652b592 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-notes.js @@ -0,0 +1,76 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Notes --------------------// +function processingNotes(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-NOTES-FIELD")){ // GIVE-NOTES-FIELD=Placeholder Text + let placeholderText = wscStatement.split('=')[1]; // - Displays notes field for feats and class abilities + giveNotesField(srcStruct, placeholderText, locationID, extraData); + } else { + displayError("Unknown statement (2-Notes): \'"+wscStatement+"\'"); + statementComplete('Notes - Unknown Statement'); + } + +} + +//////////////////////////////// Give Notes Field /////////////////////////////////// + +function giveNotesField(srcStruct, placeholderText, locationID, extraData){ + placeholderText = capitalizeWord(placeholderText); + + setData(DATA_SOURCE.NOTES_FIELD, srcStruct, 'StoredNoteField'); + + if(g_char_id != null){ + socket.emit("requestNotesFieldChange", + g_char_id, + srcStruct, + placeholderText, + { locationID, sourceName: extraData.sourceName }); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnNotesFieldChange", function(notesData, noteChangePacket){ + console.log(`Waited for 'returnNotesFieldChange'.`); + statementComplete('Notes - Add'); + if(noteChangePacket == null) { return; } + + let placeholderText = noteChangePacket.sourceName+' - '+notesData.placeholderText; + let notesText = notesData.text; + + let notesFieldID = g_char_id+'-notesField-'+notesData.sourceType+'-'+notesData.sourceLevel+'-'+notesData.sourceCode+'-'+notesData.sourceCodeSNum; + let notesFieldControlShellID = notesFieldID+'ControlShell'; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+notesFieldID).length != 0) { return; } + + $('#'+noteChangePacket.locationID).append('
    '); + + $("#"+notesFieldID).blur(function(){ + if(notesData.text != $(this).val()) { + + $("#"+notesFieldControlShellID).addClass("is-loading"); + + notesData.text = $(this).val(); + + if(g_char_id != null){ + socket.emit("requestNotesFieldSave", + g_char_id, + notesData, + notesFieldControlShellID); + } else { + saveBuildMetaData(); + } + + } + }); + +}); + +socket.on("returnNotesFieldSave", function(notesFieldControlShellID){ + $("#"+notesFieldControlShellID).removeClass("is-loading"); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-phyFeats.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-phyFeats.js new file mode 100644 index 00000000..db778a9c --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-phyFeats.js @@ -0,0 +1,44 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Physical Features --------------------// +function processingPhysicalFeatures(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-PHYSICAL-FEATURE-NAME")){ // GIVE-PHYSICAL-FEATURE-NAME=Tusks + let phyFeatName = wscStatement.split('=')[1]; + givePhysicalFeature(srcStruct, phyFeatName); + } else { + displayError("Unknown statement (2-PhyFeat): \'"+wscStatement+"\'"); + statementComplete('PhyFeat - Unknown Statement'); + } + +} + +//////////////////////////////// Give Physical Feature /////////////////////////////////// + +function givePhysicalFeature(srcStruct, phyFeatName){ + + let phyFeat = g_allPhyFeats.find(phyFeat => { + return phyFeat.name.toUpperCase() == phyFeatName.toUpperCase(); + }); + if(phyFeat != null){ + setDataOnly(DATA_SOURCE.PHYSICAL_FEATURE, srcStruct, phyFeat.id); + } + + if(g_char_id != null){ + if(phyFeat != null){ + socket.emit("requestPhysicalFeaturesChangeByID", + g_char_id, + srcStruct, + phyFeat.id); + } else { + console.error('Could not find phyFeat: '+phyFeatName); + } + } else { + saveBuildMetaData(); + } + + statementComplete('PhyFeat - Add By ID'); + +} diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-profs.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-profs.js new file mode 100644 index 00000000..426d579d --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-profs.js @@ -0,0 +1,200 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Lore --------------------// +function processingProf(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-PROF-INCREASE-IN")){// GIVE-PROF-INCREASE-IN=Arcana + let profName = wscStatement.split('=')[1]; + giveProfIncrease(srcStruct, profName, locationID, extraData); + } else if(wscStatement.includes("GIVE-PROF-IN")){// GIVE-PROF-IN=Arcana:T + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveProf(srcStruct, segments[0], segments[1], locationID, extraData); + } else { + displayError("Unknown statement (2-Prof): \'"+wscStatement+"\'"); + statementComplete('Prof - Unknown Statement'); + } + +} + +//////////////////////////////// Give Prof /////////////////////////////////// + +function giveProfIncrease(srcStruct, profName, locationID, extraData){ + giveInProf(srcStruct, profName, 'UP', locationID, extraData); +} + +function giveProf(srcStruct, profName, prof, locationID, extraData){ + if(prof === 'T'){ + giveProfSkillTraining(srcStruct, profName, prof, locationID, extraData); + } else { + giveInProf(srcStruct, profName, prof, locationID, extraData); + } +} + +function giveProfSkillTraining(srcStruct, profName, prof, locationID, extraData){ + + let adjProfName = profName.replace(/\s+/g,""); + let profProperName = null; + let profCategory = null; + + let profData = g_profConversionMap.get(adjProfName); + if(profData != null){ + profProperName = profData.Name; + profCategory = profData.Category; + } + + let numUps = profToNumUp(prof); + if(numUps === -1){ + displayError("Not a proficiency type: \'"+prof+"\'"); + statementComplete('Prof - Add Skill Error, not prof type'); + return; + } + + if(profCategory === 'Skill'){ + + for(const [profName, profDataArray] of getProfMap()){ + const varName = profConversion_convertOldNameToVarName(profName); + const profNumUps = profToNumUp(variables_getFinalRank(varName)); + if((adjProfName == varName || profConversion_convertOldNameToVarName(adjProfName) == varName) && profNumUps >= numUps){ + if(!hasSameSrcIterate(srcStruct, profDataArray)){ + processCode( + 'GIVE-SKILL='+prof, + srcStruct, + locationID, + extraData); + window.setTimeout(() => { + $('#'+locationID).append('

    You are already trained in '+profName+' which means you can select a new skill to become trained in instead.

    '); + }, 100); + statementComplete('Prof - Add Skill, already has'); + return; + } + + } + } + + setDataProficiencies(srcStruct, profCategory, profProperName, prof, extraData.sourceName); + + if(g_char_id != null){ + socket.emit("requestProficiencyChange", + g_char_id, + {srcStruct, isSkill : true, isStatement : true}, + { For : profCategory, To : profProperName, Prof : prof, SourceName : extraData.sourceName }); + } else { + saveBuildMetaData(); + } + + displayProfChange(locationID, prof, profProperName); + + selectorUpdated(); + statementComplete('Prof - Add Skill'); + return; + + } else { + giveInProf(srcStruct, profName, prof, locationID, extraData); + return; + } + +} + +function giveInProf(srcStruct, profName, prof, locationID, extraData){ + + let profProperName = null; + let profCategory = null; + + if(profName.startsWith('LORE~')){ + profName = profName.replace(/LORE\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase()+'_LORE'; + profCategory = 'Skill'; + } + + if(profName.startsWith('WEAPON~')){ + profName = profName.replace(/WEAPON\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase(); + profCategory = 'Attack'; + } + + if(profName.startsWith('ARMOR~')){ + profName = profName.replace(/ARMOR\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase(); + profCategory = 'Defense'; + } + + if(profName.startsWith('GROUP~')){ + profName = profName.replace(/GROUP\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase(); + profCategory = 'Group'; + } + + if(profName.startsWith('TRAIT~')){ + profName = profName.replace(/TRAIT\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase(); + profCategory = 'Trait'; + } + + profName = profName.replace(/\s+/g,''); + let profData = g_profConversionMap.get(profName); + if(profData != null){ + profProperName = profData.Name; + profCategory = profData.Category; + } + + let isSkill = false; + if(profCategory === 'Skill'){ + isSkill = true; + } + + if(profProperName != null && profCategory != null){ + if(isSkill){ + //skillsUpdateWSCChoiceStruct(srcStruct, profProperName, prof); + } + setDataProficiencies(srcStruct, profCategory, profProperName, prof, extraData.sourceName); + + if(g_char_id != null){ + socket.emit("requestProficiencyChange", + g_char_id, + {srcStruct, isSkill : isSkill, isStatement : true}, + { For : profCategory, To : profProperName, Prof : prof, SourceName : extraData.sourceName }); + } else { + saveBuildMetaData(); + } + + displayProfChange(locationID, prof, profProperName); + + if(isSkill){ + selectorUpdated(); + } + statementComplete('Prof - Add'); + } else { + displayError("Unknown proficiency: \'"+profName+"\'"); + statementComplete('Prof - Add Error, not prof type'); + } + +} + +function displayProfChange(locationID, prof, profName){ + if(locationID == 'profSkillsCode-'+temp_classNum) { return; }// Skip for init skill profs from class + window.setTimeout(() => { + let innerHTML = '

    Proficiency Change: You become '+profToWord(prof).toLowerCase()+' in '+profName.toLowerCase().replace(/_/g,' ').replace('class dc', 'your class DC').replace('spellattacks', ' spell attacks').replace('spelldcs', ' spell DCs')+'.

    '; + if($('#'+locationID).html() != null && !$('#'+locationID).html().includes(innerHTML)) { $('#'+locationID).append(innerHTML); } + }, 100); +} + + + +/* +socket.on("returnProficiencyChange", function(profChangePacket){ + + if(profChangePacket.isSkill){ + + selectorUpdated(); + if(profChangePacket.isAutoLoad == null || !profChangePacket.isAutoLoad) { + //updateSkillMap(true); + } + } + if(profChangePacket.isStatement != null && profChangePacket.isStatement){ + statementComplete('Prof - Add'); + } + +});*/ diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-resistances.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-resistances.js new file mode 100644 index 00000000..e827a379 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-resistances.js @@ -0,0 +1,63 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Resistances ------------------------// +function processingResistances(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-RESISTANCE")){// GIVE-RESISTANCE=cold:HALF_LEVEL/LEVEL/3 + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveResistance(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("GIVE-WEAKNESS")){// GIVE-WEAKNESS=cold:HALF_LEVEL/LEVEL/3 + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveVulnerability(srcStruct, segments[0], segments[1]); + } else { + displayError("Unknown statement (2-Resist/Weak): \'"+wscStatement+"\'"); + statementComplete('Resist/Weak - Unknown Statement'); + } + +} + +//////////////////////////////// Give Resistance /////////////////////////////////// +function giveResistance(srcStruct, resistType, resistAmount){ + + setDataResistance(srcStruct, resistType, resistAmount); + + if(g_char_id != null){ + socket.emit("requestResistanceChange", + g_char_id, + srcStruct, + resistType, + resistAmount); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnResistanceChange", function(data){ + statementComplete('Resist - Add'); +}); + +//////////////////////////////// Give Vulnerability /////////////////////////////////// +function giveVulnerability(srcStruct, vulnerableType, vulnerableAmount){ + + setDataVulnerability(srcStruct, vulnerableType, vulnerableAmount); + + if(g_char_id != null){ + socket.emit("requestVulnerabilityChange", + g_char_id, + srcStruct, + vulnerableType, + vulnerableAmount); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnVulnerabilityChange", function(data){ + statementComplete('Weak - Add'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-scfs.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-scfs.js new file mode 100644 index 00000000..1d368497 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-scfs.js @@ -0,0 +1,164 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing SCFS -------------------------// +function processingSCFS(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-SCFS=")){ // GIVE-SCFS=Class Feature Selector Name:WSC Statement Name + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + createSCFS(srcStruct, locationID, segments[0], segments[1], extraData); + } else { + displayError("Unknown statement (2-SCFS): \'"+wscStatement+"\'"); + statementComplete('SCFS - Unknown Statement'); + } + +} + +//////////////////////////////// Create SCFS /////////////////////////////////// + +function createSCFS(srcStruct, locationID, featureName, statementName, extraData){ + + if(g_char_id != null){// TODO - Support builds + socket.emit("requestFindClassFeatureForSCFS", + g_char_id, + featureName, + { locationID, srcStruct, statementName, sourceName: extraData.sourceName }); + } + +} + +socket.on("returnFindClassFeatureForSCFS", function(classFeature, allClassFeatureOptions, inputPacket){ + console.log(`Waited for 'returnFindClassFeatureForSCFS'.`); + if(classFeature == null) { statementComplete('SCFS - Add Null'); return; } + + + let scfsID = "scfs-"+inputPacket.locationID+"-"+inputPacket.srcStruct.sourceCode+"-"+inputPacket.srcStruct.sourceCodeSNum; + let scfsCodeID = scfsID+"-Code"; + let scfsControlShellClass = scfsID+'-ControlShell'; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+scfsID).length != 0) { statementComplete('SCFS - Add Error'); return; } + + const selectionTagInfo = getTagFromData(inputPacket.srcStruct, inputPacket.sourceName, 'Unselected Option', 'UNSELECTED'); + + $('#'+inputPacket.locationID).append('
    '); + + $('#'+scfsID).append(''); + $('#'+scfsID).append(''); + + /// + + //Get saved SCFS + const SCFSData = getDataSingle(DATA_SOURCE.SCFS, inputPacket.srcStruct); + + let selectedClassFeatureOption = null; + if(SCFSData != null && SCFSData.value != null){ + selectedClassFeatureOption = allClassFeatureOptions.find(classFeatureOption => { + return classFeatureOption.id == SCFSData.value; + }); + } + + /// + + let optionsMap = new Map(); // { option ID } -> { WSC statement } + + for(const classFeatureOption of allClassFeatureOptions) { + if(classFeatureOption.selectType === 'SELECT_OPTION' && (classFeatureOption.selectOptionFor === classFeature.id || classFeatureOption.indivClassAbilName === classFeature.name)) { + + const codeStatements = classFeatureOption.code.split(/\n/); + const wscStatement = codeStatements.find(statement => { + return statement.startsWith(inputPacket.statementName); + }); + + if(wscStatement != null){ + + if(selectedClassFeatureOption != null && selectedClassFeatureOption.id == classFeatureOption.id) { + $('#'+scfsID).append(''); + } else { + $('#'+scfsID).append(''); + } + + optionsMap.set(classFeatureOption.id+"", wscStatement); + + } + + } + } + + /// + + $('#'+scfsID).change(function() { + + let classFeatureOptionID = $(this).val(); + let wscStatement = optionsMap.get(classFeatureOptionID+""); + + if($(this).val() == "chooseDefault"){ + $('.'+scfsControlShellClass).addClass("is-info"); + + // Clear generated code + $('#'+scfsCodeID).html(''); + + deleteData(DATA_SOURCE.SCFS, inputPacket.srcStruct); + + // Delete SCFS + socket.emit("requestSCFSChange", + g_char_id, + inputPacket.srcStruct, + null, + { + wscStatement: null, + scfsControlShellClass, + srcStruct: inputPacket.srcStruct, + locationID: scfsCodeID, + sourceName: inputPacket.sourceName, + }); + + } else { + $('.'+scfsControlShellClass).removeClass("is-info"); + + // Clear generated code + $('#'+scfsCodeID).html(''); + + setData(DATA_SOURCE.SCFS, inputPacket.srcStruct, classFeatureOptionID); + + // Save SCFS + $('.'+scfsControlShellClass).addClass("is-loading"); + socket.emit("requestSCFSChange", + g_char_id, + inputPacket.srcStruct, + classFeatureOptionID, + { + wscStatement, + scfsControlShellClass, + srcStruct: inputPacket.srcStruct, + locationID: scfsCodeID, + sourceName: inputPacket.sourceName, + }); + + } + + }); + + $('#'+scfsID).trigger("change"); + + statementComplete('SCFS - Add'); + +}); + + +socket.on("returnSCFSChange", function(inputPacket){ + if(inputPacket.scfsControlShellClass != null) { + $('.'+inputPacket.scfsControlShellClass).removeClass("is-loading"); + $('.'+inputPacket.scfsControlShellClass+'>select').blur(); + selectorUpdated(); + } + if(inputPacket.wscStatement != null){ + processCode( + inputPacket.wscStatement, + inputPacket.srcStruct, + inputPacket.locationID, + {source: 'SCFS', sourceName: inputPacket.sourceName}); + } +}); diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-senses.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-senses.js new file mode 100644 index 00000000..cb62c003 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-senses.js @@ -0,0 +1,45 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Senses --------------------// +function processingSenses(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-SENSE-NAME")){ // GIVE-SENSE-NAME=Darkvision + let senseName = wscStatement.split('=')[1]; + giveSense(srcStruct, senseName); + } else { + displayError("Unknown statement (2-Sense): \'"+wscStatement+"\'"); + statementComplete('Sense - Unknown Statement'); + } + +} + +//////////////////////////////// Give Sense /////////////////////////////////// + +function giveSense(srcStruct, senseName){ + if(senseName.trim() == ''){ return; } + + let sense = g_allSenses.find(sense => { + return sense.name.toUpperCase() == senseName.toUpperCase(); + }); + if(sense != null){ + setDataOnly(DATA_SOURCE.SENSE, srcStruct, sense.id); + } + + if(g_char_id != null){ + if(sense != null){ + socket.emit("requestSensesChangeByID", + g_char_id, + srcStruct, + sense.id); + } else { + console.error('Could not find sense: '+senseName); + } + } else { + saveBuildMetaData(); + } + + statementComplete('Sense - Add By ID'); + +} diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-skills.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-skills.js new file mode 100644 index 00000000..8679af46 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-skills.js @@ -0,0 +1,259 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Skills -------------------------// +function processingSkills(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-SKILL-INCREASE")){// GIVE-SKILL-INCREASE + giveSkillIncrease(srcStruct, locationID, extraData); + } + else if(wscStatement.includes("GIVE-SKILL")){// GIVE-SKILL=T[arcana,deception] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + value = value.split('[')[0]; + optionals = optionals[1].split(','); + } + giveSkillProf(srcStruct, locationID, extraData, value, optionals); + } else { + displayError("Unknown statement (2-Skill): \'"+wscStatement+"\'"); + statementComplete('Skill - Unknown Statement'); + } + +} + +//////////////////////////////// Skill Increase /////////////////////////////////// + +function giveSkillIncrease(srcStruct, locationID, extraData){ + giveSkill(srcStruct, locationID, extraData, 'UP'); +} + +function giveSkillProf(srcStruct, locationID, extraData, prof, optionals){ + giveSkill(srcStruct, locationID, extraData, prof, optionals); +} + +function giveSkill(srcStruct, locationID, extraData, profType, optionals=null){ + + let selectIncreaseID = "selectIncrease-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectIncreaseControlShellClass = selectIncreaseID+'ControlShell'; + let increaseDescriptionID = "selectIncreaseDescription-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let increaseCodeID = "selectIncreaseCode-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+selectIncreaseID).length != 0) { statementComplete('Skill - Add Error'); return; } + + const selectionTagInfo = getTagFromData(srcStruct, extraData.sourceName, 'Unselected Skill', 'UNSELECTED'); + + let optionalsString = JSON.stringify(optionals).replace(/"/g, '`'); + $('#'+locationID).append('
    '); + + $('#'+locationID).append('
    '); + $('#'+locationID).append('
    '); + + populateSkillLists(selectIncreaseID, srcStruct, profType, optionals); + + // On click (open) of selectIncrease, re-populate skill list + $('#'+selectIncreaseID).click(function() { + populateSkillLists(selectIncreaseID, srcStruct, profType, optionals); + }); + + // On increase choice change + $('#'+selectIncreaseID).change(function(event, isAutoLoad) { + $('#'+increaseCodeID).html(''); + isAutoLoad = (isAutoLoad == null) ? false : isAutoLoad; + + if($(this).val() == "chooseDefault"){ + + $('.'+selectIncreaseControlShellClass).removeClass("is-danger"); + $('.'+selectIncreaseControlShellClass).addClass("is-info"); + + if(profType === 'UP') { + $('#'+increaseDescriptionID).html(''); + } + + deleteData(DATA_SOURCE.PROFICIENCY, srcStruct); + + if(g_char_id != null){ + socket.emit("requestProficiencyChange", + g_char_id, + {srcStruct, isSkill : true, isAutoLoad}, + null); + } else { + saveBuildMetaData(); + } + + selectorUpdated(); + + } else if($(this).val() == "addLore"){ + + $('.'+selectIncreaseControlShellClass).removeClass("is-danger"); + $('.'+selectIncreaseControlShellClass).removeClass("is-info"); + + if(profType === 'UP') { + $('#'+increaseDescriptionID).html(''); + } + + if(!isAutoLoad){ + setDataProficiencies(srcStruct, 'Skill', 'addLore', profType, extraData.sourceName); + + if(g_char_id != null){ + socket.emit("requestProficiencyChange", + g_char_id, + {srcStruct, isSkill : true, isAutoLoad}, + { For : "Skill", To : 'addLore', Prof : profType, SourceName : extraData.sourceName }); + } else { + saveBuildMetaData(); + } + + selectorUpdated(); + } + + processCode( + 'GIVE-LORE-CHOOSE', + srcStruct, + increaseCodeID, + {source: extraData.source, sourceName: 'Add Lore (Lvl '+srcStruct.sourceLevel+')'}); + + + } else { + + $('.'+selectIncreaseControlShellClass).removeClass("is-info"); + + let canSave = false; + if(profType === 'UP') { + const skill_varName = profConversion_convertOldNameToVarName($('#'+selectIncreaseID).val()); + const numUps = profToNumUp(variables_getFinalRank(skill_varName)); + if(isAutoLoad || isAbleToSelectIncrease(numUps+1, srcStruct.sourceLevel)) { + canSave = true; + $('#'+increaseDescriptionID).html(''); + } else { + $('.'+selectIncreaseControlShellClass).addClass("is-danger"); + $('#'+increaseDescriptionID).html('

    You cannot increase the proficiency of this skill any further at this level!

    '); + } + } else { + canSave = true; + } + + if(canSave) { + $('.'+selectIncreaseControlShellClass).removeClass("is-danger"); + + let skillName = $(this).val(); + if(skillName.includes(' Lore')){ + skillName = skillName.toUpperCase().replace(/ /g,'_'); + } + + setDataProficiencies(srcStruct, 'Skill', skillName, profType, extraData.sourceName); + + if(g_char_id != null){ + socket.emit("requestProficiencyChange", + g_char_id, + {srcStruct, isSkill : true, isAutoLoad}, + { For : "Skill", To : skillName, Prof : profType, SourceName : extraData.sourceName }); + } else { + saveBuildMetaData(); + } + + selectorUpdated(); + } + + } + + $(this).blur(); + + }); + + $('#'+selectIncreaseID).trigger("change", [true]); + + statementComplete('Skill - Add'); + +} + +function isAbleToSelectIncrease(numUps, charLevel){ + if(numUps == 3){ + return (charLevel >= 7); + } else if (numUps == 4){ + return (charLevel >= 15); + } else if (numUps > 4) { + return false; + } else { + return true; + } +} + +function populateSkillLists(selectIncreaseID, srcStruct, profType, optionals){ + + $('#'+selectIncreaseID).html(''); + $('#'+selectIncreaseID).append(''); + $('#'+selectIncreaseID).append(''); + + // Set saved skill choices + let savedSkillData = getDataSingleProficiency(srcStruct); + + // Build Skill List + let skillList = []; + for(const [skillName, skillData] of g_skillMap.entries()){ + if(skillName == 'Lore'){ continue; } + skillList.push(skillName); + } + const sortedLoreDataArray = getDataAll(DATA_SOURCE.LORE).sort( + function(a, b) { + return a.value > b.value ? 1 : -1; + } + ); + for(const loreData of sortedLoreDataArray){ + skillList.push(capitalizeWords(loreData.value)+' Lore'); + } + + // Process each skill, + for(const skillName of skillList){ + + if(optionals != null){ + if(!optionals.includes(skillName.toUpperCase())){ + continue; + } + } + + if(savedSkillData != null && savedSkillData.To != null && similarSkills(savedSkillData, skillName)) { + $('#'+selectIncreaseID).append(''); + } else { + if(profToNumUp(variables_getFinalRank(profConversion_convertOldNameToVarName(skillName))) < profToNumUp(profType)){ + $('#'+selectIncreaseID).append(''); + } else { + $('#'+selectIncreaseID).append(''); + } + /* + if(skillData.NumUps == null || skillData.NumUps < profToNumUp(profType)) { + $('#'+selectIncreaseID).append(''); + } else { + $('#'+selectIncreaseID).append(''); + } + */ + } + + } + + if(optionals == null){ + // Add Lore Option + $('#'+selectIncreaseID).append(''); + if(savedSkillData != null && savedSkillData.To == 'addLore') { + $('#'+selectIncreaseID).append(''); + } else { + $('#'+selectIncreaseID).append(''); + } + } + + // Exists to guarantee it will be blue when at chooseDefault or not + if($('#'+selectIncreaseID).val() == 'chooseDefault'){ + $('#'+selectIncreaseID).parent().addClass("is-info"); + } else { + $('#'+selectIncreaseID).parent().removeClass("is-info"); + } + +} + +function similarSkills(savedSkillData, skillName){ + let skillNameOne = savedSkillData.To.toUpperCase().replace(/ /g,"_"); + let skillNameTwo = skillName.toUpperCase().replace(/ /g,"_"); + return (skillNameOne === skillNameTwo); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-specializations.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-specializations.js new file mode 100644 index 00000000..d43a2042 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-specializations.js @@ -0,0 +1,97 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Specializations --------------------// +function processingSpecializations(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-WEAPON-SPECIALIZATION")){ // GIVE-WEAPON-SPECIALIZATION + giveWeaponSpecialization(srcStruct, 1); + } else if(wscStatement.includes("GIVE-GREATER-WEAPON-SPECIALIZATION")){ // GIVE-GREATER-WEAPON-SPECIALIZATION + giveWeaponSpecialization(srcStruct, 2); + } else if(wscStatement.includes("GIVE-WEAPON-CRITICAL-SPECIALIZATION")){ // GIVE-WEAPON-CRITICAL-SPECIALIZATION= + let weapName = wscStatement.split('=')[1]; + giveWeaponCriticalSpecialization(srcStruct, weapName); + } else if(wscStatement.includes("GIVE-ARMOR-SPECIALIZATION")){ // GIVE-ARMOR-SPECIALIZATION= + let armorName = wscStatement.split('=')[1]; + giveArmorSpecialization(srcStruct, armorName); + } else { + displayError("Unknown statement (2-Specialization): \'"+wscStatement+"\'"); + statementComplete('Specialization - Unknown Statement'); + } + +} + +//////////////////////////////// Give Weapon Specialization /////////////////////////////////// +// GIVE-WEAPON-SPECIALIZATION +// GIVE-GREATER-WEAPON-SPECIALIZATION + +function giveWeaponSpecialization(srcStruct, type){ + + setData(DATA_SOURCE.WEAPON_SPECIAL, srcStruct, type); + + if(g_char_id != null){ + socket.emit("requestWeaponSpecializationChange", + g_char_id, + srcStruct, + type); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnWeaponSpecializationChange", function(){ + statementComplete('Specialization - Add Weapon'); +}); + +//////////////////////////////// Give Armor Specialization /////////////////////////////////// +// GIVE-ARMOR-SPECIALIZATION=TRAIT~Dwarf +// GIVE-ARMOR-SPECIALIZATION=NAME~Leather +// GIVE-ARMOR-SPECIALIZATION=Light_Armor + +function giveArmorSpecialization(srcStruct, armorName){ + + setData(DATA_SOURCE.ARMOR_SPECIAL, srcStruct, armorName); + + if(g_char_id != null){ + socket.emit("requestArmorSpecializationChange", + g_char_id, + srcStruct, + armorName); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnArmorSpecializationChange", function(){ + statementComplete('Specialization - Add Armor'); +}); + +//////////////////////////////// Give Critical Specialization /////////////////////////////////// +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=TRAIT~Dwarf +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=NAME~Spear +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=GROUP~Polearm +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=PROF~E +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=Simple_Weapons + + +function giveWeaponCriticalSpecialization(srcStruct, weapName){ + + setData(DATA_SOURCE.WEAPON_CRIT_SPECIAL, srcStruct, weapName); + + if(g_char_id != null){ + socket.emit("requestWeaponCriticalSpecializationChange", + g_char_id, + srcStruct, + weapName); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnWeaponCriticalSpecializationChange", function(){ + statementComplete('Specialization - Add Weapon Crit'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-speeds.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-speeds.js new file mode 100644 index 00000000..e5c89f0f --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-speeds.js @@ -0,0 +1,39 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Speeds --------------------// +function processingSpeeds(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.startsWith("GIVE-SPEED")){ // GIVE-SPEED=Swim:15 + let data = wscStatement.split('=')[1]; // GIVE-SPEED=Swim:LAND_SPEED + let segments = data.split(':'); + giveSpeed(srcStruct, segments[0], segments[1]); + } else { + displayError("Unknown statement (2-Speed): \'"+wscStatement+"\'"); + statementComplete('Speed - Unknown Statement'); + } + +} + +//////////////////////////////// Give Speed /////////////////////////////////// + +function giveSpeed(srcStruct, speedType, speedAmt){ + + setDataOtherSpeed(srcStruct, speedType, speedAmt); + + if(g_char_id != null){ + socket.emit("requestSpeedChange", + g_char_id, + srcStruct, + speedType, + speedAmt); + } else { + saveBuildMetaData(); + } + +} + +socket.on("returnSpeedChange", function(){ + statementComplete('Speed - Add'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells-focus.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells-focus.js new file mode 100644 index 00000000..bd3e466b --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells-focus.js @@ -0,0 +1,67 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Focus Spells ------------------------// +function processingFocusSpells(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-FOCUS-SPELL")){// GIVE-FOCUS-SPELL=Bard:Meld_Into_Stone + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveFocusSpell(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("GIVE-FOCUS-POINT")){// GIVE-FOCUS-POINT + giveFocusPoint(srcStruct); + } else { + displayError("Unknown statement (2-SpellFocus): \'"+wscStatement+"\'"); + statementComplete('SpellFocus - Unknown Statement'); + } + +} + +//////////////////////////////// Give Focus Spell /////////////////////////////////// +function giveFocusSpell(srcStruct, spellSRC, spellName){ + spellName = spellName.replace(/_/g," ").replace(/’/g,"'"); + + let spell = null; + for(const [spellID, spellData] of g_spellMap.entries()){ + if(spellData.Spell.name == spellName){ + spell = spellData.Spell; + break; + } + } + if(spell != null){ + setData(DATA_SOURCE.FOCUS_SPELL, srcStruct, spellSRC+"="+spell.id); + } + + if(g_char_id != null){ + socket.emit("requestFocusSpellChange", + g_char_id, + srcStruct, + spellSRC, + spellName); + } else { + saveBuildMetaData(); + } +} + +socket.on("returnFocusSpellChange", function(){ + statementComplete('SpellFocus - Add Spell'); +}); + +//////////////////////////////// Give Focus Point /////////////////////////////////// +function giveFocusPoint(srcStruct){ + + setData(DATA_SOURCE.FOCUS_POINT, srcStruct, '1'); + + if(g_char_id != null){ + socket.emit("requestFocusPointChange", + g_char_id, + srcStruct); + } else { + saveBuildMetaData(); + } +} + +socket.on("returnFocusPointChange", function(){ + statementComplete('SpellFocus - Add Point'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells-innate.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells-innate.js new file mode 100644 index 00000000..541c5c9a --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells-innate.js @@ -0,0 +1,212 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Innate Spells -------------------------// +function processingInnateSpells(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("GIVE-INNATE-SPELL=")){// GIVE-INNATE-SPELL=3:divine:1(:ANY) + let data = wscStatement.split('=')[1]; // Set cast times per day to 0 to cast an unlimited number + let segments = data.split(':');// For cantrips just do: GIVE-INNATE-SPELL=0:divine:0 + giveInnateSpell(srcStruct, locationID, extraData, segments[0], segments[1], segments[2], segments[3], segments[4]); + } else if(wscStatement.includes("GIVE-INNATE-SPELL-NAME=")){// GIVE-INNATE-SPELL-NAME=Meld_Into_Stone:3:divine:1 + let data = wscStatement.split('=')[1]; // Set cast times per day to 0 to cast an unlimited number + let segments = data.split(':');// For cantrips just do: GIVE-INNATE-SPELL-NAME=Daze:0:divine:0 + giveInnateSpellByName(srcStruct, extraData, segments[0], segments[1], segments[2], segments[3]); + } else { + displayError("Unknown statement (2-SpellInnate): \'"+wscStatement+"\'"); + statementComplete('SpellInnate - Unknown Statement'); + } + +} + +//////////////////////////////// Give Innate Spell /////////////////////////////////// +function giveInnateSpell(srcStruct, locationID, extraData, spellLevel, spellTradition, timesPerDay, optionalSelectFromAnyTradition){ + let selectFromAnyTradition = (optionalSelectFromAnyTradition != null); + if(spellTradition != null){ + if(spellTradition === 'OCCULT' || spellTradition === 'ARCANE' || spellTradition === 'DIVINE' || spellTradition === 'PRIMAL') { + if(!isNaN(parseInt(spellLevel))) { + displayInnateSpellChoice(srcStruct, locationID, extraData, spellLevel, spellTradition, timesPerDay, selectFromAnyTradition); + } else { + displayError("Spell Level is Not a Number: \'"+spellLevel+"\'"); + statementComplete('SpellInnate - Add Error 3'); + } + } else { + displayError("Unknown Spell Tradition: \'"+spellTradition+"\'"); + statementComplete('SpellInnate - Add Error 2'); + } + } else { + displayError("Invalid Spell Tradition"); + statementComplete('SpellInnate - Add Error 1'); + } +} + +function displayInnateSpellChoice(srcStruct, locationID, extraData, spellLevel, spellTradition, timesPerDay, selectFromAnyTradition){ + + let selectionName = (spellLevel == 0) ? 'Choose a Cantrip' : 'Choose a Level '+spellLevel+' Spell'; + let selectSpellID = "selectInnateSpell-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let descriptionSpellID = "descriptionInnateSpell-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectSpellControlShellClass = selectSpellID+'-ControlShell'; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+selectSpellID).length != 0) { statementComplete('SpellInnate - Add Choice Error'); return; } + + const selectionTagInfo = getTagFromData(srcStruct, extraData.sourceName, 'Unselected Spell', 'UNSELECTED'); + + $('#'+locationID).append('
    '); + + $('#'+selectSpellID).append(''); + $('#'+selectSpellID).append(''); + + let triggerChange = false; + // Set saved spell choices + const innateSpellData = getDataSingleInnateSpell(srcStruct); + + let selectedSpell = null; + if(innateSpellData != null && innateSpellData.value != null){ + selectedSpell = innateSpellData; + triggerChange = true; + } + + for(const [spellID, spellData] of g_spellMap.entries()){ + if(spellData.Spell.level != spellLevel){ continue; } + + if(selectFromAnyTradition){ + if(spellData.Spell.traditions == '[]'){ continue; }// If has no tradition, + } else { + if(!spellData.Spell.traditions.includes(spellTradition.toLowerCase())){ continue; } + } + + let spellName = spellData.Spell.name; + if(spellData.Spell.isArchived === 1){ + if(selectedSpell != null && selectedSpell.SpellID == spellData.Spell.id){ + spellName += ' - Archived'; + } else { + continue; + } + } + + $('#'+selectSpellID).append(''); + + } + + if(selectedSpell != null){ + $('#'+selectSpellID).val(selectedSpell.SpellID); + if ($('#'+selectSpellID).val() != selectedSpell.SpellID){ + $('#'+selectSpellID).val($("#"+selectSpellID+" option:first").val()); + $('#'+selectSpellID).parent().addClass("is-info"); + } + } + + // On spell choice change + $('#'+selectSpellID).change(function(event, triggerSave) { + + let spellID = $(this).val(); + let spell = g_spellMap.get(spellID+""); + + if($(this).val() == "chooseDefault" || spell == null){ + $('.'+selectSpellControlShellClass).addClass("is-info"); + + // Display nothing + $('#'+descriptionSpellID).html(''); + + deleteData(DATA_SOURCE.INNATE_SPELL, srcStruct); + + if(g_char_id != null){ + socket.emit("requestWSCInnateSpellChange", + g_char_id, + srcStruct, + null, + selectSpellControlShellClass); + } else { + saveBuildMetaData(); + } + + } else { + $('.'+selectSpellControlShellClass).removeClass("is-info"); + + // Display spell + displaySpell(descriptionSpellID, spell); + + // Save spell + if(triggerSave == null || triggerSave) { + $('.'+selectSpellControlShellClass).addClass("is-loading"); + + setDataInnateSpell(srcStruct, spell.Spell.id, spell.Spell.level, spellTradition, timesPerDay); + + if(g_char_id != null){ + socket.emit("requestWSCInnateSpellChange", + g_char_id, + srcStruct, + {name: spell.Spell.name, level: spell.Spell.level, tradition: spellTradition, tPd: timesPerDay}, + selectSpellControlShellClass); + } else { + saveBuildMetaData(); + } + } + + } + + }); + + $('#'+selectSpellID).trigger("change", [triggerChange]); + + statementComplete('SpellInnate - Add Choice'); + +} + + +socket.on("returnWSCInnateSpellChange", function(selectControlShellClass){ + if(selectControlShellClass != null) { + $('.'+selectControlShellClass).removeClass("is-loading"); + $('.'+selectControlShellClass+'>select').blur(); + } + selectorUpdated(); +}); + + +//////////////////////////////// Give Innate Spell by Name /////////////////////////////////// +function giveInnateSpellByName(srcStruct, extraData, spellName, spellLevel, spellTradition, timesPerDay){ + if(spellTradition != null){ + spellName = spellName.replace(/_/g," "); + if(spellTradition === 'OCCULT' || spellTradition === 'ARCANE' || spellTradition === 'DIVINE' || spellTradition === 'PRIMAL') { + + let spell = null; + for(const [spellID, spellData] of g_spellMap.entries()){ + if(spellData.Spell.name.toUpperCase() == spellName){ + spell = spellData.Spell; + break; + } + } + + if(spell != null){ + setDataInnateSpell(srcStruct, spell.id, spellLevel, spellTradition, timesPerDay); + + if(g_char_id != null){ + socket.emit("requestInnateSpellChange", + g_char_id, + srcStruct, + spellName, + spellLevel, + spellTradition, + timesPerDay); + } else { + saveBuildMetaData(); + } + } else { + displayError("Unknown Spell: \'"+spellName+"\'"); + statementComplete('SpellInnate - Add By Name Error 4'); + } + } else { + displayError("Unknown Spell Tradition: \'"+spellTradition+"\'"); + statementComplete('SpellInnate - Add By Name Error 3'); + } + } else { + displayError("Invalid Spell Tradition"); + statementComplete('SpellInnate - Add By Name Error 2'); + } +} + +socket.on("returnInnateSpellChange", function(){ + statementComplete('SpellInnate - Add By Name Error 1'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells.js new file mode 100644 index 00000000..345d0680 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/builder/wsc-spells.js @@ -0,0 +1,191 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Spells ------------------------// +function processingSpells(wscStatement, srcStruct, locationID, extraData){ + + if(wscStatement.includes("SET-SPELL-SLOTS")){// SET-SPELL-SLOTS=Bard:Three-Quarters/Full/Single-Set + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveSpellCasting(srcStruct, segments[0], segments[1], segments[2]); + } else if(wscStatement.includes("GIVE-SPELL-SLOT")){// GIVE-SPELL-SLOT=Bard:10 + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + let color = ''; + if(segments[2] != null){ color = segments[2]; } + giveSpellSlot(srcStruct, segments[0], segments[1], color); + } else if(wscStatement.includes("SET-SPELL-KEY-ABILITY")){// SET-SPELL-KEY-ABILITY=Bard:INT + let data = wscStatement.split('=')[1]; // Will default to CHA if nothing is set + let segments = data.split(':'); + setSpellKeyAbility(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("SET-SPELL-CASTING-TYPE")){ + let data = wscStatement.split('=')[1]; // Will default to PREPARED-LIST + let segments = data.split(':');// SET-SPELL-CASTING-TYPE=Bard:PREPARED-LIST/PREPARED-BOOK/SPONTANEOUS-REPERTOIRE + setSpellCastingType(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("SET-SPELL-TRADITION")){// SET-SPELL-TRADITION=Wizard:Primal/Divine/Occult/Arcane + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveSpellList(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("ADD-SPELL-TO-LIST")){// ADD-SPELL-TO-LIST=Wizard:Meld_Into_Stone:3 + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + let color = ''; + if(segments[3] != null){ color = segments[3]; } + addSpellToSpellbook(srcStruct, segments[0], segments[1], segments[2], color); + } else { + displayError("Unknown statement (2-Spell): \'"+wscStatement+"\'"); + statementComplete('Spell - Unknown Statement'); + } + +} + + +//////////////////////////////// Set Spell Slots /////////////////////////////////// +function giveSpellCasting(srcStruct, spellSRC, spellcasting, reduceSlotsByOne){ + reduceSlotsByOne = (reduceSlotsByOne != null && reduceSlotsByOne.toUpperCase() == 'REDUCE-SLOTS-BY-ONE') ? true : false; + if(g_char_id != null){ + socket.emit("requestSpellCastingSlotChange", + g_char_id, + srcStruct, + spellSRC, + spellcasting, + reduceSlotsByOne); + } else { + saveBuildMetaData(); + } +} + +function giveSpellSlot(srcStruct, spellSRC, spellSlot, color){ + + let slotType = ''; + switch(color.trim().toLowerCase()){ + case 'green': slotType = 'R:0,G:1,B:0'; break; + case 'blue': slotType = 'R:0,G:0,B:1'; break; + case 'red': slotType = 'R:1,G:0,B:0'; break; + case 'brown': slotType = 'R:1,G:1,B:0'; break; + case 'aqua': slotType = 'R:0,G:1,B:1'; break; + case 'purple': slotType = 'R:1,G:0,B:1'; break; + case 'gold': slotType = 'R:1,G:1,B:1'; break; + default: break; + } + + if(g_char_id != null){ + socket.emit("requestSpellSlotChange", + g_char_id, + srcStruct, + spellSRC, + spellSlot, + slotType); + } else { + saveBuildMetaData(); + } +} + +socket.on("returnSpellCastingSlotChange", function(spellSRC, spellSlots){ + statementComplete('Spell - Add Spell Casting Slot'); +}); + +socket.on("returnSpellSlotChange", function(spellSRC, spellSlot){ + statementComplete('Spell - Add Spell Slot'); +}); + +//////////////////////////////// Set Key Ability /////////////////////////////////// +function setSpellKeyAbility(srcStruct, spellSRC, abilityScore){ + if(getAllAbilityTypes().includes(lengthenAbilityType(abilityScore))){ + if(g_char_id != null){ + socket.emit("requestKeySpellAbilityChange", + g_char_id, + srcStruct, + spellSRC, + abilityScore); + } else { + saveBuildMetaData(); + } + } else { + displayError("Cannot identify ability score (case sensitive): '"+abilityScore+"'!"); + statementComplete('Spell - Set Key Ability Error'); + } +} + +socket.on("returnKeySpellAbilityChange", function(){ + statementComplete('Spell - Set Key Ability'); +}); + +//////////////////////////////// Give Spell List /////////////////////////////////// +function giveSpellList(srcStruct, spellSRC, spellList){ + if(spellList === 'OCCULT' || spellList === 'ARCANE' || spellList === 'DIVINE' || spellList === 'PRIMAL') { + if(g_char_id != null){ + socket.emit("requestSpellTraditionChange", + g_char_id, + srcStruct, + spellSRC, + spellList); + } else { + saveBuildMetaData(); + } + } else { + displayError("Unknown Spell Tradition: \'"+spellList+"\'"); + statementComplete('Spell - Set Tradition Error'); + } +} + +socket.on("returnSpellListChange", function(){ + statementComplete('Spell - Set Tradition'); +}); + +//////////////////////////////// Set Casting Type /////////////////////////////////// +function setSpellCastingType(srcStruct, spellSRC, castingType){ + if(castingType === 'PREPARED-LIST' || castingType === 'PREPARED-BOOK' || castingType === 'PREPARED-FAMILIAR' || castingType === 'SPONTANEOUS-REPERTOIRE' || castingType === 'FLEXIBLE-COLLECTION') { + if(g_char_id != null){ + socket.emit("requestSpellCastingTypeChange", + g_char_id, + srcStruct, + spellSRC, + castingType); + } else { + saveBuildMetaData(); + } + } else { + displayError("Unknown Spellcasting Type: \'"+castingType+"\'"); + statementComplete('Spell - Set Casting Type Error'); + } +} + +socket.on("returnSpellCastingTypeChange", function(){ + statementComplete('Spell - Set Casting Type'); +}); + + +//////////////////////////////// Add Spell to Spellbook /////////////////////////////////// +function addSpellToSpellbook(srcStruct, spellSRC, spellName, spellLevel, color){ + + let spellType = null; + switch(color.trim().toLowerCase()){ + case 'green': spellType = 'R:0,G:1,B:0'; break; + case 'blue': spellType = 'R:0,G:0,B:1'; break; + case 'red': spellType = 'R:1,G:0,B:0'; break; + case 'brown': spellType = 'R:1,G:1,B:0'; break; + case 'aqua': spellType = 'R:0,G:1,B:1'; break; + case 'purple': spellType = 'R:1,G:0,B:1'; break; + case 'gold': spellType = 'R:1,G:1,B:1'; break; + default: break; + } + + spellName = spellName.replace(/_/g," "); + if(g_char_id != null){ + socket.emit("requestBuilderSpellAddToSpellBook", + g_char_id, + srcStruct, + spellSRC, + spellName, + spellLevel, + spellType); + } else { + saveBuildMetaData(); + } +} + +socket.on("returnBuilderSpellAddToSpellBook", function(){ + statementComplete('Spell - Add to Spellbook'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/expression-processor.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/expression-processor.js new file mode 100644 index 00000000..a309ca72 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/expression-processor.js @@ -0,0 +1,749 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_profConversionMap = new Map(); + +g_profConversionMap.set(VARIABLE.LIGHT_ARMOR, {Name: 'Light_Armor', Category: 'Defense', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.MEDIUM_ARMOR, {Name: 'Medium_Armor', Category: 'Defense', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.HEAVY_ARMOR, {Name: 'Heavy_Armor', Category: 'Defense', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.UNARMORED_DEFENSE, {Name: 'Unarmored_Defense', Category: 'Defense', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('LIGHTARMOR', {Name: 'Light_Armor', Category: 'Defense'}); +g_profConversionMap.set('MEDIUMARMOR', {Name: 'Medium_Armor', Category: 'Defense'}); +g_profConversionMap.set('HEAVYARMOR', {Name: 'Heavy_Armor', Category: 'Defense'}); +g_profConversionMap.set('UNARMOREDDEFENSE', {Name: 'Unarmored_Defense', Category: 'Defense'}); + +g_profConversionMap.set(VARIABLE.SIMPLE_WEAPONS, {Name: 'Simple_Weapons', Category: 'Attack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.MARTIAL_WEAPONS, {Name: 'Martial_Weapons', Category: 'Attack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.ADVANCED_WEAPONS, {Name: 'Advanced_Weapons', Category: 'Attack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.UNARMED_ATTACKS, {Name: 'Unarmed_Attacks', Category: 'Attack', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('SIMPLEWEAPONS', {Name: 'Simple_Weapons', Category: 'Attack'}); +g_profConversionMap.set('MARTIALWEAPONS', {Name: 'Martial_Weapons', Category: 'Attack'}); +g_profConversionMap.set('ADVANCEDWEAPONS', {Name: 'Advanced_Weapons', Category: 'Attack'}); +g_profConversionMap.set('UNARMEDATTACKS', {Name: 'Unarmed_Attacks', Category: 'Attack'}); + +g_profConversionMap.set(VARIABLE.SAVE_FORT, {Name: 'Fortitude', Category: 'Save', AbilScore: 'CON'}); +g_profConversionMap.set(VARIABLE.SAVE_REFLEX, {Name: 'Reflex', Category: 'Save', AbilScore: 'DEX'}); +g_profConversionMap.set(VARIABLE.SAVE_WILL, {Name: 'Will', Category: 'Save', AbilScore: 'WIS'}); + +// Old +g_profConversionMap.set('FORTITUDE', {Name: 'Fortitude', Category: 'Save'}); +g_profConversionMap.set('REFLEX', {Name: 'Reflex', Category: 'Save'}); +g_profConversionMap.set('WILL', {Name: 'Will', Category: 'Save'}); + +g_profConversionMap.set(VARIABLE.PERCEPTION, {Name: 'Perception', Category: 'Perception', AbilScore: 'WIS'}); + +// Old +g_profConversionMap.set('PERCEPTION', {Name: 'Perception', Category: 'Perception'}); + +g_profConversionMap.set(VARIABLE.CLASS_DC, {Name: 'Class_DC', Category: 'Class_DC', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('CLASSDC', {Name: 'Class_DC', Category: 'Class_DC'}); + +g_profConversionMap.set(VARIABLE.ARCANE_SPELL_ATTACK, {Name: 'ArcaneSpellAttacks', Category: 'SpellAttack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.OCCULT_SPELL_ATTACK, {Name: 'OccultSpellAttacks', Category: 'SpellAttack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.PRIMAL_SPELL_ATTACK, {Name: 'PrimalSpellAttacks', Category: 'SpellAttack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.DIVINE_SPELL_ATTACK, {Name: 'DivineSpellAttacks', Category: 'SpellAttack', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('ARCANESPELLATTACKS', {Name: 'ArcaneSpellAttacks', Category: 'SpellAttack'}); +g_profConversionMap.set('OCCULTSPELLATTACKS', {Name: 'OccultSpellAttacks', Category: 'SpellAttack'}); +g_profConversionMap.set('PRIMALSPELLATTACKS', {Name: 'PrimalSpellAttacks', Category: 'SpellAttack'}); +g_profConversionMap.set('DIVINESPELLATTACKS', {Name: 'DivineSpellAttacks', Category: 'SpellAttack'}); + +g_profConversionMap.set(VARIABLE.ARCANE_SPELL_DC, {Name: 'ArcaneSpellDCs', Category: 'SpellDC', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.OCCULT_SPELL_DC, {Name: 'OccultSpellDCs', Category: 'SpellDC', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.PRIMAL_SPELL_DC, {Name: 'PrimalSpellDCs', Category: 'SpellDC', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.DIVINE_SPELL_DC, {Name: 'DivineSpellDCs', Category: 'SpellDC', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('ARCANESPELLDCS', {Name: 'ArcaneSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('OCCULTSPELLDCS', {Name: 'OccultSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('PRIMALSPELLDCS', {Name: 'PrimalSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('DIVINESPELLDCS', {Name: 'DivineSpellDCs', Category: 'SpellDC'}); + +g_profConversionMap.set('ARCANESPELLDC', {Name: 'ArcaneSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('OCCULTSPELLDC', {Name: 'OccultSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('PRIMALSPELLDC', {Name: 'PrimalSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('DIVINESPELLDC', {Name: 'DivineSpellDCs', Category: 'SpellDC'}); + +g_profConversionMap.set(VARIABLE.SKILL_ACROBATICS, {Name: 'Acrobatics', Category: 'Skill', AbilScore: 'DEX'}); +g_profConversionMap.set(VARIABLE.SKILL_ARCANA, {Name: 'Arcana', Category: 'Skill', AbilScore: 'INT'}); +g_profConversionMap.set(VARIABLE.SKILL_ATHLETICS, {Name: 'Athletics', Category: 'Skill', AbilScore: 'STR'}); +g_profConversionMap.set(VARIABLE.SKILL_CRAFTING, {Name: 'Crafting', Category: 'Skill', AbilScore: 'INT'}); +g_profConversionMap.set(VARIABLE.SKILL_DECEPTION, {Name: 'Deception', Category: 'Skill', AbilScore: 'CHA'}); +g_profConversionMap.set(VARIABLE.SKILL_DIPLOMACY, {Name: 'Diplomacy', Category: 'Skill', AbilScore: 'CHA'}); +g_profConversionMap.set(VARIABLE.SKILL_INTIMIDATION, {Name: 'Intimidation', Category: 'Skill', AbilScore: 'CHA'}); +g_profConversionMap.set(VARIABLE.SKILL_MEDICINE, {Name: 'Medicine', Category: 'Skill', AbilScore: 'WIS'}); +g_profConversionMap.set(VARIABLE.SKILL_NATURE, {Name: 'Nature', Category: 'Skill', AbilScore: 'WIS'}); +g_profConversionMap.set(VARIABLE.SKILL_OCCULTISM, {Name: 'Occultism', Category: 'Skill', AbilScore: 'INT'}); +g_profConversionMap.set(VARIABLE.SKILL_PERFORMANCE, {Name: 'Performance', Category: 'Skill', AbilScore: 'CHA'}); +g_profConversionMap.set(VARIABLE.SKILL_RELIGION, {Name: 'Religion', Category: 'Skill', AbilScore: 'WIS'}); +g_profConversionMap.set(VARIABLE.SKILL_SOCIETY, {Name: 'Society', Category: 'Skill', AbilScore: 'INT'}); +g_profConversionMap.set(VARIABLE.SKILL_STEALTH, {Name: 'Stealth', Category: 'Skill', AbilScore: 'DEX'}); +g_profConversionMap.set(VARIABLE.SKILL_SURVIVAL, {Name: 'Survival', Category: 'Skill', AbilScore: 'WIS'}); +g_profConversionMap.set(VARIABLE.SKILL_THIEVERY, {Name: 'Thievery', Category: 'Skill', AbilScore: 'DEX'}); + +// Old +g_profConversionMap.set('ACROBATICS', {Name: 'Acrobatics', Category: 'Skill'}); +g_profConversionMap.set('ARCANA', {Name: 'Arcana', Category: 'Skill'}); +g_profConversionMap.set('ATHLETICS', {Name: 'Athletics', Category: 'Skill'}); +g_profConversionMap.set('CRAFTING', {Name: 'Crafting', Category: 'Skill'}); +g_profConversionMap.set('DECEPTION', {Name: 'Deception', Category: 'Skill'}); +g_profConversionMap.set('DIPLOMACY', {Name: 'Diplomacy', Category: 'Skill'}); +g_profConversionMap.set('INTIMIDATION', {Name: 'Intimidation', Category: 'Skill'}); +g_profConversionMap.set('MEDICINE', {Name: 'Medicine', Category: 'Skill'}); +g_profConversionMap.set('NATURE', {Name: 'Nature', Category: 'Skill'}); +g_profConversionMap.set('OCCULTISM', {Name: 'Occultism', Category: 'Skill'}); +g_profConversionMap.set('PERFORMANCE', {Name: 'Performance', Category: 'Skill'}); +g_profConversionMap.set('RELIGION', {Name: 'Religion', Category: 'Skill'}); +g_profConversionMap.set('SOCIETY', {Name: 'Society', Category: 'Skill'}); +g_profConversionMap.set('STEALTH', {Name: 'Stealth', Category: 'Skill'}); +g_profConversionMap.set('SURVIVAL', {Name: 'Survival', Category: 'Skill'}); +g_profConversionMap.set('THIEVERY', {Name: 'Thievery', Category: 'Skill'}); + +function profConversion_convertOldNameToVarName(profName){ + + let convertProfName = profConversion_convertOldName(profName); + switch(convertProfName){ + case 'LIGHTARMOR': return VARIABLE.LIGHT_ARMOR; + case 'MEDIUMARMOR': return VARIABLE.MEDIUM_ARMOR; + case 'HEAVYARMOR': return VARIABLE.HEAVY_ARMOR; + case 'UNARMOREDDEFENSE': return VARIABLE.UNARMORED_DEFENSE; + + case 'SIMPLEWEAPONS': return VARIABLE.SIMPLE_WEAPONS; + case 'MARTIALWEAPONS': return VARIABLE.MARTIAL_WEAPONS; + case 'ADVANCEDWEAPONS': return VARIABLE.ADVANCED_WEAPONS; + case 'UNARMEDATTACKS': return VARIABLE.UNARMED_ATTACKS; + + case 'FORTITUDE': return VARIABLE.SAVE_FORT; + case 'REFLEX': return VARIABLE.SAVE_REFLEX; + case 'WILL': return VARIABLE.SAVE_WILL; + + case 'PERCEPTION': return VARIABLE.PERCEPTION; + + case 'CLASSDC': return VARIABLE.CLASS_DC; + + case 'ARCANESPELLATTACKS': return VARIABLE.ARCANE_SPELL_ATTACK; + case 'OCCULTSPELLATTACKS': return VARIABLE.OCCULT_SPELL_ATTACK; + case 'PRIMALSPELLATTACKS': return VARIABLE.PRIMAL_SPELL_ATTACK; + case 'DIVINESPELLATTACKS': return VARIABLE.DIVINE_SPELL_ATTACK; + + case 'ARCANESPELLDCS': return VARIABLE.ARCANE_SPELL_DC; + case 'OCCULTSPELLDCS': return VARIABLE.OCCULT_SPELL_DC; + case 'PRIMALSPELLDCS': return VARIABLE.PRIMAL_SPELL_DC; + case 'DIVINESPELLDCS': return VARIABLE.DIVINE_SPELL_DC; + case 'ARCANESPELLDC': return VARIABLE.ARCANE_SPELL_DC; + case 'OCCULTSPELLDC': return VARIABLE.OCCULT_SPELL_DC; + case 'PRIMALSPELLDC': return VARIABLE.PRIMAL_SPELL_DC; + case 'DIVINESPELLDC': return VARIABLE.DIVINE_SPELL_DC; + + case 'ACROBATICS': return VARIABLE.SKILL_ACROBATICS; + case 'ARCANA': return VARIABLE.SKILL_ARCANA; + case 'ATHLETICS': return VARIABLE.SKILL_ATHLETICS; + case 'CRAFTING': return VARIABLE.SKILL_CRAFTING; + case 'DECEPTION': return VARIABLE.SKILL_DECEPTION; + case 'DIPLOMACY': return VARIABLE.SKILL_DIPLOMACY; + case 'INTIMIDATION': return VARIABLE.SKILL_INTIMIDATION; + case 'MEDICINE': return VARIABLE.SKILL_MEDICINE; + case 'NATURE': return VARIABLE.SKILL_NATURE; + case 'OCCULTISM': return VARIABLE.SKILL_OCCULTISM; + case 'PERFORMANCE': return VARIABLE.SKILL_PERFORMANCE; + case 'RELIGION': return VARIABLE.SKILL_RELIGION; + case 'SOCIETY': return VARIABLE.SKILL_SOCIETY; + case 'STEALTH': return VARIABLE.SKILL_STEALTH; + case 'SURVIVAL': return VARIABLE.SKILL_SURVIVAL; + case 'THIEVERY': return VARIABLE.SKILL_THIEVERY; + + case 'ADDLORE': return VARIABLE.ADD_LORE; + + default: break; // Break to below + } + + if(convertProfName.endsWith('LORE')){ + let skillLoreName = convertProfName.slice(0, -4).trim(); + if(skillLoreName == ''){ + return 'SKILL_LORE'; + } else { + return `SKILL_${skillLoreName}_LORE`; + } + } else { + console.warn('Failed to convert variable: '+convertProfName); + return ''; + } + +} + +function profConversion_convertOldName(profName){ + return profName.replace(/\s+/g,'').replace(/_/g,'').toUpperCase(); +} + +let g_expr_hasInit = false; +let g_expr_focusPoints, g_expr_senseArray, g_expr_featDataMap, g_expr_featNameArray = null; + +let g_expr_baseClassAbilityArray = []; +let g_expr_classAbilityCacheMap = new Map(); + +function initExpressionProcessor(){ + + g_expr_focusPoints = getDataAll(DATA_SOURCE.FOCUS_POINT).length; + + g_expr_senseArray = []; + for(const senseData of getDataAll(DATA_SOURCE.SENSE)){ + let sense = g_allSenses.find(sense => { + return sense.id == senseData.value; + }); + if(sense != null){ + let newData = senseData; + newData.value = sense; + g_expr_senseArray.push(newData); + } + } + + // Fill class ability cache map + for(const [classID, classData] of g_classMap.entries()){ + for(const classFeature of classData.Abilities){ + g_expr_classAbilityCacheMap.set(classFeature.id+'', classFeature.name.toUpperCase().replace(/\(|\)/g,"")); + } + } + + const charClass = getCharClass(); + if(charClass != null){ + if(charClass.Abilities != null){ + g_expr_baseClassAbilityArray = []; + for(let classAbility of charClass.Abilities){ + if(classAbility.level == -1) {continue;} + if(classAbility.level <= g_char_level) { + if(classAbility.selectType != 'SELECT_OPTION'){ + g_expr_baseClassAbilityArray.push(classAbility.id+''); + } else { + let choiceData = getDataAllClassChoice().find(choiceData => { + return classAbility.id == choiceData.OptionID; + }); + if(choiceData != null){ + g_expr_baseClassAbilityArray.push(classAbility.id+''); + } + } + } + } + + } + } + + + if(g_featMap != null){ + g_expr_featNameArray = []; + g_expr_featDataMap = new Map(); + for(let feat of getDataAll(DATA_SOURCE.FEAT_CHOICE)){ + if(feat.value != null){ + const featData = g_featMap.get(feat.value+''); + if(featData != null){ + let featName = featData.Feat.name.toUpperCase(); + g_expr_featNameArray.push(featName); + g_expr_featDataMap.set(featName, feat); + } + } + } + } + + g_expr_hasInit = true; + +} + + +function testExpr(wscCode, srcStruct=null){ + if(!g_expr_hasInit) { + displayError("Expression Processor has not been init!"); + return null; + } + + const exprStruct = readExpr(wscCode); + if(exprStruct == null) { return wscCode; } + + let expression = exprStruct.expression; + let statement = exprStruct.statement; + let elseStatement = exprStruct.elseStatement; + + // If not on the character sheet, treat expression as true + if(exprStruct.isSheetOnly && !isSheetPage()){ return statement; } + + if(expression.includes(' && ')){ + let expParts = expression.split(' && '); + + let allTrue = true; + for(let expPart of expParts){ + let resultStatement = expHandleExpression(expPart, statement, elseStatement, srcStruct); + if(resultStatement != statement){ + allTrue = false; + } + } + + if(allTrue) { + return statement; + } else { + return elseStatement; + } + + } else { + + let result = expHandleExpression(expression, statement, elseStatement, srcStruct); + if(result != -1){ + return result; + } else { + displayError("Unknown expression: \'"+expression+"\'"); + return null; + } + + } + +} + +function expHandleExpression(expression, statement, elseStatement, srcStruct){ + + if(expression.includes('HAS-LEVEL')){ // HAS-LEVEL==13 + return expHasLevel(expression, statement, elseStatement); + } + + if(expression.includes('HAS-FOCUS-POINTS')){ // HAS-FOCUS-POINTS==3 + return expHasFocusPoints(expression, statement, elseStatement); + } + + if(expression.includes('HAS-HERITAGE')){ // HAS-HERITAGE==Treedweller + return expHasHeritage(expression, statement, elseStatement); + } + + if(expression.includes('HAS-CLASS-ABILITY')){ // HAS-CLASS-ABILITY==Cloistered Cleric + return expHasClassAbility(expression, statement, elseStatement); + } + + if(expression.includes('HAS-FEAT')){ // HAS-FEAT==Specialty Crafting + return expHasFeat(expression, statement, elseStatement, srcStruct); + } + + if(expression.includes('HAS-PROF')){ // HAS-PROF==Arcana:T + return expHasProf(expression, statement, elseStatement, srcStruct); + } + + if(expression.includes('HAS-VISION')){ // HAS-VISION==Darkvision + return expHasVision(expression, statement, elseStatement, srcStruct); + } + + if(expression.includes('HAS-ENABLED-SOURCE')){ // HAS-ENABLED-SOURCE==Advanced Player's Guide + return expHasSource(expression, statement, elseStatement); + } + + let variableExprMatch = expression.match(/IS-VARIABLE\(([\w]+)\)/); + if(variableExprMatch != null){ // IS-VARIABLE(SCORE_INT)>=25 + return expIsVariable(expression, variableExprMatch[1], statement, elseStatement); + } + + /* Sheet-Only Expressions */ + if(expression.includes('IS-UNARMORED')){ // IS-UNARMORED + return expIsUnarmored(expression, statement, elseStatement); + } + + if(expression.includes('IS-TOGGLED')){ // IS-TOGGLED==Rage + return expIsToggled(expression, statement, elseStatement); + } + + return -1; + +} + +function expHasLevel(expression, statement, elseStatement){ + return expHasNumberCompare(g_char_level, expression, statement, elseStatement); +} + +function expHasFocusPoints(expression, statement, elseStatement){ + return expHasNumberCompare(g_expr_focusPoints, expression, statement, elseStatement); +} + +function expIsVariable(expression, variableName, statement, elseStatement){ + let variable = g_variableMap.get(variableName); + if(variable == null) { + displayError("Expression Processing: Unknown variable \'"+variableName+"\'!"); + return elseStatement; + } + + if(variable.Type == VAR_TYPE.INTEGER){ + return expHasNumberCompare(variables_getTotal(variableName), expression, statement, elseStatement); + } else if(variable.Type == VAR_TYPE.STRING){ + return expHasStringCompare(variable.Value, expression, statement, elseStatement); + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + return expHasNumberCompare(variables_getTotal(variableName), expression, statement, elseStatement); + } else if(variable.Type == VAR_TYPE.LIST){ + return expHasStringCompare(variable.Value+'', expression, statement, elseStatement); + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + return expHasStringCompare(variables_getFinalRank(variableName), expression, statement, elseStatement); + } else { + displayError("Expression Processing: Unknown variable type \'"+variable.Type+"\'!"); + return elseStatement; + } + +} + +function expHasNumberCompare(charVarNumber, expression, statement, elseStatement){ + if(expression.includes('==')){ + let inputValue = expression.split('==')[1]; + let number = parseInt(inputValue); + if(!isNaN(number)){ + if(charVarNumber == number){ + return statement; + } else { + return elseStatement; + } + } else { + let varValue = getVariableValue(inputValue, false); + if(charVarNumber == varValue){ + return statement; + } else { + return elseStatement; + } + } + } else if(expression.includes('>=')){ + let inputValue = expression.split('>=')[1]; + let number = parseInt(inputValue); + if(!isNaN(number)){ + if(charVarNumber >= number){ + return statement; + } else { + return elseStatement; + } + } else { + let varValue = getVariableValue(inputValue, false); + if(charVarNumber >= varValue){ + return statement; + } else { + return elseStatement; + } + } + } else if(expression.includes('<=')){ + let inputValue = expression.split('<=')[1]; + let number = parseInt(inputValue); + if(!isNaN(number)){ + if(charVarNumber <= number){ + return statement; + } else { + return elseStatement; + } + } else { + let varValue = getVariableValue(inputValue, false); + if(charVarNumber <= varValue){ + return statement; + } else { + return elseStatement; + } + } + } else if(expression.includes('!=')){ + let inputValue = expression.split('!=')[1]; + let number = parseInt(inputValue); + if(!isNaN(number)){ + if(charVarNumber != number){ + return statement; + } else { + return elseStatement; + } + } else { + let varValue = getVariableValue(inputValue, false); + if(charVarNumber != varValue){ + return statement; + } else { + return elseStatement; + } + } + } + return null; +} + +function expHasStringCompare(charVarString, expression, statement, elseStatement){ + if(expression.includes('==')){ + let string = expression.split('==')[1]; + if(string != null){ + if(charVarString == string){ + return statement; + } else { + return elseStatement; + } + } + } else if(expression.includes('!=')){ + let string = expression.split('!=')[1]; + if(string != null){ + if(charVarString != string){ + return statement; + } else { + return elseStatement; + } + } + } + return null; +} + +function expHasHeritage(expression, statement, elseStatement){ + const currentHeritage = getCharHeritage(); + if(currentHeritage == null) { return elseStatement; } + if(expression.includes('==')){ + let heritageName = expression.split('==')[1].toUpperCase(); + let currentHeritageName = currentHeritage.name.toUpperCase(); + if(currentHeritageName.startsWith(heritageName)){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let heritageName = expression.split('!=')[1].toUpperCase(); + let currentHeritageName = currentHeritage.name.toUpperCase(); + if(!currentHeritageName.startsWith(heritageName)){ + return statement; + } else { + return elseStatement; + } + } +} + +function expHasClassAbility(expression, statement, elseStatement){ + if(expression.includes('==')){ + let classAbilityName = expression.split('==')[1].toUpperCase(); + classAbilityName = classAbilityName.replace(/_/g," "); + let classAbilityNameArray = getCurrentClassAbilityNameArray(); + if(classAbilityNameArray == null){ return statement; } + if(classAbilityNameArray.includes(classAbilityName)){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let classAbilityName = expression.split('!=')[1].toUpperCase(); + classAbilityName = classAbilityName.replace(/_/g," "); + let classAbilityNameArray = getCurrentClassAbilityNameArray(); + if(classAbilityNameArray == null){ return elseStatement; } + if(!classAbilityNameArray.includes(classAbilityName)){ + return statement; + } else { + return elseStatement; + } + } +} + +function expHasFeat(expression, statement, elseStatement, srcStruct){ + if(expression.includes('==')){ + let featName = expression.split('==')[1].toUpperCase(); + featName = featName.replace(/_/g," "); + if(g_expr_featNameArray.includes(featName) && !hasSameSrc(srcStruct, g_expr_featDataMap.get(featName))){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let featName = expression.split('!=')[1].toUpperCase(); + featName = featName.replace(/_/g," "); + if(!g_expr_featNameArray.includes(featName)){ + return statement; + } else { + return elseStatement; + } + } +} + +function expHasSource(expression, statement, elseStatement){ + if(expression.includes('==')){ + let sourceName = expression.split('==')[1].toUpperCase().trim(); + let source = g_enabledSources.find(source => { + return source.name.toUpperCase().trim() == sourceName; + }); + if(source != null){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let sourceName = expression.split('!=')[1].toUpperCase().trim(); + let source = g_enabledSources.find(source => { + return source.name.toUpperCase().trim() == sourceName; + }); + if(source != null){ + return elseStatement; + } else { + return statement; + } + } +} + +function expHasVision(expression, statement, elseStatement, srcStruct){ + if(expression.includes('==')){ + let visionName = expression.split('==')[1].toUpperCase(); + visionName = visionName.replace(/_/g," "); + let vision = g_expr_senseArray.find(senseData => { + if(senseData.value != null && !hasSameSrc(srcStruct, senseData)){ + return visionName === senseData.value.name.toUpperCase(); + } else { + return false; + } + }); + if(vision != null){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let visionName = expression.split('!=')[1].toUpperCase(); + visionName = visionName.replace(/_/g," "); + let vision = g_expr_senseArray.find(senseData => { + if(senseData.value != null && !hasSameSrc(srcStruct, senseData)){ + return visionName === senseData.value.name.toUpperCase(); + } else { + return false; + } + }); + if(vision == null){ + return statement; + } else { + return elseStatement; + } + } +} + +function expHasProf(expression, statement, elseStatement, srcStruct){ + let data; + let boolOp; + if(expression.includes('==')){ + data = expression.split('==')[1]; + boolOp = 'EQUALS'; + } else if(expression.includes('>=')){ + data = expression.split('>=')[1]; + boolOp = 'GREATER-EQUALS'; + } else if(expression.includes('<=')){ + data = expression.split('<=')[1]; + boolOp = 'LESSER-EQUALS'; + } else if(expression.includes('!=')){ + data = expression.split('!=')[1]; + boolOp = 'NOT-EQUALS'; + } else { + return null; + } + + let segments = data.split(':'); + + let profName = segments[0]; + let profType = segments[1]; + + profName = profName.replace(/_|\s+/g,""); + let profData = g_profConversionMap.get(profName); + + let numUps = profToNumUp(profType); + if(numUps === -1){return null;} + + let foundProf = false; + for(const [profMapName, profMapDataArray] of getProfMap().entries()){ + const finalProfData = expr_getFinalProf(cleanProfDataArrayOfStatementProfs(profMapDataArray, srcStruct)); + if(finalProfData == null) { continue; } + if(profData == null){ + let tempSkillName = finalProfData.Name.toUpperCase(); + tempSkillName = tempSkillName.replace(/_|\s+/g,""); + if(tempSkillName === profName.toUpperCase()) { + foundProf = true; + if(expHasProfNumUpsCompare(finalProfData.NumUps, boolOp, numUps)) { + return statement; + } + } + } else { + if(finalProfData.Name === profData.Name) { + foundProf = true; + if (expHasProfNumUpsCompare(finalProfData.NumUps, boolOp, numUps)){ + return statement; + } + } + } + } + if(numUps === 0 && !foundProf){ return statement; } + + return elseStatement; +} + +function expHasProfNumUpsCompare(numUpsOne, boolOp, numUpsTwo){ + switch(boolOp) { + case 'EQUALS': return numUpsOne == numUpsTwo; + case 'NOT-EQUALS': return numUpsOne != numUpsTwo; + case 'GREATER-EQUALS': return numUpsOne >= numUpsTwo; + case 'LESSER-EQUALS': return numUpsOne <= numUpsTwo; + default: return false; + } +} + +function cleanProfDataArrayOfStatementProfs(profDataArray, srcStruct){ + if(srcStruct == null) {return profDataArray;} + let newProfDataArray = []; + for(let profData of profDataArray) { + if(!hasSameSrc(srcStruct, profData)){ + newProfDataArray.push(profData); + } + } + return newProfDataArray; +} + +function getCurrentClassAbilityNameArray(){ + let abilityNameArray = []; + for(let classFeatureID of g_expr_baseClassAbilityArray){ + let featureName = g_expr_classAbilityCacheMap.get(classFeatureID+''); + if(featureName != null){ + abilityNameArray.push(featureName); + } + } + for(let classAbility of getDataAllExtraClassFeature()){ + if(classAbility.FeatureID != null){ + let featureName = g_expr_classAbilityCacheMap.get(classAbility.FeatureID+''); + if(featureName != null){ + abilityNameArray.push(featureName); + } + + let choiceData = getDataAllClassChoice().find(choiceData => { + return classAbility.FeatureID == choiceData.SelectorID; + }); + if(choiceData != null){ + let choiceFeatureName = g_expr_classAbilityCacheMap.get(choiceData.OptionID+''); + if(choiceFeatureName != null){ + abilityNameArray.push(choiceFeatureName); + } + } + + } + } + return abilityNameArray; +} + +/*~ Sheet-Only Expressions ~*/ + +function expIsUnarmored(expression, statement, elseStatement) { + if (typeof g_equippedArmorCategory !== 'undefined') { + return (g_equippedArmorCategory == null || g_equippedArmorCategory == 'UNARMORED') ? statement : elseStatement; + } else { + return null; + } +} + +function expIsToggled(expression, statement, elseStatement) { + if(!isSheetPage()) { return null; } + if(expression.includes('==')){ + let sheetStateName = expression.split('==')[1].toUpperCase(); + let sheetState = getSheetStateByName(sheetStateName); + if(sheetState != null){ + return (isSheetStateActive(sheetState.id)) ? statement : elseStatement; + } else { + displayError("Cannot find toggleable '"+sheetStateName+"'!"); + return null; + } + } else if(expression.includes('!=')){ + let sheetStateName = expression.split('!=')[1].toUpperCase(); + let sheetState = getSheetStateByName(sheetStateName); + if(sheetState != null){ + return (isSheetStateActive(sheetState.id)) ? elseStatement : statement; + } else { + displayError("Cannot find toggleable '"+sheetStateName+"'!"); + return null; + } + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/expression-utils.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/expression-utils.js new file mode 100644 index 00000000..253ae1df --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/expression-utils.js @@ -0,0 +1,163 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function readExpr(wscCode){ + // IF(*){*} or IF(*){*}ELSE{*} + let rMatchIf = wscCode.match(/^\s*IF\s*\((.*?)\)\s*\{(.*?)\}\s*$/); + let rMatchIfElse = wscCode.match(/^\s*IF\s*\((.*?)\)\s*\{(.*?)\}\s*ELSE\s*\{(.*?)\}\s*$/); + let rMatchIfSheet = wscCode.match(/^\s*IF-SHEET\s*\((.*?)\)\s*\{(.*?)\}\s*$/); + if(rMatchIf == null && rMatchIfElse == null && rMatchIfSheet == null) { return null; } + + let expression; + let statement; + let elseStatement; + let isSheetOnly = false; + if(rMatchIfElse != null){ + expression = rMatchIfElse[1]; + statement = rMatchIfElse[2]; + elseStatement = rMatchIfElse[3]; + } else if(rMatchIf != null){ + expression = rMatchIf[1]; + statement = rMatchIf[2]; + elseStatement = null; + } else if(rMatchIfSheet != null){ + expression = rMatchIfSheet[1]; + statement = rMatchIfSheet[2]; + elseStatement = null; + isSheetOnly = true; + } + return {expression, statement, elseStatement, isSheetOnly}; +} + + +function expr_getProfUserBonus(profBonus){ + let numBonus = parseInt(profBonus); + return (isNaN(numBonus) ? 0 : numBonus); +} + +function expr_getFinalProf(profDataArray) { + if(profDataArray == null || profDataArray.length == 0) { return null; } + + let finalProfData = null; + + for(const profData of profDataArray){ + + let userAdded = false; + if(profData.sourceType === 'user-added') { + userAdded = true; + } + + if(profData.sourceType === 'user-set') { // Hardcoded User-Set Data + + let userBonus = expr_getProfUserBonus(profData.Prof); + let profOverride = (userBonus == 0); + + if(finalProfData != null){ + + let bestProf = getBetterProf(finalProfData.BestProf, profData.Prof); + let numIncreases = finalProfData.NumIncreases+getUpAmt(profData.Prof); + if(finalProfData.UserProfOverride){ + bestProf = finalProfData.BestProf; + numIncreases = finalProfData.NumIncreases; + } + if(profOverride){ + bestProf = getBetterProf('U', profData.Prof); + numIncreases = getUpAmt(profData.Prof); + } + + let userBonus = expr_getProfUserBonus(profData.Prof); + finalProfData = { + ProfName: profData.To, + BestProf : bestProf, + NumIncreases : numIncreases, + For : finalProfData.For, + UserBonus : ((finalProfData.UserBonus > userBonus) ? finalProfData.UserBonus : userBonus), + UserProfOverride : profOverride, + UserAdded : (userAdded || finalProfData.UserAdded), + }; + + } else { + + finalProfData = { + ProfName: profData.To, + BestProf : getBetterProf('U', profData.Prof), + NumIncreases : getUpAmt(profData.Prof), + For : profData.For, + UserBonus : userBonus, + UserProfOverride : profOverride, + UserAdded : userAdded, + }; + + } + + } else { + + if(finalProfData != null){ + + let bestProf = getBetterProf(finalProfData.BestProf, profData.Prof); + let numIncreases = finalProfData.NumIncreases+getUpAmt(profData.Prof); + if(finalProfData.UserProfOverride){ + bestProf = finalProfData.BestProf; + numIncreases = finalProfData.NumIncreases; + } + + let userBonus = expr_getProfUserBonus(profData.Prof); + finalProfData = { + ProfName: profData.To, + BestProf : bestProf, + NumIncreases : numIncreases, + For : finalProfData.For, + UserBonus : ((finalProfData.UserBonus > userBonus) ? finalProfData.UserBonus : userBonus), + UserProfOverride : false, + UserAdded : (userAdded || finalProfData.UserAdded), + }; + + } else { + + finalProfData = { + ProfName: profData.To, + BestProf : getBetterProf('U', profData.Prof), + NumIncreases : getUpAmt(profData.Prof), + For : profData.For, + UserBonus : 0, + UserProfOverride : false, + UserAdded : userAdded, + }; + + } + + } + + } + + return { + Name : finalProfData.ProfName, + NumUps : profToNumUp(finalProfData.BestProf, true)+finalProfData.NumIncreases, + For : finalProfData.For, + UserBonus : finalProfData.UserBonus, + UserProfOverride : finalProfData.UserProfOverride, + UserAdded : finalProfData.UserAdded, + }; + +} + +function expr_getUserSetData(profDataArray) { + if(profDataArray == null || profDataArray.length == 0) { return null; } + for(const profData of profDataArray){ + if(profData.sourceType === 'user-set' && isNaN(profData.Prof)) { + return profData; + } + } + return null; +} + +function expr_getUserAddedData(profDataArray) { + if(profDataArray == null || profDataArray.length == 0) { return null; } + for(const profData of profDataArray){ + if(profData.sourceType === 'user-added') { + return profData; + } + } + return null; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/processor/sub_processors/sheet-statements.js b/client/vue-src/legacy-js/build_planner/processor/sub_processors/sheet-statements.js new file mode 100644 index 00000000..13c17b07 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/processor/sub_processors/sheet-statements.js @@ -0,0 +1,460 @@ + +function runSheetStatements(wscStatement, wscStatementUpper, srcStruct, locationID, extraData){ + + if(wscStatementUpper.startsWith("GIVE-CONDITION=")){ // GIVE-CONDITION=Clumsy:1 OR GIVE-CONDITION=Clumsy + + let conditionName = wscStatement.split('=')[1]; + let conditionValue = null; + if(wscStatement.includes(":")){ + let conditionNameData = conditionName.split(":"); + conditionName = conditionNameData[0]; + conditionValue = parseInt(conditionNameData[1]); + } + + let conditionID = getConditionFromName(conditionName).id; + let conditionParentID = getCurrentConditionIDFromName(extraData.sourceName); + addCondition(conditionID+'', conditionValue, extraData.sourceName, conditionParentID); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("REMOVE-CONDITION=")){ // REMOVE-CONDITION=Clumsy + + + let conditionName = wscStatement.split('=')[1]; + + let conditionID = getConditionFromName(conditionName).id; + removeCondition(conditionID); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("CONDITIONAL-INCREASE-")){ + + // Ex. CONDITIONAL-INCREASE-PERCEPTION=2~status bonus to checks for initiative + + let adjustmentData = (wscStatement.split('-')[2]).split('='); + let adjustmentTowards = adjustmentData[0]; + let adjustmentNumInfoData = (adjustmentData[1]).split('~'); + let adjustmentNum = getSheetProcNumber(adjustmentNumInfoData[0], extraData.sourceName); + let adjustmentCondition = adjustmentNumInfoData[1]; + addConditionalStat(adjustmentTowards, signNumber(adjustmentNum)+' '+adjustmentCondition, extraData.sourceName); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("CONDITIONAL-DECREASE-")){ + + // Ex. CONDITIONAL-DECREASE-PERCEPTION=2~status penalty to checks for initiative + + let adjustmentData = (wscStatement.split('-')[2]).split('='); + let adjustmentTowards = adjustmentData[0]; + let adjustmentNumInfoData = (adjustmentData[1]).split('~'); + let adjustmentNum = getSheetProcNumber(adjustmentNumInfoData[0], extraData.sourceName); + let adjustmentCondition = adjustmentNumInfoData[1]; + addConditionalStat(adjustmentTowards, signNumber(-1*adjustmentNum)+' '+adjustmentCondition, extraData.sourceName); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("CONDITIONAL-")){ + + // Ex. CONDITIONAL-SAVE_FORT=When you roll a success, you get a critical success instead. + + let dataSplit = wscStatement.split('='); + + let adjustmentTowards = dataSplit[0].split('-')[1]; + let adjustmentInfo = dataSplit[1]; + addConditionalStat(adjustmentTowards, adjustmentInfo, extraData.sourceName); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("INCREASE-")){ + + // INCREASE-X=5 (Ex. INCREASE-SCORE_STR=2, INCREASE-SPEED=10-STATUS) + + let adjValData = wscStatement.split('-'); + let adjustmentData = adjValData[1].split('='); + let adjustmentTowards = adjustmentData[0]; + + let adjustmentNum = getSheetProcNumber(adjustmentData[1], extraData.sourceName); + let adjustmentSource = 'OTHER-'+extraData.sourceName; + if(adjValData[2] != null) { + adjustmentSource = adjValData[2]; + } + + if(!adjustmentSource.endsWith('_BONUS') && !adjustmentSource.endsWith('_PENALTY')){ + adjustmentSource += '_BONUS'; + } + + addStatAndSrc(adjustmentTowards, adjustmentSource, adjustmentNum, extraData.sourceName); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("DECREASE-")){ + + // DECREASE-X=5 (Ex. DECREASE-SCORE_STR=2, DECREASE-SPEED=10-STATUS) + + let adjValData = wscStatement.split('-'); + let adjustmentData = adjValData[1].split('='); + let adjustmentTowards = adjustmentData[0]; + + let adjustmentNum = getSheetProcNumber(adjustmentData[1], extraData.sourceName); + let adjustmentSource = 'OTHER-'+extraData.sourceName; + if(adjValData[2] != null) { + adjustmentSource = adjValData[2]; + } + + if(!adjustmentSource.endsWith('_BONUS') && !adjustmentSource.endsWith('_PENALTY')){ + adjustmentSource += '_PENALTY'; + } + + addStatAndSrc(adjustmentTowards, adjustmentSource, -1*adjustmentNum, extraData.sourceName); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("OVERRIDE-") && !wscStatementUpper.startsWith("OVERRIDE-FEAT-LEVEL=")){ + + // OVERRIDE-X=5 (Ex. OVERRIDE-PERCEPTION=10-MODIFIER) + + let adjValData = wscStatement.split('-'); + let overrideData = adjValData[1].split('='); + + let overrideTowards = overrideData[0]; + let overrideSource = adjValData[2]; + if(overrideSource == null) { overrideSource = ''; } + + let overrideNum = getSheetProcNumber(overrideData[1], extraData.sourceName); + + if(overrideTowards.endsWith('_PENALTY')){ + overrideNum = -1*overrideNum; + } + + addStat(overrideTowards, overrideSource, overrideNum); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("SET-APEX-ABILITY-SCORE=")){ + + // SET-APEX-ABILITY-SCORE=X (Ex. SET-APEX-ABILITY-SCORE=DEX) + + let adjustmentData = wscStatement.split('='); + let abilityScore = adjustmentData[1]; + + let baseStat = variables_getValue('SCORE_'+abilityScore).Score; + if(baseStat >= 18){ + g_variableMap.get('SCORE_'+abilityScore).Value.Score = baseStat+2; + } else { + g_variableMap.get('SCORE_'+abilityScore).Value.Score = 18; + } + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("SET-SIZE=")){ + + + // SET-SIZE=X (Ex. SET-SIZE=SMALL) + let sizeData = wscStatementUpper.split('='); + let newSize = sizeData[1]; + + if(newSize == 'TINY' || newSize == 'SMALL' || newSize == 'MEDIUM' || newSize == 'LARGE' || newSize == 'HUGE' || newSize == 'GARGANTUAN'){ + g_charSize = newSize; + } else { + displayError('Attempted to set character size to unknown value "'+newSize+'"'); + } + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("SET-MAP=")){ + + // TIER_1 = (5/10 or 4/8 agile) + // TIER_2 = (4/8 or 3/6 agile) + // TIER_3 = (3/6 or 2/4 agile) + // TIER_4 = (2/4 or 1/2 agile) + let mapTier = wscStatementUpper.split('=')[1]; + + if(mapTier == 'TIER_1' || mapTier == 'TIER_2' || mapTier == 'TIER_2_AGILE' || mapTier == 'TIER_3' || mapTier == 'TIER_4'){ + gState_MAP = mapTier; + } else { + displayError('Attempted to set multiple attack penalty to unknown tier "'+mapTier+'"'); + } + + return PROCESS_RETURN.NEXT; + } + + + if(wscStatementUpper.startsWith("DEFAULT-ON-HIT-DAMAGE=")){ + //DEFAULT-ON-HIT-DAMAGE=+5d6+6 fire + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-HIT-DAMAGE" from a non-item source'); + return PROCESS_RETURN.NEXT; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'DAMAGE-ON-HIT', modInfo); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-CRIT-DAMAGE=")){ + //DEFAULT-ON-CRIT-DAMAGE=+5d6+6 fire + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-CRIT-DAMAGE" from a non-item source'); + return PROCESS_RETURN.NEXT; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'DAMAGE-ON-CRIT', modInfo); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-HIT-OTHER=")){ + //DEFAULT-ON-HIT-OTHER=Flat-footed until next turn + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-HIT-OTHER" from a non-item source'); + return PROCESS_RETURN.NEXT; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'OTHER-ON-HIT', modInfo); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-CRIT-OTHER=")){ + //DEFAULT-ON-CRIT-OTHER=Flat-footed forever + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-CRIT-OTHER" from a non-item source'); + return PROCESS_RETURN.NEXT; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'OTHER-ON-CRIT', modInfo); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-HIT-CONDITIONAL=")){ + //DEFAULT-ON-HIT-CONDITIONAL=Flat-footed only at dawn + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-HIT-CONDITIONAL" from a non-item source'); + return PROCESS_RETURN.NEXT; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'CONDITIONAL-ON-HIT', modInfo); + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-CRIT-CONDITIONAL=")){ + //DEFAULT-ON-CRIT-CONDITIONAL=Flat-footed forever only at dawn + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-CRIT-CONDITIONAL" from a non-item source'); + return PROCESS_RETURN.NEXT; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'CONDITIONAL-ON-CRIT', modInfo); + + return PROCESS_RETURN.NEXT; + } + + + if(wscStatementUpper == "SET-FINESSE-MELEE-USE-DEX-DAMAGE"){ + + + gState_hasFinesseMeleeUseDexDamage = true; + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper == "SET-ARMORED-STEALTH"){ + + + gState_armoredStealth = true; + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper == "SET-MIGHTY-BULWARK"){ + + + gState_mightyBulwark = true; + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper == "SET-UNBURDENED-IRON"){ + + + gState_unburdenedIron = true; + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper == "SET-IMPROVISED-WEAPON-NO-PENALTY"){ + + + gState_improvisedWeaponNoPenalty = true; + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper == "SET-ADD-LEVEL-TO-UNTRAINED-WEAPONS"){ + + + gState_addLevelToUntrainedWeaponAttack = true; + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper == "SET-ADD-LEVEL-TO-UNTRAINED-SKILLS"){ + + + gState_addLevelToUntrainedSkill = true; + + return PROCESS_RETURN.NEXT; + } + + if(wscStatementUpper == "DISPLAY-COMPANION-TAB"){ + + + gState_displayCompanionTab = true; + + return PROCESS_RETURN.NEXT; + } + + return PROCESS_RETURN.UNKNOWN; + +} + +function getSheetProcNumber(strNum, sourceName){ + if(strNum == null) { + displayError('Incorrect WSC syntax ('+sourceName+')(1-1): NaN error in sheet statement'); + return 0; + } + + strNum = strNum.toUpperCase().trim(); + + if(strNum.includes('HALF_LEVEL')) { + strNum = strNum.replace(/HALF_LEVEL/g, Math.floor(g_character.level/2)+''); + } + if(strNum.includes('LEVEL')) { + strNum = strNum.replace(/LEVEL/g, g_character.level+''); + } + + if(strNum.includes('STR_MOD')) { + strNum = strNum.replace(/STR_MOD/g, getModOfValue('STR')); + } + if(strNum.includes('DEX_MOD')) { + strNum = strNum.replace(/DEX_MOD/g, getModOfValue('DEX')); + } + if(strNum.includes('CON_MOD')) { + strNum = strNum.replace(/CON_MOD/g, getModOfValue('CON')); + } + if(strNum.includes('INT_MOD')) { + strNum = strNum.replace(/INT_MOD/g, getModOfValue('INT')); + } + if(strNum.includes('WIS_MOD')) { + strNum = strNum.replace(/WIS_MOD/g, getModOfValue('WIS')); + } + if(strNum.includes('CHA_MOD')) { + strNum = strNum.replace(/CHA_MOD/g, getModOfValue('CHA')); + } + + try { + return parseInt(math.evaluate(strNum)); + } catch (err) { + displayError('Incorrect WSC syntax ('+sourceName+')(1-2): NaN error in sheet statement'); + return 0; + } +} + +/* Conditions Functions (from conditions-manager.js) */ +function getConditionFromName(name) { + for (const condition of g_allConditions) { + if (condition.name.toLowerCase() == name.toLowerCase()) { + return condition; + } + } + return null; +} + +function getCurrentConditionIDFromName(name) { + for (const condition of g_allConditions) { + if (condition.name.toLowerCase() == name.toLowerCase()) { + return condition.id; // might not be returning the correct ID (needs EntryID) + } + } + return null; +} + +function addCondition(conditionID, value, sourceText, parentID = null) { + +} + +function removeCondition(conditionID, onlyWithSourceText = null) { + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/scripts/extra-skills-and-langs.js b/client/vue-src/legacy-js/build_planner/scripts/extra-skills-and-langs.js new file mode 100644 index 00000000..af842a5c --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/extra-skills-and-langs.js @@ -0,0 +1,59 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +const extraSkillsAndLangs_isDebug = false; + +// Process Extra Ancestry Langs and Class Skill Trainings (based on Int mod) +let extraSkillsAndLangs_isInCooldown = false; +let extraSkillsAndLangs_isInterrupted = false; + +function processExtraSkillsAndLangs(){ + + if(extraSkillsAndLangs_isDebug) {console.log('ExS&L - Called');} + + if(!extraSkillsAndLangs_isInCooldown){ + + if(extraSkillsAndLangs_isDebug) {console.log('ExS&L - Entered Cooldown');} + + extraSkillsAndLangs_isInCooldown = true; + setTimeout(() => { extraSkillsAndLangs_finishCooldown(); }, 1000); + + } else { + + if(extraSkillsAndLangs_isDebug) {console.log('ExS&L - Cooldown Interrupted, marked');} + + extraSkillsAndLangs_isInterrupted = true; + + } + +} + +function extraSkillsAndLangs_finishCooldown(){ + extraSkillsAndLangs_isInCooldown = false; + + if(extraSkillsAndLangs_isDebug) {console.log('ExS&L - Finish Cooldown');} + + if(extraSkillsAndLangs_isInterrupted){ + + if(extraSkillsAndLangs_isDebug) {console.log('ExS&L - Was Interrupted, restarting');} + + extraSkillsAndLangs_isInterrupted = false; + processExtraSkillsAndLangs(); + + } else { + + extraSkillsAndLangs_execute(); + + } + +} + +function extraSkillsAndLangs_execute(){ + + if(extraSkillsAndLangs_isDebug) {console.log('ExS&L - EXECUTED');} + + processMoreAncestryLangs(getCharAncestry(), 'ancestry-initial-stats-code-languages-extra'); + processMoreClassSkills(getCharClass(), 'class-feature-initial-stats-code-skills-extra'); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/scripts/init-variables.js b/client/vue-src/legacy-js/build_planner/scripts/init-variables.js new file mode 100644 index 00000000..d575325e --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/init-variables.js @@ -0,0 +1,209 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function initVariables(){ + + g_variableMap.clear(); + + // Level + initializeVariable(VARIABLE.LEVEL, VAR_TYPE.INTEGER, g_character.level); + + // Ability Scores + varInit_abilityScores(); + initializeVariable(VARIABLE.SCORE_NONE, VAR_TYPE.ABILITY_SCORE, 10); + + // Class Name + const charClass = getCharClass(); + if(charClass != null && charClass.Class != null){ + variables_addString(VARIABLE.CLASS_NAME, charClass.Class.name); + } + + // Speed + varInit_speeds(); + + // Profs + let profMap = getProfMap(); + + // Key Ability + let keyBoost = getDataSingleAbilityBonus({ + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'keyAbility', + sourceCodeSNum: 'a' + }); + if(keyBoost != null){ + initializeVariableProf(VARIABLE.CLASS_DC, 'SCORE_'+keyBoost.Ability, 0, profMap.get("Class_DC")); + } else { + initializeVariableProf(VARIABLE.CLASS_DC, VARIABLE.SCORE_NONE, 0, profMap.get("Class_DC")); + } + + // Saves + initializeVariableProf(VARIABLE.SAVE_FORT, VARIABLE.SCORE_CON, 0, profMap.get("Fortitude")); + initializeVariableProf(VARIABLE.SAVE_REFLEX, VARIABLE.SCORE_DEX, 0, profMap.get("Reflex")); + initializeVariableProf(VARIABLE.SAVE_WILL, VARIABLE.SCORE_WIS, 0, profMap.get("Will")); + + // Skills + for(const [skillName, skillData] of g_skillMap.entries()){ + let skillCodeName = skillName.replace(/\s/g,'_'); + initializeVariableProf('SKILL_'+skillCodeName, 'SCORE_'+skillData.Skill.ability, 0, profMap.get(skillName)); + } + + // Lore Skills + for(const loreData of getDataAll(DATA_SOURCE.LORE)){ + initializeVariableProf(`SKILL_${profConversion_convertOldName(loreData.value)}_LORE`, VARIABLE.SCORE_INT, 0, profMap.get(capitalizeWords(loreData.value)+' Lore')); + } + + // Perception + initializeVariableProf(VARIABLE.PERCEPTION, VARIABLE.SCORE_WIS, 0, profMap.get("Perception")); + + // Spell Attacks and DCs + initializeVariableProf(VARIABLE.ARCANE_SPELL_ATTACK, VARIABLE.SCORE_NONE, 0, profMap.get("ArcaneSpellAttacks")); + initializeVariableProf(VARIABLE.OCCULT_SPELL_ATTACK, VARIABLE.SCORE_NONE, 0, profMap.get("OccultSpellAttacks")); + initializeVariableProf(VARIABLE.PRIMAL_SPELL_ATTACK, VARIABLE.SCORE_NONE, 0, profMap.get("PrimalSpellAttacks")); + initializeVariableProf(VARIABLE.DIVINE_SPELL_ATTACK, VARIABLE.SCORE_NONE, 0, profMap.get("DivineSpellAttacks")); + + initializeVariableProf(VARIABLE.ARCANE_SPELL_DC, VARIABLE.SCORE_NONE, 0, profMap.get("ArcaneSpellDCs")); + initializeVariableProf(VARIABLE.OCCULT_SPELL_DC, VARIABLE.SCORE_NONE, 0, profMap.get("OccultSpellDCs")); + initializeVariableProf(VARIABLE.PRIMAL_SPELL_DC, VARIABLE.SCORE_NONE, 0, profMap.get("PrimalSpellDCs")); + initializeVariableProf(VARIABLE.DIVINE_SPELL_DC, VARIABLE.SCORE_NONE, 0, profMap.get("DivineSpellDCs")); + + // Init Max HP + let ancestryHitPoints = 0; + if(getCharAncestry() != null){ + ancestryHitPoints = getCharAncestry().Ancestry.hitPoints; + } + initializeVariable(VARIABLE.MAX_HEALTH, VAR_TYPE.INTEGER, ancestryHitPoints); + initializeVariable(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL, VAR_TYPE.INTEGER, 0); + + // Attacks + initializeVariableProf(VARIABLE.SIMPLE_WEAPONS, VARIABLE.SCORE_NONE, 0, profMap.get("Simple_Weapons")); + initializeVariableProf(VARIABLE.MARTIAL_WEAPONS, VARIABLE.SCORE_NONE, 0, profMap.get("Martial_Weapons")); + initializeVariableProf(VARIABLE.ADVANCED_WEAPONS, VARIABLE.SCORE_NONE, 0, profMap.get("Advanced_Weapons")); + initializeVariableProf(VARIABLE.UNARMED_ATTACKS, VARIABLE.SCORE_NONE, 0, profMap.get("Unarmed_Attacks")); + + // Defenses + initializeVariableProf(VARIABLE.LIGHT_ARMOR, VARIABLE.SCORE_NONE, 0, profMap.get("Light_Armor")); + initializeVariableProf(VARIABLE.MEDIUM_ARMOR, VARIABLE.SCORE_NONE, 0, profMap.get("Medium_Armor")); + initializeVariableProf(VARIABLE.HEAVY_ARMOR, VARIABLE.SCORE_NONE, 0, profMap.get("Heavy_Armor")); + initializeVariableProf(VARIABLE.UNARMORED_DEFENSE, VARIABLE.SCORE_NONE, 0, profMap.get("Unarmored_Defense")); + + // Resists & Weaks + initializeVariable(VARIABLE.RESISTANCES, VAR_TYPE.STRING, ''); + initializeVariable(VARIABLE.WEAKNESSES, VAR_TYPE.STRING, ''); + + // Languages + initializeVariable(VARIABLE.LANGUAGES, VAR_TYPE.STRING, ''); + + // Init integer values, for adding bonuses/penalties to them + initializeVariable(VARIABLE.AC, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.DEX_CAP, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.ARMOR_CHECK_PENALTY, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.ARMOR_SPEED_PENALTY, VAR_TYPE.INTEGER, VAR_NULL); + + initializeVariable(VARIABLE.INVEST_LIMIT, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.BULK_LIMIT, VAR_TYPE.INTEGER, VAR_NULL); + + initializeVariable(VARIABLE.ATTACKS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.ATTACKS_DMG_DICE, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + + initializeVariable(VARIABLE.MELEE_ATTACKS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.MELEE_ATTACKS_DMG_DICE, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.MELEE_ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.AGILE_MELEE_ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.NON_AGILE_MELEE_ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + + initializeVariable(VARIABLE.RANGED_ATTACKS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.RANGED_ATTACKS_DMG_DICE, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.RANGED_ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + + // Run All SourceBook Code // + if(g_enabledSources != null){ + for(let enabledSource of g_enabledSources){ + + // Run Removal Statements first + processRemovalStatements(enabledSource.code, enabledSource.codeName, enabledSource.bundleID); + + processCode( + enabledSource.code, + { + sourceType: 'other', + sourceLevel: 0, + sourceCode: 'source-book', + sourceCodeSNum: 'a', + }, + null, // No location + {source: 'SourceBook', sourceName: enabledSource.name}); + } + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + +} + + + +function varInit_abilityScores(){ + + let srcStruct = { + sourceType: 'other', + sourceLevel: 1, + sourceCode: 'none', + sourceCodeSNum: 'a', + }; + let bonusData = getDataSingleAbilityBonus(srcStruct); + let charAbilityScores = null; + if(bonusData != null) { + let bonusArray = JSON.parse(bonusData.Bonus); + charAbilityScores = { + STR : 10 + parseInt(bonusArray[0]), + DEX : 10 + parseInt(bonusArray[1]), + CON : 10 + parseInt(bonusArray[2]), + INT : 10 + parseInt(bonusArray[3]), + WIS : 10 + parseInt(bonusArray[4]), + CHA : 10 + parseInt(bonusArray[5]), + }; + } else { + charAbilityScores = { + STR : 10, + DEX : 10, + CON : 10, + INT : 10, + WIS : 10, + CHA : 10, + }; + } + + initializeVariable(VARIABLE.SCORE_STR, VAR_TYPE.ABILITY_SCORE, charAbilityScores.STR); + initializeVariable(VARIABLE.SCORE_DEX, VAR_TYPE.ABILITY_SCORE, charAbilityScores.DEX); + initializeVariable(VARIABLE.SCORE_CON, VAR_TYPE.ABILITY_SCORE, charAbilityScores.CON); + initializeVariable(VARIABLE.SCORE_INT, VAR_TYPE.ABILITY_SCORE, charAbilityScores.INT); + initializeVariable(VARIABLE.SCORE_WIS, VAR_TYPE.ABILITY_SCORE, charAbilityScores.WIS); + initializeVariable(VARIABLE.SCORE_CHA, VAR_TYPE.ABILITY_SCORE, charAbilityScores.CHA); + initializeVariable(VARIABLE.SCORE_NONE, VAR_TYPE.ABILITY_SCORE, 10); + + for(const bonusData of getDataAllAbilityBonus()){ + if(bonusData.Bonus == "Boost") { + variables_addToBonuses('SCORE_'+bonusData.Ability, 2, JSON.stringify(parameterizeSrcStruct(bonusData.source, bonusData)), 'Boost'); + } else if(bonusData.Bonus == "Flaw") { + variables_addToBonuses('SCORE_'+bonusData.Ability, -2, JSON.stringify(parameterizeSrcStruct(bonusData.source, bonusData)), 'Flaw'); + } else { + variables_addToBonuses('SCORE_'+bonusData.Ability, parseInt(bonusData.Bonus), JSON.stringify(parameterizeSrcStruct(bonusData.source, bonusData)), 'Unknown'); + } + } + +} + + +function varInit_speeds(){ + + if(getCharAncestry() != null){ + initializeVariable(VARIABLE.SPEED, VAR_TYPE.INTEGER, getCharAncestry().Ancestry.speed); + } + for(const speedData of getDataAllOtherSpeed()){ + initializeVariable('SPEED_'+speedData.Type, VAR_TYPE.INTEGER, speedData.Amount); + } + +} + + diff --git a/client/vue-src/legacy-js/build_planner/scripts/process-ancestry-stats.js b/client/vue-src/legacy-js/build_planner/scripts/process-ancestry-stats.js new file mode 100644 index 00000000..a3528769 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/process-ancestry-stats.js @@ -0,0 +1,514 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + + outputStruct: { + hitPoints: { + displayID, + codeID, + }, + size: { + displayID, + codeID, + }, + speed: { + displayID, + codeID, + }, + + languages: { + displayID, + codeID, + }, + senses: { + displayID, + codeID, + }, + physicalFeatures: { + displayID, + codeID, + }, + + boosts: { + displayID, + codeID, + }, + flaws: { + displayID, + codeID, + }, + } + +*/ + +const PROCESS_ANCESTRY_STATS_TYPE = { + DISPLAY: 'DISPLAY', + RUN_CODE: 'RUN_CODE', + BOTH: 'BOTH', +}; + +// Designed to replicate the same sourceCode value as the old character builder to support old data // +function processAncestryStats(ancestryData, outputStruct, processType){ + const isBoth = (processType == PROCESS_ANCESTRY_STATS_TYPE.BOTH); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hit Points ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.hitPoints.displayID).html(` +

    + ${ancestryData.Ancestry.hitPoints} +

    + `); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Size ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.size.displayID).html(` +

    + ${capitalizeWords(ancestryData.Ancestry.size)} +

    + `); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Speed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.speed.displayID).html(` +

    + ${ancestryData.Ancestry.speed} ft +

    + `); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Languages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.DISPLAY || isBoth){ + + let ancestryLanguages = ''; + for(const language of ancestryData.Languages) { + ancestryLanguages += language.name+", "; + } + + const ancestryBonusLanguagesArray = ancestryData.BonusLanguages.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + let bonusLangs = ''; + for(const bonusLang of ancestryBonusLanguagesArray) { + bonusLangs += bonusLang.name+", "; + } + bonusLangs = bonusLangs.substring(0, bonusLangs.length - 2); + + ancestryLanguages += 'and more*'; + + $('#'+outputStruct.languages.displayID).html(` +

    + ${ancestryLanguages} +

    + `); + + $('.ancestry-langs-more-info').click(function(){ + openQuickView('abilityView', { + Ability : { + name: 'Additional Languages - '+ancestryData.Ancestry.name, + description: 'You get to learn an additional number of languages equal your final Intelligence modifier (if it\'s positive). Choose from the following list (or any others you may have access to): '+bonusLangs, + level: 0, + } + }); + }); + + } + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.RUN_CODE || isBoth){ + + let langCount = 0; + for(const language of ancestryData.Languages) { + processCode( + `GIVE-LANG-NAME=${language.name}`, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-'+langCount, + sourceCodeSNum: '', + }, + outputStruct.languages.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + langCount++; + } + + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Senses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.DISPLAY || isBoth){ + + let ancestrySenses = ''; + if(ancestryData.VisionSense != null){ + ancestrySenses += ''+ancestryData.VisionSense.name+''; + if(ancestryData.AdditionalSense != null){ + ancestrySenses += ' and '; + } + } + if(ancestryData.AdditionalSense != null){ + ancestrySenses += ''+ancestryData.AdditionalSense.name+''; + } + + $('#'+outputStruct.senses.displayID).html(` +

    + ${ancestrySenses} +

    + `); + + $('.ancestry-sense-vision').click(function(){ + openQuickView('abilityView', { + Ability : { + name: ancestryData.VisionSense.name, + description: ancestryData.VisionSense.description, + level: 0, + } + }); + }); + $('.ancestry-sense-additional').click(function(){ + openQuickView('abilityView', { + Ability : { + name: ancestryData.AdditionalSense.name, + description: ancestryData.AdditionalSense.description, + level: 0, + } + }); + }); + + } + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.RUN_CODE || isBoth){ + + if(ancestryData.VisionSense != null){ + processCode( + `GIVE-SENSE-NAME=${ancestryData.VisionSense.name}`, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-1', + sourceCodeSNum: '', + }, + outputStruct.senses.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + } + if(ancestryData.AdditionalSense != null){ + processCode( + `GIVE-SENSE-NAME=${ancestryData.AdditionalSense.name}`, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-'+((ancestryData.VisionSense == null) ? 1 : 2), + sourceCodeSNum: '', + }, + outputStruct.senses.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + } + + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Physical Features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.DISPLAY || isBoth){ + + let ancestryPhyFeatures = ''; + if(ancestryData.PhysicalFeatureOne != null){ + ancestryPhyFeatures += ''+ancestryData.PhysicalFeatureOne.name+''; + if(ancestryData.PhysicalFeatureTwo != null){ + ancestryPhyFeatures += ' and '; + } + } + if(ancestryData.PhysicalFeatureTwo != null){ + ancestryPhyFeatures += ''+ancestryData.PhysicalFeatureTwo.name+''; + } + + $('#'+outputStruct.physicalFeatures.displayID).html(` +

    + ${ancestryPhyFeatures} +

    + `); + + $('.ancestry-phy-feat-one').click(function(){ + openQuickView('abilityView', { + Ability : { + name: ancestryData.PhysicalFeatureOne.name, + description: ancestryData.PhysicalFeatureOne.description, + level: 0, + } + }); + }); + $('.ancestry-phy-feat-two').click(function(){ + openQuickView('abilityView', { + Ability : { + name: ancestryData.PhysicalFeatureTwo.name, + description: ancestryData.PhysicalFeatureTwo.description, + level: 0, + } + }); + }); + + // Hide section if no physical features + if(ancestryData.PhysicalFeatureOne == null && ancestryData.PhysicalFeatureTwo == null){ + $('#ancestry-initial-stats-extra-features-section').addClass('is-hidden'); + } else { + $('#ancestry-initial-stats-extra-features-section').removeClass('is-hidden'); + } + + } + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.RUN_CODE || isBoth){ + + if(ancestryData.PhysicalFeatureOne != null){ + // Giving Physical Feature + processCode( + `GIVE-PHYSICAL-FEATURE-NAME=${ancestryData.PhysicalFeatureOne.name}`, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-1', + sourceCodeSNum: 'a', + }, + outputStruct.physicalFeatures.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + + // Running Physical Feature Code + processCode( + ancestryData.PhysicalFeatureOne.code, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-phyFeat-1', + sourceCodeSNum: 'a', + }, + outputStruct.physicalFeatures.codeID, + {source: 'Ancestry', sourceName: ancestryData.PhysicalFeatureOne.name}); + } + if(ancestryData.PhysicalFeatureTwo != null){ + // Giving Physical Feature + processCode( + `GIVE-PHYSICAL-FEATURE-NAME=${ancestryData.PhysicalFeatureTwo.name}`, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-'+((ancestryData.PhysicalFeatureOne == null) ? 1 : 2), + sourceCodeSNum: 'a', + }, + outputStruct.physicalFeatures.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + + // Running Physical Feature Code + processCode( + ancestryData.PhysicalFeatureTwo.code, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-phyFeat-2', + sourceCodeSNum: 'a', + }, + outputStruct.physicalFeatures.codeID, + {source: 'Ancestry', sourceName: ancestryData.PhysicalFeatureTwo.name}); + } + + } + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Boosts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.DISPLAY || isBoth){ + + let ancestryBoosts = ''; + for(const boost of ancestryData.Boosts){ + if(ancestryBoosts != ''){ancestryBoosts += ', ';} + if(boost == 'Anything'){ + ancestryBoosts += 'Free'; + } else { + ancestryBoosts += boost; + } + } + if(ancestryBoosts == '') {ancestryBoosts = 'None';} + + $('#'+outputStruct.boosts.displayID).html(` +

    + ${ancestryBoosts} +

    + `); + + } + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.RUN_CODE || isBoth){ + + let chooseBoostCount = 0; + let nonChooseBoostCount = -1; + for(const boost of ancestryData.Boosts){ + + let abilityScore = shortenAbilityType(boost); + if(abilityScore == 'ALL'){ + chooseBoostCount++; + continue; + } else { + nonChooseBoostCount++; + } + + processCode( + `GIVE-ABILITY-BOOST-SINGLE=${abilityScore}`, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'boost-nonChoose-'+nonChooseBoostCount, + sourceCodeSNum: '', + }, + outputStruct.boosts.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + } + + + // Create list of free options + let freeListOptions = new Set(['STR','DEX','CON','INT','WIS','CHA']); + for(const boost of ancestryData.Boosts){ + freeListOptions.delete(shortenAbilityType(boost)); + } + freeListOptions = Array.from(freeListOptions); + + let boostChooseCode = ''; + for(let i = 0; i < chooseBoostCount; i++) { + boostChooseCode += 'GIVE-ABILITY-BOOST-SINGLE='+freeListOptions+'\n'; + } + if(boostChooseCode != ''){ + processCode( + boostChooseCode, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'boost-choose', + sourceCodeSNum: 'a', + }, + outputStruct.boosts.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + } + + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Flaws ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.DISPLAY || isBoth){ + + let ancestryFlaws = ''; + for(const flaw of ancestryData.Flaws){ + if(ancestryFlaws != ''){ancestryFlaws += ', ';} + if(flaw == 'Anything'){ + ancestryFlaws += 'Free'; + } else { + ancestryFlaws += flaw; + } + } + if(ancestryFlaws == '') {ancestryFlaws = 'None';} + + $('#'+outputStruct.flaws.displayID).html(` +

    + ${ancestryFlaws} +

    + `); + + } + + if(processType == PROCESS_ANCESTRY_STATS_TYPE.RUN_CODE || isBoth){ + + + let chooseFlawCount = 0; + let nonChooseFlawCount = -1; + for(const flaw of ancestryData.Flaws){ + + let abilityScore = shortenAbilityType(flaw); + if(abilityScore == 'ALL'){ + chooseFlawCount++; + continue; + } else { + nonChooseFlawCount++; + } + + processCode( + `GIVE-ABILITY-FLAW-SINGLE=${abilityScore}`, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'flaw-nonChoose-'+nonChooseFlawCount, + sourceCodeSNum: '', + }, + outputStruct.flaws.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + } + + + // Create list of free options + let freeListOptions = new Set(['STR','DEX','CON','INT','WIS','CHA']); + for(const flaw of ancestryData.Flaws){ + freeListOptions.delete(shortenAbilityType(flaw)); + } + freeListOptions = Array.from(freeListOptions); + + let flawChooseCode = ''; + for(let i = 0; i < chooseFlawCount; i++) { + flawChooseCode += 'GIVE-ABILITY-FLAW-SINGLE='+freeListOptions+'\n'; + } + if(flawChooseCode != ''){ + processCode( + flawChooseCode, + { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'flaw-choose', + sourceCodeSNum: 'a', + }, + outputStruct.flaws.codeID, + {source: 'Ancestry', sourceName: 'Initial Ancestry'}); + } + + } + +} + +function processMoreAncestryLangs(ancestryData, extraLangsCodeID){ + if(ancestryData == null) { return; } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Extra Languages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let allLangData = getDataAllLanguage(); + + deleteDataBySourceCode('inits-bonus-lang'); + + let currentChar = 'a'; + let extraLangCode = ''; + let additionalLangs = getMod(variables_getTotal(VARIABLE.SCORE_INT)); + if(ancestryData.Ancestry.name == 'Human'){ additionalLangs++; } // Hardcoded - ancestry named Human gains +1 langs. + for (let i = 0; i < additionalLangs; i++) { + extraLangCode += 'GIVE-LANG-BONUS-ONLY\n'; + + let langData = allLangData.find(langData => { + return (langData.sourceCode == 'inits-bonus-lang' && langData.sourceCodeSNum.endsWith(currentChar+'a')); + }); + if(langData != null){ + setDataLanguage(langData, langData.value); + } + + currentChar = processor_charIncrease(currentChar); + } + + $('#'+extraLangsCodeID).html(''); + processCode( + extraLangCode, + { + sourceType: 'class', // This is a mistake, should be ancestry + sourceLevel: 1, + sourceCode: 'inits-bonus-lang', + sourceCodeSNum: 'a', + }, + extraLangsCodeID, + {source: 'Ancestry', sourceName: 'Extra Languages'}); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/scripts/process-class-stats.js b/client/vue-src/legacy-js/build_planner/scripts/process-class-stats.js new file mode 100644 index 00000000..92c23b58 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/process-class-stats.js @@ -0,0 +1,479 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + + outputStruct: { + keyAbility: { + displayID, + codeID, + }, + hitPoints: { + displayID, + codeID, + }, + + perception: { + displayID, + codeID, + }, + skills: { + displayID, + codeID, + }, + savingThrows: { + displayID, + codeID, + }, + classDC: { + displayID, + codeID, + }, + attacks: { + displayID, + codeID, + }, + defenses: { + displayID, + codeID, + }, + } + +*/ + +const PROCESS_CLASS_STATS_TYPE = { + DISPLAY: 'DISPLAY', + RUN_CODE: 'RUN_CODE', + BOTH: 'BOTH', +}; + +function processClassStats(classData, outputStruct, processType){ + const isBoth = (processType == PROCESS_CLASS_STATS_TYPE.BOTH); + + let statInitCount = 0; + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Key Ability ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + $('#'+outputStruct.keyAbility.codeID).html(``); + } + + if(classData.keyAbility == 'OTHER'){ + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.keyAbility.displayID).html(` +

    + Other +

    + `); + } + + } else if(classData.keyAbility.includes(' or ')) { + + let keyAbilityOptionArray = classData.keyAbility.split(' or '); + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + processCode( + `SET-KEY-ABILITY=${shortenAbilityType(keyAbilityOptionArray[0])},${shortenAbilityType(keyAbilityOptionArray[1])}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'keyAbility', + sourceCodeSNum: 'a' + }, + outputStruct.keyAbility.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + + if(isBoth){ + $('#'+outputStruct.keyAbility.displayID).html(` +

    + ${classData.keyAbility} +

    + `); + } + + } else { + + $('#'+outputStruct.keyAbility.displayID).html(` +

    + ${classData.keyAbility} +

    + `); + + } + + } else { + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.keyAbility.displayID).html(` +

    + ${classData.keyAbility} +

    + `); + } + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + processCode( + `SET-KEY-ABILITY=${shortenAbilityType(classData.keyAbility)}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'keyAbility', + sourceCodeSNum: 'a' + }, + outputStruct.keyAbility.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + } + + } + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hit Points ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.hitPoints.displayID).html(` +

    + ${classData.hitPoints} +

    + `); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Perception ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.perception.displayID).html(` + + `); + } + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + processCode( + `GIVE-PROF-IN=${VARIABLE.PERCEPTION}:${classData.tPerception}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.perception.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Skills ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + $('#'+outputStruct.skills.codeID).html(``); + } + + let profSkillsInner = ''; + + let tSkillsArray; + if(classData.tSkills != null){ + tSkillsArray = classData.tSkills.split(', '); + } else { + tSkillsArray = []; + } + for(const tSkill of tSkillsArray){ + + if(tSkill.includes(' or ')){ + + let tSkillsOptionArray = tSkill.split(' or '); + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + + processCode( + `GIVE-SKILL=T[${tSkillsOptionArray[0]},${tSkillsOptionArray[1]}]`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.skills.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + + } else { + + profSkillsInner += '
  • Trained in '+tSkill+'
  • '; + + } + + } else { + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + profSkillsInner += '
  • Trained in '+tSkill+'
  • '; + } + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + processCode( + `GIVE-PROF-IN=${tSkill.replace(/ /g,'_')}:T`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.skills.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + } + + } + + } + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + profSkillsInner += ` +
  • + Trained in ${classData.tSkillsMore}* more skills +
  • + `; + $('#'+outputStruct.skills.displayID).html(``); + + $('.class-feature-initial-stats-skills-more-info').click(function(){ + openQuickView('abilityView', { + Ability : { + name: 'Additional Skills - '+classData.name, + description: `You get to select training in an additional number of skills equal to ${classData.tSkillsMore} plus your final Intelligence modifier.`, + level: 0, + } + }); + }); + + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Saving Throws ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.savingThrows.displayID).html(` + + `); + } + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + processCode( + `GIVE-PROF-IN=${VARIABLE.SAVE_FORT}:${classData.tFortitude}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.savingThrows.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + + processCode( + `GIVE-PROF-IN=${VARIABLE.SAVE_REFLEX}:${classData.tReflex}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.savingThrows.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + + processCode( + `GIVE-PROF-IN=${VARIABLE.SAVE_WILL}:${classData.tWill}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.savingThrows.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Attacks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let profAttacksInner = ''; + + let tWeaponsArray = []; + if(classData.tWeapons != null) { tWeaponsArray = classData.tWeapons.split(',,, '); } + for(const tWeapons of tWeaponsArray){ + + let sections = tWeapons.split(':::'); + let weapTraining = sections[0]; + let weaponName = sections[1]; + + let singleWeapon = false; + let weapID; + let profConvertData = g_profConversionMap.get(weaponName.replace(/\s+/g,'').toUpperCase()); + if(profConvertData != null){ + weapID = profConvertData.Name; + } else { + singleWeapon = true; + weapID = weaponName.replace(/\s+/g,'_').toUpperCase(); + } + + if(weaponName.slice(-1) === 's'){ + // is plural + profAttacksInner += `
  • ${profToWord(weapTraining)+" in all "+weaponName}
  • `; + } else { + // is singular + profAttacksInner += `
  • ${profToWord(weapTraining)+" in the "+weaponName}
  • `; + } + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + processCode( + `GIVE-PROF-IN=${(singleWeapon) ? 'WEAPON~' : ''}${weapID}:${weapTraining}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.attacks.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + } + + } + if(classData.weaponsExtra != null) { + let weapLines = classData.weaponsExtra.split('\n'); + for(const weapLine of weapLines){ + let newWeapLine = weapLine; + newWeapLine = newWeapLine.replace('Untrained','Untrained'); + newWeapLine = newWeapLine.replace('Trained','Trained'); + newWeapLine = newWeapLine.replace('Expert','Expert'); + newWeapLine = newWeapLine.replace('Master','Master'); + newWeapLine = newWeapLine.replace('Legendary','Legendary'); + profAttacksInner += `
  • ${newWeapLine}
  • `; + } + } + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.attacks.displayID).html(``); + } + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defenses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let profDefensesInner = ''; + + let tArmorArray = []; + if(classData.tArmor != null) { tArmorArray = classData.tArmor.split(',,, '); } + for(const tArmor of tArmorArray){ + + let sections = tArmor.split(':::'); + let armorTraining = sections[0]; + let armorName = sections[1]; + + let singleArmor = false; + let armorID; + let profConvertData = g_profConversionMap.get(armorName.replace(/\s+/g,'').toUpperCase()); + if(profConvertData != null){ + armorID = profConvertData.Name; + } else { + singleArmor = true; + armorID = armorName.replace(/\s+/g,'_').toUpperCase(); + } + + profDefensesInner += `
  • ${profToWord(armorTraining)+" in all "+armorName}
  • `; + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + processCode( + `GIVE-PROF-IN=${(singleArmor) ? 'ARMOR~' : ''}${armorID}:${armorTraining}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.defenses.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + } + + } + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.defenses.displayID).html(``); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Class DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + if(processType == PROCESS_CLASS_STATS_TYPE.DISPLAY || isBoth){ + $('#'+outputStruct.classDC.displayID).html(` + + `); + } + + if(processType == PROCESS_CLASS_STATS_TYPE.RUN_CODE || isBoth){ + processCode( + `GIVE-PROF-IN=${VARIABLE.CLASS_DC}:${classData.tClassDC}`, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-'+statInitCount, + sourceCodeSNum: 'a', + }, + outputStruct.classDC.codeID, + {source: 'Class', sourceName: 'Initial Prof (Class)'}); + statInitCount++; + } + +} + +function processMoreClassSkills(charClass, extraSkillsCodeID){ + if(charClass == null) { return; } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Extra Skills ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let allProfData = getDataAllProficiencies(); + let allLoreData = getDataAll(DATA_SOURCE.LORE); + + deleteDataBySourceCode('inits-bonus-prof'); + + let currentChar = 'a'; + let extraSkillCode = ''; + for (let i = 0; i < getMod(variables_getTotal(VARIABLE.SCORE_INT))+charClass.Class.tSkillsMore; i++) { + extraSkillCode += 'GIVE-SKILL=T\n'; + + for(let profData of allProfData){ + if(profData.sourceCode == 'inits-bonus-prof' && profData.sourceCodeSNum.endsWith(currentChar+'a')){ + setDataProficiencies(profData, profData.For, profData.To, profData.Prof, profData.SourceName, false); + } + } + + let loreData = allLoreData.find(loreData => { + return (loreData.sourceCode == 'inits-bonus-prof' && loreData.sourceCodeSNum.endsWith(currentChar+'a')); + }); + if(loreData != null){ + setData(DATA_SOURCE.LORE, loreData, loreData.value); + } + + currentChar = processor_charIncrease(currentChar); + } + + $('#'+extraSkillsCodeID).html(''); + processCode( + extraSkillCode, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-bonus-prof', + sourceCodeSNum: 'a', + }, + extraSkillsCodeID, + {source: 'Class', sourceName: 'Extra Skill Trainings'}); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/scripts/unselected-options.js b/client/vue-src/legacy-js/build_planner/scripts/unselected-options.js new file mode 100644 index 00000000..a2ee6cc5 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/unselected-options.js @@ -0,0 +1,153 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + Tag Name: data-selection-info + + STATES: + - UNSELECTED + - INCORRECT +*/ + +function getTagFromData(srcStruct, sourceName, details, STATE){ + return srcStruct.sourceType+':::'+srcStruct.sourceLevel+':::'+srcStruct.sourceCode+':::'+srcStruct.sourceCodeSNum+';;;'+sourceName+':::'+details+':::'+STATE; +} +function getDataFromTag(tagData){ + let parts = tagData.split(';;;'); + let srcStructParts = parts[0].split(':::'); + let otherDataParts = parts[1].split(':::'); + return { + srcStruct: { + sourceType: srcStructParts[0], + sourceLevel: srcStructParts[1], + sourceCode: srcStructParts[2], + sourceCodeSNum: srcStructParts[3], + }, + sourceName: otherDataParts[0], + details: otherDataParts[1], + STATE: otherDataParts[2], + }; +} + + + +function selectorUpdated() { + + // Show blue circle indicator for all accords that require a selection // + if(g_builder_type == 'by-level'){ + if(g_char_id == null){// If build creator, use custom icons + selectorUpdatedBuildIcons(); + } else {// Else, use normal blue icons + $('.accord-creation-container').each(function() { + if($(this).find('.input.is-info').length !== 0 || $(this).find('.select.is-info').length !== 0 || $(this).find('.feat-selection.is-default').length !== 0){ + $(this).find('.accord-indicate-unselected-options').html(''); + } else { + $(this).find('.accord-indicate-unselected-options').html(''); + } + }); + } + } else if(g_builder_type == 'by-abc'){ + // Clear all blue dots + $('.accord-creation-container').each(function() { + $(this).find('.accord-indicate-unselected-options').html(''); + }); + + // Reapply blue dots + if(g_page_num == 2){ + $('.ancestry-feature-section').each(function() { + if($(this).find('.input.is-info').length !== 0 || $(this).find('.select.is-info').length !== 0 || $(this).find('.feat-selection.is-default').length !== 0){ + $(this).parent().parent().find('.accord-indicate-unselected-options').html(''); + } + }); + } else if(g_page_num == 3){ + $('.background-feature-section').each(function() { + if($(this).find('.input.is-info').length !== 0 || $(this).find('.select.is-info').length !== 0 || $(this).find('.feat-selection.is-default').length !== 0){ + $(this).parent().parent().find('.accord-indicate-unselected-options').html(''); + } + }); + } else if(g_page_num == 4){ + $('.class-feature-section').each(function() { + if($(this).find('.input.is-info').length !== 0 || $(this).find('.select.is-info').length !== 0 || $(this).find('.feat-selection.is-default').length !== 0){ + $(this).parent().parent().find('.accord-indicate-unselected-options').html(''); + } + }); + } + + } + + // Process all selections that haven't been selected + $('.select').each(function() { + let tagData = $(this).attr('data-selection-info'); + if(tagData != null && tagData != '') { + let data = getDataFromTag(tagData); + if($(this).hasClass('is-info')){ + addUnselectedData(data.srcStruct, JSON.stringify({ + sourceName: data.sourceName, + details: data.details, + STATE: data.STATE, + })); + } else { + removeUnselectedData(data.srcStruct); + } + } + }); + + $('.feat-selection').each(function() { + let tagData = $(this).attr('data-selection-info'); + if(tagData != null && tagData != ''){ + let data = getDataFromTag(tagData); + if(data.STATE != ''){ + addUnselectedData(data.srcStruct, JSON.stringify({ + sourceName: data.sourceName, + details: data.details, + STATE: data.STATE, + })); + } else { + removeUnselectedData(data.srcStruct); + } + } + }); + +} + +function addUnselectedData(srcStruct, unselectedData){ + let existingData = getDataSingle(DATA_SOURCE.UNSELECTED_DATA, srcStruct); + if(existingData == null || existingData.value == null){ + + setDataOnly(DATA_SOURCE.UNSELECTED_DATA, srcStruct, unselectedData); + + if(g_char_id != null){ + socket.emit("requestUnselectedDataChange", + g_char_id, + srcStruct, + unselectedData); + } else { + saveBuildMetaData(); + } + + } +} + +function removeUnselectedData(srcStruct, deleteOnly=true){ + let existingData = getDataSingle(DATA_SOURCE.UNSELECTED_DATA, srcStruct); + if(existingData != null && existingData.value != null){ + + if(deleteOnly){ + deleteDataOnly(DATA_SOURCE.UNSELECTED_DATA, srcStruct); + } else { + deleteData(DATA_SOURCE.UNSELECTED_DATA, srcStruct); + } + + if(g_char_id != null){ + socket.emit("requestUnselectedDataChange", + g_char_id, + srcStruct, + null, + deleteOnly); + } else { + saveBuildMetaData(); + } + + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/scripts/variants/auto-bonus-progression.js b/client/vue-src/legacy-js/build_planner/scripts/variants/auto-bonus-progression.js new file mode 100644 index 00000000..f292aeab --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/variants/auto-bonus-progression.js @@ -0,0 +1,239 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function addAutoBonusProgressionVariant(classStruct){ + classStruct.Abilities.push(getABP_AttackPotency(1, 2, 1)); + classStruct.Abilities.push(getABP_SkillPotencies(2, 3)); + classStruct.Abilities.push(getABP_DevastatingAttacks(3, 4, 2, 'two')); + classStruct.Abilities.push(getABP_DefensePotency(4, 5, 1)); + // #5, Skill Potency? + classStruct.Abilities.push(getABP_PerceptionPotency(6, 7, 1)); + classStruct.Abilities.push(getABP_SavingThrowPotency(7, 8, 1)); + // #8, Skill Potency? + classStruct.Abilities.push(getABP_AttackPotency(9, 10, 2)); + classStruct.Abilities.push(getABP_DefensePotency(10, 11, 2)); + classStruct.Abilities.push(getABP_DevastatingAttacks(11, 12, 3, 'three')); + classStruct.Abilities.push(getABP_PerceptionPotency(12, 13, 2)); + // #13, Skill Potency? + classStruct.Abilities.push(getABP_SavingThrowPotency(14, 14, 2)); + // #15, Skill Potency? + classStruct.Abilities.push(getABP_AttackPotency(16, 16, 3)); + classStruct.Abilities.push(getABP_AbilityApex(17, 17)); + // #18, Skill Potency? + classStruct.Abilities.push(getABP_DefensePotency(19, 18, 3)); + classStruct.Abilities.push(getABP_DevastatingAttacks(20, 19, 4, 'four')); + classStruct.Abilities.push(getABP_PerceptionPotency(21, 19, 3)); + classStruct.Abilities.push(getABP_SavingThrowPotency(22, 20, 3)); + // #23, Skill Potency? + + // Re-sort the abilities array... + classStruct.Abilities = classStruct.Abilities.sort( + function(a, b) { + if (a.level === b.level) { + // Name is only important when levels are the same + return a.name > b.name ? 1 : -1; + } + return a.level - b.level; + } + ); + + return classStruct; +} + +function getABP_AttackPotency(id_offset, lvl, bonus){ + return { + id: -2000+(-1*id_offset), + name: "Attack Potency +"+bonus, + level: lvl, + description: "You gain a +"+bonus+" potency bonus to attack rolls with all weapons and unarmed attacks.", + code: "INCREASE-ATTACKS="+bonus+"-POTENCY", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_SkillPotencies(id_offset, lvl){ + return { + id: -2000+(-1*id_offset), + name: "Skill Potencies", + level: lvl, + description: "At 3rd level, choose a single skill. You gain a +1 potency bonus with that skill. At 6th level, choose a second skill to gain a +1 potency bonus. At 9th level, choose one of those skills and increase its potency bonus to +2. At 13th level, increase the potency bonus of your second skill to +2 and choose a third skill to gain a +1 potency bonus. At 15th level, increase the third skill’s potency bonus to +2 and choose a fourth skill to gain a +1 potency bonus. At 17th level, choose one of your three skills with a +2 potency bonus to increase to +3, and choose a fifth skill to gain a +1 potency bonus. Finally, at 20th level, choose one of the two skills with a +2 potency bonus to increase to +3, choose one of the three skills at a +1 potency bonus to increase to +2, and choose one new skill to gain a +1 potency bonus.\nYou can spend 1 week to retrain one of these assignments at any time.\n__On the character sheet, you can customize skills to add an extra bonus to that skill. Use that to indicate the potency bonus' that you would gain.__", + code: "GIVE-NOTES-FIELD=You can use this area to keep track of what skills you've selected at the given levels.", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_DevastatingAttacks(id_offset, lvl, diceNum, diceWord){ + return { + id: -2000+(-1*id_offset), + name: "Devastating Attacks ("+diceWord+" dice)", + level: lvl, + description: "Your weapon and unarmed strikes deal "+diceWord+" damage dice instead of one.", + code: "INCREASE-ATTACKS_DMG_DICE="+diceNum+"-ABP", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_DefensePotency(id_offset, lvl, bonus){ + return { + id: -2000+(-1*id_offset), + name: "Defense Potency +"+bonus, + level: lvl, + description: "You gain a +"+bonus+" potency bonus to AC.", + code: "INCREASE-AC="+bonus+"-POTENCY", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_PerceptionPotency(id_offset, lvl, bonus){ + return { + id: -2000+(-1*id_offset), + name: "Perception Potency +"+bonus, + level: lvl, + description: "You gain a +"+bonus+" potency bonus to Perception.", + code: "INCREASE-PERCEPTION="+bonus+"-POTENCY", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_SavingThrowPotency(id_offset, lvl, bonus){ + return { + id: -2000+(-1*id_offset), + name: "Saving Throw Potency +"+bonus, + level: lvl, + description: "You gain a +"+bonus+" potency bonus to saves.", + code: "INCREASE-SAVE_FORT="+bonus+"-POTENCY\nINCREASE-SAVE_REFLEX="+bonus+"-POTENCY\nINCREASE-SAVE_WILL="+bonus+"-POTENCY", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_AbilityApex(id_offset, lvl){ + return { + id: -2000+(-1*id_offset), + name: "Ability Apex", + level: lvl, + description: "Choose one ability score to either increase by 2 or increase to 18 (whichever grants the higher score).\n__On the basics page of the character, you can change your starting ability scores from all 10's. Use this to edit your ability scores and reflect the apex ability change you chose.__", + code: "GIVE-NOTES-FIELD=You can use this area to keep track of what ability score you chose.", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} +/* +function addABP_AbilityApex(classAbilities, id_offset, lvl){ + let apexAbilityID = -2000+(-1*id_offset); + classAbilities.push({ + id: apexAbilityID, + name: "Ability Apex", + level: lvl, + description: "Choose one ability score to either increase by 2 or increase to 18 (whichever grants the higher score).", + code: null, + contentSrc: "CRB", + displayInSheet: 1, + selectType: "SELECTOR", + selectOptionFor: null, + isArchived: 0, + }); + + classAbilities.push({ + id: apexAbilityID-30, + name: "Ability Apex - Strength", + level: null, + description: "Increase your Strength score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=STR", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-31, + name: "Ability Apex - Dexterity", + level: null, + description: "Increase your Dexterity score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=DEX", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-32, + name: "Ability Apex - Constitution", + level: null, + description: "Increase your Constitution score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=CON", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-33, + name: "Ability Apex - Intelligence", + level: null, + description: "Increase your Intelligence score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=INT", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-34, + name: "Ability Apex - Wisdom", + level: null, + description: "Increase your Wisdom score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=WIS", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-35, + name: "Ability Apex - Charisma", + level: null, + description: "Increase your Charisma score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=CHA", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + + return classAbilities; + +}*/ \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/scripts/variants/class-archetypes.js b/client/vue-src/legacy-js/build_planner/scripts/variants/class-archetypes.js new file mode 100644 index 00000000..b828bd58 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/variants/class-archetypes.js @@ -0,0 +1,439 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_classArchetypeTryCount = 0; +let g_classArchetypeSelectedOptions = new Map(); +let g_classArchetypeChosenArchetype = null; + +/* replacementCodeJSON layout: + + { + initial: { + detectionCode: [], // Could contain ' $OR$ ' + archetypeText, + textChangeType: 'REPLACE' or 'ADD' + replacementStatement, + optionals: { replaceOnlyDetected: false, }, + extraCode, + }, + changes: [ + detectionCode, + extraText, + replacementStatement, + extraCode, + ] + } + + + code is run based on if class archetype is chosen. + code is adjusted based on chosen class archetype. + +*/ + +const g_classArchetypeDetectionCodeOR = ' $OR$ '; + +function resetClassArchetypes(){ + g_classArchetypeTryCount = 0; + g_classArchetypeSelectedOptions = new Map(); + g_classArchetypeChosenArchetype = null; +} + +function initClassArchetypes(classArchetypeID){ + for(let classArchetype of g_classArchetypes){ + + classArchetype.replacementCode = JSON.parse(classArchetype.replacementCodeJSON); + + if(classArchetype.id == classArchetypeID){ + g_classArchetypeChosenArchetype = classArchetype; + } + + } +} + +function applyClassArchetypeChoice(classFeature){ + if(!gOption_hasClassArchetypes){ return null; } + + if(classFeature.level != 1 && classFeature.level != null){ return null; } + if(classFeature.code == null){ return null; } + + const classFeatureCodeUpper = classFeature.code.toUpperCase(); + + let foundClassFeatureArchetypeChoices = function(classFeatureCodeUpper){ + let classArchetypes = []; + for(let classArchetype of g_classArchetypes){ + + let detectedCodeInClassFeature = function(){ + for(let detectionCode of classArchetype.replacementCode.initial.detectionCode){ + + if(detectionCode.includes(g_classArchetypeDetectionCodeOR)){ + + let detectionCodeParts = detectionCode.split(g_classArchetypeDetectionCodeOR); + if(classFeatureCodeUpper.includes(detectionCodeParts[0].toUpperCase()) || classFeatureCodeUpper.includes(detectionCodeParts[1].toUpperCase())){ + // Found + } else { + return false; + } + + } else { + if(!classFeatureCodeUpper.includes(detectionCode.toUpperCase())){ + return false; + } + } + + } + return true; + }; + let foundDetectionCode = detectedCodeInClassFeature(); + + if(foundDetectionCode){ + classArchetypes.push(classArchetype); + } + + } + return classArchetypes; + }; + + let foundArchetypes = foundClassFeatureArchetypeChoices(classFeatureCodeUpper); + if(foundArchetypes.length == 0) { return null; } + g_classArchetypeTryCount++; + + let tabsID = 'classArchetypeTabs-'+g_classArchetypeTryCount; + + let classArchetypeHTML = ''; + for(let classArchetype of foundArchetypes){ + classArchetypeHTML += ` +
  • + + ${classArchetype.name} Class Archetype + +
  • + `; + } + + const tabsHTML = ` +
    + +
    +
    + `; + + return { + tabsID, + tabsHTML, + }; + +} + +function assembleClassArchetypeTabs(tabsID, classFeatureID, originalDescription, srcStruct){ + + $('#'+tabsID+' > li > .classArchetypeTab').off('click'); + $('#'+tabsID+' > li > .classArchetypeTab').click(function(event, autoPageLoad){ + if($(this).parent().hasClass('is-active')) { return; } + $(this).parent().parent().find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + + const tabID = $(this).attr('id'); + let classArchetypeID = tabID.replace(tabsID+'-option-', ''); + + if(classArchetypeID == 'default'){ + $('#'+tabsID+'-description').html(processText(originalDescription, false, null)); + + g_classArchetypeSelectedOptions.set(classFeatureID, null); + + if(autoPageLoad == null || !autoPageLoad){ + g_classArchetypeChosenArchetype = null; + if(g_char_id != null){ + socket.emit("requestClassArchetypeChange", + g_char_id, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'classArchetype', + sourceCodeSNum: 'a', + }, + null); + } + } + + } else { + + // Set all other class archetypes to default + $('.classArchetypeTab').each(function() { + if(!$(this).attr('id').startsWith(tabsID)){ + $('#'+$(this).attr('id').split('-option-')[0]+'-option-default').trigger("click", [true]); + } + }); + + let classArchetype = g_classArchetypes.find(classArchetype => { + return classArchetype.id == classArchetypeID; + }); + + if(classArchetype.replacementCode.initial.textChangeType == 'REPLACE'){ + $('#'+tabsID+'-description').html(processText(classArchetype.replacementCode.initial.archetypeText, false, null)); + } else if(classArchetype.replacementCode.initial.textChangeType == 'ADD'){ + $('#'+tabsID+'-description').html(processText(`${classArchetype.replacementCode.initial.archetypeText}\n----\n${originalDescription}`, false, null)); + } + + g_classArchetypeSelectedOptions.set(classFeatureID, classArchetype); + + if(autoPageLoad == null || !autoPageLoad){ + g_classArchetypeChosenArchetype = classArchetype; + if(g_char_id != null){ + socket.emit("requestClassArchetypeChange", + g_char_id, + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'classArchetype', + sourceCodeSNum: 'a', + }, + classArchetype.id); + } + } + + } + + if(autoPageLoad == null || !autoPageLoad){ + + if(g_char_id != null){ + socket.emit("requestWSCSrcStructDataClear", + g_char_id, + srcStruct); + + socket.once("returnWSCSrcStructDataClear", function(){ + // Update class feature code + animatedStateLoad(); + }); + + } else { + saveBuildMetaData(); + } + deleteDataSNumChildren(srcStruct); + + } + + }); + + // If archetype is selected and id exists, + if(g_classArchetypeChosenArchetype != null && $('#'+tabsID+'-option-'+g_classArchetypeChosenArchetype.id).length){ + $('#'+tabsID+'-option-'+g_classArchetypeChosenArchetype.id).trigger("click", [true]); + } else { + $('#'+tabsID+'-option-default').trigger("click", [true]); + } + +} + +/// + +function replaceClassFeatureCodeFromClassArchetype(classFeatureID, classFeatureCode, srcStruct){ + if(!gOption_hasClassArchetypes){ return classFeatureCode; } + + // Replace changes code + classFeatureCode = replaceCodeFromClassArchetype(classFeatureCode, srcStruct); + + // Replace initial code + let classArchetype = g_classArchetypeSelectedOptions.get(classFeatureID); + if(classArchetype == null) { return classFeatureCode; } + + let newWscCode = ''; + + // Replace detection statement with replacement statement + if(classArchetype.replacementCode.initial.replacementStatement != null){ + + let newWscStatements = []; + let wscStatements = classFeatureCode.split(/\n/); + for(let wscStatementRaw of wscStatements) { + + // Test/Check Statement for Expressions // + let wscStatement = testExpr(wscStatementRaw); + if(wscStatement == null) { + newWscStatements.push(wscStatementRaw); + continue; + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + for(const detectionCode of classArchetype.replacementCode.initial.detectionCode){ + + let detectedCodeInStatement = function(){ + if(detectionCode.includes(g_classArchetypeDetectionCodeOR)){ + + let detectionCodeParts = detectionCode.split(g_classArchetypeDetectionCodeOR); + if(wscStatement.toUpperCase().includes(detectionCodeParts[0].toUpperCase()) || wscStatement.toUpperCase().includes(detectionCodeParts[1].toUpperCase())){ + return true; + } + + } else { + if(wscStatement.toUpperCase().includes(detectionCode.toUpperCase())){ + return true; + } + } + return false; + }; + + if(detectedCodeInStatement()){ + + let replacementStatement = classArchetype.replacementCode.initial.replacementStatement; + wscStatementRaw = wscStatementRaw.replace(wscStatement, replacementStatement); + wscStatement = replacementStatement; + + } + } + + if(wscStatementRaw != ''){ + newWscStatements.push(wscStatementRaw); + } + } + + // Assemble new wscCode + for(const newWscStatement of newWscStatements){ + newWscCode += newWscStatement+'\n'; + } + newWscCode = newWscCode.slice(0, -1); // Trim off that last '\n' + + } else { + + newWscCode = classFeatureCode; + + } + + // Add clear metadata + if(classArchetype.replacementCode.initial.replacementStatement != null || classArchetype.replacementCode.initial.extraCode != null){ + if(classArchetype.replacementCode.initial.clearDataAfterExtraCode != null && !classArchetype.replacementCode.initial.clearDataAfterExtraCode){ + // Don't clear + } else { + //newWscCode = 'CLEAR-DATA-FROM-CODE-BLOCK\n'+newWscCode; TODO - Add back? + } + } + + // Added extra code + if(classArchetype.replacementCode.initial.extraCode != null){ + newWscCode = classArchetype.replacementCode.initial.extraCode+'\n'+newWscCode; + } + + /* + + Order will be: + + Extra Code, + Clear, + Original Code + + */ + + return newWscCode; + +} + + +function replaceCodeFromClassArchetype(wscCode, srcStruct){ + if(g_classArchetypeChosenArchetype == null) { return wscCode; } + + if(g_classArchetypeChosenArchetype.dedicationFeatName != null){ + + if(!gOption_hasFreeArchetype){ + if(wscCode.trim() == 'GIVE-CLASS-FEAT=2' && srcStruct.sourceLevel == 2 && srcStruct.sourceType == 'class'){ + let featSrcStruct = cloneObj(srcStruct); + featSrcStruct.sourceCodeSNum = 'aa'; + removeUnselectedData(featSrcStruct, false); + return `GIVE-FEAT-NAME=${g_classArchetypeChosenArchetype.dedicationFeatName}\nADD-TEXT=Because of your class archetype, you must select (feat: ${g_classArchetypeChosenArchetype.dedicationFeatName}) as your 2nd-level class feat.`; + } + } else { + if(wscCode.trim() == 'GIVE-ARCHETYPE-FEAT=2' && srcStruct.sourceLevel == 2 && srcStruct.sourceType == 'class'){ + let featSrcStruct = cloneObj(srcStruct); + featSrcStruct.sourceCodeSNum = 'aa'; + removeUnselectedData(featSrcStruct, false); + return `GIVE-FEAT-NAME=${g_classArchetypeChosenArchetype.dedicationFeatName}\nADD-TEXT=Because of your class archetype, you must select (feat: ${g_classArchetypeChosenArchetype.dedicationFeatName}) as your 2nd-level class feat.`; + } + } + + } + + if(g_classArchetypeChosenArchetype.replacementCode.changes == null) { return wscCode; } + + let newWscCode = ''; + + let extraCodes = []; + let extraTexts = []; + + let newWscStatements = []; + let wscStatements = wscCode.split(/\n/); + for(let wscStatementRaw of wscStatements) { + + // Test/Check Statement for Expressions // + let wscStatement = testExpr(wscStatementRaw); + if(wscStatement == null) { + newWscStatements.push(wscStatementRaw); + continue; + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let findAndApplyStatementChanges = function(){ + for(const change of g_classArchetypeChosenArchetype.replacementCode.changes){ + if(wscStatement.toUpperCase().includes(change.detectionCode.toUpperCase())){ + if(change.replacementStatement != null){ + + let replacementStatement = change.replacementStatement; + wscStatementRaw = wscStatementRaw.replace(wscStatement, replacementStatement); + wscStatement = replacementStatement; + + } + if(change.extraCode != null){ + extraCodes.push(change.extraCode); + } + if(change.extraText != null){ + extraTexts.push(change.extraText); + } + return; + } + } + }; + findAndApplyStatementChanges(); + + if(wscStatementRaw != ''){ + newWscStatements.push(wscStatementRaw); + } + } + + // Assemble new wscCode + for(const newWscStatement of newWscStatements){ + newWscCode += newWscStatement+'\n'; + } + newWscCode = newWscCode.slice(0, -1); // Trim off that last '\n' + + // Add clear metadata + if(wscCode != newWscCode || extraCodes.length > 0){ + if(g_classArchetypeChosenArchetype.replacementCode.initial.clearDataAfterExtraCodeForChange != null && !g_classArchetypeChosenArchetype.replacementCode.initial.clearDataAfterExtraCodeForChange){ + // Don't clear + } else { + //newWscCode = 'CLEAR-DATA-FROM-CODE-BLOCK\n'+newWscCode; TODO - Add back? + } + } + + // Add extra code + for(let extraCode of extraCodes){ + newWscCode = extraCode+'\n'+newWscCode; + } + + // Add extra text + for(let extraText of extraTexts){ + newWscCode += '\nADD-TEXT='+extraText; + } + + /* + + Order will be: + + Extra Code, + Clear, + Original Code, + Extra Text + + */ + + return newWscCode; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/scripts/variants/free-archetype.js b/client/vue-src/legacy-js/build_planner/scripts/variants/free-archetype.js new file mode 100644 index 00000000..6adb602f --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/variants/free-archetype.js @@ -0,0 +1,25 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function addFreeArchetypeVariant(classStruct){ + for (let lvl = 2; lvl <= 20; lvl += 2) { + classStruct.Abilities.push(getArchetypeClassAbility(lvl)); + } + return classStruct; +} + +function getArchetypeClassAbility(lvl){ + return { + id: -1000+(-1*lvl), + name: "Archetype Feat", + level: lvl, + description: "You gain a class feat that you can only select archetype feats with.", + code: "GIVE-ARCHETYPE-FEAT="+lvl, + contentSrc: "CRB", + displayInSheet: 0, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/scripts/variants/gradual-ability-boosts.js b/client/vue-src/legacy-js/build_planner/scripts/variants/gradual-ability-boosts.js new file mode 100644 index 00000000..df944647 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/scripts/variants/gradual-ability-boosts.js @@ -0,0 +1,69 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function addGradualAbilityBoostsVariant(classStruct){ + + let newAbilities = []; + for(let ability of classStruct.Abilities){ + if (ability.code != null && ability.code.startsWith('GIVE-ABILITY-BOOST-MULTIPLE=4') && (ability.level == 5 || ability.level == 10 || ability.level == 15 || ability.level == 20)){ + + let extraStatement = null; + if(ability.code.includes('\n')){ + let statements = ability.code.split(/\n/); + if(statements.length == 5 && statements[1] == statements[2] && statements[1] == statements[3] && statements[1] == statements[4]){ + extraStatement = statements[1]; + } + } + + newAbilities.push(getGAB_AbilityBoost(ability.level, extraStatement)); + newAbilities.push(getGAB_AbilityBoost(ability.level-1, extraStatement)); + newAbilities.push(getGAB_AbilityBoost(ability.level-2, extraStatement)); + newAbilities.push(getGAB_AbilityBoost(ability.level-3, extraStatement)); + + } else { + newAbilities.push(ability); + } + } + + // Set and re-sort the abilities array... + classStruct.Abilities = newAbilities.sort( + function(a, b) { + if (a.level === b.level) { + // Name is only important when levels are the same + return a.name > b.name ? 1 : -1; + } + return a.level - b.level; + } + ); + + return classStruct; +} + +function getGAB_AbilityBoost(lvl, extraStatement){ + let setText = ''; + if(lvl > 1 && lvl <= 5) { + setText = '2nd-5th level boosts'; + } else if(lvl > 6 && lvl <= 10) { + setText = '7th-10th level boosts'; + } else if(lvl > 11 && lvl <= 15) { + setText = '12th-15th level boosts'; + } else if(lvl > 16 && lvl <= 20) { + setText = '17th-20th level boosts'; + } + return { + id: -3000+(-1*lvl), + name: "Ability Boosts", + level: lvl, + description: ` + You gain a single boost in an ability score. This boost increases an ability score by 2, or by 1 if it's already 18 or above. + \n__You can't choose the same ability score more than once per set (${setText}).__ + `, + code: `GIVE-ABILITY-BOOST-SINGLE=ALL${(extraStatement == null) ? '' : '\n'+extraStatement}`, + contentSrc: "CRB", + displayInSheet: 0, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/build_planner/ui-handler.js b/client/vue-src/legacy-js/build_planner/ui-handler.js new file mode 100644 index 00000000..8d323284 --- /dev/null +++ b/client/vue-src/legacy-js/build_planner/ui-handler.js @@ -0,0 +1,174 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + // If mobile, hide Statistics in left quickview + if (isMobileView()) { + // Moving HTML + let statisticsHTML = $('#builder-statistics-container').html(); + $('#builder-statistics-container').html(''); + $('#builder-statistics-container').parent().addClass('is-hidden'); + $('#quickViewLeftContent').html(statisticsHTML); + + $('#center-body').prepend(` +
    + + + +
    + `); + + $('#leftQuickviewButton').click(function(event){ + event.stopImmediatePropagation(); + $('#quickviewLeftDefault').addClass('is-active'); + }); + + $('#quickViewLeftTitleClose').click(function(event){ + $('#quickviewLeftDefault').removeClass('is-active'); + }); + + } + + // Assemble accords + $('.accord-container').each(function() { + let accordHeader = $(this).find('.accord-header'); + $(accordHeader).click(function() { + let accordBody = $(this).parent().find('.accord-body'); + let accordChevron = $(this).parent().find('.accord-chevron'); + if($(accordBody).hasClass("is-hidden")) { + $(accordBody).removeClass('is-hidden'); + $(accordChevron).removeClass('fa-chevron-down'); + $(accordChevron).addClass('fa-chevron-up'); + } else { + $(accordBody).addClass('is-hidden'); + $(accordChevron).removeClass('fa-chevron-up'); + $(accordChevron).addClass('fa-chevron-down'); + } + }); + $(accordHeader).mouseenter(function(){ + $(accordHeader).addClass('accord-hover'); + }); + $(accordHeader).mouseleave(function(){ + $(accordHeader).removeClass('accord-hover'); + }); + }); + + $('.accord-like-button').each(function() { + $(this).mouseenter(function(){ + $(this).addClass('accord-hover'); + }); + $(this).mouseleave(function(){ + $(this).removeClass('accord-hover'); + }); + }); + + $('#ability-scores-body').click(function() { + openQuickView('abilityScoresBreakdownView', {}); + }); + + $('#hit-points-body').click(function() { + const charClass = getCharClass(); + const classHitPoints = (charClass == null) ? 0 : charClass.Class.hitPoints; + openQuickView('hitPointsBreakdownView', { + classHitPoints : classHitPoints, + }); + }); + $('#class-dc-body').click(function() { + openQuickView('generalBreakdownView', { + title : 'Class DC', + name : 'Class DC', + varName : VARIABLE.CLASS_DC, + isProfDC : true, + }); + }); + $('#perception-body').click(function() { + openQuickView('generalBreakdownView', { + title : 'Perception', + name : 'Perception', + varName : VARIABLE.PERCEPTION + }); + }); + + populateAccord('resist-weaks-body', []); + populateAccord('saves-body', []); + populateAccord('skills-body', []); + populateAccord('attacks-body', []); + populateAccord('defenses-body', []); + populateAccord('spellcasting-body', []); + populateAccord('languages-body', []); + +}); + + + +function populateAccord(accordBodyID, optionsList){ + + let content = $('#'+accordBodyID); + content.html(''); + + if(optionsList.length == 0){ + content.append(`

    None

    `); + return; + } + + for(let i = 0; i < optionsList.length; i++){ + let optionEntryID = `${accordBodyID}-entry-${i}`; + let option = optionsList[i]; + + let value1 = option.Value1; + let value2 = option.Value2; + let value3 = option.Value3; + let varName = option.VarName; + + if(value3 == null){ + content.append(` +
    +

    ${value1}

    +

    ${value2}

    +
    + `); + } else { + content.append(` +
    +

    ${value1}

    +

    ${value2}

    +

    ${value3}

    +
    + `); + } + + if(varName != null){ + $('#'+optionEntryID).mouseenter(function(){ + $('#'+optionEntryID).addClass('entry-hover'); + }); + $('#'+optionEntryID).mouseleave(function(){ + $('#'+optionEntryID).removeClass('entry-hover'); + }); + $('#'+optionEntryID).click(function() { + openQuickView('generalBreakdownView', { + title : value1, + name : value1, + varName : varName, + }); + }); + } else if (option.CustomQuickview != null){ + + $('#'+optionEntryID).mouseenter(function(){ + $('#'+optionEntryID).addClass('entry-hover'); + }); + $('#'+optionEntryID).mouseleave(function(){ + $('#'+optionEntryID).removeClass('entry-hover'); + }); + $('#'+optionEntryID).click(function() { + openQuickView(option.CustomQuickview.name, option.CustomQuickview.data); + }); + + } else { + $('#'+optionEntryID).removeClass('cursor-clickable'); + } + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/builds/build-creator-augment.js b/client/vue-src/legacy-js/builds/build-creator-augment.js new file mode 100644 index 00000000..8c955098 --- /dev/null +++ b/client/vue-src/legacy-js/builds/build-creator-augment.js @@ -0,0 +1,347 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + $('.builder-build-home-page-btn').click(function(){ + window.location.href = '/builds/create/?build_id='+g_build_id+'&page=init'; + }); + + $('.builder-build-publish-page-btn').click(function(){ + new ConfirmMessage('Publish Content', ` +

    By clicking publish, you are agreeing to the following about the content you are publishing:

    +

    • The content does not contain any third party’s intellectual property without their permission.

    +

    • The content preserves a high standard of quality; it is not "low-effort content."

    +

    • The content does not contain material that the general public would classify as "adult content," offensive, or inappropriate for minors.

    +

    Failure to comply with these agreements may result in your content being removed and potentially further repercussions.

    + `, 'Publish', 'modal-publish-build', 'modal-publish-build-btn', 'is-success'); + $('#modal-publish-build-btn').click(function() { + socket.emit('requestBuildPublish', g_build_id); + }); + }); + + socket.on('returnBuildPublish', function(buildID){ + window.location.href = '/builds/?view_id='+buildID; + }); + +}); + +function selectorUpdatedBuildIcons(){ + + $('.accord-creation-container').each(function() { + + if($(this).find('.input').length == $(this).find('.input.is-info').length && $(this).find('.select').length == $(this).find('.select.is-info').length && $(this).find('.feat-selection').length == $(this).find('.feat-selection.is-default').length){ + + $(this).find('.accord-indicate-unselected-options').html(''); + + } else if ($(this).find('.input.is-info').length !== 0 || $(this).find('.select.is-info').length !== 0 || $(this).find('.feat-selection.is-default').length !== 0){ + + $(this).find('.accord-indicate-unselected-options').html(''); + + } else { + $(this).find('.accord-indicate-unselected-options').html(''); + } + }); + +} + + +const saveBuildMetaData_isDebug = false; + +function saveBuildInfo(){ + + if(saveBuildMetaData_isDebug) {console.log('S-BuildInfo - EXECUTED');} + + socket.emit("requestBuildUpdateInfo", + g_build_id, + g_character); + +} + +function saveBuildFinalStats(){ + + if(saveBuildMetaData_isDebug) {console.log('S-BuildFinalStats - EXECUTED');} + + let finalStatistics = { + scores: { + str: variables_getTotal(VARIABLE.SCORE_STR), + dex: variables_getTotal(VARIABLE.SCORE_DEX), + con: variables_getTotal(VARIABLE.SCORE_CON), + int: variables_getTotal(VARIABLE.SCORE_INT), + wis: variables_getTotal(VARIABLE.SCORE_WIS), + cha: variables_getTotal(VARIABLE.SCORE_CHA), + }, + classDC: { + total: variables_getTotal(VARIABLE.CLASS_DC)+10, + rank: variables_getFinalRank(VARIABLE.CLASS_DC), + }, + perception: { + total: signNumber(variables_getTotal(VARIABLE.PERCEPTION)), + rank: variables_getFinalRank(VARIABLE.PERCEPTION), + }, + saves: { + fort: { + total: signNumber(variables_getTotal(VARIABLE.SAVE_FORT)), + rank: variables_getFinalRank(VARIABLE.SAVE_FORT), + }, + reflex: { + total: signNumber(variables_getTotal(VARIABLE.SAVE_REFLEX)), + rank: variables_getFinalRank(VARIABLE.SAVE_REFLEX), + }, + will: { + total: signNumber(variables_getTotal(VARIABLE.SAVE_WILL)), + rank: variables_getFinalRank(VARIABLE.SAVE_WILL), + } + }, + skills: { + acrobatics: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_ACROBATICS)), + rank: variables_getFinalRank(VARIABLE.SKILL_ACROBATICS), + }, + arcana: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_ARCANA)), + rank: variables_getFinalRank(VARIABLE.SKILL_ARCANA), + }, + athletics: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_ATHLETICS)), + rank: variables_getFinalRank(VARIABLE.SKILL_ATHLETICS), + }, + crafting: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_CRAFTING)), + rank: variables_getFinalRank(VARIABLE.SKILL_CRAFTING), + }, + deception: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_DECEPTION)), + rank: variables_getFinalRank(VARIABLE.SKILL_DECEPTION), + }, + diplomacy: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_DIPLOMACY)), + rank: variables_getFinalRank(VARIABLE.SKILL_DIPLOMACY), + }, + intimidation: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_INTIMIDATION)), + rank: variables_getFinalRank(VARIABLE.SKILL_INTIMIDATION), + }, + medicine: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_MEDICINE)), + rank: variables_getFinalRank(VARIABLE.SKILL_MEDICINE), + }, + nature: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_NATURE)), + rank: variables_getFinalRank(VARIABLE.SKILL_NATURE), + }, + occultism: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_OCCULTISM)), + rank: variables_getFinalRank(VARIABLE.SKILL_OCCULTISM), + }, + performance: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_PERFORMANCE)), + rank: variables_getFinalRank(VARIABLE.SKILL_PERFORMANCE), + }, + religion: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_RELIGION)), + rank: variables_getFinalRank(VARIABLE.SKILL_RELIGION), + }, + society: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_SOCIETY)), + rank: variables_getFinalRank(VARIABLE.SKILL_SOCIETY), + }, + stealth: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_STEALTH)), + rank: variables_getFinalRank(VARIABLE.SKILL_STEALTH), + }, + survival: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_SURVIVAL)), + rank: variables_getFinalRank(VARIABLE.SKILL_SURVIVAL), + }, + thievery: { + total: signNumber(variables_getTotal(VARIABLE.SKILL_THIEVERY)), + rank: variables_getFinalRank(VARIABLE.SKILL_THIEVERY), + }, + }, + lores: {}, + attacks: { + simple_weapons: { + rank: variables_getFinalRank(VARIABLE.SIMPLE_WEAPONS), + }, + martial_weapons: { + rank: variables_getFinalRank(VARIABLE.MARTIAL_WEAPONS), + }, + advanced_weapons: { + rank: variables_getFinalRank(VARIABLE.ADVANCED_WEAPONS), + }, + unarmed_weapons: { + rank: variables_getFinalRank(VARIABLE.UNARMED_ATTACKS), + }, + }, + defenses: { + light_armor: { + rank: variables_getFinalRank(VARIABLE.LIGHT_ARMOR), + }, + medium_armor: { + rank: variables_getFinalRank(VARIABLE.MEDIUM_ARMOR), + }, + heavy_armor: { + rank: variables_getFinalRank(VARIABLE.HEAVY_ARMOR), + }, + unarmored_defense: { + rank: variables_getFinalRank(VARIABLE.UNARMORED_DEFENSE), + }, + }, + spellcasting: { + arcane: { + attack: variables_getFinalRank(VARIABLE.ARCANE_SPELL_ATTACK), + dc: variables_getFinalRank(VARIABLE.ARCANE_SPELL_DC), + }, + divine: { + attack: variables_getFinalRank(VARIABLE.DIVINE_SPELL_ATTACK), + dc: variables_getFinalRank(VARIABLE.DIVINE_SPELL_DC), + }, + occult: { + attack: variables_getFinalRank(VARIABLE.OCCULT_SPELL_ATTACK), + dc: variables_getFinalRank(VARIABLE.OCCULT_SPELL_DC), + }, + primal: { + attack: variables_getFinalRank(VARIABLE.PRIMAL_SPELL_ATTACK), + dc: variables_getFinalRank(VARIABLE.PRIMAL_SPELL_DC), + }, + }, + }; + + // Health + let maxHealth = variables_getTotal(VARIABLE.MAX_HEALTH); + let maxHealthPerLevel = 0; + if(getCharClass() != null){ + maxHealthPerLevel = (getCharClass().Class.hitPoints+getMod(variables_getTotal(VARIABLE.SCORE_CON))+variables_getTotal(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL))*g_character.level; + } + finalStatistics.maxHealth = maxHealth+maxHealthPerLevel; + + // Lore + const sortedLoreDataArray = getDataAll(DATA_SOURCE.LORE).sort( + function(a, b) { + return a.value > b.value ? 1 : -1; + } + ); + let lores = []; + for(const loreData of sortedLoreDataArray){ + lores.push({ + name: capitalizeWords(loreData.value)+' Lore', + total: signNumber(variables_getTotal(`SKILL_${profConversion_convertOldName(loreData.value)}_LORE`)), + rank: variables_getFinalRank(`SKILL_${profConversion_convertOldName(loreData.value)}_LORE`), + }); + } + finalStatistics.lores = lores; + + // Langs + let sortedLangsArray = []; + for(const [key, data] of variables_getExtrasMap(VARIABLE.LANGUAGES).entries()){ + let lang = g_allLanguages.find(lang => { + return lang.id == data.Value; + }); + if(lang != null){ + sortedLangsArray.push(lang); + } + } + sortedLangsArray = sortedLangsArray.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + let languages = []; + for(let lang of sortedLangsArray){ + languages.push(lang.name); + } + finalStatistics.languages = languages; + + // Resists + const resistsArray = []; + for(const [key, data] of variables_getExtrasMap(VARIABLE.RESISTANCES).entries()){ + let dParts = data.Value.split(getSeparator()); + resistsArray.push({ Type: dParts[0], Amount: dParts[1] }); + } + const resistsMap = processResistsOrWeaksToMap(resistsArray, g_character.level); + + let resists = []; + for(const [type, amount] of resistsMap.entries()){ + resists.push(type+' '+amount); + } + finalStatistics.resists = resists; + + // Weaks + const weaksArray = []; + for(const [key, data] of variables_getExtrasMap(VARIABLE.WEAKNESSES).entries()){ + let dParts = data.Value.split(getSeparator()); + weaksArray.push({ Type: dParts[0], Amount: dParts[1] }); + } + const weaksMap = processResistsOrWeaksToMap(weaksArray, g_character.level); + + let weaks = []; + for(const [type, amount] of weaksMap.entries()){ + weaks.push(type+' '+amount); + } + finalStatistics.weaks = weaks; + + + socket.emit("requestBuildUpdateFinalStats", + g_build_id, + finalStatistics); + +} + +// Process Save Build MetaData +let saveBuildMetaData_isInCooldown = false; +let saveBuildMetaData_isInterrupted = false; + +function saveBuildMetaData(){ + + if(saveBuildMetaData_isDebug) {console.log('S-BMD - Called');} + + if(!saveBuildMetaData_isInCooldown){ + + if(saveBuildMetaData_isDebug) {console.log('S-BMD - Entered Cooldown');} + + saveBuildMetaData_isInCooldown = true; + setTimeout(() => { saveBuildMetaData_finishCooldown(); }, 1500); + + } else { + + if(saveBuildMetaData_isDebug) {console.log('S-BMD - Cooldown Interrupted, marked');} + + saveBuildMetaData_isInterrupted = true; + + } + +} + +function saveBuildMetaData_finishCooldown(){ + saveBuildMetaData_isInCooldown = false; + + if(saveBuildMetaData_isDebug) {console.log('S-BMD - Finish Cooldown');} + + if(saveBuildMetaData_isInterrupted){ + + if(saveBuildMetaData_isDebug) {console.log('S-BMD - Was Interrupted, restarting');} + + saveBuildMetaData_isInterrupted = false; + saveBuildMetaData(); + + } else { + + saveBuildMetaData_execute(); + + } + +} + +function saveBuildMetaData_execute(){ + + if(saveBuildMetaData_isDebug) {console.log('S-BMD - EXECUTED');} + + saveBuildFinalStats(); + + socket.emit("requestBuildUpdateMetaData", + g_build_id, + mapToObj(g_dataMap)); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/builds/build-creator-init.js b/client/vue-src/legacy-js/builds/build-creator-init.js new file mode 100644 index 00000000..70212e0a --- /dev/null +++ b/client/vue-src/legacy-js/builds/build-creator-init.js @@ -0,0 +1,635 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let isBuilderInit = false; + +let g_build_id = null; + +// ~~~~~~~~~~~~~~ // General - Run On Load // ~~~~~~~~~~~~~~ // +$(function () { + + g_build_id = $('#char-builder-container').attr('data-build-id'); + + // Change page + $("#nextButton").click(function(){ + // Hardcoded redirect to page 2 + window.location.href = '/builds/create/?build_id='+g_build_id+'&page=2'; + }); + initBuilderSteps(); + + // On load get basic build info + socket.emit("requestBuildInfo", + g_build_id); + +}); + +function initBuilderSteps(){ + + $('.builder-basics-page-btn').click(function(){ + window.location.href = '/builds/create/?build_id='+g_build_id+'&page=init'; + }); + $('.builder-creation-page-btn').click(function(){ + window.location.href = '/builds/create/?build_id='+g_build_id+'&page=2'; + }); + // Publish btn is set in returnBuildInfo because it needs build object. + +} + +// ~~~~~~~~~~~~~~ // Processings // ~~~~~~~~~~~~~~ // + +socket.on("returnBuildInfo", function(build, hBundles, progessBundles){ + isBuilderInit = true; + + $('.builder-finalize-page-btn').click(function(){ + console.log('Complete charater?'); + }); + + // When build name changes, save name + $("#charName").change(function(){ + + let validNameRegex = /^[^@#$%^*~=\/\\]+$/; + if(validNameRegex.test($(this).val())) { + $(this).removeClass("is-danger"); + $("#charNameSideIcon").addClass("is-hidden"); + + $("#charNameControlShell").addClass("is-medium is-loading"); + socket.emit("requestBuildNameChange", + g_build_id, + $(this).val()); + + } else { + $(this).addClass("is-danger"); + $("#charNameSideIcon").removeClass("is-hidden"); + } + + }); + + $("#buildDescription").blur(function(){ + if(build.description != $(this).val()) { + $('#buildDescription').parent().addClass("is-loading"); + socket.emit("requestBuildDescriptionChange", + g_build_id, + $(this).val()); + } + }); + + $("#buildContactInfo").blur(function(){ + if(build.contactInfo != $(this).val()) { + $('#buildContactInfo').parent().addClass("is-loading"); + socket.emit("requestBuildContactInfoChange", + g_build_id, + $(this).val()); + } + }); + + $("#buildArtworkURL").blur(function(){ + if(build.artworkURL != $(this).val()) { + $('#buildArtworkURL').parent().addClass("is-loading"); + socket.emit("requestBuildArtworkURLChange", + g_build_id, + $(this).val()); + } + }); + + handleBuildOptions(build, hBundles, progessBundles); + + // Turn off page loading + stopSpinnerLoader(); + +}); + +function handleBuildOptions(build, hBundles, progessBundles) { + displayHomebrewBundles(build, hBundles, progessBundles); + + // Content Sources // + let contentSourceArray = JSON.parse(build.enabledSources); + + $("#contentSrc-CRB").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'CRB', + this.checked); + }); + $("#contentSrc-CRB").prop('checked', contentSourceArray.includes('CRB')); + + $("#contentSrc-ADV-PLAYER-GUIDE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'ADV-PLAYER-GUIDE', + this.checked); + }); + $("#contentSrc-ADV-PLAYER-GUIDE").prop('checked', contentSourceArray.includes('ADV-PLAYER-GUIDE')); + + $("#contentSrc-GM-GUIDE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'GM-GUIDE', + this.checked); + }); + $("#contentSrc-GM-GUIDE").prop('checked', contentSourceArray.includes('GM-GUIDE')); + + $("#contentSrc-BOOK-OF-DEAD").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'BOOK-OF-DEAD', + this.checked); + }); + $("#contentSrc-BOOK-OF-DEAD").prop('checked', contentSourceArray.includes('BOOK-OF-DEAD')); + + $("#contentSrc-SECRETS-OF-MAGIC").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'SECRETS-OF-MAGIC', + this.checked); + }); + $("#contentSrc-SECRETS-OF-MAGIC").prop('checked', contentSourceArray.includes('SECRETS-OF-MAGIC')); + + $("#contentSrc-GUNS-AND-GEARS").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'GUNS-AND-GEARS', + this.checked); + }); + $("#contentSrc-GUNS-AND-GEARS").prop('checked', contentSourceArray.includes('GUNS-AND-GEARS')); + + $("#contentSrc-DARK-ARCHIVE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'DARK-ARCHIVE', + this.checked); + }); + $("#contentSrc-DARK-ARCHIVE").prop('checked', contentSourceArray.includes('DARK-ARCHIVE')); + + $("#contentSrc-RAGE-OF-ELEMENTS").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'RAGE-OF-ELEMENTS', + this.checked); + }); + $("#contentSrc-RAGE-OF-ELEMENTS").prop('checked', contentSourceArray.includes('RAGE-OF-ELEMENTS')); + + $("#contentSrc-LOST-ANCESTRY-GUIDE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-ANCESTRY-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-ANCESTRY-GUIDE").prop('checked', contentSourceArray.includes('LOST-ANCESTRY-GUIDE')); + + $("#contentSrc-LOST-CHAR-GUIDE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-CHAR-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-CHAR-GUIDE").prop('checked', contentSourceArray.includes('LOST-CHAR-GUIDE')); + + $("#contentSrc-LOST-CITY-ABSALOM").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-CITY-ABSALOM', + this.checked); + }); + $("#contentSrc-LOST-CITY-ABSALOM").prop('checked', contentSourceArray.includes('LOST-CITY-ABSALOM')); + + $("#contentSrc-LOST-GOD-MAGIC").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-GOD-MAGIC', + this.checked); + }); + $("#contentSrc-LOST-GOD-MAGIC").prop('checked', contentSourceArray.includes('LOST-GOD-MAGIC')); + + $("#contentSrc-LOST-GRAND-BAZAAR").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-GRAND-BAZAAR', + this.checked); + }); + $("#contentSrc-LOST-GRAND-BAZAAR").prop('checked', contentSourceArray.includes('LOST-GRAND-BAZAAR')); + + $("#contentSrc-LOST-IMPOSSIBLE-LANDS").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-IMPOSSIBLE-LANDS', + this.checked); + }); + $("#contentSrc-LOST-IMPOSSIBLE-LANDS").prop('checked', contentSourceArray.includes('LOST-IMPOSSIBLE-LANDS')); + + $("#contentSrc-LOST-KNIGHTS-WALL").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-KNIGHTS-WALL', + this.checked); + }); + $("#contentSrc-LOST-KNIGHTS-WALL").prop('checked', contentSourceArray.includes('LOST-KNIGHTS-WALL')); + + $("#contentSrc-LOST-LEGENDS").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-LEGENDS', + this.checked); + }); + $("#contentSrc-LOST-LEGENDS").prop('checked', contentSourceArray.includes('LOST-LEGENDS')); + + $("#contentSrc-LOST-MWANGI").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-MWANGI', + this.checked); + }); + $("#contentSrc-LOST-MWANGI").prop('checked', contentSourceArray.includes('LOST-MWANGI')); + + $("#contentSrc-LOST-MONSTERS-MYTH").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-MONSTERS-MYTH', + this.checked); + }); + $("#contentSrc-LOST-MONSTERS-MYTH").prop('checked', contentSourceArray.includes('LOST-MONSTERS-MYTH')); + + $("#contentSrc-LOST-SOCIETY-GUIDE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-SOCIETY-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-SOCIETY-GUIDE").prop('checked', contentSourceArray.includes('LOST-SOCIETY-GUIDE')); + + $("#contentSrc-LOST-TRAVEL-GUIDE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-TRAVEL-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-TRAVEL-GUIDE").prop('checked', contentSourceArray.includes('LOST-TRAVEL-GUIDE')); + + $("#contentSrc-LOST-WORLD-GUIDE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'LOST-WORLD-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-WORLD-GUIDE").prop('checked', contentSourceArray.includes('LOST-WORLD-GUIDE')); + + $("#contentSrc-ABOMINATION-VAULTS").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'ABOMINATION-VAULTS', + this.checked); + }); + $("#contentSrc-ABOMINATION-VAULTS").prop('checked', contentSourceArray.includes('ABOMINATION-VAULTS')); + + $("#contentSrc-AGENTS-OF-EDGEWATCH").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'AGENTS-OF-EDGEWATCH', + this.checked); + }); + $("#contentSrc-AGENTS-OF-EDGEWATCH").prop('checked', contentSourceArray.includes('AGENTS-OF-EDGEWATCH')); + + $("#contentSrc-AGE-OF-ASHES").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'AGE-OF-ASHES', + this.checked); + }); + $("#contentSrc-AGE-OF-ASHES").prop('checked', contentSourceArray.includes('AGE-OF-ASHES')); + + $("#contentSrc-BLOOD-LORDS").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'BLOOD-LORDS', + this.checked); + }); + $("#contentSrc-BLOOD-LORDS").prop('checked', contentSourceArray.includes('BLOOD-LORDS')); + + $("#contentSrc-CROWN-OF-KOBOLD-KING").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'CROWN-OF-KOBOLD-KING', + this.checked); + }); + $("#contentSrc-CROWN-OF-KOBOLD-KING").prop('checked', contentSourceArray.includes('CROWN-OF-KOBOLD-KING')); + + $("#contentSrc-EXTINCTION-CURSE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'EXTINCTION-CURSE', + this.checked); + }); + $("#contentSrc-EXTINCTION-CURSE").prop('checked', contentSourceArray.includes('EXTINCTION-CURSE')); + + $("#contentSrc-FALL-OF-PLAGUE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'FALL-OF-PLAGUE', + this.checked); + }); + $("#contentSrc-FALL-OF-PLAGUE").prop('checked', contentSourceArray.includes('FALL-OF-PLAGUE')); + + $("#contentSrc-FIST-PHOENIX").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'FIST-PHOENIX', + this.checked); + }); + $("#contentSrc-FIST-PHOENIX").prop('checked', contentSourceArray.includes('FIST-PHOENIX')); + + $("#contentSrc-KINGMAKER").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'KINGMAKER', + this.checked); + }); + $("#contentSrc-KINGMAKER").prop('checked', contentSourceArray.includes('KINGMAKER')); + + $("#contentSrc-MALEVOLENCE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'MALEVOLENCE', + this.checked); + }); + $("#contentSrc-MALEVOLENCE").prop('checked', contentSourceArray.includes('MALEVOLENCE')); + + $("#contentSrc-NIGHT-GRAY-DEATH").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'NIGHT-GRAY-DEATH', + this.checked); + }); + $("#contentSrc-NIGHT-GRAY-DEATH").prop('checked', contentSourceArray.includes('NIGHT-GRAY-DEATH')); + + $("#contentSrc-OUTLAWS-ALKENSTAR").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'OUTLAWS-ALKENSTAR', + this.checked); + }); + $("#contentSrc-OUTLAWS-ALKENSTAR").prop('checked', contentSourceArray.includes('OUTLAWS-ALKENSTAR')); + + $("#contentSrc-QUEST-FROZEN-FLAME").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'QUEST-FROZEN-FLAME', + this.checked); + }); + $("#contentSrc-QUEST-FROZEN-FLAME").prop('checked', contentSourceArray.includes('QUEST-FROZEN-FLAME')); + + $("#contentSrc-SLITHERING").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'SLITHERING', + this.checked); + }); + $("#contentSrc-SLITHERING").prop('checked', contentSourceArray.includes('SLITHERING')); + + $("#contentSrc-STRENGTH-THOUSANDS").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'STRENGTH-THOUSANDS', + this.checked); + }); + $("#contentSrc-STRENGTH-THOUSANDS").prop('checked', contentSourceArray.includes('STRENGTH-THOUSANDS')); + + $("#contentSrc-TROUBLES-IN-OTARI").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'TROUBLES-IN-OTARI', + this.checked); + }); + $("#contentSrc-TROUBLES-IN-OTARI").prop('checked', contentSourceArray.includes('TROUBLES-IN-OTARI')); + + $("#contentSrc-THRESHOLD-KNOWLEDGE").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'THRESHOLD-KNOWLEDGE', + this.checked); + }); + $("#contentSrc-THRESHOLD-KNOWLEDGE").prop('checked', contentSourceArray.includes('THRESHOLD-KNOWLEDGE')); + + $("#contentSrc-PATH-SOCIETY").change(function(){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'PATH-SOCIETY', + this.checked); + }); + $("#contentSrc-PATH-SOCIETY").prop('checked', contentSourceArray.includes('PATH-SOCIETY')); + + // Enable All Books Button // + $('#enableAllBooksBtn').click(function() { + let newContentSourceArray = []; + $('.bookSwitch').each(function() { + newContentSourceArray.push($(this).attr('name').replace('contentSrc-','')); + $(this).prop('checked', true); + }); + socket.emit("requestBuildSetSources", + g_build_id, + newContentSourceArray); + $('#enableAllBooksBtn').blur(); + }); + + // Variants // + $("#variantAncestryParagon").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestBuildOptionChange", + g_build_id, + 'variantAncestryParagon', + optionTypeValue); + }); + $("#variantAncestryParagon").prop('checked', (build.variantAncestryParagon === 1)); + + $("#variantFreeArchetype").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestBuildOptionChange", + g_build_id, + 'variantFreeArchetype', + optionTypeValue); + }); + $("#variantFreeArchetype").prop('checked', (build.variantFreeArchetype === 1)); + + $("#variantGradualAbilityBoosts").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestBuildOptionChange", + g_build_id, + 'variantGradualAbilityBoosts', + optionTypeValue); + }); + $("#variantGradualAbilityBoosts").prop('checked', (build.variantGradualAbilityBoosts === 1)); + + $("#variantStamina").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestBuildOptionChange", + g_build_id, + 'variantStamina', + optionTypeValue); + socket.emit("requestBuildSourceChange", + g_build_id, + 'STAMINA-VARIANT', + this.checked); + }); + $("#variantStamina").prop('checked', (build.variantStamina === 1)); + + // Options // + $("#optionClassArchetypes").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestBuildOptionChange", + g_build_id, + 'optionClassArchetypes', + optionTypeValue); + socket.emit("requestBuildSourceChange", + g_build_id, + 'CLASS-ARCHETYPES-OPTION', + this.checked); + }); + $("#optionClassArchetypes").prop('checked', (build.optionClassArchetypes === 1)); + if(build.optionClassArchetypes === 1){ + socket.emit("requestBuildSourceChange", + g_build_id, + 'CLASS-ARCHETYPES-OPTION', + true); + } + + $("#optionCustomCodeBlock").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + if(optionTypeValue === 1) { + $("#optionCustomCodeBlockInfo").removeClass('is-hidden'); + $("#option-custom-code-block-container").removeClass('is-hidden'); + } else { + $("#optionCustomCodeBlockInfo").addClass('is-hidden'); + $("#option-custom-code-block-container").addClass('is-hidden'); + } + socket.emit("requestBuildOptionChange", + g_build_id, + 'optionCustomCodeBlock', + optionTypeValue); + }); + $("#optionCustomCodeBlock").prop('checked', (build.optionCustomCodeBlock === 1)); + if(build.optionCustomCodeBlock === 1) { + $("#optionCustomCodeBlockInfo").removeClass('is-hidden'); + $("#option-custom-code-block-container").removeClass('is-hidden'); + } + $("#inputCustomCodeBlock").blur(function(){ + let newCode = $(this).val(); + if(build.customCode != newCode){ + build.customCode = newCode; + $('#inputCustomCodeBlock').parent().addClass("is-loading"); + socket.emit("requestBuildCustomCodeBlockChange", g_build_id, newCode); + } + }); + +} + + +// ~~~~~~~~~~~~~~ // Processings // ~~~~~~~~~~~~~~ // + +socket.on("returnBuildNameChange", function() { + $("#charNameControlShell").removeClass("is-medium is-loading"); +}); + +socket.on("returnBuildDescriptionChange", function() { + $('#buildDescription').parent().removeClass("is-loading"); +}); + +socket.on("returnBuildContactInfoChange", function() { + $('#buildContactInfo').parent().removeClass("is-loading"); +}); + +socket.on("returnBuildArtworkURLChange", function() { + $('#buildArtworkURL').parent().removeClass("is-loading"); +}); + +// + +socket.on("returnBuildSourceChange", function() { + $(".optionSwitch").blur(); +}); + +socket.on("returnBuildOptionChange", function() { + $(".optionSwitch").blur(); +}); + +// + +socket.on("returnBuildCustomCodeBlockChange", function() { + $('#inputCustomCodeBlock').parent().removeClass("is-loading"); +}); + +//// Homebrew Bundles //// +function displayHomebrewBundles(build, hBundles, progessBundles){ + let homebrewBundleArray = JSON.parse(build.enabledHomebrew); + + hBundles = hBundles.sort( + function(a, b) { + return a.homebrewBundle.name > b.homebrewBundle.name ? 1 : -1; + } + ); + progessBundles = progessBundles.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + for(let progessBundle of progessBundles) { + let homebrewBundle = progessBundle; + let bundleSwitchID = 'homebrew-bundle-progess-switch-'+homebrewBundle.id; + $('#homebrewCollectionContainer').append('
    '); + + $('#'+bundleSwitchID).change(function(){ + socket.emit('requestBuildHomebrewChange', + g_build_id, + homebrewBundle.id, + this.checked); + }); + $('#'+bundleSwitchID).prop('checked', homebrewBundleArray.includes(homebrewBundle.id)); + + } + + for(let hBundle of hBundles) { + let homebrewBundle = hBundle.homebrewBundle; + let bundleSwitchID = 'homebrew-bundle-switch-'+homebrewBundle.id; + + let bundleName = homebrewBundle.name; + if(homebrewBundle.isPublished === 0){ + bundleName += ''; + } + + $('#homebrewCollectionContainer').append('
    '); + + $('#'+bundleSwitchID).change(function(){ + socket.emit('requestBuildHomebrewChange', + g_build_id, + homebrewBundle.id, + this.checked); + }); + $('#'+bundleSwitchID).prop('checked', homebrewBundleArray.includes(homebrewBundle.id)); + + } + + if(hBundles.length > 0){ + let hCollectionContainer = document.getElementById('homebrewColumn'); + if(hCollectionContainer.scrollHeight > hCollectionContainer.clientHeight){ + // container has scrollbar + } else { + $('#homebrewCollectionContainer').addClass('pb-3'); + $('#viewHomebrewCollectionBtn').removeClass('is-hidden'); + } + } else { + $('#noHomebrewMessage').removeClass('is-hidden'); + $('#viewBrowseHomebrewBtn').removeClass('is-hidden'); + } + + $('#viewHomebrewCollectionBtn').click(function() { + window.location.href = '/homebrew/?sub_tab=collection'; + }); + $('#viewBrowseHomebrewBtn').click(function() { + window.location.href = '/homebrew/?sub_tab=browse'; + }); + +} + +socket.on("returnBuildHomebrewChange", function() { + $(".optionSwitch").blur(); +}); diff --git a/client/vue-src/legacy-js/builds/build-view.js b/client/vue-src/legacy-js/builds/build-view.js new file mode 100644 index 00000000..8b38dd90 --- /dev/null +++ b/client/vue-src/legacy-js/builds/build-view.js @@ -0,0 +1,1034 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openBuildView(buildID){ + window.history.pushState('builds', '', '/builds/?view_id='+buildID);// Update URL + socket.emit('requestBuildContents', buildID); + startSpinnerSubLoader(); +} + +let g_notesMap; +let g_unselectedDataArray; + +socket.on("returnBuildContents", function(buildContents){ + + if(buildContents == null){ console.error('Don\'t have access!'); } + + g_activeBuild = buildContents.build; + + textProcess_warningOnUnknown = true; + g_skillMap = objToMap(buildContents.sourceMaterial.skillObject); + g_featMap = objToMap(buildContents.sourceMaterial.featsObject); + g_itemMap = objToMap(buildContents.sourceMaterial.itemsObject); + g_spellMap = objToMap(buildContents.sourceMaterial.spellsObject); + g_allTags = buildContents.sourceMaterial.allTags; + g_allLanguages = buildContents.sourceMaterial.allLanguages; + g_allConditions = buildContents.sourceMaterial.allConditions; + + let displayContainerID = 'build-container-'+g_activeBuild.id; + $('#tabContent').parent().append(''); + $('#tabContent').addClass('is-hidden'); + stopSpinnerSubLoader(); + + $('#'+displayContainerID).load("/templates/builds/display-view-build.html"); + $.ajax({ type: "GET", + url: "/templates/builds/display-view-build.html", + success : function(text) + { + + $('#build-back-btn').click(function() { + $('#'+displayContainerID).remove(); + $('#tabContent').removeClass('is-hidden'); + if($('#tabContent').is(':empty')){ $('#browseTab').trigger("click"); } + }); + $('.category-tabs li').click(function() { + $('#'+displayContainerID).remove(); + }); + + // If mobile, reduce width of the add character button + if(isMobileView()){ // Remove so the icon shows up proportionality correct + $('#build-create-character-btn-text').remove(); + } + + // Generate Notes Map // + generateNotesMap(); + + + $('#build-name').html(g_activeBuild.name); + $('#build-description').html(processText(g_activeBuild.description, false, false, 'MEDIUM', false)); + + $('#build-artwork-img').attr('src', g_activeBuild.artworkURL); + + let contactInfoStr = (g_activeBuild.contactInfo != '' && g_activeBuild.contactInfo != null) ? ', '+g_activeBuild.contactInfo : ''; + $('#build-contact-info').html(' '+g_activeBuild.authorName+' #'+g_activeBuild.userID+''+contactInfoStr); + + // Determine build level range + let lowestLvl = 999; + let highestLvl = 0; + for(const data of buildContents.buildData){ + if(!processData_isCheckedData(data)) { continue; } + if(data.sourceLevel < lowestLvl){ + lowestLvl = data.sourceLevel; + } + if(data.sourceLevel > highestLvl){ + highestLvl = data.sourceLevel; + } + } + $('#build-lvl-range').html(`(Level ${lowestLvl} - ${highestLvl})`); + + /// + + // Hide create character button if user isn't logged in + if($('#builds-container').attr('data-user-id') == '') { + $('#build-create-character-btn').addClass('is-hidden'); + } + + // Create Character Button // + $('#build-create-character-btn').click(function() { + + let homebrewNeeded = []; + + const buildHomebrew = JSON.parse(g_activeBuild.enabledHomebrew); + for(const buildHomebrewID of buildHomebrew){ + let hBundle = buildContents.userInfo.hBundlesCollected.find(hBundle => { + return hBundle.homebrewID == buildHomebrewID; + }); + if(hBundle == null){ + hBundle = buildContents.userInfo.hBundlesProgess.find(hBundle => { + return hBundle.id == buildHomebrewID; + }); + } + if(hBundle == null){ + homebrewNeeded.push(buildHomebrewID); + } + } + + startSpinnerSubLoader(); + + // If requires homebrew bundles to be added, get homebrew bundles + if(homebrewNeeded.length > 0){ + socket.emit('requestHomebrewBundlesFromArray', homebrewNeeded); + + socket.once('returnHomebrewBundlesFromArray', function(neededBundles){ + if(neededBundles.length > 0){ + stopSpinnerSubLoader(); + + // Send confirm message asking if it's okay to add required bundles + let requiredBundlesHTML = ''; + for(const neededBundle of neededBundles){ + if(neededBundle == null) { continue; } + requiredBundlesHTML += `

    - ${neededBundle.name} (ID: ${neededBundle.id})

    `; + } + + new ConfirmMessage('Build Requires Homebrew', ` +

    This build requires the following homebrew to be enabled and added to your homebrew collection:

    + ${requiredBundlesHTML} + `, 'Add Homebrew to Collection', 'modal-build-add-required-homebrew', 'modal-build-add-required-homebrew-btn', 'is-info'); + $('#modal-build-add-required-homebrew-btn').click(function() { + startSpinnerSubLoader(); + + // Homebrew bundles can be added, but do any require a key? + let neededBundlesRequireKey = []; + for(const neededBundle of neededBundles){ + if(neededBundle == null) { continue; } + if(neededBundle.hasKeys == 1){ + neededBundlesRequireKey.push(neededBundle); + } else { + socket.emit('requestBundleChangeCollection', neededBundle.id, true); + } + } + + // Some of the bundles require a key, say that. + if(neededBundlesRequireKey.length > 0){ + stopSpinnerSubLoader(); + + let requiredBundlesThatNeedKeyHTML = ''; + for(const neededBundleRequireKey of neededBundlesRequireKey){ + requiredBundlesThatNeedKeyHTML += `

    - ${neededBundleRequireKey.name} (ID: ${neededBundleRequireKey.id})

    `; + } + + new ConfirmMessage('Homebrew Requires Key to Access', ` +

    The following homebrew requires a key to access:

    + ${requiredBundlesThatNeedKeyHTML} +

    You can add the homebrew to your collection by individually adding the homebrew bundle and inputting the required key.

    + `, 'Okay', 'modal-build-homebrew-requires-key', 'modal-build-homebrew-requires-key-btn', 'is-info'); + + } else { + // No keys required, create the character + socket.emit('requestCreateCharacterFromBuild', g_activeBuild.id); + } + + }); + + } else { + // If requires homebrew bundles, but can't find them. Just create the character and hope for the best! + socket.emit('requestCreateCharacterFromBuild', g_activeBuild.id); + } + }); + } else { + // No homebrew bundles required to be enabled, just create the character + socket.emit('requestCreateCharacterFromBuild', g_activeBuild.id); + } + + }); + + /// + + g_unselectedDataArray = []; + for(const data of buildContents.buildData){ + if(processData_isIncorrectOption(data)){ + g_unselectedDataArray.push(data); + } + } + + // Reveal warnings icon if there is incorrect data + if(g_unselectedDataArray.length > 0){ + $('#build-warnings-icon').removeClass('is-hidden'); + } + + // Build Warnings Icon // + $('#build-warnings-icon').click(function() { + openQuickView('warningsView', {}); + }); + + /// + + if(buildContents.mainSelections.bAncestry != null){ + $('#build-ancestry').html(buildContents.mainSelections.bAncestry.name); + $('#build-ancestry').addClass('is-info'); + + $('#build-ancestry').click(function() { + new DisplayAncestry(displayContainerID, buildContents.mainSelections.bAncestry.id, g_featMap, buildContents.mainSelections.bAncestry.homebrewID, true); + }); + + } else { + $('#build-ancestry').html('Any Ancestry'); + } + + if(buildContents.mainSelections.bHeritage != null || buildContents.mainSelections.bUniHeritage != null){ + if(buildContents.mainSelections.bUniHeritage != null){ + $('#build-heritage').html(buildContents.mainSelections.bUniHeritage.name); + + $('#build-heritage').click(function() { + new DisplayUniHeritage(displayContainerID, buildContents.mainSelections.bUniHeritage.id, g_featMap, buildContents.mainSelections.bUniHeritage.homebrewID, true); + }); + + } else if(buildContents.mainSelections.bHeritage != null){ + $('#build-heritage').html(buildContents.mainSelections.bHeritage.name); + + $('#build-heritage').click(function() { + new DisplayAncestry(displayContainerID, buildContents.mainSelections.bAncestry.id, g_featMap, buildContents.mainSelections.bAncestry.homebrewID, true); + }); + + } + $('#build-heritage').addClass('is-info'); + + } else { + $('#build-heritage').html('Any Heritage'); + } + + if(buildContents.mainSelections.bBackground != null){ + $('#build-background').html(buildContents.mainSelections.bBackground.name); + $('#build-background').addClass('is-info'); + + $('#build-background').click(function() { + new DisplayBackground(displayContainerID, buildContents.mainSelections.bBackground.id, buildContents.mainSelections.bBackground.homebrewID, true); + }); + + } else { + $('#build-background').html('Any Background'); + } + + if(buildContents.mainSelections.bClass != null && buildContents.mainSelections.bClass.Class != null){ + $('#build-class').html(buildContents.mainSelections.bClass.Class.name); + $('#build-class').addClass('is-info'); + + $('#build-class').click(function() { + new DisplayClass(displayContainerID, buildContents.mainSelections.bClass.Class.id, g_featMap, buildContents.mainSelections.bClass.Class.homebrewID, true); + }); + + } else { + $('#build-class').html('Any Class'); + } + + + + + + //// Assemble Accords + + $('.accord-container').each(function() { + let accordHeader = $(this).find('.accord-header'); + $(accordHeader).click(function() { + let accordBody = $(this).parent().find('.accord-body'); + let accordChevron = $(this).parent().find('.accord-chevron'); + if($(accordBody).hasClass("is-hidden")) { + $(accordBody).removeClass('is-hidden'); + $(accordChevron).removeClass('fa-chevron-down'); + $(accordChevron).addClass('fa-chevron-up'); + } else { + $(accordBody).addClass('is-hidden'); + $(accordChevron).removeClass('fa-chevron-up'); + $(accordChevron).addClass('fa-chevron-down'); + } + }); + $(accordHeader).mouseenter(function(){ + $(accordHeader).addClass('accord-hover'); + }); + $(accordHeader).mouseleave(function(){ + $(accordHeader).removeClass('accord-hover'); + }); + }); + + //// Populate Accords + + if(buildContents.build.finalStatsJSON != null){ + + let finalStats = JSON.parse(buildContents.build.finalStatsJSON); + + $('#str-score').text(finalStats.scores.str); + $('#dex-score').text(finalStats.scores.dex); + $('#con-score').text(finalStats.scores.con); + $('#int-score').text(finalStats.scores.int); + $('#wis-score').text(finalStats.scores.wis); + $('#cha-score').text(finalStats.scores.cha); + + $('#hit-points-total').text(finalStats.maxHealth); + + $('#class-dc-total').text(finalStats.classDC.total); + $('#class-dc-rank').text(finalStats.classDC.rank); + + $('#perception-total').text(finalStats.perception.total); + $('#perception-rank').text(finalStats.perception.rank); + + let saves = [ + { + Value1: 'Fortitude', + Value2: finalStats.saves.fort.total, + Value3: finalStats.saves.fort.rank, + }, + { + Value1: 'Reflex', + Value2: finalStats.saves.reflex.total, + Value3: finalStats.saves.reflex.rank, + }, + { + Value1: 'Will', + Value2: finalStats.saves.will.total, + Value3: finalStats.saves.will.rank, + }, + ]; + populateAccord('saves-body', saves); + + let skills = [ + { + Value1: 'Acrobatics', + Value2: finalStats.skills.acrobatics.total, + Value3: finalStats.skills.acrobatics.rank, + }, + { + Value1: 'Arcana', + Value2: finalStats.skills.arcana.total, + Value3: finalStats.skills.arcana.rank, + }, + { + Value1: 'Athletics', + Value2: finalStats.skills.athletics.total, + Value3: finalStats.skills.athletics.rank, + }, + { + Value1: 'Crafting', + Value2: finalStats.skills.crafting.total, + Value3: finalStats.skills.crafting.rank, + }, + { + Value1: 'Deception', + Value2: finalStats.skills.deception.total, + Value3: finalStats.skills.deception.rank, + }, + { + Value1: 'Diplomacy', + Value2: finalStats.skills.diplomacy.total, + Value3: finalStats.skills.diplomacy.rank, + }, + { + Value1: 'Intimidation', + Value2: finalStats.skills.intimidation.total, + Value3: finalStats.skills.intimidation.rank, + }, + { + Value1: 'Medicine', + Value2: finalStats.skills.medicine.total, + Value3: finalStats.skills.medicine.rank, + }, + { + Value1: 'Nature', + Value2: finalStats.skills.nature.total, + Value3: finalStats.skills.nature.rank, + }, + { + Value1: 'Occultism', + Value2: finalStats.skills.occultism.total, + Value3: finalStats.skills.occultism.rank, + }, + { + Value1: 'Performance', + Value2: finalStats.skills.performance.total, + Value3: finalStats.skills.performance.rank, + }, + { + Value1: 'Religion', + Value2: finalStats.skills.religion.total, + Value3: finalStats.skills.religion.rank, + }, + { + Value1: 'Society', + Value2: finalStats.skills.society.total, + Value3: finalStats.skills.society.rank, + }, + { + Value1: 'Stealth', + Value2: finalStats.skills.stealth.total, + Value3: finalStats.skills.stealth.rank, + }, + { + Value1: 'Survival', + Value2: finalStats.skills.survival.total, + Value3: finalStats.skills.survival.rank, + }, + { + Value1: 'Thievery', + Value2: finalStats.skills.thievery.total, + Value3: finalStats.skills.thievery.rank, + }, + ]; + + for(let lore of finalStats.lores){ + skills.push({ + Value1: lore.name, + Value2: lore.total, + Value3: lore.rank, + }); + } + populateAccord('skills-body', skills); + + let attacks = [ + { + Value1: 'Simple Weapons', + Value2: finalStats.attacks.simple_weapons.rank, + }, + { + Value1: 'Martial Weapons', + Value2: finalStats.attacks.martial_weapons.rank, + }, + { + Value1: 'Advanced Weapons', + Value2: finalStats.attacks.advanced_weapons.rank, + }, + { + Value1: 'Unarmed Attacks', + Value2: finalStats.attacks.unarmed_weapons.rank, + }, + ]; + populateAccord('attacks-body', attacks); + + let defenses = [ + { + Value1: 'Light Armor', + Value2: finalStats.defenses.light_armor.rank, + }, + { + Value1: 'Medium Armor', + Value2: finalStats.defenses.medium_armor.rank, + }, + { + Value1: 'Heavy Armor', + Value2: finalStats.defenses.heavy_armor.rank, + }, + { + Value1: 'Unarmored Defense', + Value2: finalStats.defenses.unarmored_defense.rank, + }, + ]; + populateAccord('defenses-body', defenses); + + let spellcasting = []; + const arcaneSpellAttacksRank = finalStats.spellcasting.arcane.attack; + if(arcaneSpellAttacksRank != 'U'){ + spellcasting.push({ + Value1: 'Arcane Spell Attacks', + Value2: arcaneSpellAttacksRank, + }); + } + const arcaneSpellDCsRank = finalStats.spellcasting.arcane.dc; + if(arcaneSpellDCsRank != 'U'){ + spellcasting.push({ + Value1: 'Arcane Spell DCs', + Value2: arcaneSpellDCsRank, + }); + } + + const divineSpellAttacksRank = finalStats.spellcasting.divine.attack; + if(divineSpellAttacksRank != 'U'){ + spellcasting.push({ + Value1: 'Divine Spell Attacks', + Value2: divineSpellAttacksRank, + }); + } + const divineSpellDCsRank = finalStats.spellcasting.divine.dc; + if(divineSpellDCsRank != 'U'){ + spellcasting.push({ + Value1: 'Divine Spell DCs', + Value2: divineSpellDCsRank, + }); + } + + const occultSpellAttacksRank = finalStats.spellcasting.occult.attack; + if(occultSpellAttacksRank != 'U'){ + spellcasting.push({ + Value1: 'Occult Spell Attacks', + Value2: occultSpellAttacksRank, + }); + } + const occultSpellDCsRank = finalStats.spellcasting.occult.dc; + if(occultSpellDCsRank != 'U'){ + spellcasting.push({ + Value1: 'Occult Spell DCs', + Value2: occultSpellDCsRank, + }); + } + + const primalSpellAttacksRank = finalStats.spellcasting.primal.attack; + if(primalSpellAttacksRank != 'U'){ + spellcasting.push({ + Value1: 'Primal Spell Attacks', + Value2: primalSpellAttacksRank, + }); + } + const primalSpellDCsRank = finalStats.spellcasting.primal.dc; + if(primalSpellDCsRank != 'U'){ + spellcasting.push({ + Value1: 'Primal Spell DCs', + Value2: primalSpellDCsRank, + }); + } + populateAccord('spellcasting-body', spellcasting); + + let languages = []; + for(let langName of finalStats.languages){ + languages.push({ + Value1: langName, + Value2: '', + }); + } + populateAccord('languages-body', languages); + + let resistWeaks = []; + for(let resist of finalStats.resists){ + resistWeaks.push({ + Value1: resist, + Value2: 'Resist.', + }); + } + for(let weak of finalStats.weaks){ + resistWeaks.push({ + Value1: weak, + Value2: 'Weak.', + }); + } + populateAccord('resist-weaks-body', resistWeaks); + + } else { + + populateAccord('saves-body', []); + populateAccord('skills-body', []); + populateAccord('attacks-body', []); + populateAccord('defenses-body', []); + populateAccord('spellcasting-body', []); + populateAccord('languages-body', []); + populateAccord('resist-weaks-body', []); + + } + + //// Reading MetaData + + processMetaData(buildContents); + + + $('#'+displayContainerID).removeClass('is-hidden'); + } + }); +}); + +socket.on('returnCharacterCreatedFromBuild', function(character){ + stopSpinnerSubLoader(); + window.location.href = '/profile/characters/builder/basics/?id='+character.id; +}); + +socket.on('returnCharacterFailedToCreateFromBuild', function(){ + stopSpinnerSubLoader(); + new ConfirmMessage('Cannot Create Character', 'It seems like you\'ve reached your max characters. To get unlimited characters, support us and what we\'re doing on Patreon!', 'Okay', 'modal-failed-max-characters', 'modal-failed-max-characters-btn', 'is-info'); +}); + +function populateAccord(accordBodyID, optionsList){ + + let content = $('#'+accordBodyID); + content.html(''); + + if(optionsList.length == 0){ + content.append(`

    None

    `); + return; + } + + for(let i = 0; i < optionsList.length; i++){ + let optionEntryID = `${accordBodyID}-entry-${i}`; + let option = optionsList[i]; + + let value1 = option.Value1; + let value2 = option.Value2; + let value3 = option.Value3; + + if(value3 == null){ + content.append(` +
    +

    ${value1}

    +

    ${value2}

    +
    + `); + } else { + content.append(` +
    +

    ${value1}

    +

    ${value2}

    +

    ${value3}

    +
    + `); + } + + } + +} + +function generateNotesMap(){ + g_notesMap = new Map(); + if(g_activeBuild.description == null) { return; } + + let newDescription = ''; + for(let line of g_activeBuild.description.split('\n')){ + if(line.includes(':')){ + let lineParts = line.split(':'); + if(lineParts.length == 2 && lineParts[0].length <= 60){ + g_notesMap.set(lineParts[0].toUpperCase(), lineParts[1].trim()); + } else { + newDescription += line+'\n'; + } + } else { + newDescription += line+'\n'; + } + } + + g_activeBuild.description = newDescription; + +} + +function processMetaData(buildContents){ + + let ancestryFeats = []; + let classSelections = []; + let classFeats = []; + let archetypeFeats = []; + let skillFeats = []; + let generalFeats = []; + let skillData = []; + + let otherData = []; + + for(const data of buildContents.buildData){ + if(processData_isAncestryFeat(data)){ + ancestryFeats.push(data); + } else if(processData_isSkillFeat(data)){ + skillFeats.push(data); + } else if(processData_isGeneralFeat(data, buildContents)){ + generalFeats.push(data); + } else if(processData_isClassFeat(data)){ + classFeats.push(data); + } else if(processData_isArchetypeFeat(data)){ + archetypeFeats.push(data); + } else if(processData_isSkillRelated(data)){ + skillData.push(data); + } else if(processData_isClassSelection(data)){ + classSelections.push(data); + } else { + otherData.push(data); + } + } + + // Build Tables // + processData_buildClassSelection('build-class-selections', classSelections, buildContents); + + processData_buildFeatTable('build-ancestry-feats', ancestryFeats); + + processData_buildFeatTable('build-class-feats', classFeats); + + processData_buildFeatTable('build-archetype-feats', archetypeFeats); + + processData_buildFeatTable('build-general-feats', generalFeats); + + processData_buildFeatTable('build-skill-feats', skillFeats); + + processData_buildSkillTable('build-skill-history', skillData); + +} + +function processData_isCheckedData(data){ + return ((data.source == 'chosenFeats' || data.source == 'classChoice') && data.value != null); +} + +function processData_isAncestryFeat(data){ + return (data.source == 'chosenFeats' + && data.sourceCode.startsWith('ancestryFeat-') + && data.sourceType == 'ancestry' + ); +} + +function processData_isClassFeat(data){ + if(data.source == 'chosenFeats' + && data.sourceCode.startsWith('classAbility-') + && !data.sourceCode.startsWith('classAbility--') + && data.sourceType == 'class' + ) { + + let featStruct = g_featMap.get(data.value+''); + if(featStruct.Feat.level > 0) { + + let generalTag = featStruct.Tags.find(tag => { + return tag.id == 8; // Hardcoded General Tag IDs + }); + return (generalTag == null); + + } else { + return false; + } + + } else { + return false; + } +} + +function processData_isArchetypeFeat(data){ + return (data.source == 'chosenFeats' + && data.sourceCode.startsWith('classAbility--') + && data.sourceType == 'class' + ); +} + +function processData_isGeneralFeat(data, buildContents){ + if (data.source == 'chosenFeats' + && data.sourceCode.startsWith('classAbility-') + && !data.sourceCode.startsWith('classAbility--') + && data.sourceType == 'class' + ) { + + let featStruct = g_featMap.get(data.value+''); + let tag = featStruct.Tags.find(tag => { + return tag.id == 8; // Hardcoded General Tag IDs + }); + if(tag != null){ + + let featureID = data.sourceCode.replace('classAbility-',''); + + let classFeature = buildContents.mainSelections.bClass.Abilities.find(classFeature => { + return classFeature.id == featureID; + }); + if(classFeature != null){ + return (classFeature.name == 'General Feat'); + } else { + return false; + } + + } else { + return false; + } + + } else { + return false; + } +} + +function processData_isSkillFeat(data){ + if (data.source == 'chosenFeats' + && data.sourceCode.startsWith('classAbility-') + && !data.sourceCode.startsWith('classAbility--') + && data.sourceType == 'class' + ) { + + let featStruct = g_featMap.get(data.value+''); + let tag = featStruct.Tags.find(tag => { + return tag.id == 9; // Hardcoded Skill Tag IDs + }); + return (tag != null); + + } else { + return false; + } +} + +function processData_isSkillRelated(data){ + return (data.source == 'proficiencies' + && data.value.startsWith('Skill:::') + ); +} + +function processData_isClassSelection(data){ + return (data.source == 'classChoice' + && data.sourceCode.startsWith('classAbilitySelector-') + && data.sourceType == 'class' + ); +} + +function processData_isIncorrectOption(data){ + return (data.source == 'unselectedData' + && data.value.includes('"INCORRECT"') + ); +} + + +function processData_buildFeatTable(locationID, featDataArray){ + if(featDataArray.length > 0){ + $('#'+locationID+'-section').removeClass('is-hidden'); + } else { + return; + } + + let containsNotes = false; + for(let data of featDataArray){ + let featStruct = g_featMap.get(data.value+''); + if(featStruct != null && g_notesMap.has(featStruct.Feat.name.toUpperCase())){ + containsNotes = true; + } + } + if(!containsNotes){ + $('#'+locationID).addClass('is-short'); + } + + $('#'+locationID).html(` +
    +
    + Level +
    +
    + Feat +
    + ${(containsNotes) ? ` +
    + Notes +
    + ` : ``} +
    +
    + `); + for(let data of featDataArray){ + let featStruct = g_featMap.get(data.value+''); + if(featStruct == null) { continue; } + let featEntryID = 'feat-table-entry-'+featStruct.Feat.id; + + let notes = null; + if(containsNotes){ + notes = g_notesMap.get(featStruct.Feat.name.toUpperCase()); + if(notes == null) { notes = ''; } + } + + $('#'+locationID+'-list').append(` +
    +
    + ${data.sourceLevel} +
    +
    + ${featStruct.Feat.name+convertActionToHTML(featStruct.Feat.actions)} +
    + ${(containsNotes) ? ` +
    + ${notes} +
    + ` : ``} +
    + `); + + $('#'+featEntryID).click(function(){ + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags + }); + }); + + $('#'+featEntryID).mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+featEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + } + +} + +function processData_buildSkillTable(locationID, skillDataArray){ + if(skillDataArray.length > 0){ + $('#'+locationID+'-section').removeClass('is-hidden'); + } else { + return; + } + + skillDataArray = skillDataArray.sort( + function(aData, bData) { + if (aData.sourceLevel == bData.sourceLevel) { + // Skill Source is only important when levels are the same + let aSource = aData.value.split(':::')[3]; + let bSource = bData.value.split(':::')[3]; + if(aSource == bSource){ + // Skill Name is only important when sources are the same + return aData.value > bData.value ? 1 : -1; + } else { + return aData.value.split(':::')[3] > bData.value.split(':::')[3] ? 1 : -1; + } + } else { + return aData.sourceLevel - bData.sourceLevel; + } + } + ); + + $('#'+locationID).html(` +
    +
    + Level +
    +
    + Skill Proficiency +
    +
    + Notes +
    +
    +
    + `); + for(let data of skillDataArray){ + if(data.value == null) { continue; } + + let parts = data.value.split(':::'); + const skillName = parts[1]; + const profRank = parts[2]; + const source = parts[3]; + + $('#'+locationID+'-list').append(` +
    +
    + ${data.sourceLevel} +
    +
    + ${capitalizeWords(skillName.replace(/_/g,' '))} (${profToWord(profRank)}) +
    +
    + From ${source} +
    +
    + `); + + } + +} + +function processData_buildClassSelection(locationID, selectionDataArray, buildContents){ + if(selectionDataArray.length > 0){ + $('#'+locationID+'-section').removeClass('is-hidden'); + } else { + return; + } + + selectionDataArray = selectionDataArray.sort( + function(aData, bData) { + return aData.sourceLevel - bData.sourceLevel; + } + ); + + $('#'+locationID).html(` +
    +
    + Level +
    +
    + Class Selection +
    +
    +
    + `); + for(let data of selectionDataArray){ + if(data.value == null) { continue; } + + let parts = data.value.split(':::'); + const selectorID = parts[0]; + const optionID = parts[1]; + + let selectorFeature = buildContents.mainSelections.bClass.Abilities.find(classFeature => { + return classFeature.id == selectorID; + }); + + let optionFeature = buildContents.mainSelections.bClass.Abilities.find(classFeature => { + return classFeature.id == optionID; + }); + + let selectorEntryID = 'selection-table-entry-1-'+selectorFeature.id+'-'+optionFeature.id; + let optionEntryID = 'selection-table-entry-2-'+selectorFeature.id+'-'+optionFeature.id; + + $('#'+locationID+'-list').append(` +
    +
    + ${data.sourceLevel} +
    +
    +
    +
    + ${selectorFeature.name} +
    +
    + (${optionFeature.name}) +
    +
    +
    +
    + `); + + $('#'+selectorEntryID).click(function(){ + openQuickView('abilityView', { + Ability : selectorFeature + }); + }); + $('#'+selectorEntryID).mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+selectorEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + + $('#'+optionEntryID).click(function(){ + openQuickView('abilityView', { + Ability : optionFeature + }); + }); + $('#'+optionEntryID).mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+optionEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/builds/builds-browse.js b/client/vue-src/legacy-js/builds/builds-browse.js new file mode 100644 index 00000000..3b369a24 --- /dev/null +++ b/client/vue-src/legacy-js/builds/builds-browse.js @@ -0,0 +1,181 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openBuildsBrowse(){ + window.history.pushState('builds', '', '/builds/?sub_tab=browse');// Update URL + socket.emit('requestPublishedBuilds'); + //startSpinnerSubLoader(); +} + +socket.on("returnPublishedBuilds", function(builds){ + + builds = builds.sort( + function(a, b) { + let aRating = a.characters.length; + let bRating = b.characters.length; + if (aRating === bRating) { + // Name is only important when ratings are the same + return a.name > b.name ? 1 : -1; + } + return bRating - aRating; + } + ); + + stopSpinnerSubLoader(); + $('#tabContent').html(''); + $('#tabContent').addClass('is-hidden'); + $('#tabContent').load("/templates/builds/display-browse.html"); + $.ajax({ type: "GET", + url: "/templates/builds/display-browse.html", + success : function(text) + { + + $("#filterNameInput").blur(function(){ + if($('#filterNameInput').val() != ''){ + $('#filterNameInput').addClass('is-info'); + } else { + $('#filterNameInput').removeClass('is-info'); + } + }); + $("#filterDescInput").blur(function(){ + if($('#filterDescInput').val() != ''){ + $('#filterDescInput').addClass('is-info'); + } else { + $('#filterDescInput').removeClass('is-info'); + } + });$("#filterAuthorInput").blur(function(){ + if($('#filterAuthorInput').val() != ''){ + $('#filterAuthorInput').addClass('is-info'); + } else { + $('#filterAuthorInput').removeClass('is-info'); + } + }); + $("#filterRatingInput").blur(function(){ + if($('#filterRatingInput').val() != ''){ + $('#filterRatingInput').addClass('is-info'); + } else { + $('#filterRatingInput').removeClass('is-info'); + } + }); + + // Search Filtering // + $('#updateFilterButton').click(function(){ + filterBundleSearch(builds); + }); + $(document).on('keypress',function(e) { + if(e.which == 13) { + filterBundleSearch(builds); + } + }); + filterBundleSearch(builds); + + $('#tabContent').removeClass('is-hidden'); + + } + }); +}); + +function filterBundleSearch(builds){ + + let nameFilter = $('#filterNameInput').val(); + let descFilter = $('#filterDescInput').val(); + let authorFilter = $('#filterAuthorInput').val(); + let ratingRelationFilter = $('#filterRatingRelationInput').val(); + let ratingFilter = $('#filterRatingInput').val(); + + builds = new Set(builds); + + if(nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const build of builds){ + if(!textContainsWords(build.name, parts)){ + builds.delete(build); + } + } + } + + if(descFilter != ''){ + console.log('Filtering by Description...'); + let parts = descFilter.toUpperCase().split(' '); + for(const build of builds){ + if(!textContainsWords(build.description, parts)){ + builds.delete(build); + } + } + } + + if(authorFilter != ''){ + console.log('Filtering by Author...'); + let parts = authorFilter.toUpperCase().split(' '); + for(const build of builds){ + if(!textContainsWords(build.authorName, parts)){ + builds.delete(build); + } + } + } + + if(ratingFilter != ''){ + console.log('Filtering by Rating...'); + let rating = parseInt(ratingFilter); + for(const build of builds){ + let bundleRating = build.characters.length; + switch(ratingRelationFilter) { + case 'EQUAL': if(bundleRating === rating) {} else {builds.delete(build);} break; + case 'LESS': if(bundleRating < rating) {} else {builds.delete(build);} break; + case 'GREATER': if(bundleRating > rating) {} else {builds.delete(build);} break; + case 'LESS-EQUAL': if(bundleRating <= rating) {} else {builds.delete(build);} break; + case 'GREATER-EQUAL': if(bundleRating >= rating) {} else {builds.delete(build);} break; + case 'NOT-EQUAL': if(bundleRating !== rating) {} else {builds.delete(build);} break; + default: break; + } + } + } + + displayBundleResults(builds); +} + +function displayBundleResults(builds){ + $('#browsingList').html(''); + + if(builds.size <= 0){ + $('#browsingList').html('

    No results found!

    '); + $('#searchResultCountContainer').html('

    (0 results found)

    '); + return; + } + + for(const build of builds){ + let entryID = 'bundle-entry-'+build.id; + let rating = build.characters.length; + let ratingColor = ''; + + if(rating > 0){ + ratingColor = 'has-text-success'; + } else if (rating < 0) { + ratingColor = 'has-text-danger'; + } else { + ratingColor = 'has-text-warning'; + } + + let bundleName = build.name; + if(build.hasKeys === 1){ + bundleName += ''; + } + + $('#browsingList').append('
    '+bundleName+'
    '+build.authorName+'
    '+rating+'
    '); + + $('#'+entryID).click(function(){ + openBuildView(build.id); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/builds/general-builds.js b/client/vue-src/legacy-js/builds/general-builds.js new file mode 100644 index 00000000..7a40c1c8 --- /dev/null +++ b/client/vue-src/legacy-js/builds/general-builds.js @@ -0,0 +1,67 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let g_activeBuild = null; + +let g_featMap = null; +let g_itemMap = null; +let g_spellMap = null; +let g_allLanguages = null; +let g_allConditions = null; +let g_allTags = null; +let g_skillMap = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('.category-tabs li a').click(function() { + $('#browseTab').parent().removeClass("is-active"); + $('#userContentTab').parent().removeClass("is-active"); + $(this).parent().addClass("is-active"); + }); + + $('#browseTab').click(function() { + openBuildsBrowse(); + }); + + $('#userContentTab').click(function() { + openUserContent(); + }); + + + let viewBuildID = $('#builds-container').attr('data-view-build-id'); + let buildTabName = $('#builds-container').attr('data-direct-to-tab').toUpperCase(); + + if(viewBuildID != '' || buildTabName != '') { + if(viewBuildID != ''){ + $('#browseTab').parent().addClass('is-active'); + openBuildView(viewBuildID); + } else if(buildTabName != ''){ + switch(buildTabName) { + case 'BROWSE': $('#browseTab').trigger("click"); break; + case 'CONTENT': $('#userContentTab').trigger("click"); break; + default: break; + } + } + } else { + $('#browseTab').trigger("click"); + } + +}); + +/* +socket.on("returnHomebrewBundle", function(REQUEST_TYPE, homebrewBundle){ + if(homebrewBundle != null){ + if(REQUEST_TYPE === 'EDIT') { + $('#userContentTab').parent().addClass("is-active"); + openBundleEditor(homebrewBundle); + } else if(REQUEST_TYPE === 'VIEW') { + $('#browseTab').parent().addClass("is-active"); + openBundleView(homebrewBundle); + } + } +}); +*/ \ No newline at end of file diff --git a/client/vue-src/legacy-js/builds/user-content.js b/client/vue-src/legacy-js/builds/user-content.js new file mode 100644 index 00000000..1d04cec2 --- /dev/null +++ b/client/vue-src/legacy-js/builds/user-content.js @@ -0,0 +1,121 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openUserContent(){ + window.history.pushState('builds', '', '/builds/?sub_tab=content');// Update URL + socket.emit('requestUserBuilds'); + //startSpinnerSubLoader(); +} + +socket.on("returnUserBuilds", function(builds){ + + stopSpinnerSubLoader(); + $('#tabContent').html(''); + $('#tabContent').addClass('is-hidden'); + $('#tabContent').load("/templates/builds/display-user-content.html"); + $.ajax({ type: "GET", + url: "/templates/builds/display-user-content.html", + success : function(text) + { + + $('#createBuildBtn').click(function() { + socket.emit('requestBuildCreate'); + }); + + let foundPublished = false; + let foundInProgess = false; + for (const build of builds) { + if(build.isPublished == 1){ + foundPublished = true; + + let buildViewID = 'build-'+build.id+'-view'; + let buildUpdateID = 'build-'+build.id+'-update'; + let buildDeleteID = 'build-'+build.id+'-delete'; + + $('#buildsPublishedContainer').append('
    '+build.name+'
    '); + + // View Button // + $('#'+buildViewID).click(function() { + openBuildView(build.id); + }); + + // Update Button // + $('#'+buildUpdateID).click(function() { + g_activeBuild = build; + $('#build-update-published-modal').addClass('is-active'); + $('html').addClass('is-clipped'); + }); + + // Delete Button // + $('#'+buildDeleteID).click(function() { + new ConfirmMessage('Delete “'+build.name+'”', '

    Are you sure you want to delete this?

    There are '+'???'+' users still using this build.

    ', 'Delete', 'modal-delete-in-progress-build-'+build.id, 'modal-delete-in-progress-build-btn-'+build.id); + $('#modal-delete-in-progress-build-btn-'+build.id).click(function() { + socket.emit('requestBuildDelete', build.id); + }); + }); + + } else { + foundInProgess = true; + + let buildViewID = 'build-'+build.id+'-view'; + let buildEditID = 'build-'+build.id+'-edit'; + let buildDeleteID = 'build-'+build.id+'-delete'; + + $('#buildsInProgessContainer').append('
    '+build.name+'
    '); + + // View Button // + $('#'+buildViewID).click(function() { + openBuildView(build.id); + }); + + // Update Button // + $('#'+buildEditID).click(function() { + window.location.href = '/builds/create/?build_id='+build.id+'&page=init'; + }); + + // Delete Button // + $('#'+buildDeleteID).click(function() { + new ConfirmMessage('Delete “'+build.name+'”', '

    Are you sure you want to delete this?

    There are '+'???'+' users still using this build.

    ', 'Delete', 'modal-delete-published-build-'+build.id, 'modal-delete-published-build-btn-'+build.id); + $('#modal-delete-published-build-btn-'+build.id).click(function() { + socket.emit('requestBuildDelete', build.id); + }); + }); + + } + } + + + $('#build-update-published-modal-btn').click(function() { + $('html').removeClass('is-clipped'); + socket.emit('requestBuildUpdate', g_activeBuild.id); + }); + $('#build-update-published-modal-background,#build-update-published-modal-close').click(function() { + $('#build-update-published-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + g_activeBuild = null; + }); + + if(!foundPublished){ + $('#buildsPublishedContainer').html('

    None

    '); + } + if(!foundInProgess){ + $('#buildsInProgessContainer').html('

    None

    '); + } + + $('#tabContent').removeClass('is-hidden'); + } + }); +}); + +socket.on("returnBuildCreate", function(build){ + window.location.href = '/builds/create/?build_id='+build.id+'&page=init'; +}); + +socket.on("returnBuildDelete", function(){ + openUserContent(); +}); + +socket.on("returnBuildUpdate", function(){ + openUserContent(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/bulma/bulma-accordion.min.js b/client/vue-src/legacy-js/bulma/bulma-accordion.min.js new file mode 100644 index 00000000..ad0ff30b --- /dev/null +++ b/client/vue-src/legacy-js/bulma/bulma-accordion.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.bulmaAccordion=t():e.bulmaAccordion=t()}("undefined"!=typeof self?self:this,function(){return function(n){var r={};function i(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}return i.m=n,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(1),o=function(){function r(e,t){for(var n=0;n=l.length&&(c=!0)):c=!0),c&&(e.once&&(a[t]=null),e.callback(r))});-1!==a.indexOf(null);)a.splice(a.indexOf(null),1)}}]),t}();t.a=i}]).default}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/bulma/bulma-collapsible.min.js b/client/vue-src/legacy-js/bulma/bulma-collapsible.min.js new file mode 100644 index 00000000..3625e8eb --- /dev/null +++ b/client/vue-src/legacy-js/bulma/bulma-collapsible.min.js @@ -0,0 +1 @@ +!function webpackUniversalModuleDefinition(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.bulmaCollapsible=t():e.bulmaCollapsible=t()}(window,function(){return function(e){var t={};function __webpack_require__(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,__webpack_require__),r.l=!0,r.exports}return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.d=function(e,t,n){__webpack_require__.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.t=function(e,t){if(1&t&&(e=__webpack_require__(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(__webpack_require__.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)__webpack_require__.d(n,r,function(t){return e[t]}.bind(null,r));return n},__webpack_require__.n=function(e){var t=e&&e.__esModule?function getDefault(){return e.default}:function getModuleExports(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=12)}([function(e,t){function _getPrototypeOf(t){return e.exports=_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(e){return e.__proto__||Object.getPrototypeOf(e)},_getPrototypeOf(t)}e.exports=_getPrototypeOf},function(e,t){e.exports=function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t){function _defineProperties(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:[];o()(this,EventEmitter),this._listeners=new Map(e),this._middlewares=new Map}return s()(EventEmitter,[{key:"listenerCount",value:function listenerCount(e){return this._listeners.has(e)?this._listeners.get(e).length:0}},{key:"removeListeners",value:function removeListeners(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];null!==t?Array.isArray(t)?name.forEach(function(t){return e.removeListeners(t,n)}):(this._listeners.delete(t),n&&this.removeMiddleware(t)):this._listeners=new Map}},{key:"middleware",value:function middleware(e,t){var n=this;Array.isArray(e)?name.forEach(function(e){return n.middleware(e,t)}):(Array.isArray(this._middlewares.get(e))||this._middlewares.set(e,[]),this._middlewares.get(e).push(t))}},{key:"removeMiddleware",value:function removeMiddleware(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;null!==t?Array.isArray(t)?name.forEach(function(t){return e.removeMiddleware(t)}):this._middlewares.delete(t):this._middlewares=new Map}},{key:"on",value:function on(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(Array.isArray(e))e.forEach(function(e){return n.on(e,t)});else{var o=(e=e.toString()).split(/,|, | /);o.length>1?o.forEach(function(e){return n.on(e,t)}):(Array.isArray(this._listeners.get(e))||this._listeners.set(e,[]),this._listeners.get(e).push({once:r,callback:t}))}}},{key:"once",value:function once(e,t){this.on(e,t,!0)}},{key:"emit",value:function emit(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e=e.toString();var o=this._listeners.get(e),i=null,s=0,l=r;if(Array.isArray(o))for(o.forEach(function(a,c){r||(i=n._middlewares.get(e),Array.isArray(i)?(i.forEach(function(n){n(t,function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;null!==e&&(t=e),s++},e)}),s>=i.length&&(l=!0)):l=!0),l&&(a.once&&(o[c]=null),a.callback(t))});-1!==o.indexOf(null);)o.splice(o.indexOf(null),1)}}]),EventEmitter}(),g=n(8),w=n.n(g),k=n(6),O=n.n(k),E=function isFunction(e){return"function"==typeof e},x=function isString(e){return"string"==typeof e||!!e&&"object"===O()(e)&&"[object String]"===Object.prototype.toString.call(e)},P=function isNode(e){try{return Node.prototype.cloneNode.call(e,!1),!0}catch(e){return!1}},S=function isNodeList(e){return NodeList.prototype.isPrototypeOf(e)},j=/^(?:f(?:alse)?|no?|0+)$/i,C=function uuid(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"")+([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(e){return(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})},A=function detectSupportsPassive(){var e=!1;if("undefined"!=typeof window&&"function"==typeof window.addEventListener){var t=Object.defineProperty({},"passive",{get:function get(){return e=!0,!0}}),n=function noop(){};window.addEventListener("testPassive",n,t),window.removeEventListener("testPassive",n,t)}return e},T=function querySelectorAll(e,t){return E(e)?e(t||("undefined"!=typeof document?document:null)):x(e)?t&&P(t)?t.querySelectorAll(e):"undefined"!=typeof document?document.querySelectorAll(e):null:P(e)?[e]:S(e)?e:null},q=function optionsFromDataset(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return P(e)&&e.dataset?Object.keys(e.dataset).filter(function(e){return Object.keys(t).includes(e)}).reduce(function(t,n){return m()({},t,w()({},n,e.dataset[n]))},{}):{}};"undefined"==typeof Node||Node.prototype.on||(Node.prototype.on=function(e,t){var n=this;return Array.isArray(e)||(e=e.split(" ")),e.forEach(function(e){n.addEventListener(e.trim(),t,!!A()&&{passive:!1})}),this}),"undefined"==typeof NodeList||NodeList.prototype.on||(NodeList.prototype.on=function(e,t){return this.forEach(function(n){n.on(e,t)}),this}),"undefined"==typeof Node||Node.prototype.off||(Node.prototype.off=function(e,t){var n=this;return Array.isArray(e)||(e=e.split(" ")),e.forEach(function(e){n.removeEventListener(e.trim(),t,!!A()&&{passive:!1})}),this}),"undefined"==typeof NodeList||NodeList.prototype.off||(NodeList.prototype.off=function(e,t){return this.forEach(function(n){n.off(e,t)}),this});var L=function(e){function Component(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(o()(this,Component),(t=a()(this,p()(Component).call(this))).element=x(e)?t.options.container.querySelector(e):e,!t.element)throw new Error("An invalid selector or non-DOM node has been provided for ".concat(t.constructor.name,"."));return t.element[t.constructor.name]=t.constructor._interface.bind(u()(t)),t.element[t.constructor.name].Constructor=t.constructor.name,t.id=C(t.constructor.name+"-"),t.options=m()({},r,n,q(t.element,r)),t}return y()(Component,e),s()(Component,null,[{key:"attach",value:function attach(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=new Array;return null===t?o:(n=m()({},r,n,q(this.element,r)),(T(t,n.container)||[]).forEach(function(r){void 0===r[e.constructor.name]?o.push(new e(r,m()({selector:t},n))):o.push(r[e.constructor.name])}),o)}},{key:"_interface",value:function _interface(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if("string"==typeof e){if(void 0===this[e])throw new TypeError('No method named "'.concat(e,'"'));return this[e](e)}return this}}]),Component}(b),N={allowMultiple:!1,container:"undefined"!=typeof document?document:null};n.d(t,"default",function(){return M});var M=function(e){function bulmaCollapsible(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o()(this,bulmaCollapsible),(t=a()(this,p()(bulmaCollapsible).call(this,e,n,N))).onTriggerClick=t.onTriggerClick.bind(u()(t)),t.onTransitionEnd=t.onTransitionEnd.bind(u()(t)),t._init(),t}return y()(bulmaCollapsible,e),s()(bulmaCollapsible,[{key:"_init",value:function _init(){if(this._originalHeight=this.element.style.height,this._parent=this.element.dataset.parent,this._parent){var e=this.options.container.querySelector("#".concat(this._parent));this._siblings=T(this.options.selector,e)||[]}this._triggers=this.options.container.querySelectorAll('[data-action="collapse"][href="#'.concat(this.element.id,'"], [data-action="collapse"][data-target="').concat(this.element.id,'"]'))||null,this._triggers&&this._triggers.on("click touch",this.onTriggerClick),this._transitionEvent=function whichTransitionEvent(){var e=document.createElement("fakeelement"),t={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(var n in t)if(void 0!==e.style[n])return t[n]}(),this._transitionEvent&&this.element.on(this._transitionEvent,this.onTransitionEnd),this.element.classList.contains("is-active")?this.expand():this.collapse()}},{key:"destroy",value:function destroy(){this._triggers&&this._triggers.off("click touch",this.onTriggerClick,!1)}},{key:"collapsed",value:function collapsed(){return this._collapsed}},{key:"expand",value:function expand(){var e=this;(void 0===this._collapsed||this._collapsed)&&(this.emit("before:expand",this),this._collapsed=!1,this._parent&&!function BooleanParse(e){return!j.test(e)&&!!e}(this.options.allowMultiple)&&this._siblings.forEach(function(t){t.isSameNode(e.element)||t.bulmaCollapsible&&t.bulmaCollapsible("close")}),this.element.style.height=this.element.scrollHeight+"px",this.element.classList.add("is-active"),this.element.setAttribute("aria-expanded",!0),this._triggers&&this._triggers.forEach(function(e){e.classList.add("is-active")}),this.emit("after:expand",this))}},{key:"open",value:function open(){this.expand()}},{key:"collapse",value:function collapse(){void 0!==this._collapsed&&this._collapsed||(this.emit("before:collapse",this),this._collapsed=!0,this.element.style.height=0,this.element.classList.remove("is-active"),this.element.setAttribute("aria-expanded",!1),this._triggers&&this._triggers.forEach(function(e){e.classList.remove("is-active")}),this.emit("after:collapse",this))}},{key:"close",value:function close(){this.collapse()}},{key:"onTriggerClick",value:function onTriggerClick(e){e.preventDefault(),this.collapsed()?(e.currentTarget.classList.add("is-active"),this.expand()):(e.currentTarget.classList.remove("is-active"),this.collapse())}},{key:"onTransitionEnd",value:function onTransitionEnd(e){this._collapsed||(this.element.style.height=this._originalHeight)}}],[{key:"attach",value:function attach(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:".is-collapsible",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h()(p()(bulmaCollapsible),"attach",this).call(this,e,t,N)}}]),bulmaCollapsible}(L)}]).default}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/bulma/bulma-quickview.min.js b/client/vue-src/legacy-js/bulma/bulma-quickview.min.js new file mode 100644 index 00000000..c0b753c1 --- /dev/null +++ b/client/vue-src/legacy-js/bulma/bulma-quickview.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.bulmaQuickview=t():e.bulmaQuickview=t()}("undefined"!=typeof self?self:this,function(){return function(n){var i={};function r(e){if(i[e])return i[e].exports;var t=i[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,r),t.l=!0,t.exports}return r.m=n,r.c=i,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(1),o=n(2),s=Object.assign||function(e){for(var t=1;t=a.length&&(l=!0)):l=!0),l&&(e.once&&(s[t]=null),e.callback(i))});-1!==s.indexOf(null);)s.splice(s.indexOf(null),1)}}]),t}();t.a=r},function(e,t,n){"use strict";t.a={}}]).default}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/bulma/bulma-steps.min.js b/client/vue-src/legacy-js/bulma/bulma-steps.min.js new file mode 100644 index 00000000..e2e73f11 --- /dev/null +++ b/client/vue-src/legacy-js/bulma/bulma-steps.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.bulmaSteps=e():t.bulmaSteps=e()}("undefined"!=typeof self?self:this,function(){return function(n){var s={};function i(t){if(s[t])return s[t].exports;var e=s[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,i),e.l=!0,e.exports}return i.m=n,i.c=s,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=0)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=n(2),r=Object.assign||function(t){for(var e=1;en.current_id;)n[u](t);for(;e=this.steps.length?(void 0!==this.options.onFinish&&null!=this.options.onFinish&&this.options.onFinish&&this.options.onFinish(t),this.emit("bulmasteps:finish",t),this.deactivate_step(t)):(this.complete_step(t),this.activate_step(e))}}},{key:"previous_step",value:function(){var t=this.get_current_step_id();null!=t&&(this.uncomplete_step(t-1),this.activate_step(t-1))}},{key:"activate_step",value:function(t){this.updateActions(this.steps[t]);for(var e=0;e=l.length&&(u=!0)):u=!0),u&&(t.once&&(r[e]=null),t.callback(s))});-1!==r.indexOf(null);)r.splice(r.indexOf(null),1)}}]),e}();e.a=i},function(t,e,n){"use strict";e.a={selector:".step-item",selector_content:".step-content",previous_selector:'[data-nav="previous"]',next_selector:'[data-nav="next"]',active_class:"is-active",completed_class:"is-completed",stepClickable:!1,beforeNext:null,onShow:null,onFinish:null,onError:null}}]).default}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/bulma/bulma-tagsinput.min.js b/client/vue-src/legacy-js/bulma/bulma-tagsinput.min.js new file mode 100644 index 00000000..12a0c05a --- /dev/null +++ b/client/vue-src/legacy-js/bulma/bulma-tagsinput.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.bulmaTagsinput=t():e.bulmaTagsinput=t()}("undefined"!=typeof self?self:this,function(){return function(n){var i={};function r(e){if(i[e])return i[e].exports;var t=i[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,r),t.l=!0,t.exports}return r.m=n,r.c=i,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(1),a=n(2),s=n(3),o=Object.assign||function(e){for(var t=1;t=o.length&&(c=!0)):c=!0),c&&(e.once&&(s[t]=null),e.callback(i))});-1!==s.indexOf(null);)s.splice(s.indexOf(null),1)}}]),t}();t.a=r},function(e,t,n){"use strict";t.a={disabled:!1,delimiter:",",allowDelete:!0,lowercase:!1,uppercase:!1,duplicates:!0}},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=function(e){return"string"==typeof e||!!e&&"object"===(void 0===e?"undefined":i(e))&&"[object String]"===Object.prototype.toString.call(e)}}]).default}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/cache-storing.js b/client/vue-src/legacy-js/cache-storing.js new file mode 100644 index 00000000..e5999f79 --- /dev/null +++ b/client/vue-src/legacy-js/cache-storing.js @@ -0,0 +1,142 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +const STORE_ENTRY_LIMIT = 100; + +function clearCacheStore(){ + localStorage.clear(); +} + +// + +function storeString(key, str){ + try { + localStorage[key] = str; + } catch (err) { + console.error(err); + } +} + +function retrieveString(key){ + try { + let data = localStorage[key]; + return (data != null) ? data : false; + } catch (err) { + console.error(err); + return false; + } +} + +// + +function storeArray(key, array){ + let chunkedArray = chunkArray(array, STORE_ENTRY_LIMIT); + for (let i = 0; i < chunkedArray.length; i++) { + let subArray = chunkedArray[i]; + let arrayKey = key+'-'+i; + try { + localStorage[arrayKey] = JSON.stringify(subArray); + } catch (err) { + console.error(err); + } + } +} + +function retrieveArray(key){ + let chunkArray = []; + let i = 0; + while (true) { + let arrayKey = key+'-'+i; + try { + let rawArrayStr = localStorage[arrayKey]; + if(rawArrayStr != null){ + chunkArray.push(JSON.parse(rawArrayStr)); + } else { + return dechunkArray(chunkArray); + } + } catch (err) { + console.error(err); + return false; + } + i++; + } +} + +// + +function storeMap(key, map){ + let chunkedMapArray = chunkMap(map, STORE_ENTRY_LIMIT); + for (let i = 0; i < chunkedMapArray.length; i++) { + let subMap = chunkedMapArray[i]; + let mapKey = key+'-'+i; + try { + localStorage[mapKey] = JSON.stringify(mapToObj(subMap)); + } catch (err) { + console.error(err); + } + } +} + +function retrieveMap(key){ + let chunkMapArray = []; + let i = 0; + while (true) { + let mapKey = key+'-'+i; + try { + let rawMapStr = localStorage[mapKey]; + if(rawMapStr != null){ + chunkMapArray.push(objToMap(JSON.parse(rawMapStr))); + } else { + return dechunkMap(chunkMapArray); + } + } catch (err) { + console.error(err); + return false; + } + i++; + } +} + + + +// Utils // +function chunkArray(array, chunk_size){ + let chunkArray = []; + for (let i = 0; i < array.length; i += chunk_size) { + chunkArray.push(array.slice(i, i+chunk_size)); + } + return chunkArray; +} +function dechunkArray(chunkArray){ + let completeArray = []; + for(let subArray of chunkArray) { + completeArray = completeArray.concat(subArray); + } + return completeArray; +} + +function chunkMap(map, chunk_size){ + let chunkMapArray = []; + let count = 1; + let tempMap = new Map(); + for(const [key, value] of map.entries()){ + tempMap.set(key, value); + if(count == chunk_size){ + count = 1; + chunkMapArray.push(new Map(tempMap)); + tempMap = new Map(); + } else { + count++; + } + } + chunkMapArray.push(new Map(tempMap)); + return chunkMapArray; +} +function dechunkMap(chunkMapArray){ + let completeMap = new Map(); + for(let chunkMap of chunkMapArray) { + chunkMap.forEach((value, key) => completeMap.set(key, value)); + } + return completeMap; +} diff --git a/client/vue-src/legacy-js/char_builders/char-builder-general.js b/client/vue-src/legacy-js/char_builders/char-builder-general.js new file mode 100644 index 00000000..e65437f9 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/char-builder-general.js @@ -0,0 +1,296 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let isBuilderInit = false; +let isFirstLoad = true; +let g_pageNum; + +// Temp global variables +let gOption_hasProfWithoutLevel = false; +let g_character = null; +// + +// +let g_char_ancestryID = null; +let g_char_backgroundID = null; +let g_char_classID_1 = null; +let g_char_classID_2 = null; +// + +// Core Builder Data // +let g_abilMap = null; +let g_featMap = null; +let g_skillMap = null; +let g_itemMap = null; +let g_spellMap = null; +let g_allLanguages = null; +let g_allConditions = null; +let g_allTags = null; +let g_enabledSources = null; +let g_classArchetypes = null; +let g_unselectedData = null; +let g_rawMetaData = null; +// ~~~~~~~~~~~~~~~~~ // + +$(function () { + + startDiceLoader(); + // Using an MLoad instead here + //socket.emit("requestCharBuilderDetails", getCharIDFromURL()); + +}); + +socket.on("returnCharBuilderDetails", function(character, coreDataStruct, inChoiceStruct){ + isBuilderInit = true; + + console.log('~ LOADING BUILDER ~'); + + // Core Builder Data // + g_abilMap = objToMap(coreDataStruct.AbilObject); + g_featMap = objToMap(coreDataStruct.FeatObject); + g_skillMap = objToMap(coreDataStruct.SkillObject); + g_itemMap = objToMap(coreDataStruct.ItemObject); + g_spellMap = objToMap(coreDataStruct.SpellObject); + g_allLanguages = coreDataStruct.AllLanguages; + g_allConditions = coreDataStruct.AllConditions; + g_allTags = coreDataStruct.AllTags; + g_enabledSources = coreDataStruct.EnabledSources; + g_classArchetypes = coreDataStruct.ClassArchetypeArray; + g_unselectedData = coreDataStruct.UnselectedDataArray; + g_rawMetaData = coreDataStruct.RawMetaDataArray; + // + g_char_ancestryID = character.ancestryID; + g_char_backgroundID = character.backgroundID; + g_char_classID_1 = character.classID; + g_char_classID_2 = null; + // + gOption_hasProfWithoutLevel = (character.variantProfWithoutLevel == 1); + g_character = character; + // + injectWSCChoiceStruct(inChoiceStruct); + initClassArchetypes(inChoiceStruct.ClassArchetypeID); + // ~~~~~~~~~~~~~~~~~ // + + for(const [featID, featStruct] of g_featMap.entries()){ + g_featPrereqMap.set(featID+'', meetsPrereqs(featStruct.Feat)); + } + + goToBuilderPage($('#char-builder-container').attr('data-page-num'), true); + +}); + +function goToBuilderPage(pageNum, firstLoad=false){ + isFirstLoad = firstLoad; + startLoadingPage(); + $("#prevButton").off(); + $("#nextButton").off(); + $("#goToCharButton").off(); + $("#goToCharBigButton").off(); + g_pageNum = pageNum; + switch(pageNum+''){ + case '1': window.location.href = '/profile/characters/builder/basics/?id='+getCharIDFromURL(); break; + case '2': socket.emit("requestBuilderPageAncestry", getCharIDFromURL()); break; + case '3': socket.emit("requestBuilderPageBackground", getCharIDFromURL()); break; + case '4': socket.emit("requestBuilderPageClass", getCharIDFromURL()); break; + case '42': socket.emit("requestBuilderPageClass2", getCharIDFromURL()); break; + case '5': socket.emit("requestBuilderPageFinalize", getCharIDFromURL()); break; + default: break; + } +} + +function goToSheet(){ + // Hardcoded redirect + window.location.href ='/profile/characters/'+getCharIDFromURL(); +} + +socket.on("returnBuilderPageAncestry", function(ancestryObject, uniHeritageArray){ + $('#char-builder-container').load("/templates/char_builder/display-builder-page-2.html"); + $.ajax({ type: "GET", + url: "/templates/char_builder/display-builder-page-2.html", + success : function(text) + { + console.log('PAGE: Ancestry'); + + $("#prevButton").click(function(){ + goToBuilderPage(1); + }); + $("#nextButton").parent().removeClass('is-hidden'); + $("#nextButton").click(function(){ + goToBuilderPage(3); + }); + $("#goToCharButton").parent().removeClass('is-hidden'); + $("#goToCharButton").click(function(){ + goToSheet(); + }); + $("#goToCharBigButton").parent().addClass('is-hidden'); + initBuilderSteps(); + + window.history.pushState('profile/characters/builder', '', '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=2');// Update URL + loadAncestryPage(ancestryObject, uniHeritageArray); + timeOutFinishLoad(); + } + }); +}); + +socket.on("returnBuilderPageBackground", function(backgrounds){ + $('#char-builder-container').load("/templates/char_builder/display-builder-page-3.html"); + $.ajax({ type: "GET", + url: "/templates/char_builder/display-builder-page-3.html", + success : function(text) + { + console.log('PAGE: Background'); + + $("#prevButton").click(function(){ + goToBuilderPage(2); + }); + $("#nextButton").parent().removeClass('is-hidden'); + $("#nextButton").click(function(){ + goToBuilderPage(4); + }); + $("#goToCharButton").parent().removeClass('is-hidden'); + $("#goToCharButton").click(function(){ + goToSheet(); + }); + $("#goToCharBigButton").parent().addClass('is-hidden'); + initBuilderSteps(); + + window.history.pushState('profile/characters/builder', '', '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=3');// Update URL + loadBackgroundPage(backgrounds); + timeOutFinishLoad(); + } + }); +}); + +socket.on("returnBuilderPageClass", function(classObject){ + $('#char-builder-container').load("/templates/char_builder/display-builder-page-4.html"); + $.ajax({ type: "GET", + url: "/templates/char_builder/display-builder-page-4.html", + success : function(text) + { + console.log('PAGE: Class'); + + $("#prevButton").click(function(){ + goToBuilderPage(3); + }); + $("#nextButton").parent().removeClass('is-hidden'); + $("#nextButton").click(function(){ + if(hasDualClassVariant()){ + goToBuilderPage(42); + } else { + goToBuilderPage(5); + } + }); + $("#goToCharButton").parent().removeClass('is-hidden'); + $("#goToCharButton").click(function(){ + goToSheet(); + }); + $("#goToCharBigButton").parent().addClass('is-hidden'); + initBuilderSteps(); + + window.history.pushState('profile/characters/builder', '', '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=4');// Update URL + loadClassPage(classObject, 1); + timeOutFinishLoad(); + } + }); +}); + +socket.on("returnBuilderPageClass2", function(classObject){ + $('#char-builder-container').load("/templates/char_builder/display-builder-page-4-2.html"); + $.ajax({ type: "GET", + url: "/templates/char_builder/display-builder-page-4-2.html", + success : function(text) + { + console.log('PAGE: Class 2'); + + $("#prevButton").click(function(){ + goToBuilderPage(4); + }); + $("#nextButton").parent().removeClass('is-hidden'); + $("#nextButton").click(function(){ + goToBuilderPage(5); + }); + $("#goToCharButton").parent().removeClass('is-hidden'); + $("#goToCharButton").click(function(){ + goToSheet(); + }); + $("#goToCharBigButton").parent().addClass('is-hidden'); + initBuilderSteps(); + + window.history.pushState('profile/characters/builder', '', '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=42');// Update URL + loadClassPage(classObject, 2); + timeOutFinishLoad(); + } + }); +}); + +socket.on("returnBuilderPageFinalize", function(character, unselectedDataArray){ + $('#char-builder-container').load("/templates/char_builder/display-builder-page-5.html"); + $.ajax({ type: "GET", + url: "/templates/char_builder/display-builder-page-5.html", + success : function(text) + { + console.log('PAGE: Finalize'); + + $("#prevButton").click(function(){ + goToBuilderPage(4); + }); + $("#nextButton").parent().addClass('is-hidden'); + $("#goToCharButton").parent().addClass('is-hidden'); + $("#goToCharBigButton").parent().removeClass('is-hidden'); + $('#goToCharBigButton').click(function(){ + if(!$(this).hasClass('has-text-danger')){ + goToSheet(); + } + }); + initBuilderSteps(); + + window.history.pushState('profile/characters/builder', '', '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=5');// Update URL + loadFinalizePage(character, unselectedDataArray); + timeOutFinishLoad(); + } + }); +}); + +function initBuilderSteps(){ + + $('.builder-basics-page-btn').click(function(){ + goToBuilderPage(1); + }); + $('.builder-ancestry-page-btn').click(function(){ + goToBuilderPage(2); + }); + $('.builder-background-page-btn').click(function(){ + goToBuilderPage(3); + }); + $('.builder-class-page-btn').click(function(){ + goToBuilderPage(4); + }); + $('.builder-class-2-page-btn').click(function(){ + goToBuilderPage(42); + }); + $('.builder-finalize-page-btn').click(function(){ + goToBuilderPage(5); + }); + +} + +function startLoadingPage() { + // Turn on page loading + if(!isFirstLoad) { startSpinnerLoader(); } +} +function finishLoadingPage() { + // Turn off page loading + if(!isFirstLoad) { stopSpinnerLoader(); } else { stopDiceLoader(); } + selectorUpdated(); + if(hasDualClassVariant()){ + $('#class-2-page-icon').removeClass('is-hidden'); + } +} + +function timeOutFinishLoad(){ + window.setTimeout(() => { + finishLoadingPage(); + }, 15000); // 15 seconds +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/char-builder-init.js b/client/vue-src/legacy-js/char_builders/char-builder-init.js new file mode 100644 index 00000000..0275cd8c --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/char-builder-init.js @@ -0,0 +1,920 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let isBuilderInit = false; + + +// ~~~~~~~~~~~~~~ // General - Run On Load // ~~~~~~~~~~~~~~ // +$(function () { + + // Change page + $("#nextButton").click(function(){ + // Hardcoded redirect to page 2 + window.location.href = '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=2'; + }); + initBuilderSteps(); + + // On load get basic character info + socket.emit("requestCharacterDetails", + getCharIDFromURL()); + +}); + +function initBuilderSteps(){ + + $('.builder-basics-page-btn').click(function(){ + window.location.href = '/profile/characters/builder/basics/?id='+getCharIDFromURL(); + }); + $('.builder-ancestry-page-btn').click(function(){ + window.location.href = '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=2'; + }); + $('.builder-background-page-btn').click(function(){ + window.location.href = '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=3'; + }); + $('.builder-class-page-btn').click(function(){ + window.location.href = '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=4'; + }); + // Sheet btn is set in returnCharacterDetails because it needs character object. + +} + +// ~~~~~~~~~~~~~~ // Processings // ~~~~~~~~~~~~~~ // + +socket.on("returnCharacterDetails", function(character, buildInfo, clientsWithAccess, campaign, hBundles, progessBundles){ + isBuilderInit = true; + + $('.builder-finalize-page-btn').click(function(){ + if(character.name != null && character.ancestryID != null && character.backgroundID != null && character.classID != null){ + window.location.href ='/profile/characters/'+getCharIDFromURL(); + } else { + let charRequirements = ''; + if(character.name == null){ charRequirements += '
    Name'; } + if(character.ancestryID == null){ charRequirements += '
    Ancestry'; } + if(character.backgroundID == null){ charRequirements += '
    Background'; } + if(character.classID == null){ charRequirements += '
    Class'; } + new ConfirmMessage('Incomplete Character', 'Your character requires the following before you can view their sheet:'+charRequirements, 'Okay', 'modal-incomplete-character', 'modal-incomplete-character-btn', 'is-info'); + } + }); + + displayExternalCharacterAccess(clientsWithAccess); + + // When character name changes, save name + $("#charName").change(function(){ + + let validNameRegex = /^[^@#$%^*~=\/\\]+$/; + if(validNameRegex.test($(this).val())) { + $(this).removeClass("is-danger"); + $("#charNameSideIcon").addClass("is-hidden"); + + $("#charNameControlShell").addClass("is-medium is-loading"); + socket.emit("requestNameChange", + getCharIDFromURL(), + $(this).val()); + + } else { + $(this).addClass("is-danger"); + $("#charNameSideIcon").removeClass("is-hidden"); + } + + }); + + // When character level changes, save level + $("#charLevel").change(function(){ + const newLevel = $(this).val(); + if(parseInt(newLevel) < character.level){ + $("#charLevel").val(character.level); + new ConfirmMessage('Decrease Level', 'Are you sure you want to decrease your character\'s level? Any selections you\'ve made at a higher level than the new level will be erased.', 'Change', 'modal-decrease-character-level', 'modal-decrease-character-level-btn'); + $('#modal-decrease-character-level-btn').click(function() { + $("#charLevel").val(newLevel); + character.level = newLevel; + socket.emit("requestLevelChange", + getCharIDFromURL(), + newLevel); + }); + } else { + character.level = newLevel; + socket.emit("requestLevelChange", + getCharIDFromURL(), + newLevel); + } + + }); + + // Display if using build + if(buildInfo != null){ + $('#character-build').text(buildInfo.build.name); + $('#character-build').parent().removeClass('is-hidden'); + + $('#character-build').click(function(){ + window.open('/builds/?view_id='+buildInfo.build.id, '_blank'); + }); + } + + // Set builder type + if(character.builderByLevel === 1){ + $('#builder-by-level').prop('checked', true); + $('#builder-by-abc').prop('checked', false); + $('.is-builder-type-by-level').removeClass('is-hidden'); + $('.is-builder-type-by-abc').addClass('is-hidden'); + } else { + $('#builder-by-level').prop('checked', false); + $('#builder-by-abc').prop('checked', true); + $('.is-builder-type-by-level').addClass('is-hidden'); + $('.is-builder-type-by-abc').removeClass('is-hidden'); + } + $("#builder-by-level").click(function(){ + $('.is-builder-type-by-level').removeClass('is-hidden'); + $('.is-builder-type-by-abc').addClass('is-hidden'); + socket.emit("requestBuilderTypeChange", + getCharIDFromURL(), + 'by-level'); + }); + $("#builder-by-abc").click(function(){ + $('.is-builder-type-by-level').addClass('is-hidden'); + $('.is-builder-type-by-abc').removeClass('is-hidden'); + socket.emit("requestBuilderTypeChange", + getCharIDFromURL(), + 'by-abc'); + }); + + // Handle campaign content + setupCampaignDetails(campaign); + + // When ability score changes, save them all + $("#abilSTR").blur(function(){ + deployAbilityScoreChange(); + }); + $("#abilDEX").blur(function(){ + deployAbilityScoreChange(); + }); + $("#abilCON").blur(function(){ + deployAbilityScoreChange(); + }); + $("#abilINT").blur(function(){ + deployAbilityScoreChange(); + }); + $("#abilWIS").blur(function(){ + deployAbilityScoreChange(); + }); + $("#abilCHA").blur(function(){ + deployAbilityScoreChange(); + }); + + handleCharacterOptions(character, hBundles, progessBundles); + + // Turn off page loading + stopSpinnerLoader(); + +}); + +function setupCampaignDetails(campaign){ + + let campaignName = (campaign) ? campaign.name : 'None'; + $("#campaign-name").text(campaignName); + + $("#campaign-leave-btn").off("click"); + $("#campaign-leave-btn").click(function(){ + new ConfirmMessage('Leave Campaign', `Are you sure you want to leave "${campaignName}"? The GM will no longer have access to this character.`, 'Leave', 'modal-leave-campaign', 'modal-leave-campaign-btn'); + $('#modal-leave-campaign-btn').click(function() { + socket.emit("requestLeaveCampaign", getCharIDFromURL()); + }); + }); + + $("#campaign-access-code-btn").off("click"); + $("#campaign-access-code-btn").click(function(){ + let accessCode = $('#campaign-access-code-input').val(); + if(accessCode && accessCode.trim() != ''){ + + new ConfirmMessage('Join Campaign', `Are you sure you want to join a campaign? The GM will have viewing and editing access to this character.`, 'Join', 'modal-join-campaign', 'modal-join-campaign-btn', 'is-info'); + $('#modal-join-campaign-btn').click(function() { + socket.emit("requestJoinCampaign", getCharIDFromURL(), accessCode.trim()); + $('#campaign-access-code-input').val(''); + }); + + } + }); + + if(campaign){ + $('#campaign-container-join').addClass('is-hidden'); + $('#campaign-container-leave').removeClass('is-hidden'); + } else { + $('#campaign-container-join').removeClass('is-hidden'); + $('#campaign-container-leave').addClass('is-hidden'); + } + +} + +function deployAbilityScoreChange(){ + + let strVal = $('#abilSTR').val(); + let dexVal = $('#abilDEX').val(); + let conVal = $('#abilCON').val(); + let intVal = $('#abilINT').val(); + let wisVal = $('#abilWIS').val(); + let chaVal = $('#abilCHA').val(); + + const MAX_VAL = 30; + const MIN_VAL = 0; + + if(strVal <= MAX_VAL && dexVal <= MAX_VAL && conVal <= MAX_VAL && intVal <= MAX_VAL && wisVal <= MAX_VAL && chaVal <= MAX_VAL && strVal >= MIN_VAL && dexVal >= MIN_VAL && conVal >= MIN_VAL && intVal >= MIN_VAL && wisVal >= MIN_VAL && chaVal >= MIN_VAL) { + + $('.abilScoreSet').removeClass("is-danger"); + + socket.emit("requestAbilityScoreChange", + getCharIDFromURL(), + strVal, + dexVal, + conVal, + intVal, + wisVal, + chaVal); + + } else { + $('.abilScoreSet').addClass("is-danger"); + } +} + +function handleCharacterOptions(character, hBundles, progessBundles) { + displayHomebrewBundles(character, hBundles, progessBundles); + + // Content Sources // + let contentSourceArray = JSON.parse(character.enabledSources); + + $("#contentSrc-CRB").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'CRB', + this.checked); + }); + $("#contentSrc-CRB").prop('checked', contentSourceArray.includes('CRB')); + + $("#contentSrc-ADV-PLAYER-GUIDE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'ADV-PLAYER-GUIDE', + this.checked); + }); + $("#contentSrc-ADV-PLAYER-GUIDE").prop('checked', contentSourceArray.includes('ADV-PLAYER-GUIDE')); + + $("#contentSrc-GM-GUIDE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'GM-GUIDE', + this.checked); + }); + $("#contentSrc-GM-GUIDE").prop('checked', contentSourceArray.includes('GM-GUIDE')); + + $("#contentSrc-BOOK-OF-DEAD").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'BOOK-OF-DEAD', + this.checked); + }); + $("#contentSrc-BOOK-OF-DEAD").prop('checked', contentSourceArray.includes('BOOK-OF-DEAD')); + + $("#contentSrc-SECRETS-OF-MAGIC").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'SECRETS-OF-MAGIC', + this.checked); + }); + $("#contentSrc-SECRETS-OF-MAGIC").prop('checked', contentSourceArray.includes('SECRETS-OF-MAGIC')); + + $("#contentSrc-GUNS-AND-GEARS").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'GUNS-AND-GEARS', + this.checked); + }); + $("#contentSrc-GUNS-AND-GEARS").prop('checked', contentSourceArray.includes('GUNS-AND-GEARS')); + + $("#contentSrc-DARK-ARCHIVE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'DARK-ARCHIVE', + this.checked); + }); + $("#contentSrc-DARK-ARCHIVE").prop('checked', contentSourceArray.includes('DARK-ARCHIVE')); + + $("#contentSrc-RAGE-OF-ELEMENTS").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'RAGE-OF-ELEMENTS', + this.checked); + }); + $("#contentSrc-RAGE-OF-ELEMENTS").prop('checked', contentSourceArray.includes('RAGE-OF-ELEMENTS')); + + $("#contentSrc-LOST-ANCESTRY-GUIDE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-ANCESTRY-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-ANCESTRY-GUIDE").prop('checked', contentSourceArray.includes('LOST-ANCESTRY-GUIDE')); + + $("#contentSrc-LOST-CHAR-GUIDE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-CHAR-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-CHAR-GUIDE").prop('checked', contentSourceArray.includes('LOST-CHAR-GUIDE')); + + $("#contentSrc-LOST-CITY-ABSALOM").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-CITY-ABSALOM', + this.checked); + }); + $("#contentSrc-LOST-CITY-ABSALOM").prop('checked', contentSourceArray.includes('LOST-CITY-ABSALOM')); + + $("#contentSrc-LOST-GOD-MAGIC").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-GOD-MAGIC', + this.checked); + }); + $("#contentSrc-LOST-GOD-MAGIC").prop('checked', contentSourceArray.includes('LOST-GOD-MAGIC')); + + $("#contentSrc-LOST-GRAND-BAZAAR").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-GRAND-BAZAAR', + this.checked); + }); + $("#contentSrc-LOST-GRAND-BAZAAR").prop('checked', contentSourceArray.includes('LOST-GRAND-BAZAAR')); + + $("#contentSrc-LOST-IMPOSSIBLE-LANDS").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-IMPOSSIBLE-LANDS', + this.checked); + }); + $("#contentSrc-LOST-IMPOSSIBLE-LANDS").prop('checked', contentSourceArray.includes('LOST-IMPOSSIBLE-LANDS')); + + $("#contentSrc-LOST-KNIGHTS-WALL").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-KNIGHTS-WALL', + this.checked); + }); + $("#contentSrc-LOST-KNIGHTS-WALL").prop('checked', contentSourceArray.includes('LOST-KNIGHTS-WALL')); + + $("#contentSrc-LOST-LEGENDS").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-LEGENDS', + this.checked); + }); + $("#contentSrc-LOST-LEGENDS").prop('checked', contentSourceArray.includes('LOST-LEGENDS')); + + $("#contentSrc-LOST-MWANGI").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-MWANGI', + this.checked); + }); + $("#contentSrc-LOST-MWANGI").prop('checked', contentSourceArray.includes('LOST-MWANGI')); + + $("#contentSrc-LOST-MONSTERS-MYTH").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-MONSTERS-MYTH', + this.checked); + }); + $("#contentSrc-LOST-MONSTERS-MYTH").prop('checked', contentSourceArray.includes('LOST-MONSTERS-MYTH')); + + $("#contentSrc-LOST-SOCIETY-GUIDE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-SOCIETY-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-SOCIETY-GUIDE").prop('checked', contentSourceArray.includes('LOST-SOCIETY-GUIDE')); + + $("#contentSrc-LOST-TRAVEL-GUIDE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-TRAVEL-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-TRAVEL-GUIDE").prop('checked', contentSourceArray.includes('LOST-TRAVEL-GUIDE')); + + $("#contentSrc-LOST-WORLD-GUIDE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'LOST-WORLD-GUIDE', + this.checked); + }); + $("#contentSrc-LOST-WORLD-GUIDE").prop('checked', contentSourceArray.includes('LOST-WORLD-GUIDE')); + + $("#contentSrc-ABOMINATION-VAULTS").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'ABOMINATION-VAULTS', + this.checked); + }); + $("#contentSrc-ABOMINATION-VAULTS").prop('checked', contentSourceArray.includes('ABOMINATION-VAULTS')); + + $("#contentSrc-AGENTS-OF-EDGEWATCH").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'AGENTS-OF-EDGEWATCH', + this.checked); + }); + $("#contentSrc-AGENTS-OF-EDGEWATCH").prop('checked', contentSourceArray.includes('AGENTS-OF-EDGEWATCH')); + + $("#contentSrc-AGE-OF-ASHES").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'AGE-OF-ASHES', + this.checked); + }); + $("#contentSrc-AGE-OF-ASHES").prop('checked', contentSourceArray.includes('AGE-OF-ASHES')); + + $("#contentSrc-BLOOD-LORDS").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'BLOOD-LORDS', + this.checked); + }); + $("#contentSrc-BLOOD-LORDS").prop('checked', contentSourceArray.includes('BLOOD-LORDS')); + + $("#contentSrc-CROWN-OF-KOBOLD-KING").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'CROWN-OF-KOBOLD-KING', + this.checked); + }); + $("#contentSrc-CROWN-OF-KOBOLD-KING").prop('checked', contentSourceArray.includes('CROWN-OF-KOBOLD-KING')); + + $("#contentSrc-EXTINCTION-CURSE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'EXTINCTION-CURSE', + this.checked); + }); + $("#contentSrc-EXTINCTION-CURSE").prop('checked', contentSourceArray.includes('EXTINCTION-CURSE')); + + $("#contentSrc-FALL-OF-PLAGUE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'FALL-OF-PLAGUE', + this.checked); + }); + $("#contentSrc-FALL-OF-PLAGUE").prop('checked', contentSourceArray.includes('FALL-OF-PLAGUE')); + + $("#contentSrc-FIST-PHOENIX").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'FIST-PHOENIX', + this.checked); + }); + $("#contentSrc-FIST-PHOENIX").prop('checked', contentSourceArray.includes('FIST-PHOENIX')); + + $("#contentSrc-KINGMAKER").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'KINGMAKER', + this.checked); + }); + $("#contentSrc-KINGMAKER").prop('checked', contentSourceArray.includes('KINGMAKER')); + + $("#contentSrc-MALEVOLENCE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'MALEVOLENCE', + this.checked); + }); + $("#contentSrc-MALEVOLENCE").prop('checked', contentSourceArray.includes('MALEVOLENCE')); + + $("#contentSrc-NIGHT-GRAY-DEATH").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'NIGHT-GRAY-DEATH', + this.checked); + }); + $("#contentSrc-NIGHT-GRAY-DEATH").prop('checked', contentSourceArray.includes('NIGHT-GRAY-DEATH')); + + $("#contentSrc-OUTLAWS-ALKENSTAR").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'OUTLAWS-ALKENSTAR', + this.checked); + }); + $("#contentSrc-OUTLAWS-ALKENSTAR").prop('checked', contentSourceArray.includes('OUTLAWS-ALKENSTAR')); + + $("#contentSrc-QUEST-FROZEN-FLAME").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'QUEST-FROZEN-FLAME', + this.checked); + }); + $("#contentSrc-QUEST-FROZEN-FLAME").prop('checked', contentSourceArray.includes('QUEST-FROZEN-FLAME')); + + $("#contentSrc-SLITHERING").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'SLITHERING', + this.checked); + }); + $("#contentSrc-SLITHERING").prop('checked', contentSourceArray.includes('SLITHERING')); + + $("#contentSrc-STRENGTH-THOUSANDS").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'STRENGTH-THOUSANDS', + this.checked); + }); + $("#contentSrc-STRENGTH-THOUSANDS").prop('checked', contentSourceArray.includes('STRENGTH-THOUSANDS')); + + $("#contentSrc-TROUBLES-IN-OTARI").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'TROUBLES-IN-OTARI', + this.checked); + }); + $("#contentSrc-TROUBLES-IN-OTARI").prop('checked', contentSourceArray.includes('TROUBLES-IN-OTARI')); + + $("#contentSrc-THRESHOLD-KNOWLEDGE").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'THRESHOLD-KNOWLEDGE', + this.checked); + }); + $("#contentSrc-THRESHOLD-KNOWLEDGE").prop('checked', contentSourceArray.includes('THRESHOLD-KNOWLEDGE')); + + $("#contentSrc-PATH-SOCIETY").change(function(){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'PATH-SOCIETY', + this.checked); + }); + $("#contentSrc-PATH-SOCIETY").prop('checked', contentSourceArray.includes('PATH-SOCIETY')); + + // Enable All Books Button // + $('#enableAllBooksBtn').click(function() { + let newContentSourceArray = []; + $('.bookSwitch').each(function() { + newContentSourceArray.push($(this).attr('name').replace('contentSrc-','')); + $(this).prop('checked', true); + }); + socket.emit("requestCharacterSetSources", + getCharIDFromURL(), + newContentSourceArray); + $('#enableAllBooksBtn').blur(); + }); + + // Variants // + $("#variantAncestryParagon").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'variantAncestryParagon', + optionTypeValue); + }); + $("#variantAncestryParagon").prop('checked', (character.variantAncestryParagon === 1)); + + $("#variantAutoBonusProgression").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'variantAutoBonusProgression', + optionTypeValue); + }); + $("#variantAutoBonusProgression").prop('checked', (character.variantAutoBonusProgression === 1)); + + $("#variantFreeArchetype").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'variantFreeArchetype', + optionTypeValue); + }); + $("#variantFreeArchetype").prop('checked', (character.variantFreeArchetype === 1)); + + $("#variantGradualAbilityBoosts").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'variantGradualAbilityBoosts', + optionTypeValue); + }); + $("#variantGradualAbilityBoosts").prop('checked', (character.variantGradualAbilityBoosts === 1)); + + $("#variantProficiencyWithoutLevel").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'variantProfWithoutLevel', + optionTypeValue); + }); + $("#variantProficiencyWithoutLevel").prop('checked', (character.variantProfWithoutLevel === 1)); + + $("#variantStamina").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'variantStamina', + optionTypeValue); + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'STAMINA-VARIANT', + this.checked); + }); + $("#variantStamina").prop('checked', (character.variantStamina === 1)); + + // Options // + $("#optionPublicCharacter").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + if(optionTypeValue === 1) { + $("#optionPublicCharacterInfo").removeClass('is-hidden'); + } else { + $("#optionPublicCharacterInfo").addClass('is-hidden'); + } + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'optionPublicCharacter', + optionTypeValue); + }); + $("#optionPublicCharacter").prop('checked', (character.optionPublicCharacter === 1)); + if(character.optionPublicCharacter === 1) { $("#optionPublicCharacterInfo").removeClass('is-hidden'); } + + $("#optionAutoHeightenSpells").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'optionAutoHeightenSpells', + optionTypeValue); + }); + $("#optionAutoHeightenSpells").prop('checked', (character.optionAutoHeightenSpells === 1)); + + $("#optionAutoDetectPreReqs").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'optionAutoDetectPreReqs', + optionTypeValue); + }); + $("#optionAutoDetectPreReqs").prop('checked', (character.optionAutoDetectPreReqs === 1)); + + $("#optionDiceRoller").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'optionDiceRoller', + optionTypeValue); + }); + $("#optionDiceRoller").prop('checked', (character.optionDiceRoller === 1)); + + $("#optionClassArchetypes").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'optionClassArchetypes', + optionTypeValue); + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'CLASS-ARCHETYPES-OPTION', + this.checked); + }); + $("#optionClassArchetypes").prop('checked', (character.optionClassArchetypes === 1)); + if(character.optionClassArchetypes === 1){ + socket.emit("requestCharacterSourceChange", + getCharIDFromURL(), + 'CLASS-ARCHETYPES-OPTION', + true); + } + + $("#optionCustomCodeBlock").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + if(optionTypeValue === 1) { + $("#optionCustomCodeBlockInfo").removeClass('is-hidden'); + $("#option-custom-code-block-container").removeClass('is-hidden'); + } else { + $("#optionCustomCodeBlockInfo").addClass('is-hidden'); + $("#option-custom-code-block-container").addClass('is-hidden'); + socket.emit("requestCustomCodeBlockDataClear", + getCharIDFromURL()); + } + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'optionCustomCodeBlock', + optionTypeValue); + }); + $("#optionCustomCodeBlock").prop('checked', (character.optionCustomCodeBlock === 1)); + if(character.optionCustomCodeBlock === 1) { + $("#optionCustomCodeBlockInfo").removeClass('is-hidden'); + $("#option-custom-code-block-container").removeClass('is-hidden'); + } + $("#inputCustomCodeBlock").blur(function(){ + let newCode = $(this).val(); + if(character.customCode != newCode){ + character.customCode = newCode; + $('#inputCustomCodeBlock').parent().addClass("is-loading"); + socket.emit("requestCharacterCustomCodeBlockChange", getCharIDFromURL(), newCode); + } + }); + + $("#optionIgnoreBulk").change(function(){ + let optionTypeValue = (this.checked) ? 1 : 0; + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'optionIgnoreBulk', + optionTypeValue); + }); + $("#optionIgnoreBulk").prop('checked', (character.optionIgnoreBulk === 1)); + +} + + +// ~~~~~~~~~~~~~~ // Processings // ~~~~~~~~~~~~~~ // + +socket.on("returnNameChange", function() { + $("#charNameControlShell").removeClass("is-medium is-loading"); +}); + +socket.on("returnLevelChange", function() { + $("#charLevel").blur(); +}); + +socket.on("returnAbilityScoreChange", function() { +}); + +socket.on("returnJoinCampaign", function(campaign) { + setupCampaignDetails(campaign); + if(!campaign){ + new ConfirmMessage('Failed to Join Campaign', `We weren't able to add you to that campaign. Make sure your access code is correct!`, 'Okay', 'modal-failed-to-join-campaign', 'modal-failed-to-join-campaign-btn'); + } +}); + +socket.on("returnLeaveCampaign", function() { + setupCampaignDetails(null); +}); + +// + +socket.on("returnCharacterSourceChange", function() { + $(".optionSwitch").blur(); +}); + +socket.on("returnCharacterOptionChange", function() { + $(".optionSwitch").blur(); +}); + +// + +socket.on("returnCharacterCustomCodeBlockChange", function() { + $('#inputCustomCodeBlock').parent().removeClass("is-loading"); +}); + +//// Homebrew Bundles //// +function displayHomebrewBundles(character, hBundles, progessBundles){ + let homebrewBundleArray = JSON.parse(character.enabledHomebrew); + + hBundles = hBundles.sort( + function(a, b) { + return a.homebrewBundle.name > b.homebrewBundle.name ? 1 : -1; + } + ); + progessBundles = progessBundles.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + for(let progessBundle of progessBundles) { + let homebrewBundle = progessBundle; + let bundleSwitchID = 'homebrew-bundle-progess-switch-'+homebrewBundle.id; + $('#homebrewCollectionContainer').append('
    '); + + $('#'+bundleSwitchID).change(function(){ + socket.emit('requestCharacterHomebrewChange', + getCharIDFromURL(), + homebrewBundle.id, + this.checked); + }); + $('#'+bundleSwitchID).prop('checked', homebrewBundleArray.includes(homebrewBundle.id)); + + } + + for(let hBundle of hBundles) { + let homebrewBundle = hBundle.homebrewBundle; + let bundleSwitchID = 'homebrew-bundle-switch-'+homebrewBundle.id; + + let bundleName = homebrewBundle.name; + if(homebrewBundle.isPublished === 0){ + bundleName += ''; + } + + $('#homebrewCollectionContainer').append('
    '); + + $('#'+bundleSwitchID).change(function(){ + socket.emit('requestCharacterHomebrewChange', + getCharIDFromURL(), + homebrewBundle.id, + this.checked); + }); + $('#'+bundleSwitchID).prop('checked', homebrewBundleArray.includes(homebrewBundle.id)); + + } + + if(hBundles.length > 0){ + let hCollectionContainer = document.getElementById('homebrewColumn'); + if(hCollectionContainer.scrollHeight > hCollectionContainer.clientHeight){ + // container has scrollbar + } else { + $('#homebrewCollectionContainer').addClass('pb-3'); + $('#viewHomebrewCollectionBtn').removeClass('is-hidden'); + } + } else { + $('#noHomebrewMessage').removeClass('is-hidden'); + $('#viewBrowseHomebrewBtn').removeClass('is-hidden'); + } + + $('#viewHomebrewCollectionBtn').click(function() { + window.location.href = '/homebrew/?sub_tab=collection'; + }); + $('#viewBrowseHomebrewBtn').click(function() { + window.location.href = '/homebrew/?sub_tab=browse'; + }); + +} + +socket.on("returnCharacterHomebrewChange", function() { + $(".optionSwitch").blur(); +}); + +//// External Character Access - API Clients //// + +function displayExternalCharacterAccess(clientsWithAccess){ + if(clientsWithAccess != null && clientsWithAccess.length > 0){ + $('.character-access-container').removeClass('is-hidden'); + } else { + $('.character-access-container').addClass('is-hidden'); + return; + } + + $('#character-access-content').html(''); + $('#character-access-content').append('
    '); + + let connectionCount = 0; + for(let client of clientsWithAccess){ + + let connectionID = 'accessConnection-'+connectionCount; + let connectionDeleteIconID = connectionID+'-delete'; + + if(connectionCount != 0){ $('#character-access-content').append('
    '); } + + $('#character-access-content').append('
    '); + + $('#'+connectionID).append('

    '+client.appName+'

    '); + if(client.description != null && client.description != ''){ + $('#'+connectionID).append('

    '+client.description+'

    '); + } + $('#'+connectionID).append('

    '+accessRightsToText(client.accessRights)+'

    '); + + $('#'+connectionDeleteIconID).click(function() { + socket.emit("requestCharacterRemoveClientAccess", + getCharIDFromURL(), + client.clientID); + }); + + connectionCount++; + } + + $('#character-access-dropdown').click(function() { + if($('#character-access-content').hasClass("is-hidden")) { + $('#character-access-content').removeClass('is-hidden'); + $('#character-access-chevron').removeClass('fa-chevron-down'); + $('#character-access-chevron').addClass('fa-chevron-up'); + } else { + $('#character-access-content').addClass('is-hidden'); + $('#character-access-chevron').removeClass('fa-chevron-up'); + $('#character-access-chevron').addClass('fa-chevron-down'); + } + }); + + $('#character-access-dropdown').mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#character-access-dropdown').mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + +} + +function accessRightsToText(accessRights){ + switch(accessRights) { + case 'READ-ONLY': return 'Can read character information.'; + case 'READ-UPDATE': return 'Can read and update character information.'; + case 'READ-UPDATE-ADD-DELETE': return 'Can read, update, add, and delete character information.'; + default: return 'ACCESS RIGHTS NOT FOUND'; + } +} + +socket.on("returnCharacterRemoveClientAccess", function(clientsWithAccess) { + displayExternalCharacterAccess(clientsWithAccess); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/pages/page-2-ancestry.js b/client/vue-src/legacy-js/char_builders/pages/page-2-ancestry.js new file mode 100644 index 00000000..960a120e --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/pages/page-2-ancestry.js @@ -0,0 +1,675 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_uniHeritageArray = null; + +let g_ancestry = null; +let g_ancestryForHeritage = null; + +// ~~~~~~~~~~~~~~ // Processings // ~~~~~~~~~~~~~~ // + +function loadAncestryPage(ancestryObject, uniHeritageArray) { + + g_uniHeritageArray = uniHeritageArray; + + let ancestryMap = objToMap(ancestryObject); + ancestryMap = new Map([...ancestryMap.entries()].sort( + function(a, b) { + return a[1].Ancestry.name > b[1].Ancestry.name ? 1 : -1; + }) + ); + + // Populate Ancestry Selector + let selectAncestry = $('#selectAncestry'); + selectAncestry.append(''); + selectAncestry.append(''); + for(const [key, value] of ancestryMap.entries()){ + if(value.Ancestry.id == g_char_ancestryID){ + if(value.Ancestry.isArchived == 0){ + selectAncestry.append(''); + } else { + selectAncestry.append(''); + } + } else if(value.Ancestry.isArchived == 0){ + selectAncestry.append(''); + } + } + + + // Ancestry Selection // + selectAncestry.change(function(event, triggerSave) { + $('#ancestryArtworkImg').attr('src', ''); + let ancestryID = $("#selectAncestry option:selected").val(); + if(ancestryID != "chooseDefault"){ + $('.ancestry-content').removeClass("is-hidden"); + $('#selectAncestryControlShell').removeClass("is-info"); + + // Save ancestry + if(triggerSave == null || triggerSave) { + $('#selectAncestryControlShell').addClass("is-loading"); + + g_char_ancestryID = ancestryID; + g_ancestry = ancestryMap.get(ancestryID); + stopCodeProcessing(); + socket.emit("requestAncestryChange", + getCharIDFromURL(), + ancestryID); + + } else { + displayCurrentAncestry(ancestryMap.get(ancestryID), false); + } + + } else { + $('.ancestry-content').addClass("is-hidden"); + $('#selectAncestryControlShell').addClass("is-info"); + + $('#ancestryRarityContainer').html(''); + + // Delete ancestry, set to null + g_char_ancestryID = null; + g_ancestry = null; + stopCodeProcessing(); + socket.emit("requestAncestryChange", + getCharIDFromURL(), + null); + } + + }); + + // Heritage Selection // + $('#selectHeritage').change(function(event, triggerSave) { + $('#heritageArtworkImg').attr('src', ''); + + let heritageID = $(this).val(); + let ancestryID = $("#selectAncestry option:selected").val(); + + if(ancestryID != "chooseDefault" && heritageID != "chooseDefault"){ + $('#heritageInfo').removeClass("is-hidden"); + $('#selectHeritageControlShell').removeClass("is-info"); + + // Save heritage + let isUniversal = isUniversalHeritage(); + if(triggerSave == null || triggerSave) { + $('#selectHeritageControlShell').addClass("is-loading"); + + g_ancestryForHeritage = ancestryMap.get(ancestryID); + socket.emit("requestHeritageChange", + getCharIDFromURL(), + heritageID, + isUniversal); + + } else { + displayCurrentHeritage(ancestryMap.get(ancestryID), heritageID, isUniversal); + } + + } else { + $('#heritageInfo').addClass("is-hidden"); + $('#selectHeritageControlShell').addClass("is-info"); + + g_ancestryForHeritage = null; + let isUniversal = isUniversalHeritage(); + socket.emit("requestHeritageChange", + getCharIDFromURL(), + null, + isUniversal); + + } + + }); + + + $('.heritageTab').click(function(event, autoPageLoad){ + if($(this).parent().hasClass('is-active')) { return; } + $(this).parent().parent().find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + + let ancestryID = $("#selectAncestry option:selected").val(); + if(ancestryID != "chooseDefault"){ + let heritage; + if(autoPageLoad != null && autoPageLoad){ + heritage = wscChoiceStruct.Heritage; + } else { + heritage = null; + } + displayHeritageSelectOptions(ancestryMap.get(ancestryID), heritage); + } + }); + + if(wscChoiceStruct.Heritage != null){ + if(wscChoiceStruct.Heritage.tagID != null){ + $('#universalHeritageTab').trigger("click", [true]); + } else { + $('#ancestryHeritageTab').trigger("click", [true]); + } + } else { + $('#ancestryHeritageTab').trigger("click", [true]); + } + + // Display current ancestry + selectAncestry.trigger("change", [false]); + +} + +/* +socket.on("returnAncestryChange", function(inChoiceStruct){ + $('#selectAncestryControlShell').removeClass("is-loading"); + + if(g_ancestry != null){ + injectWSCChoiceStruct(inChoiceStruct); + displayHeritageSelectOptions(g_ancestry, wscChoiceStruct.Heritage); + displayCurrentAncestry(g_ancestry, true); + } else { + finishLoadingPage(); + } + +});*/ + +socket.on("returnHeritageChange", function(heritageID, isUniversal, charTagsArray){ + $('#selectHeritageControlShell').removeClass("is-loading"); + + wscChoiceStruct.CharTagsArray = charTagsArray; + if($('#quickviewLeftDefault').hasClass('is-active')){ + openLeftQuickView('skillsView', null); + } + displayCurrentHeritage(g_ancestryForHeritage, heritageID, isUniversal); + +}); + + +function displayCurrentAncestry(ancestryStruct, saving) { + g_ancestry = null; + $('#selectAncestry').blur(); + resettingVariables(g_enabledSources); + + if(ancestryStruct.Ancestry.isArchived == 1){ + $('#isArchivedMessage').removeClass('is-hidden'); + } else { + $('#isArchivedMessage').addClass('is-hidden'); + } + + $('#physicalFeatureOneCodeOutput').html(''); + $('#physicalFeatureTwoCodeOutput').html(''); + + let ancestryDescription = $('#ancestryDescription'); + ancestryDescription.html(processText(ancestryStruct.Ancestry.description, false, false, 'MEDIUM', false)); + + if(ancestryStruct.Ancestry.artworkURL != null){ + $('#ancestryArtworkImg').removeClass('is-hidden'); + $('#ancestryArtworkImg').attr('src', ancestryStruct.Ancestry.artworkURL); + } else { + $('#ancestryArtworkImg').addClass('is-hidden'); + $('#ancestryArtworkImg').attr('src', ''); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Rarity ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + $('#ancestryRarityContainer').html(convertRarityToHTML(ancestryStruct.Ancestry.rarity)); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hit Points ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let ancestryHitPoints = $('#ancestryHitPoints'); + ancestryHitPoints.html(''); + ancestryHitPoints.append(ancestryStruct.Ancestry.hitPoints); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Size ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let ancestrySize = $('#ancestrySize'); + ancestrySize.html(''); + ancestrySize.append(capitalizeWord(ancestryStruct.Ancestry.size)); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Speed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let ancestrySpeed = $('#ancestrySpeed'); + ancestrySpeed.html(''); + ancestrySpeed.append(ancestryStruct.Ancestry.speed+" ft"); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Languages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let ancestryLanguages = $('#ancestryLanguages'); + ancestryLanguages.html(''); + let langIDArray = []; + for(const language of ancestryStruct.Languages) { + ancestryLanguages.append(language.name+", "); + langIDArray.push(language.id); + } + let bonusLangs = ''; + ancestryStruct.BonusLanguages = ancestryStruct.BonusLanguages.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + for(const bonusLang of ancestryStruct.BonusLanguages) { + bonusLangs += bonusLang.name+", "; + } + bonusLangs = bonusLangs.substring(0, bonusLangs.length - 2); + ancestryLanguages.append('and more*'); + + if(saving){ + let langCount = 0; + for(let langID of langIDArray){ + let srcStruct = { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-'+langCount, + sourceCodeSNum: 'a', + }; + socket.emit("requestLanguageChange", + getCharIDFromURL(), + srcStruct, + langID, + false); + langCount++; + } + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Senses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let ancestrySenses = $('#ancestrySenses'); + ancestrySenses.html(''); + let senseIDArray = []; + if(ancestryStruct.VisionSense != null){ + ancestrySenses.append(''+ancestryStruct.VisionSense.name+''); + senseIDArray.push(ancestryStruct.VisionSense.id); + if(ancestryStruct.AdditionalSense != null){ + ancestrySenses.append(' and '); + } + } + if(ancestryStruct.AdditionalSense != null){ + ancestrySenses.append(''+ancestryStruct.AdditionalSense.name+''); + senseIDArray.push(ancestryStruct.AdditionalSense.id); + } + + if(saving){ + let senseCount = 0; + for(let senseID of senseIDArray){ + let srcStruct = { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-'+senseCount, + sourceCodeSNum: 'a', + }; + socket.emit("requestSensesChange", + getCharIDFromURL(), + srcStruct, + senseID, + false); + senseCount++; + } + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Physical Features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + $('#physicalFeatureOneCodeOutput').addClass('is-hidden'); + $('#physicalFeatureTwoCodeOutput').addClass('is-hidden'); + + if(ancestryStruct.PhysicalFeatureOne != null || ancestryStruct.PhysicalFeatureTwo != null) { + $('#sectionPhysicalFeatures').removeClass('is-hidden'); + + let ancestryPhysicalFeatures = $('#ancestryPhysicalFeatures'); + ancestryPhysicalFeatures.html(''); + let physicalFeatureIDArray = []; + if(ancestryStruct.PhysicalFeatureOne != null){ + ancestryPhysicalFeatures.append(''+ancestryStruct.PhysicalFeatureOne.name+''); + physicalFeatureIDArray.push(ancestryStruct.PhysicalFeatureOne.id); + if(ancestryStruct.PhysicalFeatureTwo != null){ + ancestryPhysicalFeatures.append(' and '); + } + + let srcStruct = { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-phyFeat-1', + sourceCodeSNum: 'a', + }; + processBuilderCode( + ancestryStruct.PhysicalFeatureOne.code, + srcStruct, + 'physicalFeatureOneCodeOutput', + 'Ancestry Feature'); + if(ancestryStruct.PhysicalFeatureOne.code != null){ + $('#physicalFeatureOneCodeOutput').removeClass('is-hidden'); + } + } + + if(ancestryStruct.PhysicalFeatureTwo != null){ + ancestryPhysicalFeatures.append(''+ancestryStruct.PhysicalFeatureTwo.name+''); + physicalFeatureIDArray.push(ancestryStruct.PhysicalFeatureTwo.id); + + let srcStruct = { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-phyFeat-2', + sourceCodeSNum: 'a', + }; + processBuilderCode( + ancestryStruct.PhysicalFeatureTwo.code, + srcStruct, + 'physicalFeatureTwoCodeOutput', + 'Ancestry Feature'); + if(ancestryStruct.PhysicalFeatureTwo.code != null){ + $('#physicalFeatureTwoCodeOutput').removeClass('is-hidden'); + } + } + + if(saving){ + let phyFeatCount = 0; + for(let physicalFeatureID of physicalFeatureIDArray){ + let srcStruct = { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'inits-'+phyFeatCount, + sourceCodeSNum: 'a', + }; + socket.emit("requestPhysicalFeaturesChange", + getCharIDFromURL(), + srcStruct, + physicalFeatureID, + false); + phyFeatCount++; + } + } + + } else { + $('#sectionPhysicalFeatures').addClass('is-hidden'); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + // Boosts // + + let boostChooseCount = 0; + let boostNonChooseList = []; + for(const boost of ancestryStruct.Boosts) { + if(boost == "Anything") { + boostChooseCount++; + } else { + boostNonChooseList.push(boost); + } + } + let boostsNonChoose = $('#boostsNonChoose'); + let boostsNonChooseInnerHTML = ''; + let boostNonChooseCount = 0; + for(const boostNonChoose of boostNonChooseList) { + boostsNonChooseInnerHTML += ' '+boostNonChoose+''; + $(".abilityBoost option[value='"+boostNonChoose+"']").remove(); + + if(saving){ + socket.emit("requestAbilityBonusChange", + getCharIDFromURL(), + {sourceType: 'ancestry', sourceLevel: 1, sourceCode: 'boost-nonChoose-'+boostNonChooseCount, sourceCodeSNum: 'a'}, + {Ability : shortenAbilityType(boostNonChoose), Bonus : "Boost"}); + } + boostNonChooseCount++; + + } + boostsNonChoose.html(boostsNonChooseInnerHTML); + + + let boostChooseString = ''; + for(let ability of getAllAbilityTypes()){ + if(!boostNonChooseList.includes(ability)){ + boostChooseString += shortenAbilityType(ability)+','; + } + } + + $('#boostsChoose').html(''); + let srcStruct = { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'boost-choose', + sourceCodeSNum: 'a', + }; + let boostChooseCodeStr = ''; + for(let i = 0; i < boostChooseCount; i++) { + boostChooseCodeStr += 'GIVE-ABILITY-BOOST-SINGLE='+boostChooseString+'\n'; + } + if(boostChooseCodeStr != ''){ + processBuilderCode( + boostChooseCodeStr, + srcStruct, + 'boostsChoose', + 'Ancestry Boosts'); + } + + + // Flaws // + let flawNonChooseList = []; + for(const flaw of ancestryStruct.Flaws) { + if(flaw == "Anything") { + + } else { + flawNonChooseList.push(flaw); + } + } + let flawsNonChoose = $('#flawsNonChoose'); + let flawsNonChooseInnerHTML = ''; + let flawNonChooseCount = 0; + for(const flawNonChoose of flawNonChooseList) { + flawsNonChooseInnerHTML += ' '+flawNonChoose+''; + $(".abilityBoost option[value='"+flawNonChoose+"']").remove(); + + if(saving){ + socket.emit("requestAbilityBonusChange", + getCharIDFromURL(), + {sourceType: 'ancestry', sourceLevel: 1, sourceCode: 'flaw-nonChoose-'+flawNonChooseCount, sourceCodeSNum: 'a',}, + {Ability : shortenAbilityType(flawNonChoose), Bonus : "Flaw"}); + } + flawNonChooseCount++; + } + flawsNonChoose.html(flawsNonChooseInnerHTML); + + if(flawNonChooseList.length == 0){ + $('#flawsSection').addClass('is-hidden'); + } else { + $('#flawsSection').removeClass('is-hidden'); + } + +} + +function displayHeritageSelectOptions(ancestryStruct, charHeritage){ + + let selectHeritage = $('#selectHeritage'); + selectHeritage.html(''); + + selectHeritage.append(''); + selectHeritage.append(''); + + if(isUniversalHeritage()){ + for(const uniHeritage of g_uniHeritageArray){ + if(charHeritage != null && charHeritage.tagID != null && charHeritage.id == uniHeritage.id) { + selectHeritage.append(''); + } else { + selectHeritage.append(''); + } + } + } else { + if(ancestryStruct != null){ + for(const heritage of ancestryStruct.Heritages){ + if(charHeritage != null && charHeritage.tagID == null && charHeritage.id == heritage.id) { + selectHeritage.append(''); + } else { + selectHeritage.append(''); + } + } + } + } + + + $('#selectHeritage').trigger("change", [false]); + +} + +function isUniversalHeritage(){ + return $('#universalHeritageTab').parent().hasClass('is-active'); +} + +function displayCurrentHeritage(ancestryStruct, heritageID, isUniversal) { + $('#selectHeritage').blur(); + + if(heritageID != "chooseDefault" && ancestryStruct != null){ + + let heritage; + if(isUniversal) { + heritage = g_uniHeritageArray.find(uniHeritage => { + return uniHeritage.id == heritageID; + }); + } else { + heritage = ancestryStruct.Heritages.find(heritage => { + return heritage.id == heritageID; + }); + } + wscChoiceStruct.Heritage = heritage; + + // Rarity // + $('#heritageRarityContainer').html(convertRarityToHTML(heritage.rarity, true)); + + let heritageDescription = $('#heritageDescription'); + heritageDescription.html(processText(heritage.description, false, false, 'MEDIUM', false)); + heritageDescription.removeClass('is-hidden'); + + if(heritage.artworkURL != null){ + $('#heritageArtworkImg').removeClass('is-hidden'); + $('#heritageArtworkImg').attr('src', heritage.artworkURL); + } else { + $('#heritageArtworkImg').addClass('is-hidden'); + $('#heritageArtworkImg').attr('src', ''); + } + + $('#heritageCodeOutput').html(''); + + let srcStruct = { + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'heritage', + sourceCodeSNum: 'a', + }; + + // Clear wscChoiceStruct.FeatArray of feats with srcStruct + //featsRemoveFromWSCChoiceStruct(srcStruct, true); + + processBuilderCode( + heritage.code, + srcStruct, + 'heritageCodeOutput', + 'Heritage'); + + } else { + + wscChoiceStruct.Heritage = null; + + $('#heritageRarityContainer').html(''); + + let heritageDescription = $('#heritageDescription'); + heritageDescription.html(''); + heritageDescription.addClass('is-hidden'); + $('#heritageArtworkImg').addClass('is-hidden'); + $('#heritageArtworkImg').attr('src', ''); + $('#heritageCodeOutput').html(''); + + } + + window.setTimeout(() => { + createAncestryFeats(wscChoiceStruct.Character.level); + }, 250); + +} + + +function createAncestryFeats(charLevel){ + + $('#ancestryFeats').html(''); + + let ancestryFeatsLocs = []; + + // Use Ancestry Paragon Variant if enabled instead... + if(wscChoiceStruct.Character.variantAncestryParagon == 1){ + + let locData1, locData3, locData7, locData11, locData15, locData19; + + if(charLevel >= 1){ + let locData = buildFeatStruct(1); + ancestryFeatsLocs.push(locData); + + locData1 = buildFeatStruct(1, '1-2'); + } + ancestryFeatsLocs.push(locData1); + + if(charLevel >= 3){ + locData3 = buildFeatStruct(3); + } + ancestryFeatsLocs.push(locData3); + + if(charLevel >= 5){ + let locData = buildFeatStruct(5); + ancestryFeatsLocs.push(locData); + } + + if(charLevel >= 7){ + locData7 = buildFeatStruct(7); + } + ancestryFeatsLocs.push(locData7); + + if(charLevel >= 9){ + let locData = buildFeatStruct(9); + ancestryFeatsLocs.push(locData); + } + + if(charLevel >= 11){ + locData11 = buildFeatStruct(11); + } + ancestryFeatsLocs.push(locData11); + + if(charLevel >= 13){ + let locData = buildFeatStruct(13); + ancestryFeatsLocs.push(locData); + } + + if(charLevel >= 15){ + locData15 = buildFeatStruct(15); + } + ancestryFeatsLocs.push(locData15); + + if(charLevel >= 17){ + let locData = buildFeatStruct(17); + ancestryFeatsLocs.push(locData); + } + + if(charLevel >= 19){ + locData19 = buildFeatStruct(19); + } + ancestryFeatsLocs.push(locData19); + + } else { // Or else use normal... + + if(charLevel >= 1){ + let locData = buildFeatStruct(1); + ancestryFeatsLocs.push(locData); + } + if(charLevel >= 5){ + let locData = buildFeatStruct(5); + ancestryFeatsLocs.push(locData); + } + if(charLevel >= 9){ + let locData = buildFeatStruct(9); + ancestryFeatsLocs.push(locData); + } + if(charLevel >= 13){ + let locData = buildFeatStruct(13); + ancestryFeatsLocs.push(locData); + } + if(charLevel >= 17){ + let locData = buildFeatStruct(17); + ancestryFeatsLocs.push(locData); + } + + } + + processBuilderCode_AncestryAbilities(ancestryFeatsLocs); + +} + +function buildFeatStruct(featLevel, locID=null) { + + if(locID == null) { locID = featLevel; } + let locationID = "descriptionFeat"+locID; + + $('#ancestryFeats').append('
    Level '+featLevel+'

    You gain an ancestry feat.

    '); + + return { LocationID : locationID, Level : featLevel }; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/pages/page-3-background.js b/client/vue-src/legacy-js/char_builders/pages/page-3-background.js new file mode 100644 index 00000000..624ec1ec --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/pages/page-3-background.js @@ -0,0 +1,147 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_background = null; + +// ~~~~~~~~~~~~~~ // Processings // ~~~~~~~~~~~~~~ // + +function loadBackgroundPage(backgrounds) { + + backgrounds = backgrounds.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + // Populate Background Selector + let selectBackground = $('#selectBackground'); + selectBackground.append(''); + selectBackground.append(''); + for(const background of backgrounds){ + if(background.id == g_char_backgroundID){ + if(background.isArchived == 0){ + selectBackground.append(''); + } else { + selectBackground.append(''); + } + } else if(background.isArchived == 0){ + selectBackground.append(''); + } + } + + // Background Selection // + selectBackground.change(function(event, triggerSave) { + let backgroundID = $("#selectBackground option:selected").val(); + + let background = backgrounds.find(background => { + return background.id == backgroundID; + }); + + if(backgroundID != "chooseDefault" && background != null){ + $('.background-content').removeClass("is-hidden"); + $('#selectBackgroundControlShell').removeClass("is-info"); + + // Save background + if(triggerSave == null || triggerSave) { + $('#selectBackgroundControlShell').addClass("is-loading"); + + g_char_backgroundID = backgroundID; + g_background = background; + stopCodeProcessing(); + socket.emit("requestBackgroundChange", + getCharIDFromURL(), + backgroundID); + } else { + displayCurrentBackground(background); + } + + } else { + $('.background-content').addClass("is-hidden"); + $('#selectBackgroundControlShell').addClass("is-info"); + + $('#backgroundRarityContainer').html(''); + + // Delete background, set to null + g_char_backgroundID = null; + g_background = null; + stopCodeProcessing(); + socket.emit("requestBackgroundChange", + getCharIDFromURL(), + null); + } + + }); + + + // Display current background + $('#selectBackground').trigger("change", [false]); + + // Activate boostSingleSelection() triggers + $('.abilityBoost').trigger("change", [false]); + +} + +socket.on("returnBackgroundChange", function(choiceStruct){ + $('#selectBackgroundControlShell').removeClass("is-loading"); + + if(g_background != null){ + injectWSCChoiceStruct(choiceStruct); + displayCurrentBackground(g_background); + } else { + finishLoadingPage(); + } + +}); + + +function displayCurrentBackground(background) { + g_background = null; + $('#selectBackground').blur(); + resettingVariables(g_enabledSources); + + if(background.isArchived == 1){ + $('#isArchivedMessage').removeClass('is-hidden'); + } else { + $('#isArchivedMessage').addClass('is-hidden'); + } + + let backgroundDescription = $('#backgroundDescription'); + backgroundDescription.html(processText(background.description, false, null, 'MEDIUM', false)); + + // Rarity // + $('#backgroundRarityContainer').html(convertRarityToHTML(background.rarity)); + + + // Code - Run General Code before Boosts Code, it's more likely to be delaying // + $('#backgroundCodeOutput').html(''); + let srcStruct = { + sourceType: 'background', + sourceLevel: 1, + sourceCode: 'background', + sourceCodeSNum: 'a', + }; + processBuilderCode( + background.code, + srcStruct, + 'backgroundCodeOutput', + 'Background'); + + // Boosts // + $('#backBoostSection').html(''); + // No need for a process clear because it will be going to AbilityBoost data every time. + let boostSrcStruct = { + sourceType: 'background', + sourceLevel: 1, + sourceCode: 'boost-choose', + sourceCodeSNum: 'a', + }; + if(background.boostOne != null && background.boostTwo != null) { + processBuilderCode( + 'GIVE-ABILITY-BOOST-SINGLE='+background.boostOne+'\n GIVE-ABILITY-BOOST-SINGLE='+background.boostTwo, + boostSrcStruct, + 'backBoostSection', + 'Background Boosts'); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/pages/page-4-class.js b/client/vue-src/legacy-js/char_builders/pages/page-4-class.js new file mode 100644 index 00000000..670fa753 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/pages/page-4-class.js @@ -0,0 +1,794 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_class = null; + +// ~~~~~~~~~~~~~~ // Processings // ~~~~~~~~~~~~~~ // + +function loadClassPage(classObject, classNum) { + + let classMap = objToMap(classObject); + classMap = new Map([...classMap.entries()].sort( + function(a, b) { + return a[1].Class.name > b[1].Class.name ? 1 : -1; + }) + ); + + // Populate Class Selector + let selectClass = $('#selectClass-'+classNum); + selectClass.append(''); + selectClass.append(''); + for(const [key, value] of classMap.entries()){ + if(value.Class.id == getCharClassID(classNum)){ + if(value.Class.isArchived == 0){ + selectClass.append(''); + } else { + selectClass.append(''); + } + } else if(value.Class.isArchived == 0){ + selectClass.append(''); + } + } + + + // Class Selection // + $('#selectClass-'+classNum).change(function(event, triggerSave) { + $('#classArtworkImg-'+classNum).attr('src', ''); + let classID = $("#selectClass-"+classNum+" option:selected").val(); + if(classID != "chooseDefault"){ + $('.class-content-'+classNum).removeClass("is-hidden"); + $('#selectClassControlShell-'+classNum).removeClass("is-info"); + + if(triggerSave == null || triggerSave) { + $('#selectClassControlShell-'+classNum).addClass("is-loading"); + + setCharClassID(classNum, classID); + g_class = classMap.get(classID); + stopCodeProcessing(); + socket.emit("requestClassChange", + getCharIDFromURL(), + classID, + classNum); + + } else { + displayCurrentClass(classMap.get(classID), classNum); + } + + } else { + $('.class-content-'+classNum).addClass("is-hidden"); + $('#selectClassControlShell-'+classNum).addClass("is-info"); + + // Delete class, set to null + setCharClassID(classNum, null); + g_class = null; + stopCodeProcessing(); + socket.emit("requestClassChange", + getCharIDFromURL(), + null, + classNum); + } + + }); + + $('#selectClass-'+classNum).trigger("change", [false]); + finishLoadingPage(); + +} + +socket.on("returnClassChange", function(inChoiceStruct, classNum){ + $('#selectClassControlShell-'+classNum).removeClass("is-loading"); + + if(g_class != null){ + injectWSCChoiceStruct(inChoiceStruct); + updateSkillMap(true); + resetClassArchetypes(); + displayCurrentClass(g_class, classNum); + } else { + finishLoadingPage(); + } + +}); + +function displayCurrentClass(classStruct, classNum) { + g_class = null; + $('#selectClass-'+classNum).blur(); + resettingVariables(g_enabledSources); + + // Add support for Free Archetype Variant if enabled... + if(wscChoiceStruct.Character.variantFreeArchetype == 1){ + classStruct = addFreeArchetypeVariant(classStruct); + } + + // Add support for Auto Bonus Progression Variant if enabled... + if(wscChoiceStruct.Character.variantAutoBonusProgression == 1){ + classStruct = addAutoBonusProgressionVariant(classStruct); + } + + // Add support for Gradual Ability Boosts Variant if enabled... + if(wscChoiceStruct.Character.variantGradualAbilityBoosts == 1){ + classStruct = addGradualAbilityBoostsVariant(classStruct); + } + + let choiceArray = wscChoiceStruct.ChoiceArray; + + if(classStruct.Class.isArchived == 1){ + $('#isArchivedMessage-'+classNum).removeClass('is-hidden'); + } else { + $('#isArchivedMessage-'+classNum).addClass('is-hidden'); + } + + // Rarity // + $('#classRarityContainer-'+classNum).html(convertRarityToHTML(classStruct.Class.rarity)); + + let classDescription = $('#classDescription-'+classNum); + classDescription.html(processText(classStruct.Class.description, false, false, 'MEDIUM', false)); + + if(classStruct.Class.artworkURL != null){ + $('#classArtworkImg-'+classNum).removeClass('is-hidden'); + $('#classArtworkImg-'+classNum).attr('src', classStruct.Class.artworkURL); + } else { + $('#classArtworkImg-'+classNum).addClass('is-hidden'); + $('#classArtworkImg-'+classNum).attr('src', ''); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Key Ability ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let keyAbility = $('#keyAbility-'+classNum); + keyAbility.html(''); + + if(classStruct.Class.keyAbility == 'OTHER'){ + + keyAbility.append('

    Other

    '); + + } else if(classStruct.Class.keyAbility.includes(' or ')) { + + let keyAbilitySelectID = 'keyAbilitySelect-'+classNum; + let keyAbilityControlShellClass = 'keyAbilityControlShell-'+classNum; + let keyAbilityOptionArray = classStruct.Class.keyAbility.split(' or '); + keyAbility.append('
    '); + + let keyAbilitySelect = $('#'+keyAbilitySelectID); + keyAbilitySelect.append(''); + keyAbilitySelect.append(''); + + keyAbilitySelect.append(''); + keyAbilitySelect.append(''); + + $('#'+keyAbilitySelectID).change(function() { + let abilityName = $(this).val(); + if(abilityName != "chooseDefault"){ + $('.'+keyAbilityControlShellClass).removeClass("is-info"); + socket.emit("requestAbilityBonusChange", + getCharIDFromURL(), + {sourceType: getClassSourceType(classNum), sourceLevel: 1, sourceCode: 'keyAbility', sourceCodeSNum: 'a'}, + {Ability : shortenAbilityType(abilityName), Bonus : "Boost"}); + } else { + $('.'+keyAbilityControlShellClass).addClass("is-info"); + socket.emit("requestAbilityBonusChange", + getCharIDFromURL(), + {sourceType: getClassSourceType(classNum), sourceLevel: 1, sourceCode: 'keyAbility', sourceCodeSNum: 'a'}, + null); + } + $(this).blur(); + }); + + let keyAbilitySrcStruct = { + sourceType: getClassSourceType(classNum), + sourceLevel: 1, + sourceCode: 'keyAbility', + sourceCodeSNum: 'a' + }; + let bonusArray = wscChoiceStruct.BonusArray; + let keyAbilityChoice = bonusArray.find(bonus => { + return hasSameSrc(bonus, keyAbilitySrcStruct); + }); + if(keyAbilityChoice != null){ + keyAbilitySelect.val(lengthenAbilityType(keyAbilityChoice.Ability)); + } + + if(keyAbilitySelect.val() != "chooseDefault"){ + $('.'+keyAbilityControlShellClass).removeClass("is-info"); + } else { + $('.'+keyAbilityControlShellClass).addClass("is-info"); + } + + } else { + keyAbility.append('

    '+classStruct.Class.keyAbility+'

    '); + socket.emit("requestAbilityBonusChange", + getCharIDFromURL(), + {sourceType: getClassSourceType(classNum), sourceLevel: 1, sourceCode: 'keyAbility', sourceCodeSNum: 'a'}, + {Ability : shortenAbilityType(classStruct.Class.keyAbility), Bonus : "Boost"}); + } + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hit Points ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let hitPoints = $('#hitPoints-'+classNum); + hitPoints.html(''); + hitPoints.append('

    '+classStruct.Class.hitPoints+'

    '); + + + + let savingProfArray = []; + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Perception ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let profPerception = $('#profPerception-'+classNum); + profPerception.html(''); + profPerception.append('
      '); + + let profPerceptionUL = $('#profPerceptionUL-'+classNum); + profPerceptionUL.append('
    • '); + + let profPerceptionLI = $('#profPerceptionLI-'+classNum); + profPerceptionLI.append(profToWord(classStruct.Class.tPerception)); + + savingProfArray.push({ For : "Perception", To : "Perception", Prof : classStruct.Class.tPerception }); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Skills ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + $('#profSkillsCode-'+classNum).html(''); + let profSkills = $('#profSkills-'+classNum); + profSkills.html(''); + profSkills.append('
        '); + + let profSkillsUL = $('#profSkillsUL-'+classNum); + + let tSkillsArray; + if(classStruct.Class.tSkills != null){ + tSkillsArray = classStruct.Class.tSkills.split(', '); + } else { + tSkillsArray = []; + } + for(const tSkill of tSkillsArray){ + + let tSkillID = tSkill.replace(/ /g,'_'); + profSkillsUL.append('
      • '); + let profSkillsLI = $('#profSkillsLI-'+classNum+'-'+tSkillID); + + if(tSkill.includes(' or ')){ + + let tSkillControlShellClass = tSkillID+'-'+classNum+'-ControlShell'; + let tSkillsOptionArray = tSkill.split(' or '); + profSkillsLI.append('Trained in
        '); + + let tSkillSelect = $('#'+tSkillID+'-'+classNum); + + tSkillSelect.append(''); + tSkillSelect.append(''); + + tSkillSelect.append(''); + tSkillSelect.append(''); + + $('#'+tSkillID+'-'+classNum).change(function() { + let skillName = $(this).val(); + + let srcStruct = { + sourceType: getClassSourceType(classNum), + sourceLevel: 1, + sourceCode: 'inits-misc-'+tSkillID, + sourceCodeSNum: 'a', + }; + + if(skillName != "chooseDefault"){ + $('.'+tSkillControlShellClass).removeClass("is-info"); + processBuilderCode( + 'GIVE-PROF-IN='+skillName+':T', + srcStruct, + 'profSkillsCode-'+classNum, + 'Initial Class'); + } else { + $('.'+tSkillControlShellClass).addClass("is-info"); + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct, isSkill : true}, + null); + } + $(this).blur(); + }); + + let tSkillSrcStruct = { + sourceType: getClassSourceType(classNum), + sourceLevel: 1, + sourceCode: 'inits-misc-'+tSkillID, + sourceCodeSNum: 'aa', + }; + let profArray = wscChoiceStruct.ProfArray; + let tSkillChoice = profArray.find(bonus => { + return hasSameSrc(bonus, tSkillSrcStruct); + }); + if(tSkillChoice != null){ + tSkillSelect.val(tSkillChoice.To); + } + + if(tSkillSelect.val() != "chooseDefault"){ + $('.'+tSkillControlShellClass).removeClass("is-info"); + } else { + $('.'+tSkillControlShellClass).addClass("is-info"); + } + + } else { + + profSkillsLI.append("Trained in "+tSkill); + savingProfArray.push({ For : "Skill", To : tSkillID, Prof : 'T' }); + + } + + } + + profSkillsUL.append('
      • '); + let profSkillsLIAddTrained = $('#profSkillsLIAdditionalTrained-'+classNum); + + profSkillsLIAddTrained.append('Trained in '+classStruct.Class.tSkillsMore+'* more skills'); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Saving Throws ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let profSavingThrows = $('#profSavingThrows-'+classNum); + profSavingThrows.html(''); + profSavingThrows.append('
          '); + + let profSavingThrowsUL = $('#profSavingThrowsUL-'+classNum); + profSavingThrowsUL.append('
        • '); + profSavingThrowsUL.append('
        • '); + profSavingThrowsUL.append('
        • '); + + let profSavingThrowsLIFort = $('#profSavingThrowsLIFort-'+classNum); + profSavingThrowsLIFort.append(profToWord(classStruct.Class.tFortitude)+" in Fortitude"); + + let profSavingThrowsLIReflex = $('#profSavingThrowsLIReflex-'+classNum); + profSavingThrowsLIReflex.append(profToWord(classStruct.Class.tReflex)+" in Reflex"); + + let profSavingThrowsLIWill = $('#profSavingThrowsLIWill-'+classNum); + profSavingThrowsLIWill.append(profToWord(classStruct.Class.tWill)+" in Will"); + + savingProfArray.push({ For : "Save", To : 'Fortitude', Prof : classStruct.Class.tFortitude }); + savingProfArray.push({ For : "Save", To : 'Reflex', Prof : classStruct.Class.tReflex }); + savingProfArray.push({ For : "Save", To : 'Will', Prof : classStruct.Class.tWill }); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Attacks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let profAttacks = $('#profAttacks-'+classNum); + profAttacks.html(''); + + profAttacks.append('
            '); + let profAttacksUL = $('#profAttacksUL-'+classNum); + + + let tWeaponsArray = []; + if(classStruct.Class.tWeapons != null) { tWeaponsArray = classStruct.Class.tWeapons.split(',,, '); } + for(const tWeapons of tWeaponsArray){ + + let sections = tWeapons.split(':::'); + let weapTraining = sections[0]; + let weaponName = sections[1]; + + let weapID; + let profConvertData = g_profConversionMap.get(weaponName.replace(/\s+/g,'').toUpperCase()); + if(profConvertData != null){ + weapID = profConvertData.Name; + } else { + weapID = weaponName.replace(/\s+/g,'_').toUpperCase(); + } + + profAttacksUL.append('
          • '); + let profAttacksLI = $('#profAttacksLI-'+classNum+'-'+weapID); + + if(weaponName.slice(-1) === 's'){ + // is plural + profAttacksLI.append(profToWord(weapTraining)+" in all "+weaponName); + } else { + // is singular + profAttacksLI.append(profToWord(weapTraining)+" in the "+weaponName); + } + + savingProfArray.push({ For : "Attack", To : weapID, Prof : weapTraining }); + + } + if(classStruct.Class.weaponsExtra != null) { + let weapLines = classStruct.Class.weaponsExtra.split('\n'); + for(const weapLine of weapLines){ + profAttacksUL.append(`
          • ${weapLine}
          • `); + } + } + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defenses ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let profDefenses = $('#profDefenses-'+classNum); + profDefenses.html(''); + + profDefenses.append('
              '); + let profDefensesUL = $('#profDefensesUL-'+classNum); + + + let tArmorArray = []; + if(classStruct.Class.tArmor != null) { tArmorArray = classStruct.Class.tArmor.split(',,, '); } + for(const tArmor of tArmorArray){ + + let sections = tArmor.split(':::'); + let armorTraining = sections[0]; + let armorName = sections[1]; + + let armorID; + let profConvertData = g_profConversionMap.get(armorName.replace(/\s+/g,'').toUpperCase()); + if(profConvertData != null){ + armorID = profConvertData.Name; + } else { + armorID = armorName.replace(/\s+/g,'_').toUpperCase(); + } + + profDefensesUL.append('
            • '); + let profDefensesLI = $('#profDefensesLI-'+classNum+'-'+armorID); + + profDefensesLI.append(profToWord(armorTraining)+" in all "+armorName); + + savingProfArray.push({ For : "Defense", To : armorID, Prof : armorTraining }); + + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Class DC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + let profClassDC = $('#profClassDC-'+classNum); + profClassDC.html(''); + profClassDC.append('
                '); + + let profClassDCUL = $('#profClassDCUL-'+classNum); + profClassDCUL.append('
              • '); + + let profClassDCLI = $('#profClassDCLI-'+classNum); + profClassDCLI.append(profToWord(classStruct.Class.tClassDC)); + + savingProfArray.push({ For : "Class_DC", To : "Class_DC", Prof : classStruct.Class.tClassDC }); + + + let savingProfCount = 0; + for(let savingProf of savingProfArray){ + let srcStruct = { + sourceType: getClassSourceType(classNum), + sourceLevel: 1, + sourceCode: 'inits-'+savingProfCount, + sourceCodeSNum: 'a', + }; + if(savingProf.For === 'Skill' && savingProf.Prof === 'T'){ + processBuilderCode( // Use WSC because if the character is already trained, it will give them a new skill. + 'GIVE-PROF-IN='+savingProf.To+':T', + srcStruct, + 'profSkillsCode-'+classNum, + 'Initial Class'); + } else { + savingProf.SourceName = 'Initial Class'; + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct, isSkill : false}, + savingProf); + } + savingProfCount++; + } + + + $('#classAbilities-'+classNum).html('
                '); + + let abilityTabsTempSet = new Set(); + let abilityNameSet = new Set(); + for(const classAbility of classStruct.Abilities) { + if(classAbility.selectType != 'SELECT_OPTION') { + if(abilityNameSet.has(classAbility.name)){ + abilityTabsTempSet.add(classAbility.name); + } else { + abilityNameSet.add(classAbility.name); + } + } + } + + let abilityTabsSet = new Set(); + for(const abilName of abilityNameSet){ + if(abilityTabsTempSet.has(abilName)){ + abilityTabsSet.add(abilName); + } + } + + let abilityTabHTML = '
              • Core Features
              • '; + for(const abilityTab of abilityTabsSet){ + let hashOfName = hashCode(abilityTab); + abilityTabHTML += '
              • '+abilityTab+'
              • '; + $('#classAbilitiesContent-'+classNum).append(''); + } + $('#classAbilitiesContent-'+classNum).append(''); + + $('#classAbilitiesTabs-'+classNum).html('
                  '+abilityTabHTML+'
                '); + + for(const classAbility of classStruct.Abilities) { + if(classAbility.level == -1) {continue;} + + if(classAbility.selectType != 'SELECT_OPTION' && classAbility.level <= wscChoiceStruct.Character.level) { + + let classAbilityID = "classAbility-"+classNum+"-"+classAbility.id; + let classAbilityHeaderID = "classAbilityHeader-"+classNum+"-"+classAbility.id; + let classAbilityContentID = "classAbilityContent-"+classNum+"-"+classAbility.id; + let classAbilityCodeID = "classAbilityCode-"+classNum+"-"+classAbility.id; + + let tabContent = null; + if(abilityTabsSet.has(classAbility.name)){ + + let hashOfName = hashCode(classAbility.name); + tabContent = $('#abilityContent-'+classNum+'-'+hashOfName); + tabContent.append('
                '); + + let classAbilitySection = $('#'+classAbilityID); + classAbilitySection.append('Level '+classAbility.level+''); + classAbilitySection.append('
                '); + classAbilitySection.append('
                '); + + } else { + + tabContent = $('#abilityContent-'+classNum+'-Other'); + tabContent.append('
                '); + + let classAbilitySection = $('#'+classAbilityID); + classAbilitySection.append(''+classAbility.name+''+rankLevel(classAbility.level)+''); + classAbilitySection.append('
                '); + classAbilitySection.append('
                '); + + } + + + let classAbilityContent = $('#'+classAbilityContentID); + + + let result = applyClassArchetypeChoice(classAbility); + if(result != null){ + classAbilityContent.append('
                '+result.tabsHTML+'
                '); + assembleClassArchetypeTabs(result.tabsID, classAbility.id, classAbility.description); + } else { + classAbilityContent.append('
                '+processText(classAbility.description, false, null)+'
                '); + } + + classAbilityContent.append('
                '); + + if(classAbility.selectType === 'SELECTOR') { + + let selectorID = 'classAbilSelection-'+classNum+'-'+classAbility.id; + let descriptionID = 'classAbilSelection-'+classNum+'-'+classAbility.id+'Description'; + let abilityCodeID = 'classAbilSelection-'+classNum+'-'+classAbility.id+'Code'; + + let classAbilitySelectorInnerHTML = ''; + + classAbilitySelectorInnerHTML += '
                '; + classAbilitySelectorInnerHTML += ''; + classAbilitySelectorInnerHTML += '
                '; + + classAbilitySelectorInnerHTML += ''; + + classAbilityContent.append(classAbilitySelectorInnerHTML); + + } + + + } + + } + + // Class abilities should come before ability options + processBuilderCode_ClassAbilities(classStruct.Abilities, classNum); + + // Class ability options + let abilSelectors = $('.classAbilSelection'); + for(const abilSelector of abilSelectors){ + + $(abilSelector).change(function(event, triggerSave, runCodeOnly){ + + if(runCodeOnly === true){ + + if($(this).val() != "chooseDefault"){ + + let abilityCodeID = $(this).attr('id')+'Code'; + $('#'+abilityCodeID).html(''); + + let classAbilityID = $(this).attr('name'); + let classAbility = classStruct.Abilities.find(classAbility => { + return classAbility.id == classAbilityID; + }); + + let srcStruct = { + sourceType: getClassSourceType(classNum), + sourceLevel: classAbility.level, + sourceCode: 'classAbilitySelector-'+classAbilityID, + sourceCodeSNum: 'a', + }; + + let chosenAbilityID = $(this).val(); + let chosenClassAbility = classStruct.Abilities.find(classAbility => { + return classAbility.id == chosenAbilityID; + }); + + const chosenClassFeatureCode = replaceClassFeatureCodeFromClassArchetype(chosenClassAbility.id, chosenClassAbility.code, srcStruct); + + // Run ability choice code + processBuilderCode( + chosenClassFeatureCode, + srcStruct, + abilityCodeID, + chosenClassAbility.name); + + } + + } else { + + let descriptionID = $(this).attr('id')+'Description'; + let abilityCodeID = $(this).attr('id')+'Code'; + $('#'+descriptionID).html(''); + $('#'+abilityCodeID).html(''); + + let classAbilityID = $(this).attr('name'); + let classAbility = classStruct.Abilities.find(classAbility => { + return classAbility.id == classAbilityID; + }); + + let srcStruct = { + sourceType: getClassSourceType(classNum), + sourceLevel: classAbility.level, + sourceCode: 'classAbilitySelector-'+classAbilityID, + sourceCodeSNum: 'a', + }; + + if($(this).val() == "chooseDefault"){ + $(this).parent().addClass("is-info"); + $('#'+descriptionID).parent().parent().parent().parent().addClass('is-hidden'); + + // Save ability choice + if(triggerSave == null || triggerSave) { + socket.emit("requestClassChoiceChange", + getCharIDFromURL(), + srcStruct, + null); + } + + } else { + $(this).parent().removeClass("is-info"); + $('#'+descriptionID).parent().parent().parent().parent().removeClass('is-hidden'); + + let chosenAbilityID = $(this).val(); + let chosenClassAbility = classStruct.Abilities.find(classAbility => { + return classAbility.id == chosenAbilityID; + }); + + let result = applyClassArchetypeChoice(chosenClassAbility); + if(result != null){ + $('#'+descriptionID).html(result.tabsHTML); + assembleClassArchetypeTabs(result.tabsID, chosenClassAbility.id, chosenClassAbility.description); + } else { + $('#'+descriptionID).html(processText(chosenClassAbility.description, false, null)); + } + + // Save ability choice + if(triggerSave == null || triggerSave) { + socket.emit("requestClassChoiceChange", + getCharIDFromURL(), + srcStruct, + { SelectorID : classAbilityID, OptionID : chosenAbilityID }); + } + + const chosenClassFeatureCode = replaceClassFeatureCodeFromClassArchetype(chosenClassAbility.id, chosenClassAbility.code, srcStruct); + + // Run ability choice code + processBuilderCode( + chosenClassFeatureCode, + srcStruct, + abilityCodeID, + chosenClassAbility.name); + + } + + } + + $(this).blur(); + selectorUpdated(); + }); + + } + + $('.classAbilSelection').trigger("change", [false]); + + + for(let abilityTab of $('.ability-tabs a')){ + let tabNameHash = $(abilityTab).attr('id').replace('abilityTab-'+classNum+'-', ''); + if($('#abilityContent-'+classNum+'-'+tabNameHash).html() == ''){ + $(abilityTab).parent().addClass('is-hidden'); + } else { + $(abilityTab).parent().removeClass('is-hidden'); + } + } + + $('.ability-tabs a').click(function(){ + $('#classAbilitiesContent-'+classNum+' > div').addClass('is-hidden'); + $('.ability-tabs > li').removeClass("is-active"); + + let tabNameHash = $(this).attr('id').replace('abilityTab-'+classNum+'-', ''); + $('#abilityContent-'+classNum+'-'+tabNameHash).removeClass('is-hidden'); + $('#abilityTab-'+classNum+'-'+tabNameHash).parent().addClass("is-active"); + }); + + $('.ability-tabs a:first').click(); + +} + +socket.on("returnClassChoiceChange", function(srcStruct, selectorID, optionID){ + + let choiceArray = wscChoiceStruct.ChoiceArray; + + let foundChoiceData = false; + for(let choiceData of choiceArray){ + if(hasSameSrc(choiceData, srcStruct)){ + foundChoiceData = true; + if(selectorID != null && optionID != null){ + choiceData.value = selectorID+':::'+optionID; + choiceData.SelectorID = selectorID; + choiceData.OptionID = optionID; + } else { + choiceData.value = null; + choiceData.SelectorID = null; + choiceData.OptionID = null; + } + break; + } + } + + if(!foundChoiceData && selectorID != null && optionID != null){ + let choiceData = cloneObj(srcStruct); + choiceData.value = selectorID+':::'+optionID; + choiceData.SelectorID = selectorID; + choiceData.OptionID = optionID; + choiceArray.push(choiceData); + } + + wscChoiceStruct.ChoiceArray = choiceArray; + updateExpressionProcessor({ + ChoiceStruct : wscChoiceStruct, + }); + +}); + + +function getCharClassID(classNum){ + if(classNum == 1){ + return g_char_classID_1; + } else if(classNum == 2){ + return g_char_classID_2; + } else { + return null; + } +} +function setCharClassID(classNum, char_classID){ + if(classNum == 1){ + g_char_classID_1 = char_classID; + } else if(classNum == 2){ + g_char_classID_2 = char_classID; + } +} + +function getClassSourceType(classNum){ + if(classNum == 1){ + return 'class'; + } else if(classNum == 2){ + return 'class-2'; + } else { + return 'class'; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/pages/page-5-finalize.js b/client/vue-src/legacy-js/char_builders/pages/page-5-finalize.js new file mode 100644 index 00000000..ff1fcd46 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/pages/page-5-finalize.js @@ -0,0 +1,206 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ~~~~~~~~~~~~~~ // Processings // ~~~~~~~~~~~~~~ // + +function loadFinalizePage(character, unselectedDataArray) { + + resettingVariables(g_enabledSources); + + let strScore = g_abilMap.get("STR"); + $("#strScore").html(strScore); + $("#strMod").html(signNumber(getMod(strScore))); + + let dexScore = g_abilMap.get("DEX"); + $("#dexScore").html(dexScore); + $("#dexMod").html(signNumber(getMod(dexScore))); + + let conScore = g_abilMap.get("CON"); + $("#conScore").html(conScore); + $("#conMod").html(signNumber(getMod(conScore))); + + let intScore = g_abilMap.get("INT"); + $("#intScore").html(intScore); + $("#intMod").html(signNumber(getMod(intScore))); + + let wisScore = g_abilMap.get("WIS"); + $("#wisScore").html(wisScore); + $("#wisMod").html(signNumber(getMod(wisScore))); + + let chaScore = g_abilMap.get("CHA"); + $("#chaScore").html(chaScore); + $("#chaMod").html(signNumber(getMod(chaScore))); + + if(character.classID != null && character.ancestryID != null){ + + let profSrcStruct = { + sourceType: 'class',// Class 1 is what gives the extra skills + sourceLevel: 1, + sourceCode: 'inits-bonus-prof', + sourceCodeSNum: 'a', + }; + + let langSrcStruct = { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-bonus-lang', + sourceCodeSNum: 'a', + }; + + socket.emit("requestLangsAndTrainingsClear", + getCharIDFromURL(), + profSrcStruct, + langSrcStruct, + {Character: character, SkillLocationID: 'skillSelection', LangLocationID: 'langSelection'}); + + } else { + + $("#missing-class-message").removeClass("is-hidden"); + $(".finalize-content").addClass("is-hidden"); + finishLoadingPage(); + + runCustomCodeBlock(character); + + } + + if (character.name == null || character.ancestryID == null || character.backgroundID == null || character.classID == null) { + + $("#goToCharBigButton").removeClass("has-text-info"); + $("#goToCharBigButton").addClass("has-text-danger"); + $("#goToCharBigButton").addClass("has-tooltip-left"); + + let infoNeeded = ''; + if(character.name == null) { + infoNeeded += "- Name\n"; + $("#basics-step").removeClass("is-link"); + $("#basics-step").addClass("is-danger"); + } + if(character.ancestryID == null) { + infoNeeded += "- Ancestry\n"; + $("#ancestry-step").removeClass("is-link"); + $("#ancestry-step").addClass("is-danger"); + } + if(character.backgroundID == null) { + infoNeeded += "- Background\n"; + $("#background-step").removeClass("is-link"); + $("#background-step").addClass("is-danger"); + } + if(character.classID == null) { + infoNeeded += "- Class\n"; + $("#class-step").removeClass("is-link"); + $("#class-step").addClass("is-danger"); + } + + $("#goToCharBigButton").attr("data-tooltip", "Character Incomplete\n"+infoNeeded); + + } else { + $("#goToCharBigButton").removeClass("has-text-danger"); + $("#goToCharBigButton").addClass("has-text-info"); + $("#goToCharBigButton").removeClass("has-tooltip-left"); + $("#goToCharBigButton").attr("data-tooltip", null); + } + + if(unselectedDataArray.length > 0){ + $('#warnings-section').removeClass('is-hidden'); + + let sortedUnselectedDataArray = unselectedDataArray.sort( + function(a, b) { + return a.value > b.value ? 1 : -1; + } + ); + + for(let unselectedDataStruct of sortedUnselectedDataArray){ + + let unselectedData = JSON.parse(unselectedDataStruct.value); + + let unselectedSymbol = ''; + if(unselectedData.STATE == 'UNSELECTED'){ + unselectedSymbol = ''; + } else if(unselectedData.STATE == 'INCORRECT'){ + unselectedSymbol = ''; + } + + $('#warnings-container').append(` +
                +
                + ${unselectedSymbol} +
                +
                + + ${unselectedData.details} + - ${unselectedData.sourceName} + +
                +
                + `); + + } + + } + +} + + +socket.on("returnLangsAndTrainingsClear", function(profSrcStruct, langSrcStruct, data){ + + $(".finalize-content").removeClass("is-hidden"); + + if(wscChoiceStruct.ClassDetails.Class != null){ + let giveSkillTrainingCode = ''; + for (let i = 0; i < getMod(g_abilMap.get("INT"))+wscChoiceStruct.ClassDetails.Class.tSkillsMore; i++) { + giveSkillTrainingCode += 'GIVE-SKILL=T\n'; + } + + processBuilderCode( + giveSkillTrainingCode, + profSrcStruct, + data.SkillLocationID, + 'Final Skill Trainings'); + } + + if(wscChoiceStruct.Ancestry != null){ + let giveLanguageCode = ''; + let additionalLangs = getMod(g_abilMap.get("INT")); + if(wscChoiceStruct.Ancestry.name == 'Human'){ additionalLangs++; } // Hardcoded - ancestry named Human gains +1 langs. + for (let i = 0; i < additionalLangs; i++) { + giveLanguageCode += 'GIVE-LANG-BONUS-ONLY\n'; + } + + processBuilderCode( + giveLanguageCode, + langSrcStruct, + data.LangLocationID, + 'Final Languages'); + } + + if(data.Character != null){ + runCustomCodeBlock(data.Character); + } + + finishLoadingPage(); + +}); + +function runCustomCodeBlock(character) { + + // Custom Code Block Option - Results // + if(character.optionCustomCodeBlock === 1){ + $('#custom-code-block-results-section').removeClass('is-hidden'); + let customCodeSrcStruct = { + sourceType: 'custom-code', + sourceLevel: 0, + sourceCode: 'custom-code', + sourceCodeSNum: 'a', + }; + processBuilderCode( + character.customCode, + customCodeSrcStruct, + 'custom-code-block-results-container', + 'Custom Code Block'); + } else { + socket.emit("requestCustomCodeBlockDataClear", + getCharIDFromURL()); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/top-stickies.js b/client/vue-src/legacy-js/char_builders/top-stickies.js new file mode 100644 index 00000000..f7b1bad4 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/top-stickies.js @@ -0,0 +1,13 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ~~~~~~~~~~~~~~ // General - Run On Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('#leftQuickviewButton').click(function(event){ + event.stopImmediatePropagation(); + openLeftQuickView('skillsView', null); + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/unselected-options.js b/client/vue-src/legacy-js/char_builders/unselected-options.js new file mode 100644 index 00000000..b7f08739 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/unselected-options.js @@ -0,0 +1,138 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + Tag Name: data-selection-info + + STATES: + - UNSELECTED + - INCORRECT +*/ + +function getTagFromData(srcStruct, sourceName, details, STATE){ + return srcStruct.sourceType+':::'+srcStruct.sourceLevel+':::'+srcStruct.sourceCode+':::'+srcStruct.sourceCodeSNum+';;;'+sourceName+':::'+details+':::'+STATE; +} +function getDataFromTag(tagData){ + let parts = tagData.split(';;;'); + let srcStructParts = parts[0].split(':::'); + let otherDataParts = parts[1].split(':::'); + return { + srcStruct: { + sourceType: srcStructParts[0], + sourceLevel: srcStructParts[1], + sourceCode: srcStructParts[2], + sourceCodeSNum: srcStructParts[3], + }, + sourceName: otherDataParts[0], + details: otherDataParts[1], + STATE: otherDataParts[2], + }; +} + + + +function selectorUpdated() { + + // Show blue circle indicator for all class abilities that require a selection // + $('.classAbility').each(function() { + if($(this).find('.select.is-info').length !== 0 || $(this).find('.feat-selection.is-default').length !== 0){ + $(this).find('.classAbilityUnselectedOption').html(''); + } else { + $(this).find('.classAbilityUnselectedOption').html(''); + } + + // Make sure everything is centered + //$(this).find('.has-text-left').removeClass('has-text-left'); + + }); + + // Process all selections that haven't been selected + $('.select').each(function() { + let tagData = $(this).attr('data-selection-info'); + if(tagData != null && tagData != '') { + let data = getDataFromTag(tagData); + if($(this).hasClass('is-info')){ + addUnselectedData(data.srcStruct, JSON.stringify({ + sourceName: data.sourceName, + details: data.details, + STATE: data.STATE, + })); + } else { + removeUnselectedData(data.srcStruct); + } + } + }); + $('.feat-selection').each(function() { + let tagData = $(this).attr('data-selection-info'); + if(tagData != null && tagData != ''){ + let data = getDataFromTag(tagData); + if(data.STATE != ''){ + addUnselectedData(data.srcStruct, JSON.stringify({ + sourceName: data.sourceName, + details: data.details, + STATE: data.STATE, + })); + } else { + removeUnselectedData(data.srcStruct); + } + } + }); + +} + +function addUnselectedData(srcStruct, unselectedData){ + let existingData = g_unselectedData.find(unselData => { + return hasSameSrc(unselData, srcStruct) && unselData.value === unselectedData; + }); + if(existingData == null){ + + let newData = cloneObj(srcStruct); + newData.value = unselectedData; + g_unselectedData.push(newData); + + socket.emit("requestUnselectedDataChange", + getCharIDFromURL(), + srcStruct, + unselectedData); + + } +} + +function removeUnselectedData(srcStruct){ + let existingData = g_unselectedData.find(unselData => { + return hasSameSrc(unselData, srcStruct); + }); + if(existingData != null){ + + let newDataArray = []; + for(let unselData of g_unselectedData){ + if(!hasSameSrc(unselData, srcStruct)){ + newDataArray.push(unselData); + } + } + g_unselectedData = newDataArray; + + socket.emit("requestUnselectedDataChange", + getCharIDFromURL(), + srcStruct, + null); + + } +} + + + +// Check for multiple skill trainings - TODO +function detectMultipleSkillTrainings(){ + + /* + for(const profData of wscChoiceStruct.ProfArray){ + + if(profData.Prof == 'T') { + + } + + }*/ + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/utils.js b/client/vue-src/legacy-js/char_builders/utils.js new file mode 100644 index 00000000..6c6bd772 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/utils.js @@ -0,0 +1,101 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getCharIDFromURL(){ + return $('#char-builder-container').attr('data-char-id'); +} + +function getAllAbilityTypes() { + return ['Strength','Dexterity','Constitution','Intelligence','Wisdom','Charisma']; +} + +/* Duplicate Checking */ +function hasDuplicateSelected(selectOptions) { + let optionValArray = []; + $(selectOptions).each(function() { + if($(this).val() != "chooseDefault"){ + optionValArray.push($(this).val()); + } + }); + return (new Set(optionValArray)).size !== optionValArray.length; +} + +function hasDuplicateFeat(featArray, featID){ + for(const feat of featArray){ + if(feat.value != null && feat.value.id == featID) { + return true; + } + } + return false; +} + +function hasDuplicateLang(langArray, langID){ + for(const lang of langArray){ + if(lang.value.id == langID) { + return true; + } + } + return false; +} + +// WSC statement maximum: 52 +function charIncrease(char){ + switch(char) { + case 'a': return 'b'; + case 'b': return 'c'; + case 'c': return 'd'; + case 'd': return 'e'; + case 'e': return 'f'; + case 'f': return 'g'; + case 'g': return 'h'; + case 'h': return 'i'; + case 'i': return 'j'; + case 'j': return 'k'; + case 'k': return 'l'; + case 'l': return 'm'; + case 'm': return 'n'; + case 'n': return 'o'; + case 'o': return 'p'; + case 'p': return 'q'; + case 'q': return 'r'; + case 'r': return 's'; + case 's': return 't'; + case 't': return 'u'; + case 'u': return 'v'; + case 'v': return 'w'; + case 'w': return 'x'; + case 'x': return 'y'; + case 'y': return 'z'; + case 'z': return 'A'; + + case 'A': return 'B'; + case 'B': return 'C'; + case 'C': return 'D'; + case 'D': return 'E'; + case 'E': return 'F'; + case 'F': return 'G'; + case 'G': return 'H'; + case 'H': return 'I'; + case 'I': return 'J'; + case 'J': return 'K'; + case 'K': return 'L'; + case 'L': return 'M'; + case 'M': return 'N'; + case 'N': return 'O'; + case 'O': return 'P'; + case 'P': return 'Q'; + case 'Q': return 'R'; + case 'R': return 'S'; + case 'S': return 'T'; + case 'T': return 'U'; + case 'U': return 'V'; + case 'V': return 'W'; + case 'W': return 'X'; + case 'X': return 'Y'; + case 'Y': return 'Z'; + case 'Z': return null; + + default: return null; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/variants/auto-bonus-progression.js b/client/vue-src/legacy-js/char_builders/variants/auto-bonus-progression.js new file mode 100644 index 00000000..f292aeab --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/variants/auto-bonus-progression.js @@ -0,0 +1,239 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function addAutoBonusProgressionVariant(classStruct){ + classStruct.Abilities.push(getABP_AttackPotency(1, 2, 1)); + classStruct.Abilities.push(getABP_SkillPotencies(2, 3)); + classStruct.Abilities.push(getABP_DevastatingAttacks(3, 4, 2, 'two')); + classStruct.Abilities.push(getABP_DefensePotency(4, 5, 1)); + // #5, Skill Potency? + classStruct.Abilities.push(getABP_PerceptionPotency(6, 7, 1)); + classStruct.Abilities.push(getABP_SavingThrowPotency(7, 8, 1)); + // #8, Skill Potency? + classStruct.Abilities.push(getABP_AttackPotency(9, 10, 2)); + classStruct.Abilities.push(getABP_DefensePotency(10, 11, 2)); + classStruct.Abilities.push(getABP_DevastatingAttacks(11, 12, 3, 'three')); + classStruct.Abilities.push(getABP_PerceptionPotency(12, 13, 2)); + // #13, Skill Potency? + classStruct.Abilities.push(getABP_SavingThrowPotency(14, 14, 2)); + // #15, Skill Potency? + classStruct.Abilities.push(getABP_AttackPotency(16, 16, 3)); + classStruct.Abilities.push(getABP_AbilityApex(17, 17)); + // #18, Skill Potency? + classStruct.Abilities.push(getABP_DefensePotency(19, 18, 3)); + classStruct.Abilities.push(getABP_DevastatingAttacks(20, 19, 4, 'four')); + classStruct.Abilities.push(getABP_PerceptionPotency(21, 19, 3)); + classStruct.Abilities.push(getABP_SavingThrowPotency(22, 20, 3)); + // #23, Skill Potency? + + // Re-sort the abilities array... + classStruct.Abilities = classStruct.Abilities.sort( + function(a, b) { + if (a.level === b.level) { + // Name is only important when levels are the same + return a.name > b.name ? 1 : -1; + } + return a.level - b.level; + } + ); + + return classStruct; +} + +function getABP_AttackPotency(id_offset, lvl, bonus){ + return { + id: -2000+(-1*id_offset), + name: "Attack Potency +"+bonus, + level: lvl, + description: "You gain a +"+bonus+" potency bonus to attack rolls with all weapons and unarmed attacks.", + code: "INCREASE-ATTACKS="+bonus+"-POTENCY", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_SkillPotencies(id_offset, lvl){ + return { + id: -2000+(-1*id_offset), + name: "Skill Potencies", + level: lvl, + description: "At 3rd level, choose a single skill. You gain a +1 potency bonus with that skill. At 6th level, choose a second skill to gain a +1 potency bonus. At 9th level, choose one of those skills and increase its potency bonus to +2. At 13th level, increase the potency bonus of your second skill to +2 and choose a third skill to gain a +1 potency bonus. At 15th level, increase the third skill’s potency bonus to +2 and choose a fourth skill to gain a +1 potency bonus. At 17th level, choose one of your three skills with a +2 potency bonus to increase to +3, and choose a fifth skill to gain a +1 potency bonus. Finally, at 20th level, choose one of the two skills with a +2 potency bonus to increase to +3, choose one of the three skills at a +1 potency bonus to increase to +2, and choose one new skill to gain a +1 potency bonus.\nYou can spend 1 week to retrain one of these assignments at any time.\n__On the character sheet, you can customize skills to add an extra bonus to that skill. Use that to indicate the potency bonus' that you would gain.__", + code: "GIVE-NOTES-FIELD=You can use this area to keep track of what skills you've selected at the given levels.", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_DevastatingAttacks(id_offset, lvl, diceNum, diceWord){ + return { + id: -2000+(-1*id_offset), + name: "Devastating Attacks ("+diceWord+" dice)", + level: lvl, + description: "Your weapon and unarmed strikes deal "+diceWord+" damage dice instead of one.", + code: "INCREASE-ATTACKS_DMG_DICE="+diceNum+"-ABP", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_DefensePotency(id_offset, lvl, bonus){ + return { + id: -2000+(-1*id_offset), + name: "Defense Potency +"+bonus, + level: lvl, + description: "You gain a +"+bonus+" potency bonus to AC.", + code: "INCREASE-AC="+bonus+"-POTENCY", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_PerceptionPotency(id_offset, lvl, bonus){ + return { + id: -2000+(-1*id_offset), + name: "Perception Potency +"+bonus, + level: lvl, + description: "You gain a +"+bonus+" potency bonus to Perception.", + code: "INCREASE-PERCEPTION="+bonus+"-POTENCY", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_SavingThrowPotency(id_offset, lvl, bonus){ + return { + id: -2000+(-1*id_offset), + name: "Saving Throw Potency +"+bonus, + level: lvl, + description: "You gain a +"+bonus+" potency bonus to saves.", + code: "INCREASE-SAVE_FORT="+bonus+"-POTENCY\nINCREASE-SAVE_REFLEX="+bonus+"-POTENCY\nINCREASE-SAVE_WILL="+bonus+"-POTENCY", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} + +function getABP_AbilityApex(id_offset, lvl){ + return { + id: -2000+(-1*id_offset), + name: "Ability Apex", + level: lvl, + description: "Choose one ability score to either increase by 2 or increase to 18 (whichever grants the higher score).\n__On the basics page of the character, you can change your starting ability scores from all 10's. Use this to edit your ability scores and reflect the apex ability change you chose.__", + code: "GIVE-NOTES-FIELD=You can use this area to keep track of what ability score you chose.", + contentSrc: "CRB", + displayInSheet: 1, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} +/* +function addABP_AbilityApex(classAbilities, id_offset, lvl){ + let apexAbilityID = -2000+(-1*id_offset); + classAbilities.push({ + id: apexAbilityID, + name: "Ability Apex", + level: lvl, + description: "Choose one ability score to either increase by 2 or increase to 18 (whichever grants the higher score).", + code: null, + contentSrc: "CRB", + displayInSheet: 1, + selectType: "SELECTOR", + selectOptionFor: null, + isArchived: 0, + }); + + classAbilities.push({ + id: apexAbilityID-30, + name: "Ability Apex - Strength", + level: null, + description: "Increase your Strength score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=STR", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-31, + name: "Ability Apex - Dexterity", + level: null, + description: "Increase your Dexterity score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=DEX", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-32, + name: "Ability Apex - Constitution", + level: null, + description: "Increase your Constitution score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=CON", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-33, + name: "Ability Apex - Intelligence", + level: null, + description: "Increase your Intelligence score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=INT", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-34, + name: "Ability Apex - Wisdom", + level: null, + description: "Increase your Wisdom score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=WIS", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + classAbilities.push({ + id: apexAbilityID-35, + name: "Ability Apex - Charisma", + level: null, + description: "Increase your Charisma score by 2 or increase it to 18 (whichever grants the higher score).", + code: "SET-APEX-ABILITY-SCORE=CHA", + contentSrc: "CRB", + displayInSheet: 0, + selectType: "SELECT_OPTION", + selectOptionFor: apexAbilityID, + isArchived: 0, + }); + + return classAbilities; + +}*/ \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/variants/class-archetypes.js b/client/vue-src/legacy-js/char_builders/variants/class-archetypes.js new file mode 100644 index 00000000..09f1e538 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/variants/class-archetypes.js @@ -0,0 +1,423 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_classArchetypeTryCount = 0; +let g_classArchetypeSelectedOptions = new Map(); +let g_classArchetypeChosenArchetype = null; + +/* replacementCodeJSON layout: + + { + initial: { + detectionCode: [], // Could contain ' $OR$ ' + archetypeText, + textChangeType: 'REPLACE' or 'ADD' + replacementStatement, + optionals: { replaceOnlyDetected: false, }, + extraCode, + }, + changes: [ + detectionCode, + extraText, + replacementStatement, + extraCode, + ] + } + + + code is run based on if class archetype is chosen. + code is adjusted based on chosen class archetype. + +*/ + +const g_classArchetypeDetectionCodeOR = ' $OR$ '; + +function resetClassArchetypes(){ + g_classArchetypeTryCount = 0; + g_classArchetypeSelectedOptions = new Map(); + g_classArchetypeChosenArchetype = null; +} + +function initClassArchetypes(classArchetypeID){ + for(let classArchetype of g_classArchetypes){ + + classArchetype.replacementCode = JSON.parse(classArchetype.replacementCodeJSON); + + if(classArchetype.id == classArchetypeID){ + g_classArchetypeChosenArchetype = classArchetype; + } + + } +} + +function applyClassArchetypeChoice(classFeature){ + if(wscChoiceStruct.Character.optionClassArchetypes == 0){ return null; } + + if(classFeature.level != 1 && classFeature.level != null){ return null; } + if(classFeature.code == null){ return null; } + + const classFeatureCodeUpper = classFeature.code.toUpperCase(); + + let foundClassFeatureArchetypeChoices = function(classFeatureCodeUpper){ + let classArchetypes = []; + for(let classArchetype of g_classArchetypes){ + + let detectedCodeInClassFeature = function(){ + for(let detectionCode of classArchetype.replacementCode.initial.detectionCode){ + + if(detectionCode.includes(g_classArchetypeDetectionCodeOR)){ + + let detectionCodeParts = detectionCode.split(g_classArchetypeDetectionCodeOR); + if(classFeatureCodeUpper.includes(detectionCodeParts[0].toUpperCase()) || classFeatureCodeUpper.includes(detectionCodeParts[1].toUpperCase())){ + // Found + } else { + return false; + } + + } else { + if(!classFeatureCodeUpper.includes(detectionCode.toUpperCase())){ + return false; + } + } + + } + return true; + }; + let foundDetectionCode = detectedCodeInClassFeature(); + + if(foundDetectionCode){ + classArchetypes.push(classArchetype); + } + + } + return classArchetypes; + }; + + let foundArchetypes = foundClassFeatureArchetypeChoices(classFeatureCodeUpper); + if(foundArchetypes.length == 0) { return null; } + g_classArchetypeTryCount++; + + let tabsID = 'classArchetypeTabs-'+g_classArchetypeTryCount; + + let classArchetypeHTML = ''; + for(let classArchetype of foundArchetypes){ + classArchetypeHTML += ` +
              • + + ${classArchetype.name} Class Archetype + +
              • + `; + } + + const tabsHTML = ` +
                + +
                +
                + `; + + return { + tabsID, + tabsHTML, + }; + +} + +function assembleClassArchetypeTabs(tabsID, classFeatureID, originalDescription){ + + $('#'+tabsID+' > li > .classArchetypeTab').off('click'); + $('#'+tabsID+' > li > .classArchetypeTab').click(function(event, autoPageLoad){ + if($(this).parent().hasClass('is-active')) { return; } + $(this).parent().parent().find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + + const tabID = $(this).attr('id'); + let classArchetypeID = tabID.replace(tabsID+'-option-', ''); + + if(classArchetypeID == 'default'){ + $('#'+tabsID+'-description').html(processText(originalDescription, false, null)); + + g_classArchetypeSelectedOptions.set(classFeatureID, null); + + if(autoPageLoad == null || !autoPageLoad){ + g_classArchetypeChosenArchetype = null; + socket.emit("requestClassArchetypeChange", + getCharIDFromURL(), + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'classArchetype', + sourceCodeSNum: 'a', + }, + null); + } + + } else { + + // Set all other class archetypes to default + $('.classArchetypeTab').each(function() { + if(!$(this).attr('id').startsWith(tabsID)){ + $('#'+$(this).attr('id').split('-option-')[0]+'-option-default').trigger("click", [true]); + } + }); + + let classArchetype = g_classArchetypes.find(classArchetype => { + return classArchetype.id == classArchetypeID; + }); + + if(classArchetype.replacementCode.initial.textChangeType == 'REPLACE'){ + $('#'+tabsID+'-description').html(processText(classArchetype.replacementCode.initial.archetypeText, false, null)); + } else if(classArchetype.replacementCode.initial.textChangeType == 'ADD'){ + $('#'+tabsID+'-description').html(processText(`${classArchetype.replacementCode.initial.archetypeText}\n----\n${originalDescription}`, false, null)); + } + + g_classArchetypeSelectedOptions.set(classFeatureID, classArchetype); + + if(autoPageLoad == null || !autoPageLoad){ + g_classArchetypeChosenArchetype = classArchetype; + socket.emit("requestClassArchetypeChange", + getCharIDFromURL(), + { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'classArchetype', + sourceCodeSNum: 'a', + }, + classArchetype.id); + } + + } + + if(autoPageLoad == null || !autoPageLoad){ + + // Update class feature code + if(temp_classAbilities != null && temp_classNum != null){ + processBuilderCode_ClassAbilities(temp_classAbilities, temp_classNum); + } + // and selectors, + $('.classAbilSelection').trigger("change", [false, true]); + + } + + }); + + // If archetype is selected and id exists, + if(g_classArchetypeChosenArchetype != null && $('#'+tabsID+'-option-'+g_classArchetypeChosenArchetype.id).length){ + $('#'+tabsID+'-option-'+g_classArchetypeChosenArchetype.id).trigger("click", [true]); + } else { + $('#'+tabsID+'-option-default').trigger("click", [true]); + } + +} + +/// + +function replaceClassFeatureCodeFromClassArchetype(classFeatureID, classFeatureCode, srcStruct){ + if(wscChoiceStruct.Character.optionClassArchetypes == 0){ return classFeatureCode; } + + // Replace changes code + classFeatureCode = replaceCodeFromClassArchetype(classFeatureCode, srcStruct); + + // Replace initial code + let classArchetype = g_classArchetypeSelectedOptions.get(classFeatureID); + if(classArchetype == null) { return classFeatureCode; } + + let newWscCode = ''; + + // Replace detection statement with replacement statement + if(classArchetype.replacementCode.initial.replacementStatement != null){ + + let newWscStatements = []; + let wscStatements = classFeatureCode.split(/\n/); + for(let wscStatementRaw of wscStatements) { + + // Test/Check Statement for Expressions // + let wscStatement = testExpr(wscStatementRaw); + if(wscStatement == null) { + newWscStatements.push(wscStatementRaw); + continue; + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + for(const detectionCode of classArchetype.replacementCode.initial.detectionCode){ + + let detectedCodeInStatement = function(){ + if(detectionCode.includes(g_classArchetypeDetectionCodeOR)){ + + let detectionCodeParts = detectionCode.split(g_classArchetypeDetectionCodeOR); + if(wscStatement.toUpperCase().includes(detectionCodeParts[0].toUpperCase()) || wscStatement.toUpperCase().includes(detectionCodeParts[1].toUpperCase())){ + return true; + } + + } else { + if(wscStatement.toUpperCase().includes(detectionCode.toUpperCase())){ + return true; + } + } + return false; + }; + + if(detectedCodeInStatement()){ + + let replacementStatement = classArchetype.replacementCode.initial.replacementStatement; + wscStatementRaw = wscStatementRaw.replace(wscStatement, replacementStatement); + wscStatement = replacementStatement; + + } + } + + if(wscStatementRaw != ''){ + newWscStatements.push(wscStatementRaw); + } + } + + // Assemble new wscCode + for(const newWscStatement of newWscStatements){ + newWscCode += newWscStatement+'\n'; + } + newWscCode = newWscCode.slice(0, -1); // Trim off that last '\n' + + } else { + + newWscCode = classFeatureCode; + + } + + // Add clear metadata + if(classArchetype.replacementCode.initial.replacementStatement != null || classArchetype.replacementCode.initial.extraCode != null){ + if(classArchetype.replacementCode.initial.clearDataAfterExtraCode != null && !classArchetype.replacementCode.initial.clearDataAfterExtraCode){ + // Don't clear + } else { + newWscCode = 'CLEAR-DATA-FROM-CODE-BLOCK\n'+newWscCode; + } + } + + // Added extra code + if(classArchetype.replacementCode.initial.extraCode != null){ + newWscCode = classArchetype.replacementCode.initial.extraCode+'\n'+newWscCode; + } + + /* + + Order will be: + + Extra Code, + Clear, + Original Code + + */ + + return newWscCode; + +} + + +function replaceCodeFromClassArchetype(wscCode, srcStruct){ + if(g_classArchetypeChosenArchetype == null) { return wscCode; } + + if(g_classArchetypeChosenArchetype.dedicationFeatName != null){ + + if(wscChoiceStruct.Character.variantFreeArchetype == 0){ + if(wscCode.trim() == 'GIVE-CLASS-FEAT=2' && srcStruct.sourceLevel == 2 && srcStruct.sourceType == 'class'){ + removeUnselectedData(srcStruct); + return `GIVE-FEAT-NAME=${g_classArchetypeChosenArchetype.dedicationFeatName}\nADD-TEXT=Because of your class archetype, you must select (feat: ${g_classArchetypeChosenArchetype.dedicationFeatName}) as your 2nd-level class feat.`; + } + } else { + if(wscCode.trim() == 'GIVE-ARCHETYPE-FEAT=2' && srcStruct.sourceLevel == 2 && srcStruct.sourceType == 'class'){ + removeUnselectedData(srcStruct); + return `GIVE-FEAT-NAME=${g_classArchetypeChosenArchetype.dedicationFeatName}\nADD-TEXT=Because of your class archetype, you must select (feat: ${g_classArchetypeChosenArchetype.dedicationFeatName}) as your 2nd-level class feat.`; + } + } + + } + + if(g_classArchetypeChosenArchetype.replacementCode.changes == null) { return wscCode; } + + let newWscCode = ''; + + let extraCodes = []; + let extraTexts = []; + + let newWscStatements = []; + let wscStatements = wscCode.split(/\n/); + for(let wscStatementRaw of wscStatements) { + + // Test/Check Statement for Expressions // + let wscStatement = testExpr(wscStatementRaw); + if(wscStatement == null) { + newWscStatements.push(wscStatementRaw); + continue; + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let findAndApplyStatementChanges = function(){ + for(const change of g_classArchetypeChosenArchetype.replacementCode.changes){ + if(wscStatement.toUpperCase().includes(change.detectionCode.toUpperCase())){ + if(change.replacementStatement != null){ + + let replacementStatement = change.replacementStatement; + wscStatementRaw = wscStatementRaw.replace(wscStatement, replacementStatement); + wscStatement = replacementStatement; + + } + if(change.extraCode != null){ + extraCodes.push(change.extraCode); + } + if(change.extraText != null){ + extraTexts.push(change.extraText); + } + return; + } + } + }; + findAndApplyStatementChanges(); + + if(wscStatementRaw != ''){ + newWscStatements.push(wscStatementRaw); + } + } + + // Assemble new wscCode + for(const newWscStatement of newWscStatements){ + newWscCode += newWscStatement+'\n'; + } + newWscCode = newWscCode.slice(0, -1); // Trim off that last '\n' + + // Add clear metadata + if(wscCode != newWscCode || extraCodes.length > 0){ + if(g_classArchetypeChosenArchetype.replacementCode.initial.clearDataAfterExtraCodeForChange != null && !g_classArchetypeChosenArchetype.replacementCode.initial.clearDataAfterExtraCodeForChange){ + // Don't clear + } else { + newWscCode = 'CLEAR-DATA-FROM-CODE-BLOCK\n'+newWscCode; + } + } + + // Add extra code + for(let extraCode of extraCodes){ + newWscCode = extraCode+'\n'+newWscCode; + } + + // Add extra text + for(let extraText of extraTexts){ + newWscCode += '\nADD-TEXT='+extraText; + } + + /* + + Order will be: + + Extra Code, + Clear, + Original Code, + Extra Text + + */ + + return newWscCode; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/variants/dual-class.js b/client/vue-src/legacy-js/char_builders/variants/dual-class.js new file mode 100644 index 00000000..a7dafcfb --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/variants/dual-class.js @@ -0,0 +1,7 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function hasDualClassVariant(){ + return false; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/variants/free-archetype.js b/client/vue-src/legacy-js/char_builders/variants/free-archetype.js new file mode 100644 index 00000000..6adb602f --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/variants/free-archetype.js @@ -0,0 +1,25 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function addFreeArchetypeVariant(classStruct){ + for (let lvl = 2; lvl <= 20; lvl += 2) { + classStruct.Abilities.push(getArchetypeClassAbility(lvl)); + } + return classStruct; +} + +function getArchetypeClassAbility(lvl){ + return { + id: -1000+(-1*lvl), + name: "Archetype Feat", + level: lvl, + description: "You gain a class feat that you can only select archetype feats with.", + code: "GIVE-ARCHETYPE-FEAT="+lvl, + contentSrc: "CRB", + displayInSheet: 0, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/variants/gradual-ability-boosts.js b/client/vue-src/legacy-js/char_builders/variants/gradual-ability-boosts.js new file mode 100644 index 00000000..df944647 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/variants/gradual-ability-boosts.js @@ -0,0 +1,69 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function addGradualAbilityBoostsVariant(classStruct){ + + let newAbilities = []; + for(let ability of classStruct.Abilities){ + if (ability.code != null && ability.code.startsWith('GIVE-ABILITY-BOOST-MULTIPLE=4') && (ability.level == 5 || ability.level == 10 || ability.level == 15 || ability.level == 20)){ + + let extraStatement = null; + if(ability.code.includes('\n')){ + let statements = ability.code.split(/\n/); + if(statements.length == 5 && statements[1] == statements[2] && statements[1] == statements[3] && statements[1] == statements[4]){ + extraStatement = statements[1]; + } + } + + newAbilities.push(getGAB_AbilityBoost(ability.level, extraStatement)); + newAbilities.push(getGAB_AbilityBoost(ability.level-1, extraStatement)); + newAbilities.push(getGAB_AbilityBoost(ability.level-2, extraStatement)); + newAbilities.push(getGAB_AbilityBoost(ability.level-3, extraStatement)); + + } else { + newAbilities.push(ability); + } + } + + // Set and re-sort the abilities array... + classStruct.Abilities = newAbilities.sort( + function(a, b) { + if (a.level === b.level) { + // Name is only important when levels are the same + return a.name > b.name ? 1 : -1; + } + return a.level - b.level; + } + ); + + return classStruct; +} + +function getGAB_AbilityBoost(lvl, extraStatement){ + let setText = ''; + if(lvl > 1 && lvl <= 5) { + setText = '2nd-5th level boosts'; + } else if(lvl > 6 && lvl <= 10) { + setText = '7th-10th level boosts'; + } else if(lvl > 11 && lvl <= 15) { + setText = '12th-15th level boosts'; + } else if(lvl > 16 && lvl <= 20) { + setText = '17th-20th level boosts'; + } + return { + id: -3000+(-1*lvl), + name: "Ability Boosts", + level: lvl, + description: ` + You gain a single boost in an ability score. This boost increases an ability score by 2, or by 1 if it's already 18 or above. + \n__You can't choose the same ability score more than once per set (${setText}).__ + `, + code: `GIVE-ABILITY-BOOST-SINGLE=ALL${(extraStatement == null) ? '' : '\n'+extraStatement}`, + contentSrc: "CRB", + displayInSheet: 0, + selectType: "NONE", + selectOptionFor: null, + isArchived: 0, + }; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/display-structs.js b/client/vue-src/legacy-js/char_builders/wsc/display-structs.js new file mode 100644 index 00000000..290fc7ff --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/display-structs.js @@ -0,0 +1,23 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + + +function displaySpell(locationID, spell){ + let buttonClass = locationID+'-spellView-'+spell.Spell.id; + $('#'+locationID).html(''); + + let inSpellName = spell.Spell.name.replace(/’/g,'\'').toUpperCase(); + for(const [spellID, spellDataStruct] of g_spellMap.entries()){ + let spellName = spellDataStruct.Spell.name.toUpperCase(); + if(inSpellName === spellName && spellDataStruct.Spell.isArchived == 0) { + $('.'+buttonClass).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + return; + } + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/feats-selection.js b/client/vue-src/legacy-js/char_builders/wsc/feats-selection.js new file mode 100644 index 00000000..80759082 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/feats-selection.js @@ -0,0 +1,385 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_featPrereqMap = new Map(); +let g_featSelectionMap = new Map(); + +function giveFeatSelection(locationID, srcStruct, selectionName, selectionMap, sourceName){ + + let featSelectionLocID = "featSelect-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + $('#'+locationID).append('
                '); + generateFeatSelection(featSelectionLocID, srcStruct, selectionName, selectionMap, sourceName); + +} + +function generateFeatSelection(contentLocID, srcStruct, selectionName, selectionMap, sourceName){ + g_featSelectionMap.set(contentLocID, { + SrcStruct: srcStruct, + SelectionName: selectionName, + SelectionMap: selectionMap, + SourceName: sourceName, + }); + + // Find selectedFeat // + let featData = wscChoiceStruct.FeatArray.find(featData => { + return hasSameSrc(featData, srcStruct); + }); + let selectedFeat = null; + if(featData != null && featData.value != null){ + selectedFeat = g_featMap.get(featData.value.id+""); + } + // ~~~~~~~~~~~~~~~~~ // + + let openFeatDetailsClass = "openFeat-"+contentLocID; + let openFeatListClass = "openList-"+contentLocID; + + let featListSectionClass = "featListSection-"+contentLocID; + let featDropdownIconClass = "featDropdownIcon-"+contentLocID; + + let featCodeSectionID = "featCode-"+contentLocID; + + let featSelectButtonClass = "featSelectBtn-"+contentLocID; + let featRemoveButtonClass = "featRemoveBtn-"+contentLocID; + + if(selectedFeat == null) { + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Feat', 'UNSELECTED'); + + $('#'+contentLocID).html('
                '+selectionName+'
                '); + } else { + const selectionTagInfo = (meetsPrereqs(selectedFeat.Feat) == 'FALSE') ? getTagFromData(srcStruct, sourceName, 'Prerequisites Not Met', 'INCORRECT') : getTagFromData(srcStruct, sourceName, '', ''); + + let featNameHTML = ''+selectedFeat.Feat.name+''; + if(selectedFeat.Feat.isArchived === 1){ featNameHTML += ' - Archived'; } + let featLevelHTML = ''; + if(selectedFeat.Feat.level > 0){ featLevelHTML = ' Lvl '+selectedFeat.Feat.level+''; } + $('#'+contentLocID).html('
                '+featNameHTML+''+featLevelHTML+'
                '); + } + + let sortedSelectionMap = new Map(); + if(wscChoiceStruct.Character.optionAutoDetectPreReqs === 1) { + for(let [featLevel, featArray] of selectionMap.entries()){ + + // Sort feat array by level -> prereq -> name + let sortedFeatArray = featArray.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Prereq is only important when levels are the same + let a_meets = prereqToValue(g_featPrereqMap.get(a.Feat.id+'')); + let b_meets = prereqToValue(g_featPrereqMap.get(b.Feat.id+'')); + if(a_meets === b_meets) { + // Name is only important when prereqs are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return b_meets - a_meets; + } + return a.Feat.level - b.Feat.level; + } + ); + sortedSelectionMap.set(featLevel, sortedFeatArray); + + } + } + + let featListHTML = ''; + let displayedFeat = false; + for(let [featLevel, featArray] of selectionMap.entries()){ + + if(featLevel > 0){ + featListHTML += '
                Level '+featLevel+'
                '; + } + + // If all the feats of a given level start with the same 'Text - ...', remove the 'Text - ' + let detectSameBeginningDashText = function(){ + let beginningDashText = null; + for(const featData of featArray){ + if(beginningDashText == null){ + if(featData.Feat.name.includes(' - ')){ + beginningDashText = featData.Feat.name.split(' - ')[0]; + } else { + return null; + } + } else { + if(!featData.Feat.name.startsWith(beginningDashText+' - ')){ + return null; + } + } + } + return beginningDashText; + }; + const beginningDashText = detectSameBeginningDashText(); + + for(let featData of featArray) { + + let featNameHTML = ''+featData.Feat.name.replace(beginningDashText+' - ', '')+''; + + if(featData.Feat.isArchived === 1){ + if(selectedFeat != null && selectedFeat.Feat.id == featData.Feat.id){ + featNameHTML += ' - Archived'; + } else { + continue; + } + } + + let rightInfoHTML = ''; + if(featData.Feat.skillID != null){ + rightInfoHTML = ''+getSkillNameAbbrev(getSkillIDToName(featData.Feat.skillID))+''; + } + + /* + let featRarityClass = ''; + if(featData.Feat.rarity == 'UNCOMMON'){ + featRarityClass = 'is-uncommon'; + } else if(featData.Feat.rarity == 'RARE'){ + featRarityClass = 'is-rare'; + } else if(featData.Feat.rarity == 'UNIQUE'){ + featRarityClass = 'is-unique'; + }*/ + + let hasFeat = (featData.Feat.canSelectMultiple == 0 && hasDuplicateFeat(wscChoiceStruct.FeatArray, featData.Feat.id)); + if(selectedFeat != null && selectedFeat.Feat.id == featData.Feat.id){ + featListHTML += '
                '+featNameHTML+'
                '+rightInfoHTML+'
                '; + } else if(hasFeat) { + featListHTML += '
                '+featNameHTML+'
                '+rightInfoHTML+'
                '; + } else { + featListHTML += '
                '+featNameHTML+'
                '+rightInfoHTML+'
                '; + } + displayedFeat = true; + + } + } + if(!displayedFeat){ + // No feat displayed, + featListHTML = ` +
                +
                None
                + `; + } + $('.'+featListSectionClass).html('
                '+featListHTML+'
                '); + + + if(selectedFeat != null) { + $('.'+openFeatDetailsClass).click(function(event) { + openQuickView('featView', { + Feat : selectedFeat.Feat, + Tags : selectedFeat.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }); + }); + + $('.'+openFeatDetailsClass).mouseenter(function(){ + $('.'+openFeatDetailsClass).addClass('feat-selection-is-hovered'); + }); + $('.'+openFeatDetailsClass).mouseleave(function(){ + $('.'+openFeatDetailsClass).removeClass('feat-selection-is-hovered'); + }); + + $('.'+openFeatListClass).mouseenter(function(){ + $(this).addClass('feat-selection-is-hovered'); + }); + $('.'+openFeatListClass).mouseleave(function(){ + $(this).removeClass('feat-selection-is-hovered'); + }); + } + + $('.'+openFeatListClass).click(function() { + if($('.'+featListSectionClass).hasClass('is-hidden')){ + $('.'+featDropdownIconClass).removeClass('fa-chevron-down'); + $('.'+featDropdownIconClass).addClass('fa-chevron-up'); + populatePrereqIcons(featListSectionClass); + $('.'+featListSectionClass).removeClass('is-hidden'); + } else { + $('.'+featDropdownIconClass).removeClass('fa-chevron-up'); + $('.'+featDropdownIconClass).addClass('fa-chevron-down'); + $('.'+featListSectionClass).addClass('is-hidden'); + } + }); + + $('.'+featSelectButtonClass).click(function() { + $(this).addClass('is-loading'); + let featID = $(this).attr('data-feat-id'); + let feat = g_featMap.get(featID); + featsUpdateWSCChoiceStruct(srcStruct, feat.Feat); + socket.emit("requestFeatChange", + getCharIDFromURL(), + {srcStruct, feat, featID, codeLocationID : featCodeSectionID }); + }); + + $('.'+featRemoveButtonClass).click(function() { + $(this).addClass('is-loading'); + featsUpdateWSCChoiceStruct(srcStruct, null); + socket.emit("requestFeatChange", + getCharIDFromURL(), + {srcStruct, feat : null, featID : null, codeLocationID : featCodeSectionID }); + }); + + updateFeatSelectionEntryEvents(); + + if(selectedFeat != null){ + processBuilderCode( + selectedFeat.Feat.code, + srcStruct, + featCodeSectionID, + selectedFeat.Feat.name); + } + +} + +socket.on("returnFeatChange", function(featChangePacket){ + + // Updating feat selections will run code for all feats (including this one) + updateAllFeatSelections(); + selectorUpdated(); + + // If leftStatsQuickview is open, refresh it + if($('#quickviewLeftDefault').hasClass('is-active')){ + openLeftQuickView('skillsView', null); + } + + // If dedication is switched, reload all class abilities // + //if(featChangePacket.autoPageLoad != null && !featChangePacket.autoPageLoad){} + + // Get number of character archetypes + let charArchetypesArray = []; + for(let featChoice of wscChoiceStruct.FeatArray){ + if(featChoice.value != null) { + let feat = g_featMap.get(featChoice.value.id+""); + if(feat != null){ + let dedicationTag = feat.Tags.find(featTag => { + return featTag.name === 'Dedication'; + }); + if(dedicationTag != null){ + charArchetypesArray.push(featChoice.value.id); + } + } + } + } + + // Get number of current archetype tabs + let maxArchetypesLength = 0; + $('.classFeatTabs').each(function() { + let archetypesTabClass = $(this).attr('data-arch-tab-class'); + let archLength = $('.'+archetypesTabClass).length; + if (archLength > maxArchetypesLength) { + maxArchetypesLength = archLength; + } + }); + + // Changed feat has Dedication tag + let featDedicationTag = null; + if(featChangePacket.feat != null){ + featDedicationTag = featChangePacket.feat.Tags.find(featTag => { + return featTag.name === 'Dedication'; + }); + } + + // If they aren't the same amount, reload class abilities + if(maxArchetypesLength != charArchetypesArray.length || featDedicationTag != null) { + if(temp_classAbilities != null && temp_classNum != null){ + processBuilderCode_ClassAbilities(temp_classAbilities, temp_classNum); + } + } + +}); + + +function updateAllFeatSelections(){ + + $(".feat-selection").each(function(){ + + let contentLocID = $(this).attr('data-contentLoc-id'); + let featData = g_featSelectionMap.get(contentLocID); + if(featData != null){ + generateFeatSelection(contentLocID, + featData.SrcStruct, + featData.SelectionName, + featData.SelectionMap, + featData.SourceName); + } + + }); + +} + +function featsUpdateWSCChoiceStruct(srcStruct, feat){ + + let foundFeatData = false; + for(let featData of wscChoiceStruct.FeatArray){ + if(hasSameSrc(featData, srcStruct)){ + foundFeatData = true; + featData.value = feat; + break; + } + } + + if(!foundFeatData){ + let featData = srcStruct; + featData.value = feat; + wscChoiceStruct.FeatArray.push(featData); + } + + injectWSCChoiceStruct(wscChoiceStruct); + +} + +function featsRemoveFromWSCChoiceStruct(srcStruct, ignoreSNum){ + + for(let featData of wscChoiceStruct.FeatArray){ + if(ignoreSNum) { + if(!hasSameSrcAnySNum(featData, srcStruct)){ continue; } + } else { + if(!hasSameSrc(featData, srcStruct)){ continue; } + } + featData.value = null; + } + + injectWSCChoiceStruct(wscChoiceStruct); + +} + +function updateFeatSelectionEntryEvents(){ + + // Feat Selection Entry Events // + $('.feat-selection-list-entry').unbind(); + $('.feat-selection-list-entry').mouseenter(function(){ + $(this).addClass('is-selected'); + }); + $('.feat-selection-list-entry').mouseleave(function(){ + $(this).removeClass('is-selected'); + }); + + $('.feat-selection-list-entry-view').unbind(); + $('.feat-selection-list-entry-view').click(function(){ + let featID = $(this).parent().attr('data-feat-id'); + let feat = g_featMap.get(featID); + openQuickView('featView', { + Feat : feat.Feat, + Tags : feat.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }); + }); + +} + +function populatePrereqIcons(featListSectionClass){ + if(wscChoiceStruct.Character.optionAutoDetectPreReqs !== 1) { return; } + + $('.'+featListSectionClass+' .feat-selection-list .feat-selection-list-entry').each(function(){ + let feat = g_featMap.get($(this).attr('data-feat-id')); + let preReqResult = meetsPrereqs(feat.Feat); + + let preReqIconHTML = ''; + if(preReqResult == 'TRUE'){ + preReqIconHTML = ' '+preReqGetIconTrue(); + } else if(preReqResult == 'FALSE'){ + preReqIconHTML = ' '+preReqGetIconFalse(); + } else if(preReqResult == 'UNKNOWN'){ + preReqIconHTML = ' '+preReqGetIconUnknown(); + } + $(this).find(".featPrereqIcon").html(preReqIconHTML); + + g_featPrereqMap.set(feat.Feat.id+'', preReqResult); + + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/init-processing.js b/client/vue-src/legacy-js/char_builders/wsc/init-processing.js new file mode 100644 index 00000000..eefa9aab --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/init-processing.js @@ -0,0 +1,465 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ========================================================================================= // +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Wanderer's Guide Code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // +// ========================================================================================= // + +const processingDebug = false; + +// Global Variables // +let codeQueue = []; +let runningCodeQueue = false; +let gCode_statements, gCode_srcStruct, gCode_locationID, gCode_sourceName; +let wscChoiceStruct = null; +let wscMapsInit = false; +let g_langMap, g_archetypes, g_profMap = null; +let temp_classAbilities, temp_classNum, temp_ancestryFeatsLocs = null; +// // + +function processBuilderCode(wscCode, srcStruct, locationID, sourceName=''){ + if(wscCode == null || wscCode == ''){ return; } + + // Process Variables + wscCode = processVariables(wscCode, `builderCode-${srcStructToCompositeKey(srcStruct)}`); + + // Process ADD-TEXT Statements + processAddText(wscCode, locationID, true); + + // Add Loading Animiation // + $('#'+locationID).append('
                '); + + // Uppercase all code (to make everything case insensitive) + wscCode = wscCode.toUpperCase(); + + // Clone srcStruct object (to prevent some concurrency issues) + let newSrcStruct = cloneObj(srcStruct); + + if(wscChoiceStruct == null){ + displayError("WSC ChoiceStruct Has Not Been Init!"); + if(processingDebug) {console.error("WSC ChoiceStruct Has Not Been Init!");} + return; + } + + codeDecompiling(wscCode, newSrcStruct, locationID, sourceName); + +} + +function codeDecompiling(wscCode, srcStruct, locationID, sourceName){ + + codeQueue.push({ wscCode, srcStruct, locationID, sourceName }); + + if(!runningCodeQueue){ + + runningCodeQueue = true; + if(!wscMapsInit){ + //if(processingDebug) {console.log("Did not find valid WSC Maps :(");} + socket.emit("requestWSCMapsInit", + getCharIDFromURL()); + } else { + //if(processingDebug) {console.log("> Found a valid WSC Maps!");} + shiftCodeQueue(); + } + + } + +} + +function stopCodeProcessing(){ + codeQueue = []; + gCode_statements = null; + gCode_srcStruct = null; + gCode_locationID = null; + gCode_sourceName = null; +} + +socket.on("returnWSCMapsInit", function(){ + //if(processingDebug) {console.log("Setting WSC Maps...");} + wscMapsInit = true; + + initExpressionProcessor({ + ChoiceStruct : wscChoiceStruct, + }); + + window.setTimeout(() => { + shiftCodeQueue(); + }, 100); +}); + +function shiftCodeQueue(){ + + runningCodeQueue = true; + let code = codeQueue.shift(); + + if(processingDebug) {console.log("Starting Code Queue:");} + if(processingDebug) {console.log(code);} + if(code != null){ + gCode_statements = code.wscCode.split(/\n/); + gCode_locationID = code.locationID; + gCode_sourceName = code.sourceName; + + code.srcStruct.sourceCodeSNum = 'a'+code.srcStruct.sourceCodeSNum; + gCode_srcStruct = code.srcStruct; + + let stateReturn = runNextStatement(); + if(stateReturn === 'END'){ + if(processingDebug) {console.log("Code Queue Complete - only 1 statement!");} + shiftCodeQueue(); + } else if(stateReturn === 'SKIP'){ + statementComplete(); + } + } else { + runningCodeQueue = false; + if(processingDebug) {console.log("No More Code Queues Remaining :)");} + finishLoadingPage(); + } + +} + +function statementComplete(){ + if(gCode_srcStruct == null) { return; } + if(processingDebug) {console.log("Statement Complete, onto next statement...");} + + if(processingDebug) {console.log(gCode_srcStruct.sourceCodeSNum);} + // Up ticks the first digit in the sourceCodeSNum string. + let sourceCodeSNum = gCode_srcStruct.sourceCodeSNum; + let firstChar = sourceCodeSNum[0]; // Get first char + sourceCodeSNum = sourceCodeSNum.substr(1); // Remove first char + firstChar = charIncrease(firstChar); + if(firstChar == null){ + displayError("Attempted to run more WSC statements than maximum!"); + return; + } + sourceCodeSNum = firstChar+sourceCodeSNum; + gCode_srcStruct.sourceCodeSNum = sourceCodeSNum; + if(processingDebug) {console.log(gCode_srcStruct.sourceCodeSNum);} + + let stateReturn = runNextStatement(); + if(stateReturn === 'END'){ + if(processingDebug) {console.log("Code Queue Complete");} + shiftCodeQueue(); + } else if(stateReturn === 'SKIP'){ + statementComplete(); + } +} + +function runNextStatement(){ + + let wscStatement = gCode_statements.shift(); + let srcStruct = { + sourceType: gCode_srcStruct.sourceType, + sourceLevel: gCode_srcStruct.sourceLevel, + sourceCode: gCode_srcStruct.sourceCode, + sourceCodeSNum: gCode_srcStruct.sourceCodeSNum, + }; + let locationID = gCode_locationID; + let sourceName = gCode_sourceName; + + if(processingDebug) {console.log('SRC-STRUCT');} + if(processingDebug) {console.log(srcStruct);} + if(processingDebug) {console.log(wscStatement);} + + // Remove Loading Animiation // + $('#'+locationID+' .wsc-statement-roller').remove(); + + if(wscStatement != null){ + if(wscStatement.trim() == ''){ return 'SKIP'; } + if(wscStatement.endsWith(',')){ wscStatement = wscStatement.slice(0, -1); } + + // Test/Check Statement for Expressions // + wscStatement = testExpr(wscStatement, srcStruct); + if(wscStatement == null) { + socket.emit("requestDataClearAtSrcStruct", + getCharIDFromURL(), + srcStruct); + return 'SKIP'; + } + if(wscStatement.trim() == ''){ return 'SKIP'; } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + // Test/Check if Statement is a Sheet Statement // + if(testSheetCode(wscStatement)){ + if(processingDebug) {console.log("Skipping '"+wscStatement+"' because it's a sheet statement.");} + return 'SKIP'; + } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + if(wscStatement == "CLEAR-DATA-FROM-CODE-BLOCK"){ + clearDataFromSrcStruct(srcStruct); + return 'WAIT'; + } + + if(wscStatement.includes("-SCFS")){ // Needs to come before the rest + processingSCFS(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-CHAR-TRAIT")){ + processingCharTags(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-PHYSICAL-FEATURE")){ + processingPhysicalFeatures(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-SENSE")){ + processingSenses(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-CLASS-FEATURE")){ + processingClassFeatures(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-FEAT")){ + processingFeats(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-PROF")){ + processingProf(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-SKILL")){ + processingSkills(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-LANG")){ + processingLangs(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-ABILITY-BOOST")){ + processingAbilityBoosts(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-INNATE")){ + processingInnateSpells(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-FOCUS")){ + processingFocusSpells(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-SPELL")){ + processingSpells(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-LORE")){ + processingLore(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-RESISTANCE") || wscStatement.includes("-WEAKNESS")){ + processingResistances(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-DOMAIN")){ + processingDomains(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-SPECIALIZATION")){ + processingSpecializations(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-FAMILIARITY")){ + processingFamiliarities(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-NOTES")){ + processingNotes(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-SPEED")){ + processingSpeeds(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-KEY-ABILITY")){ + processingKeyAbilities(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("-HERITAGE-EFFECTS")){ + processingHeritageEffects(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + if(wscStatement.includes("ADD-TEXT")){ + processingAddText(wscStatement, srcStruct, locationID, sourceName); + return 'WAIT'; + } + + displayError("Unknown statement (1): \'"+wscStatement+"\'"); + return 'END'; + + } else { + return 'END'; + } + +} + + +socket.on("returnWSCStatementFailure", function(details){ + if(details != null){ + displayError("Statement failure: \'"+details+"\'"); + } else { + displayError("Unknown statement failure"); + } + statementComplete(); +}); + +///////////// + +function injectWSCChoiceStruct(choiceStruct){ + wscChoiceStruct = choiceStruct; + g_profMap = objToMap(choiceStruct.ProfObject); + updateExpressionProcessor({ + ChoiceStruct : choiceStruct, + }); +} + +socket.on("returnWSCUpdateChoices", function(updateType, updateData){ + //if(processingDebug) {console.log("Updating choiceStruct part...");} + + if(updateType == 'ABILITY-BOOSTS'){ + wscChoiceStruct.BonusArray = updateData; + updateAbilityMap(); + } else if(updateType == 'FEATS'){ + wscChoiceStruct.FeatArray = updateData; + } else if(updateType == 'DOMAINS'){ + wscChoiceStruct.DomainArray = updateData; + } else { + displayError("Failed to update correct charChoice data!"); + if(processingDebug) {console.error('Failed to update correct charChoice data!');} + } + + updateExpressionProcessor({ + ChoiceStruct : wscChoiceStruct, + }); +}); + +socket.on("returnWSCUpdateFeats", function(featObject){ + let featMap = objToMap(featObject); + featMap = new Map([...featMap.entries()].sort( + function(a, b) { + if (a[1].Feat.level === b[1].Feat.level) { + // Name is only important when levels are the same + return a[1].Feat.name > b[1].Feat.name ? 1 : -1; + } + return b[1].Feat.level - a[1].Feat.level; + }) + ); + //if(processingDebug) {console.log("Updating featMap...");} + g_featMap = featMap; + g_featMap = updateFeatMapWithMiscs(g_featMap); +}); + +socket.on("returnWSCUpdateLangs", function(langObject){ + let langMap = objToMap(langObject); + //if(processingDebug) {console.log("Updating langMap...");} + g_langMap = new Map([...langMap.entries()].sort( + function(a, b) { + return a[1].Lang.name > b[1].Lang.name ? 1 : -1; + }) + ); +}); + +socket.on("returnWSCUpdateSpells", function(spellObject){ + let spellsMap = objToMap(spellObject); + spellsMap = new Map([...spellsMap.entries()].sort( + function(a, b) { + if (a[1].Spell.level === b[1].Spell.level) { + // Name is only important when levels are the same + return a[1].Spell.name > b[1].Spell.name ? 1 : -1; + } + return b[1].Spell.level - a[1].Spell.level; + }) + ); + //if(processingDebug) {console.log("Updating spellMap...");} + g_spellMap = spellsMap; +}); + +socket.on("returnWSCUpdateArchetypes", function(archetypesArray){ + //if(processingDebug) {console.log("Updating ArchetypesArray...");} + g_archetypes = archetypesArray; +}); + +////////////// + +function clearDataFromSrcStruct(srcStruct){ + let newSrcStruct = cloneObj(srcStruct); + newSrcStruct.sourceCodeSNum = newSrcStruct.sourceCodeSNum.substring(1); + socket.emit("requestWSCSrcStructDataClear",// FYI - No longer returns choiceStruct + getCharIDFromURL(), + newSrcStruct); +} + +socket.on("returnWSCSrcStructDataClear", function(choiceStruct){ + injectWSCChoiceStruct(choiceStruct); + statementComplete(); +}); + +////////////// + +function processBuilderCode_ClassAbilities(classAbilities, classNum){ + //if(processingDebug) {console.log("Starting to run class abilities code...");} + temp_classAbilities = classAbilities; + temp_classNum = classNum; + for(const classAbility of classAbilities) { + if(classAbility.selectType != 'SELECT_OPTION' && classAbility.level <= wscChoiceStruct.Character.level) { + let srcStruct = { + sourceType: getClassSourceType(classNum), + sourceLevel: classAbility.level, + sourceCode: 'classAbility-'+classAbility.id, + sourceCodeSNum: 'a', + }; + + const classFeatureCode = replaceClassFeatureCodeFromClassArchetype(classAbility.id, classAbility.code, srcStruct); + + $('#classAbilityCode-'+classNum+'-'+classAbility.id).html(''); + processBuilderCode( + classFeatureCode, + srcStruct, + 'classAbilityCode-'+classNum+'-'+classAbility.id, + classAbility.name+' (Lvl '+classAbility.level+')'); + } + } +} + +function processBuilderCode_AncestryAbilities(ancestryFeatsLocs){ + //if(processingDebug) {console.log("Starting to run ancestry feats code...");} + temp_ancestryFeatsLocs = ancestryFeatsLocs; + let ancestryFeatCount = 0; + for(const ancestryFeatsLoc of ancestryFeatsLocs) { + if(ancestryFeatsLoc == null) {continue;} + let srcStruct = { + sourceType: 'ancestry', + sourceLevel: ancestryFeatsLoc.Level, + sourceCode: 'ancestryFeat-'+ancestryFeatCount, + sourceCodeSNum: 'a', + }; + $('#'+ancestryFeatsLoc.LocationID).html(''); + processBuilderCode( + 'GIVE-ANCESTRY-FEAT='+ancestryFeatsLoc.Level, + srcStruct, + ancestryFeatsLoc.LocationID, + 'Ancestry Feat (Lvl '+ancestryFeatsLoc.Level+')'); + ancestryFeatCount++; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/prereq-parser.js b/client/vue-src/legacy-js/char_builders/wsc/prereq-parser.js new file mode 100644 index 00000000..004b7be1 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/prereq-parser.js @@ -0,0 +1,408 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function preReqGetIconTrue(){ + return ''; +} +function preReqGetIconFalse(){ + return ''; +} +function preReqGetIconUnknown(){ + return ''; +} + +function preReqFeatLink(featLinkClass, inFeatName){ + inFeatName = inFeatName.replace(/’/g,'\'').toUpperCase(); + for(const [featID, featStruct] of g_featMap.entries()){ + let featName = featStruct.Feat.name.toUpperCase(); + if(inFeatName === featName && featStruct.Feat.isArchived == 0) { + setTimeout(function() { + $('.'+featLinkClass).off('click'); + $('.'+featLinkClass).click(function(){ + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + }, 100); + } + } +} + +function preReqResultArray(feat){ + let resultArray = []; + + let prereqParts = []; + let prereqSemicolonParts = feat.prerequisites.replace(/’/g,"'").split('; '); + for(let prereq of prereqSemicolonParts){ + if(prereq.includes(', or ') || prereq.includes(', and ')){ + prereqParts.push(prereq); + } else { + let prereqCommaParts = prereq.split(', '); + prereqParts = prereqParts.concat(prereqCommaParts); + } + } + + for(let prereq of prereqParts){ + if(prereq == '') { continue; } + let uPreReq = prereq.toUpperCase(); + + let result; + result = preReqCheckProfs(uPreReq); + if(result != null) { resultArray.push({Type: 'SKILL-PROF', Result: result, PreReqPart: prereq}); continue; } + + result = prereqListChecking('ABILITY-SCORE', uPreReq, prereq); + if(result != null) { resultArray.push({Type: 'ABILITY-SCORE', Result: result, PreReqPart: prereq}); continue; } + + result = preReqCheckHeritages(uPreReq, prereq); + if(result != null) { resultArray.push({Type: 'HERITAGE', Result: result, PreReqPart: prereq}); continue; } + + result = prereqListChecking('FEAT', uPreReq, prereq); + if(result != null) { resultArray.push({Type: 'FEAT', Result: result, PreReqPart: prereq}); continue; } + + result = prereqListChecking('CLASS-FEATURE', uPreReq, prereq); + if(result != null) { resultArray.push({Type: 'CLASS-FEATURE', Result: result, PreReqPart: prereq}); continue; } + + resultArray.push({Type: 'UNKNOWN', Result: 'UNKNOWN', PreReqPart: prereq}); + } + return resultArray; +} + +function meetsPrereqs(feat){ + // Returns TRUE, FALSE, UNKNOWN, and null + if(feat.prerequisites == null) { return null; } + + let resultArray = preReqResultArray(feat); + + let totalResult = 'TRUE'; + for(let resultData of resultArray){ + if(resultData.Result == 'TRUE') { continue; } + if(resultData.Result == 'FALSE') { return 'FALSE'; } + if(resultData.Result == 'UNKNOWN') { totalResult = 'UNKNOWN'; continue; } + } + return totalResult; +} + +function prereqToValue(prereq){ + if(prereq == 'TRUE'){ return 0; } + if(prereq == 'UNKNOWN'){ return 0; } + if(prereq == 'FALSE'){ return -1; } + return 0;// No prereq +} + +// Prereq Ability Score Checking // +function preReqCheckAbilityScores(prereq){ + let rStr = prereq.match(/STRENGTH (\d+)/); + if(rStr != null){ + return preReqConfirmAbilityScore('STR', rStr[1]); + } + let rDex = prereq.match(/DEXTERITY (\d+)/); + if(rDex != null){ + return preReqConfirmAbilityScore('DEX', rDex[1]); + } + let rCon = prereq.match(/CONSTITUTION (\d+)/); + if(rCon != null){ + return preReqConfirmAbilityScore('CON', rCon[1]); + } + let rInt = prereq.match(/INTELLIGENCE (\d+)/); + if(rInt != null){ + return preReqConfirmAbilityScore('INT', rInt[1]); + } + let rWis = prereq.match(/WISDOM (\d+)/); + if(rWis != null){ + return preReqConfirmAbilityScore('WIS', rWis[1]); + } + let rCha = prereq.match(/CHARISMA (\d+)/); + if(rCha != null){ + return preReqConfirmAbilityScore('CHA', rCha[1]); + } + return null; +} + +function preReqConfirmAbilityScore(scoreType, amt){ + let scoreAmt = g_abilMap.get(scoreType); + if(scoreAmt != null){ + return scoreAmt >= amt ? 'TRUE' : 'FALSE'; + } else { + return 'UNKNOWN'; + } +} + + +// Prereq List Middleware // +function prereqListChecking(type, prereq, oData) { + + // For cases like the feat: 'Come and Get Me' + if(type == 'FEAT'){ + let preFeatResult = preReqCheckFeats(prereq, oData); + if(preFeatResult != null) { return preFeatResult; } + } + + let orCheck = false; + let listPrereqs; + if(prereq.includes(' OR ')){ + listPrereqs = prereq.split(/, OR | OR |, /); + orCheck = true; + } else if(prereq.includes(' AND ')){ + listPrereqs = prereq.split(/, AND | AND |, /); + } else { + listPrereqs = [prereq]; + } + + let totalResult = 'TRUE'; + for(let subPre of listPrereqs){ + let result; + if(type == 'PROF'){ + result = preReqConfirmSkillProf(subPre, oData); + } else if(type == 'FEAT'){ + result = preReqCheckFeats(subPre, oData); + } else if(type == 'CLASS-FEATURE'){ + result = preReqCheckClassAbilities(subPre, oData); + } else if(type == 'HERITAGE'){ + result = preReqConfirmHeritage(subPre); + } else if (type == 'ABILITY-SCORE'){ + result = preReqCheckAbilityScores(subPre); + } else { + result = 'FALSE'; + } + if(result == null) { return null; } + if(orCheck) { + if(result == 'TRUE'){ + return 'TRUE'; + } else if(result == 'FALSE'){ + totalResult = 'FALSE'; + } else if(result == 'UNKNOWN'){ + if(totalResult != 'FALSE') { + totalResult = 'UNKNOWN'; + } + } + } else { + if(result == 'FALSE'){ + totalResult = 'FALSE'; + } else if(result == 'UNKNOWN'){ + return 'UNKNOWN'; + } + } + } + return totalResult; +} + + +// Prereq Heritage Checking // +function preReqCheckHeritages(prereq, normalPreReq){ + if(prereq.toLowerCase() === normalPreReq){ + let rHeritage = prereq.match(/(.+) HERITAGE$/); + if(rHeritage != null){ + return prereqListChecking('HERITAGE', rHeritage[1], null); + } else { + return null; + } + } else { + return null; + } +} + +function preReqConfirmHeritage(heritageName){ + if(wscChoiceStruct.Heritage != null && heritageName === wscChoiceStruct.Heritage.name.toUpperCase()){ + return 'TRUE'; + } else { + return 'FALSE'; + } +} + +// Prereq Profs Checking // +function preReqCheckProfs(prereq){ + let rTrained = prereq.match(/TRAINED IN (.+)/); + if(rTrained != null){ + return prereqListChecking('PROF', rTrained[1], 1); + } + let rExpert = prereq.match(/EXPERT IN (.+)/); + if(rExpert != null){ + return prereqListChecking('PROF', rExpert[1], 2); + } + let rMaster = prereq.match(/MASTER IN (.+)/); + if(rMaster != null){ + return prereqListChecking('PROF', rMaster[1], 3); + } + let rLegendary = prereq.match(/LEGENDARY IN (.+)/); + if(rLegendary != null){ + return prereqListChecking('PROF', rLegendary[1], 4); + } + return null; +} + +function preReqConfirmSkillProf(skillName, numUps){ + let customChecksResult = checkCustomSkillProfs(skillName, numUps); + if(customChecksResult != null) { return customChecksResult; } + let skillData = g_skillMap.get(capitalizeWords(skillName)); + if(skillData != null){ + return skillData.NumUps >= numUps ? 'TRUE' : 'FALSE'; + } else { + if(skillName.endsWith(' LORE')){ return 'FALSE'; } + return 'UNKNOWN'; + } +} + +function checkCustomSkillProfs(name, numUps){ + + if(name === 'LORE'){ + for(const [skillName, skillData] of g_skillMap.entries()){ + if(skillData.Name.includes(' Lore') && skillData.NumUps >= numUps){ + return 'TRUE'; + } + } + return 'FALSE'; + } + + if(name === 'AT LEAST ONE SKILL'){ + for(const [skillName, skillData] of g_skillMap.entries()){ + if(skillData.NumUps >= numUps){ + return 'TRUE'; + } + } + return 'FALSE'; + } + + if(name === 'A SKILL WITH THE RECALL KNOWLEDGE ACTION' || name === 'A RECALL KNOWLEDGE SKILL'){ + for(const [skillName, skillData] of g_skillMap.entries()){ + if(skillData.NumUps >= numUps){ + if(skillData.Name.includes(' Lore') || + skillData.Name == 'Arcana' || + skillData.Name == 'Crafting' || + skillData.Name == 'Medicine' || + skillData.Name == 'Nature' || + skillData.Name == 'Occultism' || + skillData.Name == 'Religion' || + skillData.Name == 'Society'){ + return 'TRUE'; + } + } + } + return 'FALSE'; + } + + if(name === 'PERCEPTION'){ + let percepData = getFinalProf(g_profMap.get('Perception')); + if(percepData != null && percepData.NumUps >= numUps){ + return 'TRUE'; + } + return 'FALSE'; + } + + return null; + +} + + + +// Prereq Feats Checking // +function preReqCheckFeats(prereq, normalPreReq){ + // Feats aren't all lowercase, that'd likely be a class feature + if(normalPreReq == normalPreReq.toLowerCase()) { return null; } + + for(let featData of wscChoiceStruct.FeatArray){ + if(featData.value != null){ + if(featData.value.name.toUpperCase() === prereq){ + return 'TRUE'; + } + } + } + for(const [featID, featStruct] of g_featMap.entries()){ + if(featStruct.Feat != null && featStruct.Feat.isArchived == 0){ + if(featStruct.Feat.name.toUpperCase() === prereq){ + return 'FALSE'; + } + } + } + return null; +} + + +// Prereq Class Feature Checking // +function preReqCheckClassAbilities(prereq, normalPreReq){ + if(g_expr_classAbilityArray != null && + wscChoiceStruct.ClassDetails != null && + wscChoiceStruct.ClassDetails.Abilities != null){ + if(prereq.toLowerCase() === normalPreReq){ + + for(let abilityName of g_expr_classAbilityArray){ + let abilName = abilityName.toLowerCase(); + if(normalPreReq === abilName){ return 'TRUE'; } + + if(normalPreReq.endsWith(' cause')){ + if(abilName.startsWith(normalPreReq.replace(' cause', ''))){ + return 'TRUE'; + } + } + if(normalPreReq.startsWith('divine ally (')){ + if(normalPreReq == 'divine ally ('+abilName+')'){ + return 'TRUE'; + } + } + + if(normalPreReq.includes(abilName) || abilName.includes(normalPreReq)){ + + // For cases like ANTIPALADIN and PALADIN + if(normalPreReq.includes(abilName)){ + let preReqWithoutAbilName = normalPreReq.replace(abilName,':::'); + let lastChar = preReqWithoutAbilName.substring(0,preReqWithoutAbilName.indexOf(':::')).slice(-1); + if(!(/\s|(^$)/g.test(lastChar))){// Is whitespace or '' + return 'FALSE'; + } + } + + let ability = prereqFindClassAbility(abilityName); + if(ability != null){ + if(ability.selectType != 'SELECTOR'){ + // For long prereqs that go into more detail, the answer is most likely unknown. + if(abilName.split(' ').length+3 >= normalPreReq.split(' ').length){ + return 'TRUE'; + } else { + return 'UNKNOWN'; + } + } + } + } + } + + for(let ability of wscChoiceStruct.ClassDetails.Abilities){ + let abilName = ability.name.toLowerCase().split('(')[0]; + if(normalPreReq === abilName){ return 'FALSE'; } + if(normalPreReq.includes(abilName) || abilName.includes(normalPreReq)){ + if(ability.selectType != 'SELECTOR'){ + // For long prereqs that go into more detail, the answer is most likely unknown. + if(abilName.split(' ').length+3 >= normalPreReq.split(' ').length){ + return 'FALSE'; + } else { + return 'UNKNOWN'; + } + } + } + } + + return 'UNKNOWN'; + + } else { + return null; + } + } else { + return null; + } +} + +function prereqFindClassAbility(abilityName){ + abilityName = abilityName.toLowerCase(); + for(let ability of wscChoiceStruct.ClassDetails.Abilities){ + if(abilityName === ability.name.toLowerCase()) { + return ability; + } + } + for(let ability of wscChoiceStruct.ExtraClassFeaturesArray){ + if(abilityName === ability.value.name.toLowerCase()) { + return ability; + } + } + return null; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/prof-manager.js b/client/vue-src/legacy-js/char_builders/wsc/prof-manager.js new file mode 100644 index 00000000..adf16fa3 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/prof-manager.js @@ -0,0 +1,9 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function updateProfMap(){ + + + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/quickview-left.js b/client/vue-src/legacy-js/char_builders/wsc/quickview-left.js new file mode 100644 index 00000000..c211b367 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/quickview-left.js @@ -0,0 +1,213 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let quickviews = bulmaQuickview.attach(); + +}); + +let g_leftQuickViewScroll = 0; + +function openLeftQuickView(type, data){ + if($('#quickviewLeftDefault').hasClass('is-active')){ + g_leftQuickViewScroll = $('#quickViewLeftContent').parent().scrollTop(); + } else { + g_leftQuickViewScroll = 0; + } + + // Load QuickView // + $('#quickViewLeftTitle').html(''); + $('#quickViewLeftContent').html(''); + + $('#quickViewLeftTitleClose').html(''); + $('#quickViewLeftClose').click(function(){ + closeQuickViewLeft(); + }); + + if(type == 'skillsView'){ + openLeftStatsQuickview(data); + } + +} + +function closeQuickViewLeft() { + $('#quickviewLeftDefault').removeClass('is-active'); +} + + +// ~~~~~~~~~~ Stats Quickview ~~~~~~~~~~ // +let g_openFeatsDropDown = false; + +function openLeftStatsQuickview(data) { + + $('#quickviewLeftDefault').addClass('is-active'); + + $('#quickViewLeftTitle').html('Statistics'); + let qContent = $('#quickViewLeftContent'); + + let charTags = cloneObj(wscChoiceStruct.CharTagsArray); + charTags.push({value: 'Humanoid'}); + charTags = charTags.sort( + function(a, b) { + return a.value > b.value ? 1 : -1; + } + ); + let tagsInnerHTML = ''; + for(const charTag of charTags){ + if(charTag.value != null && charTag.value != ''){ + tagsInnerHTML += ''; + } + } + if(tagsInnerHTML != ''){ + qContent.append('
                '+tagsInnerHTML+'
                '); + qContent.append('
                '); + } + + qContent.append(` +
                +

                Str

                +

                Dex

                +

                Con

                +

                Int

                +

                Wis

                +

                Cha

                +
                + `); + qContent.append(` +
                +

                ${g_abilMap.get("STR")}

                +

                ${g_abilMap.get("DEX")}

                +

                ${g_abilMap.get("CON")}

                +

                ${g_abilMap.get("INT")}

                +

                ${g_abilMap.get("WIS")}

                +

                ${g_abilMap.get("CHA")}

                +
                + `); + + qContent.append('
                '); + + qContent.append('
                '); + + let switchColumnNum = Math.ceil(g_skillMap.size/2); + let skillCount = 0; + for(const [skillName, skillData] of g_skillMap.entries()){ + skillCount++; + + let skillsColumnID; + if(skillCount > switchColumnNum){ + skillsColumnID = "skillsColumnTwo"; + } else { + skillsColumnID = "skillsColumnOne"; + } + + $('#'+skillsColumnID).append('
                '+getProfLetterFromNumUps(skillData.NumUps)+' - '+skillData.Name+'
                '); + } + + qContent.append('

                U = Untrained, T = Trained, E = Expert, M = Master, L = Legendary

                '); + + qContent.append('
                '); + + qContent.append('

                My Feats

                '); + + $('#myFeatsQuickviewName').click(function() { + g_openFeatsDropDown = !g_openFeatsDropDown; + if(g_openFeatsDropDown) { + $("#myFeatsQuickviewSection").removeClass('is-hidden'); + $("#myFeatsQuickviewChevron").removeClass('fa-chevron-down'); + $("#myFeatsQuickviewChevron").addClass('fa-chevron-up'); + } else { + $("#myFeatsQuickviewSection").addClass('is-hidden'); + $("#myFeatsQuickviewChevron").removeClass('fa-chevron-up'); + $("#myFeatsQuickviewChevron").addClass('fa-chevron-down'); + } + }); + + const sortedFeatArray = wscChoiceStruct.FeatArray.sort( + function(a, b) { + if(a.value == null || b.value == null){ + return b.value != null ? 1 : -1; + } + if (a.value.level === b.value.level) { + // Name is only important when levels are the same + return a.value.name > b.value.name ? 1 : -1; + } + return a.value.level - b.value.level; + } + ); + for (let i = 0; i < sortedFeatArray.length; i++) { + const featData = sortedFeatArray[i]; + if(featData.value.level <= 0) { continue; } + + let featButtonID = 'myFeatViewButton-'+i; + $('#myFeatsQuickviewSection').append(''); + + $('#'+featButtonID).click(function(event) { + let featStruct = g_featMap.get(featData.value.id+""); + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, true); + $(this).blur(); + }); + + } + + qContent.append('
                '); + + qContent.append('
                '); + + if(wscChoiceStruct.ClassDetails.Class != null){ + let tSkillsMore = wscChoiceStruct.ClassDetails.Class.tSkillsMore; + $('#finalSkillTrainingColumn').append('

                Skill Training

                '); + $('#finalSkillTrainingColumn').append('
                '); + } + + if(wscChoiceStruct.Ancestry != null){ + let humanExtraText = ''; + if(wscChoiceStruct.Ancestry.name == 'Human'){ humanExtraText = ' Being a human gives you another language as well.'; } + $('#finalLanguagesColumn').append('

                Languages

                '); + $('#finalLanguagesColumn').append('
                '); + } + + statsFinalSkillsAndLangs(); + +} + +socket.on("returnLangsAndTrainingsClear", function(profSrcStruct, langSrcStruct, data){ + if(data.SkillLocationID != 'sideSkillSelection') { return; } + // Runs after all code is executed for leftQuickView + setTimeout(() => { + + // Scrolls to where it last was + $('#quickViewLeftContent').parent().scrollTop(g_leftQuickViewScroll); + + }, 10); +}); + +function statsFinalSkillsAndLangs(){ + + let profSrcStruct = { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-bonus-prof', + sourceCodeSNum: 'a', + }; + + let langSrcStruct = { + sourceType: 'class', + sourceLevel: 1, + sourceCode: 'inits-bonus-lang', + sourceCodeSNum: 'a', + }; + + socket.emit("requestLangsAndTrainingsClear", + getCharIDFromURL(), + profSrcStruct, + langSrcStruct, + {Character: null, SkillLocationID: 'sideSkillSelection', LangLocationID: 'sideLangSelection'}); + +} diff --git a/client/vue-src/legacy-js/char_builders/wsc/skill-manager.js b/client/vue-src/legacy-js/char_builders/wsc/skill-manager.js new file mode 100644 index 00000000..b4eff4fd --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/skill-manager.js @@ -0,0 +1,198 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getSkillArray() { + let skillArray = []; // Hardcoded - Skill IDs + skillArray.push({ id: 1, name: 'Acrobatics', ability: 'DEX' }); + skillArray.push({ id: 3, name: 'Arcana', ability: 'INT' }); + skillArray.push({ id: 4, name: 'Athletics', ability: 'STR' }); + skillArray.push({ id: 5, name: 'Crafting', ability: 'INT' }); + skillArray.push({ id: 6, name: 'Deception', ability: 'CHA' }); + skillArray.push({ id: 7, name: 'Diplomacy', ability: 'CHA' }); + skillArray.push({ id: 8, name: 'Intimidation', ability: 'CHA' }); + skillArray.push({ id: 9, name: 'Lore', ability: 'INT' }); + skillArray.push({ id: 10, name: 'Medicine', ability: 'WIS' }); + skillArray.push({ id: 11, name: 'Nature', ability: 'WIS' }); + skillArray.push({ id: 12, name: 'Occultism', ability: 'INT' }); + skillArray.push({ id: 14, name: 'Performance', ability: 'CHA' }); + skillArray.push({ id: 15, name: 'Religion', ability: 'WIS' }); + skillArray.push({ id: 16, name: 'Society', ability: 'INT' }); + skillArray.push({ id: 17, name: 'Stealth', ability: 'DEX' }); + skillArray.push({ id: 18, name: 'Survival', ability: 'WIS' }); + skillArray.push({ id: 19, name: 'Thievery', ability: 'DEX' }); + return skillArray; +} + +function getSkillIDToName(skillID){ + switch(skillID) { // Hardcoded - Skill IDs + case 1: return 'Acrobatics'; + case 3: return 'Arcana'; + case 4: return 'Athletics'; + case 5: return 'Crafting'; + case 6: return 'Deception'; + case 7: return 'Diplomacy'; + case 8: return 'Intimidation'; + case 9: return 'Lore'; + case 10: return 'Medicine'; + case 11: return 'Nature'; + case 12: return 'Occultism'; + case 14: return 'Performance'; + case 15: return 'Religion'; + case 16: return 'Society'; + case 17: return 'Stealth'; + case 18: return 'Survival'; + case 19: return 'Thievery'; + default: return 'Unknown'; + } +} + +function getSkillNameAbbrev(skillName){ + skillName = skillName.toUpperCase(); + switch(skillName) { + case 'ACROBATICS': return 'Acro.'; + case 'ARCANA': return 'Arcana'; + case 'ATHLETICS': return 'Athletics'; + case 'CRAFTING': return 'Crafting'; + case 'DECEPTION': return 'Deception'; + case 'DIPLOMACY': return 'Diplomacy'; + case 'INTIMIDATION': return 'Intim.'; + case 'LORE': return 'Lore'; + case 'MEDICINE': return 'Medicine'; + case 'NATURE': return 'Nature'; + case 'OCCULTISM': return 'Occultism'; + case 'PERFORMANCE': return 'Perform.'; + case 'RELIGION': return 'Religion'; + case 'SOCIETY': return 'Society'; + case 'STEALTH': return 'Stealth'; + case 'SURVIVAL': return 'Survival'; + case 'THIEVERY': return 'Thievery'; + default: return ''; + } +} + + + +function updateAbilityMap(){ + + let abilMap = new Map(); + abilMap.set("STR", parseInt($('#quickviewLeftDefault').attr('data-str-base'))); + abilMap.set("DEX", parseInt($('#quickviewLeftDefault').attr('data-dex-base'))); + abilMap.set("CON", parseInt($('#quickviewLeftDefault').attr('data-con-base'))); + abilMap.set("INT", parseInt($('#quickviewLeftDefault').attr('data-int-base'))); + abilMap.set("WIS", parseInt($('#quickviewLeftDefault').attr('data-wis-base'))); + abilMap.set("CHA", parseInt($('#quickviewLeftDefault').attr('data-cha-base'))); + + let boostMap = new Map(); + for(const bonusData of wscChoiceStruct.BonusArray){ + if(bonusData.Bonus == "Boost") { + let boostNums = boostMap.get(bonusData.Ability); + if(boostNums == null){ + boostMap.set(bonusData.Ability, 1); + } else { + boostMap.set(bonusData.Ability, boostNums+1); + } + } else if(bonusData.Bonus == "Flaw") { + let boostNums = boostMap.get(bonusData.Ability); + if(boostNums == null){ + boostMap.set(bonusData.Ability, -1); + } else { + boostMap.set(bonusData.Ability, boostNums-1); + } + } else { + let abilBonus = abilMap.get(bonusData.Ability); + abilMap.set(bonusData.Ability, abilBonus+parseInt(bonusData.Bonus)); + } + } + + for(const [ability, boostNums] of boostMap.entries()){ + let abilityScore = abilMap.get(ability); + for (let i = 0; i < boostNums; i++) { + if(abilityScore < 18){ + abilityScore += 2; + } else { + abilityScore += 1; + } + } + if(boostNums < 0) { + abilityScore = abilityScore+boostNums*2; + } + abilMap.set(ability, abilityScore); + } + + g_abilMap = abilMap; + + if($('#quickviewLeftDefault').hasClass('is-active')){ + openLeftQuickView('skillsView', null); + } + +} + + +function updateSkillMap(refreshLists){ + + let skillArray = []; + for(const skill of getSkillArray()){ + if(skill.name != "Lore"){ + skillArray.push({ SkillName : skill.name, Skill : skill }); + } + } + + let loreSkill = getSkillArray().find(skill => { + return skill.name === "Lore"; + }); + for(const loreData of wscChoiceStruct.LoreArray) { + if(loreData.value != null){ + // Remove [[CHA]] if present in lore name + skillArray.push({ SkillName : capitalizeWords(loreData.value.replace(/\[\[(.+?)\]\]/g, ''))+" Lore", Skill : loreSkill }); + } + } + + let skillMap = new Map(); + + for(const skillData of skillArray){ + let bestProf = 'U'; + let numUps = 0; + for(const profData of wscChoiceStruct.ProfArray){ + if(profData.For == "Skill" && profData.To != null){ + let tempSkillName = skillData.SkillName.toUpperCase(); + tempSkillName = tempSkillName.replace(/_|\s+/g,""); + let tempProfTo = profData.To.toUpperCase(); + tempProfTo = tempProfTo.replace(/_|\s+/g,""); + if(tempProfTo === tempSkillName) { + numUps += getUpAmt(profData.Prof); + bestProf = getBetterProf(bestProf, profData.Prof); + } + } + } + + skillMap.set(skillData.SkillName, { + Name : skillData.SkillName, + NumUps : profToNumUp(bestProf, true)+numUps, + Skill : skillData.Skill + }); + } + + g_skillMap = skillMap; + + if(refreshLists){ + // Update Skill Lists + $('.selectIncrease').each(function(){ + let selectIncreaseID = $(this).attr('id'); + let srcStruct = { + sourceType: $(this).attr('data-sourceType'), + sourceLevel: $(this).attr('data-sourceLevel'), + sourceCode: $(this).attr('data-sourceCode'), + sourceCodeSNum: $(this).attr('data-sourceCodeSNum'), + }; + let profType = $(this).attr('data-profType'); + let optionals = JSON.parse($(this).attr('data-optionals').replace(/`/g, '"')); + populateSkillLists(selectIncreaseID, srcStruct, profType, optionals); + }); + } + + if($('#quickviewLeftDefault').hasClass('is-active')){ + openLeftQuickView('skillsView', null); + } + +} diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-boosts.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-boosts.js new file mode 100644 index 00000000..6473e439 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-boosts.js @@ -0,0 +1,167 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Ability Boosts --------------------// +function processingAbilityBoosts(wscStatement, srcStruct, locationID, sourceName){ + + // GIVE-ABILITY-BOOST-SINGLE=ALL + // GIVE-ABILITY-BOOST-SINGLE=INT,WIS,CHA + if(wscStatement.includes("GIVE-ABILITY-BOOST-SINGLE")){ + let selectionOptions = wscStatement.split('=')[1]; + giveAbilityBoostSingle(srcStruct, selectionOptions, locationID, sourceName); + } else if(wscStatement.includes("GIVE-ABILITY-BOOST-MULTIPLE")){// GIVE-ABILITY-BOOST-MULTIPLE=3 + let numberOfBoosts = wscStatement.split('=')[1]; + giveAbilityBoostMultiple(srcStruct, numberOfBoosts, locationID, sourceName); + } else { + displayError("Unknown statement (2-Boost): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Ability Boost - Single /////////////////////////////////// + +function giveAbilityBoostMultiple(srcStruct, numberOfBoosts, locationID, sourceName) { + statementComplete(); + if(numberOfBoosts > 6){ + displayError("Attempted to create more than 6 ability boosts!"); + } else { + let multiBoostCodeStr = ''; + for (let i = 0; i < numberOfBoosts; i++) { + multiBoostCodeStr += 'GIVE-ABILITY-BOOST-SINGLE=ALL\n'; + } + if(multiBoostCodeStr != ''){ + let newLocationID = locationID+'-BoostContent'; + $('#'+locationID).append('
                '); + processBuilderCode( + multiBoostCodeStr, + srcStruct, + newLocationID, + sourceName); + } + } +} + +function giveAbilityBoostSingle(srcStruct, selectionOptions, locationID, sourceName){ + + selectionOptions = selectionOptions.toUpperCase(); + + if(selectionOptions == "ALL"){ + displayAbilityBoostSingle(srcStruct, locationID, getAllAbilityTypes(), sourceName); + } else { + + let selectionOptionsArray = selectionOptions.split(","); + if(selectionOptionsArray.length < 8){ + let abilityTypes = []; + for(let selectionOption of selectionOptionsArray){ + let abilityType = lengthenAbilityType(selectionOption); + if(!abilityTypes.includes(abilityType)){ + abilityTypes.push(abilityType); + } + } + if(abilityTypes.length != 0){ + if(abilityTypes.length != 1) { + displayAbilityBoostSingle(srcStruct, locationID, abilityTypes, sourceName); + } else { + socket.emit("requestWSCAbilityBonusChange", + getCharIDFromURL(), + srcStruct, + {Ability: shortenAbilityType(abilityTypes[0]), Bonus: "Boost"}, + null); + removeUnselectedData(srcStruct); // Fixes bug with ability boost selector becoming no selector + statementComplete(); + } + } else { + displayError("Attempted to produce an invalid ability boost! (2)"); + statementComplete(); + } + } else { + displayError("Attempted to produce an invalid ability boost! (1)"); + statementComplete(); + } + + } + + +} + +function displayAbilityBoostSingle(srcStruct, locationID, abilityTypes, sourceName){ + + let selectBoostID = "selectBoost-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectBoostSet = "selectBoostSet-"+locationID; + let selectBoostControlShellClass = selectBoostSet+'ControlShell'; + + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Ability Boost', 'UNSELECTED'); + + $('#'+locationID).append(''); + + let selectBoost = $('#'+selectBoostID); + selectBoost.append(''); + selectBoost.append(''); + for(const ability of abilityTypes){ + selectBoost.append(''); + } + + let bonusArray = wscChoiceStruct.BonusArray; + + let bonus = bonusArray.find(bonus => { + return hasSameSrc(bonus, srcStruct); + }); + if(bonus != null){ + let longAbilityType = lengthenAbilityType(bonus.Ability); + + $(selectBoost).val(longAbilityType); + if ($(selectBoost).val() != longAbilityType){ + $(selectBoost).val($("#"+selectBoostID+" option:first").val()); + $(selectBoost).parent().addClass("is-info"); + } + } else { + $(selectBoost).parent().addClass("is-info"); + } + + $(selectBoost).change(function(){ + + if(hasDuplicateSelected($('.'+selectBoostSet))){ + $('.'+selectBoostControlShellClass).addClass("is-danger"); + if($(this).val() != "chooseDefault"){ + $(this).parent().removeClass("is-info"); + } else { + $(this).parent().addClass("is-info"); + } + } else { + $('.'+selectBoostControlShellClass).removeClass("is-danger"); + $('.'+selectBoostControlShellClass).addClass("is-loading"); + + if($(this).val() != "chooseDefault"){ + $(this).parent().removeClass("is-info"); + socket.emit("requestWSCAbilityBonusChange", + getCharIDFromURL(), + srcStruct, + {Ability: shortenAbilityType($(this).val()), Bonus: "Boost"}, + selectBoostControlShellClass); + } else { + $(this).parent().addClass("is-info"); + socket.emit("requestWSCAbilityBonusChange", + getCharIDFromURL(), + srcStruct, + null, + selectBoostControlShellClass); + } + + } + + }); + + statementComplete(); + +} + +socket.on("returnWSCAbilityBonusChange", function(selectBoostControlShellClass){ + if(selectBoostControlShellClass != null){ + $('.'+selectBoostControlShellClass).removeClass("is-loading"); + $('.'+selectBoostControlShellClass+'>select').blur(); + } + selectorUpdated(); + socket.emit("requestWSCUpdateChoices", getCharIDFromURL(), 'ABILITY-BOOSTS'); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-charTags.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-charTags.js new file mode 100644 index 00000000..c6c57ba1 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-charTags.js @@ -0,0 +1,167 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Char Tags --------------------// +function processingCharTags(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-CHAR-TRAIT-NAME")){ // GIVE-CHAR-TRAIT-NAME=Elf + let charTagName = wscStatement.split('=')[1]; + giveCharTag(srcStruct, charTagName); + } else if(wscStatement.includes("GIVE-CHAR-TRAIT-COMMON")){ // GIVE-CHAR-TRAIT-COMMON + displayCharTagChoice(srcStruct, locationID, sourceName, true); + } else if(wscStatement.includes("GIVE-CHAR-TRAIT")){ // GIVE-CHAR-TRAIT + displayCharTagChoice(srcStruct, locationID, sourceName); + } else { + displayError("Unknown statement (2-CharTrait): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Char Tag /////////////////////////////////// + +function giveCharTag(srcStruct, charTagName){ + charTagName = capitalizeWords(charTagName); + + socket.emit("requestCharTagChange", + getCharIDFromURL(), + srcStruct, + charTagName); + +} + +socket.on("returnCharTagChange", function(charTagsArray){ + wscChoiceStruct.CharTagsArray = charTagsArray; + if($('#quickviewLeftDefault').hasClass('is-active')){ + openLeftQuickView('skillsView', null); + } + statementComplete(); +}); + +//////////////////////////////// Give Char Tag Selector /////////////////////////////////// + +function displayCharTagChoice(srcStruct, locationID, sourceName, commonOnly=false){ + + let selectCharTagID = "selectCharTag"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectCharTagControlShellClass = selectCharTagID+'ControlShell'; + + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Option', 'UNSELECTED'); + + $('#'+locationID).append('
                '); + + $('#'+selectCharTagID).append(''); + $('#'+selectCharTagID).append(''); + + let triggerChange = false; + // Set saved char trait choices + + let charTagsArray = wscChoiceStruct.CharTagsArray; + + let charTagsData = charTagsArray.find(charTags => { + return hasSameSrc(charTags, srcStruct); + }); + + let selectedCharTag = null; + if(charTagsData != null){ + selectedCharTag = charTagsData; + triggerChange = true; + } + + let sortedAncestries = wscChoiceStruct.AllAncestries.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + if(commonOnly) { + + for(const ancestry of sortedAncestries){ + if(ancestry.isArchived === 0 && ancestry.rarity === 'COMMON'){ + $('#'+selectCharTagID).append(''); + } + } + $('#'+selectCharTagID).append(''); + for(const ancestry of sortedAncestries){ + if(ancestry.isArchived === 0 && ancestry.rarity !== 'COMMON'){ + $('#'+selectCharTagID).append(''); + } + } + + } else { + + for(const ancestry of sortedAncestries){ + if(ancestry.isArchived === 0){ + $('#'+selectCharTagID).append(''); + } + } + + } + + if(selectedCharTag != null){ + $('#'+selectCharTagID).val(selectedCharTag.value); + if ($('#'+selectCharTagID).val() != selectedCharTag.value){ + $('#'+selectCharTagID).val($("#"+selectCharTagID+" option:first").val()); + $('#'+selectCharTagID).parent().addClass("is-info"); + } + } + + // On char tag choice change + $('#'+selectCharTagID).change(function(event, triggerSave, triggerReload) { + if(triggerReload == null){ triggerReload = true; } + + let charTagName = $(this).val(); + + if($(this).val() == "chooseDefault"){ + $('.'+selectCharTagControlShellClass).addClass("is-info"); + + socket.emit("requestWSCCharTagChange", + getCharIDFromURL(), + srcStruct, + null, + selectCharTagControlShellClass, + triggerReload); + + } else { + $('.'+selectCharTagControlShellClass).removeClass("is-info"); + + // Save char tag + if(triggerSave == null || triggerSave) { + $('.'+selectCharTagControlShellClass).addClass("is-loading"); + socket.emit("requestWSCCharTagChange", + getCharIDFromURL(), + srcStruct, + charTagName, + selectCharTagControlShellClass, + triggerReload); + } + + } + + }); + + $('#'+selectCharTagID).trigger("change", [triggerChange, false]); + + statementComplete(); + +} + +socket.on("returnWSCCharTagChange", function(charTagsArray, selectControlShellClass, triggerReload){ + wscChoiceStruct.CharTagsArray = charTagsArray; + if(selectControlShellClass != null) { + $('.'+selectControlShellClass).removeClass("is-loading"); + $('.'+selectControlShellClass+'>select').blur(); + } + if($('#quickviewLeftDefault').hasClass('is-active')){ + openLeftQuickView('skillsView', null); + } + selectorUpdated(); + + // If on ancestry page, reload ancestry feats + if(triggerReload && g_pageNum == 2){ + window.setTimeout(() => { + createAncestryFeats(wscChoiceStruct.Character.level); + }, 250); + } + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-class-feature.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-class-feature.js new file mode 100644 index 00000000..7d38788f --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-class-feature.js @@ -0,0 +1,249 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Class Features -------------------------// +function processingClassFeatures(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-CLASS-FEATURE-NAME")){ // GIVE-CLASS-FEATURE-NAME=Polymath + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + value = value.split('[')[0]; + optionals = optionals[1].split(','); + } + let dontRunCode = (optionals != null && optionals.length > 0 && optionals[0].toUpperCase() == 'NO-CODE'); + giveClassFeatureByName(srcStruct, locationID, value, sourceName, dontRunCode); + } else { + displayError("Unknown statement (2-ClassFeature): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Class Feature /////////////////////////////////// + +function giveClassFeatureByName(srcStruct, locationID, featureName, sourceName, dontRunCode=false){ + + socket.emit("requestAddClassFeature", + getCharIDFromURL(), + srcStruct, + featureName, + { locationID, sourceName, dontRunCode }); + +} + +socket.on("returnAddClassFeature", function(srcStruct, classAbility, allClassAbilityOptions, inputPacket){ + if(classAbility == null) { statementComplete(); return; } + + let classAbilityID = inputPacket.locationID+"-wsc-cf-"+srcStruct.sourceCodeSNum+"-classAbility"+classAbility.id; + let classAbilityHeaderID = inputPacket.locationID+"-wsc-cf-"+srcStruct.sourceCodeSNum+"-classAbilityHeader"+classAbility.id; + let classAbilityContentID = inputPacket.locationID+"-wsc-cf-"+srcStruct.sourceCodeSNum+"-classAbilityContent"+classAbility.id; + let classAbilityCodeID = inputPacket.locationID+"-wsc-cf-"+srcStruct.sourceCodeSNum+"-classAbilityCode"+classAbility.id; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+classAbilityID).length != 0) { statementComplete(); return; } + + $('#'+inputPacket.locationID).append('
                '); + + /// + let classAbilitySection = $('#'+classAbilityID); + classAbilitySection.append(''+classAbility.name+''); + classAbilitySection.append('
                '); + + /// + let classAbilityContent = $('#'+classAbilityContentID); + classAbilityContent.append('
                '+processText(classAbility.description, false, null)+'
                '); + + classAbilityContent.append('
                '); + + /// + if(classAbility.selectType === 'SELECTOR') { + + let classAbilityOptionSelectorID = inputPacket.locationID+'-wsc-cf-'+srcStruct.sourceCodeSNum+'-classAbilSelection'+classAbility.id; + let descriptionID = classAbilityOptionSelectorID+'Description'; + let abilityCodeID = classAbilityOptionSelectorID+'Code'; + + const selectionTagInfo = getTagFromData(srcStruct, inputPacket.sourceName, 'Unselected Option', 'UNSELECTED'); + + let classAbilitySelectorInnerHTML = ''; + classAbilitySelectorInnerHTML += '
                '; + classAbilitySelectorInnerHTML += ''; + classAbilitySelectorInnerHTML += '
                '; + + classAbilitySelectorInnerHTML += ''; + + classAbilityContent.append(classAbilitySelectorInnerHTML); + + + // Class Ability Option Selector // + $('#'+classAbilityOptionSelectorID).change(function(event, triggerSave){ + + let descriptionID = $(this).attr('id')+'Description'; + let abilityCodeID = $(this).attr('id')+'Code'; + $('#'+descriptionID).html(''); + $('#'+abilityCodeID).html(''); + + /* Don't use the class ability's normal srcStruct, use the code block's + let srcStruct = { + sourceType: 'class',// <- Issue here too with 2 classes + sourceLevel: classAbility.level, + sourceCode: 'classAbilitySelector-'+classAbility.id, + sourceCodeSNum: 'a', + };*/ + + if($(this).val() == "chooseDefault"){ + $(this).parent().addClass("is-info"); + $('#'+descriptionID).parent().parent().parent().parent().addClass('is-hidden'); + + // Save ability choice + if(triggerSave == null || triggerSave) { + socket.emit("requestClassChoiceChange", + getCharIDFromURL(), + srcStruct, + null, + false); + } + + extraClassFeatureOptionsUpdateWSCChoiceStruct(null, srcStruct, false); + + } else { + $(this).parent().removeClass("is-info"); + $('#'+descriptionID).parent().parent().parent().parent().removeClass('is-hidden'); + + let chosenAbilityID = $(this).val(); + + let chosenClassAbility = allClassAbilityOptions.find(classAbility => { + return classAbility.id == chosenAbilityID; + }); + + $('#'+descriptionID).html(processText(chosenClassAbility.description, false, null)); + + // Save ability choice + if(triggerSave == null || triggerSave) { + socket.emit("requestClassChoiceChange", + getCharIDFromURL(), + srcStruct, + { SelectorID : classAbility.id+'', OptionID : chosenAbilityID }, + false); + } + + if(inputPacket.dontRunCode) { + processBuilderCode( + 'ADD-TEXT=__You don’t gain any of this option’s other effects, just the class feature option itself.__', + srcStruct, + abilityCodeID, + chosenClassAbility.name); + } else { + // Run ability choice code + processBuilderCode( + chosenClassAbility.code, + srcStruct, + abilityCodeID, + chosenClassAbility.name); + } + + extraClassFeatureOptionsUpdateWSCChoiceStruct(chosenClassAbility, srcStruct, true); + + } + $(this).blur(); + selectorUpdated(); + }); + $('#'+classAbilityOptionSelectorID).trigger("change", [false]); + + } + + if(inputPacket.dontRunCode) { + processBuilderCode( + 'ADD-TEXT=__You don’t gain any of this class feature’s other effects, just the feature itself.__', + srcStruct, + classAbilityCodeID, + classAbility.name); + } else { + processBuilderCode( + classAbility.code, + srcStruct, + classAbilityCodeID, + classAbility.name); + } + + extraClassFeaturesUpdateWSCChoiceStruct(classAbility); + + statementComplete(); +}); + +function extraClassFeaturesUpdateWSCChoiceStruct(newClassFeature){ + + let existingClassFeature = wscChoiceStruct.ExtraClassFeaturesArray.find(classFeature => { + return classFeature.value.id == newClassFeature.id; + }); + if(existingClassFeature == null){ + wscChoiceStruct.ExtraClassFeaturesArray.push({ value: newClassFeature }); + g_expr_classAbilityArray.push(newClassFeature.name.toUpperCase().replace(/\(|\)/g,"")); + } + +} + +function extraClassFeatureOptionsUpdateWSCChoiceStruct(newClassFeatureOption, srcStruct, isAdd){ + + if(isAdd){ + // Is Add + + let existingClassFeature = wscChoiceStruct.ExtraClassFeaturesArray.find(classFeature => { + return classFeature.value.selectType == 'SELECT_OPTION' && hasSameSrc(classFeature.value.srcStruct, srcStruct); + }); + + if(existingClassFeature == null){ + newClassFeatureOption.srcStruct = srcStruct; + + wscChoiceStruct.ExtraClassFeaturesArray.push({ value: newClassFeatureOption }); + g_expr_classAbilityArray.push(newClassFeatureOption.name.toUpperCase().replace(/\(|\)/g,"")); + } + + } else { + // Is Remove + + let newExtraClassFeaturesArray = []; + let removedClassFeatureNamesArray = []; + for(let classFeature of wscChoiceStruct.ExtraClassFeaturesArray){ + if(classFeature.value != null && classFeature.value.selectType == 'SELECT_OPTION' && hasSameSrc(classFeature.value.srcStruct, srcStruct)){ + // Is classFeatureOption, skip. Add to removed array. + removedClassFeatureNamesArray.push(classFeature.value.name.toUpperCase()); + } else { + newExtraClassFeaturesArray.push(classFeature); + } + } + + wscChoiceStruct.ExtraClassFeaturesArray = newExtraClassFeaturesArray; + + let new_expr_classAbilityArray = []; + for(let abilityName of g_expr_classAbilityArray){ + if(!removedClassFeatureNamesArray.includes(abilityName)){ + new_expr_classAbilityArray.push(abilityName); + } + } + g_expr_classAbilityArray = new_expr_classAbilityArray; + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-domains.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-domains.js new file mode 100644 index 00000000..d4d6e64a --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-domains.js @@ -0,0 +1,177 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Domains --------------------// +function processingDomains(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-DOMAIN-ADVANCEMENT=")){ // GIVE-DOMAIN-ADVANCEMENT=Cleric + let spellSRC = wscStatement.split('=')[1]; + giveDomainAdvancement(srcStruct, locationID, spellSRC, sourceName); + } else if(wscStatement.includes("GIVE-DOMAIN=")){ // GIVE-DOMAIN=Cleric + let spellSRC = wscStatement.split('=')[1]; + giveDomain(srcStruct, locationID, spellSRC, sourceName); + } else { + displayError("Unknown statement (2-Domain): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Domain /////////////////////////////////// + +function giveDomain(srcStruct, locationID, spellSRC, sourceName){ + + let selectID = "selectDomain-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectControlShellClass = selectID+'ControlShell'; + let descriptionID = "selectDomainDescription-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Domain', 'UNSELECTED'); + + $('#'+locationID).append('
                '); + + $('#'+locationID).append('
                '); + + $('#'+selectID).append(''); + $('#'+selectID).append(''); + + // Set saved domain choice + let savedDomainData = wscChoiceStruct.DomainArray.find(domain => { + return hasSameSrc(domain, srcStruct); + }); + + for(const domain of wscChoiceStruct.AllDomains){ + + if(savedDomainData != null && savedDomainData.value.id == domain.id) { + $('#'+selectID).append(''); + } else { + $('#'+selectID).append(''); + } + + } + + // On select change + $('#'+selectID).change(function(event, triggerSave) { + + if($(this).val() == "chooseDefault"){ + + $('.'+selectControlShellClass).addClass("is-info"); + + $('#'+descriptionID).html(''); + + socket.emit("requestDomainChange", + getCharIDFromURL(), + srcStruct, + null); + + } else { + + $('.'+selectControlShellClass).removeClass("is-info"); + + let domainID = $(this).val(); + let domain = wscChoiceStruct.AllDomains.find(domain => { + return domain.id == domainID; + }); + + $('#'+descriptionID).html(processText(domain.description, false, null)); + + socket.emit("requestDomainChange", + getCharIDFromURL(), + srcStruct, + {Domain: domain, SpellSRC: spellSRC}); + + } + + $(this).blur(); + + }); + + $('#'+selectID).trigger("change", [false]); + + statementComplete(); + +} + +socket.on("returnDomainChange", function(){ + selectorUpdated(); + socket.emit("requestWSCUpdateChoices", getCharIDFromURL(), 'DOMAINS'); +}); + + +//////////////////////////////// Give Domain Advancement /////////////////////////////////// + +function giveDomainAdvancement(srcStruct, locationID, spellSRC, sourceName){ + + let selectID = "selectDomainAdvancement-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectControlShellClass = selectID+'ControlShell'; + let descriptionID = "selectDomainAdvancementDescription-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Domain Advancement', 'UNSELECTED'); + + $('#'+locationID).append('
                '); + + $('#'+locationID).append('
                '); + + $('#'+selectID).append(''); + $('#'+selectID).append(''); + + // Set saved domain choice + let savedDomainData = wscChoiceStruct.AdvancedDomainArray.find(domainAdvanced => { + return hasSameSrc(domainAdvanced, srcStruct); + }); + + for(const domainData of wscChoiceStruct.DomainArray){ + + if(savedDomainData != null && savedDomainData.value.id == domainData.value.id) { + $('#'+selectID).append(''); + } else { + $('#'+selectID).append(''); + } + + } + + // On select change + $('#'+selectID).change(function(event, triggerSave) { + + if($(this).val() == "chooseDefault"){ + + $('.'+selectControlShellClass).addClass("is-info"); + + $('#'+descriptionID).html(''); + + socket.emit("requestDomainAdvancementChange", + getCharIDFromURL(), + srcStruct, + null); + + } else { + + $('.'+selectControlShellClass).removeClass("is-info"); + + let domainID = $(this).val(); + let domain = wscChoiceStruct.AllDomains.find(domain => { + return domain.id == domainID; + }); + + $('#'+descriptionID).html(processText(domain.description, false, null)); + + socket.emit("requestDomainAdvancementChange", + getCharIDFromURL(), + srcStruct, + {Domain: domain, SpellSRC: spellSRC}); + + } + + $(this).blur(); + + }); + + $('#'+selectID).trigger("change", [false]); + + statementComplete(); + +} + +socket.on("returnDomainAdvancementChange", function(){ + selectorUpdated(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-familiarity.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-familiarity.js new file mode 100644 index 00000000..63bb51b7 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-familiarity.js @@ -0,0 +1,31 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Familiarities --------------------// +function processingFamiliarities(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-WEAPON-FAMILIARITY")){ // GIVE-WEAPON-FAMILIARITY=Goblin + let trait = wscStatement.split('=')[1]; + giveWeaponFamiliarity(srcStruct, trait); + } else { + displayError("Unknown statement (2-Familiarity): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Weapon Familiarity /////////////////////////////////// + +function giveWeaponFamiliarity(srcStruct, trait){ + + socket.emit("requestWeaponFamiliarityChange", + getCharIDFromURL(), + srcStruct, + trait); + +} + +socket.on("returnWeaponFamiliarityChange", function(){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-feats.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-feats.js new file mode 100644 index 00000000..4a8156f4 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-feats.js @@ -0,0 +1,548 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Feats -------------------------// +function processingFeats(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-GENERAL-FEAT=")){ // GIVE-GENERAL-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = wscChoiceStruct.Character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(wscChoiceStruct.Character.level/2); + } else { + level = parseInt(value); + } + giveGeneralFeat(srcStruct, locationID, level, optionals, sourceName); + } + else if(wscStatement.includes("GIVE-FEAT=")){ // GIVE-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = wscChoiceStruct.Character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(wscChoiceStruct.Character.level/2); + } else { + level = parseInt(value); + } + giveFeat(srcStruct, locationID, level, optionals, sourceName); + } + else if(wscStatement.includes("GIVE-ANCESTRY-FEAT=")){ // GIVE-ANCESTRY-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = wscChoiceStruct.Character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(wscChoiceStruct.Character.level/2); + } else { + level = parseInt(value); + } + let charTagsArray = []; + for(let dataTag of wscChoiceStruct.CharTagsArray){ + charTagsArray.push(dataTag.value); + } + giveAncestryFeat(srcStruct, locationID, level, charTagsArray, optionals, sourceName); + } + else if(wscStatement.includes("GIVE-CLASS-FEAT=")){ // GIVE-CLASS-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = wscChoiceStruct.Character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(wscChoiceStruct.Character.level/2); + } else { + level = parseInt(value); + } + let className = (wscChoiceStruct.ClassDetails.Class != null) ? wscChoiceStruct.ClassDetails.Class.name : null; + giveClassFeat(srcStruct, locationID, level, className, optionals, sourceName); + } + else if(wscStatement.includes("GIVE-ARCHETYPE-FEAT=")){ // GIVE-ARCHETYPE-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = wscChoiceStruct.Character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(wscChoiceStruct.Character.level/2); + } else { + level = parseInt(value); + } + giveArchetypeFeat(srcStruct, locationID, level, optionals, sourceName); + } + else if(wscStatement.includes("GIVE-SKILL-FEAT=")){ // GIVE-SKILL-FEAT=3[metamagic] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + } + let level; + if(value.startsWith('LEVEL')){ + level = wscChoiceStruct.Character.level; + } else if(value.startsWith('HALF_LEVEL')){ + level = Math.floor(wscChoiceStruct.Character.level/2); + } else { + level = parseInt(value); + } + giveSkillFeat(srcStruct, locationID, level, optionals, sourceName); + } + else if(wscStatement.includes("GIVE-FEAT-FROM=")){ // GIVE-FEAT-FROM=Choose a Tradition:feat 1,feat 2,feat 2 + let value = wscStatement.split('=')[1]; + let valueParts = value.split(':'); + let chooseTitle = valueParts[0]; + let customListParts = valueParts[1].split(','); + giveFeatCustomList(srcStruct, locationID, chooseTitle, customListParts, sourceName); + } + else if(wscStatement.includes("GIVE-FEAT-NAME=")){ // GIVE-FEAT-NAME=Ancestral_Paragon + let value = wscStatement.split('=')[1]; + + let featName = null; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + optionals = optionals[1].split(','); + featName = value.split('[')[0]; + } else { + featName = value; + } + + featName = featName.replace(/_/g," "); + giveFeatByName(srcStruct, featName, locationID, optionals, sourceName); + } else { + displayError("Unknown statement (2-Feat): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + + +////////////////////////////////// Choose Feats ///////////////////////////////////////////// + +function giveFeatCustomList(srcStruct, locationID, chooseTitle, customList, sourceName){ + + chooseTitle = capitalizeWords(chooseTitle).replace(/( The )/,' the ').replace(/( A )/,' a ').replace(/( An )/,' an '); + displayFeatChoice( + srcStruct, + locationID, + chooseTitle, + [], + 100, + [], + sourceName, + 'AUTO_PAGE_LOAD', + customList + ); + + statementComplete(); + +} + +function giveFeat(srcStruct, locationID, featLevel, optionalTags, sourceName){ + + displayFeatChoice( + srcStruct, + locationID, + "Choose a Feat", + [], + featLevel, + optionalTags, + sourceName + ); + + statementComplete(); + +} + +function giveGeneralFeat(srcStruct, locationID, featLevel, optionalTags, sourceName){ + + displayFeatChoice( + srcStruct, + locationID, + "Choose a General Feat", + ["General"], + featLevel, + optionalTags, + sourceName + ); + + statementComplete(); + +} + +function giveSkillFeat(srcStruct, locationID, featLevel, optionalTags, sourceName){ + + displayFeatChoice( + srcStruct, + locationID, + "Choose a Skill Feat", + ["Skill"], + featLevel, + optionalTags, + sourceName + ); + + statementComplete(); + +} + +function giveAncestryFeat(srcStruct, locationID, featLevel, charTagsArray, optionalTags, sourceName){ + + displayFeatChoice( + srcStruct, + locationID, + "Choose an Ancestry Feat", + charTagsArray, + featLevel, + optionalTags, + sourceName + ); + + statementComplete(); + +} + +function giveArchetypeFeat(srcStruct, locationID, featLevel, optionalTags, sourceName){ + + giveClassFeat(srcStruct, locationID, featLevel, null, optionalTags, sourceName, true); + +} + +function giveClassFeat(srcStruct, locationID, featLevel, className, optionalTags, sourceName, isArchetypeOnlyFeat=false){ + + // Include sourceCodeSNum at the end for if a code field gives multiple class feats + let classFeatTabsID = locationID+'-classFeatTabs-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + let containerLocationID = locationID+'-ClassFeatContainer-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + + let classTabClass = locationID+'-classFeatClassTab-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + let archetypesTabClass = locationID+'-classFeatArchetypesTab-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + let dedicationTabClass = locationID+'-classFeatDedicationTab-'+srcStruct.sourceCode+'-'+srcStruct.sourceCodeSNum; + + $('#'+locationID).append('
                  '); + let tabsContent = $('#'+classFeatTabsID); + tabsContent.html(''); // <- Fixes bug with multiple tabs being created + + if(!isArchetypeOnlyFeat) { + tabsContent.append('
                • '+className+' Class
                • '); + } + + let charArchetypesArray = []; + for(let featChoice of wscChoiceStruct.FeatArray){ + if(featChoice.value != null) { + let feat = g_featMap.get(featChoice.value.id+""); + if(feat != null){ + let dedicationTag = feat.Tags.find(featTag => { + return featTag.name === 'Dedication'; + }); + if(dedicationTag != null){ + charArchetypesArray.push(featChoice.value.id); + } + } + } + } + + for(let charArchetypeDedFeatID of charArchetypesArray){ + let archetype = g_archetypes.find(archetype => { + return archetype.dedicationFeatID == charArchetypeDedFeatID; + }); + if(archetype != null){ + tabsContent.append('
                • '+archetype.name+' Archetype
                • '); + } + } + + tabsContent.append('
                • Add Dedication
                • '); + + $('#'+locationID).append('
                  '); + + if(!isArchetypeOnlyFeat) { + $('.'+classTabClass).click(function(event, autoPageLoad){ + event.stopImmediatePropagation(); + if (autoPageLoad != 'AUTO_PAGE_LOAD') { autoPageLoad = null; } + if($(this).parent().hasClass('is-active')) { return; } + + $('#'+containerLocationID).html(''); + $('#'+classFeatTabsID).find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + + displayFeatChoice( + srcStruct, + containerLocationID, + "Choose a Class Feat", + [className], + featLevel, + optionalTags, + sourceName, + autoPageLoad + ); + + }); + } + + $('.'+archetypesTabClass).click(function(event, autoPageLoad){ + event.stopImmediatePropagation(); + if (autoPageLoad != 'AUTO_PAGE_LOAD') { autoPageLoad = null; } + if($(this).parent().hasClass('is-active')) { return; } + + $('#'+containerLocationID).html(''); + $('#'+classFeatTabsID).find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + let archetypeName = $(this).attr('name'); + + displayFeatChoice( + srcStruct, + containerLocationID, + "Choose an Archetype Feat", + [archetypeName+' Archetype'], + featLevel, + optionalTags, + sourceName, + autoPageLoad + ); + + }); + + $('.'+dedicationTabClass).click(function(event){ + event.stopImmediatePropagation(); + if($(this).parent().hasClass('is-active')) { return; } + + $('#'+containerLocationID).html(''); + $('#'+classFeatTabsID).find('.is-active').removeClass('is-active'); + $(this).parent().addClass('is-active'); + + displayFeatChoice( + srcStruct, + containerLocationID, + "Choose a Dedication", + ['Dedication'], + featLevel, + optionalTags, + sourceName + ); + + }); + + let clickedTab = false; + let featData = wscChoiceStruct.FeatArray.find(featData => { + return hasSameSrc(featData, srcStruct); + }); + if(featData != null && featData.value != null){ + if(charArchetypesArray.includes(featData.value.id)){ + // Click Dedication Tab + $('.'+dedicationTabClass).trigger("click"); + clickedTab = true; + + // Remove Self-Archetype Tab + let archetype = g_archetypes.find(archetype => { + return archetype.dedicationFeatID == featData.value.id; + }); + if(archetype != null) { + let selfArchetypeTabClass = archetypesTabClass+'-'+archetype.name.replace(/\W/g,'_'); + $('#'+classFeatTabsID).find('.'+selfArchetypeTabClass).parent().remove(); + } + } else { + let feat = g_featMap.get(featData.value.id+""); + if(feat != null){ + for(let charArchetypeDedFeatID of charArchetypesArray){ + let archetype = g_archetypes.find(archetype => { + return archetype.dedicationFeatID == charArchetypeDedFeatID; + }); + if(archetype != null){ + let archetypeTag = feat.Tags.find(featTag => { + return featTag.name === archetype.name+' Archetype'; + }); + if(archetypeTag != null){ + // Click Archetype Tab + $('.'+archetypesTabClass+'-'+archetype.name.replace(/\W/g,'_')).trigger("click", ['AUTO_PAGE_LOAD']); + clickedTab = true; + break; + } + } + } + } + } + } + + if(!isArchetypeOnlyFeat) { + if(!clickedTab){ + $('.'+classTabClass).trigger("click", ['AUTO_PAGE_LOAD']); + } + } else { + if(!clickedTab){ + $('.'+dedicationTabClass).trigger("click", ['AUTO_PAGE_LOAD']); + } + } + + statementComplete(); + +} + +function displayFeatChoice(srcStruct, locationID, selectionName, tagsArray, featLevel, optionalTags, sourceName, + autoPageLoad = 'AUTO_PAGE_LOAD', customList = null) { + + // Make optional tags lowercase + if(optionalTags != null){ + for (let i = 0; i < optionalTags.length; i++) { + optionalTags[i] = optionalTags[i].toLowerCase().trim(); + } + } + // Make custom list feat names lowercase + if(customList != null){ + for (let i = 0; i < customList.length; i++) { + customList[i] = customList[i].toLowerCase().trim(); + } + } + + let className = (wscChoiceStruct.ClassDetails.Class != null) ? wscChoiceStruct.ClassDetails.Class.name : null; + + let featSelectionMap = new Map(); + for(const featStruct of g_featMap){ + let feat = featStruct[1]; + if(feat.Feat.level < 1 && customList == null){ continue; } + + // You cannot select the dedication for your own class + if(className != null && feat.Feat.name === className+' Dedication'){ continue; } + + let hasCorrectTags = false; + if(customList == null) { + let sameOpsTagsArray = []; + for(let featTag of feat.Tags){ + if(tagsArray.length > 0){ + if(tagsArray.includes(featTag.name)){ + hasCorrectTags = true; + } + } else { + hasCorrectTags = true; + } + if(optionalTags != null){ + let featTagNameLower = featTag.name.toLowerCase(); + if(optionalTags.includes(featTagNameLower)){ + sameOpsTagsArray.push(featTagNameLower); + } + } + } + if(optionalTags != null && hasCorrectTags){ + hasCorrectTags = (optionalTags.sort().join(',') === sameOpsTagsArray.sort().join(',')); + } + } else { + if(customList.includes(feat.Feat.name.toLowerCase())){ + hasCorrectTags = true; + } + } + + /* If feat is an archetype feat, has the skill trait, and tagsArray doesn't include the skill trait, + do not include feat. This follows the rule about archetype skill feats CRB pg. 219. + */ + if(!tagsArray.includes('Skill') && feat.Tags.find(tag => { return tag.name.includes(' Archetype'); }) != null && feat.Tags.find(tag => { return tag.name == 'Skill'; }) != null){ + hasCorrectTags = false; + } + + if(feat.Feat.level <= featLevel && hasCorrectTags){ + + let selectionArray = featSelectionMap.get(feat.Feat.level); + if(selectionArray == null) { selectionArray = []; } + selectionArray.push(feat); + featSelectionMap.set(feat.Feat.level, selectionArray); + + } + + } + + giveFeatSelection(locationID, srcStruct, selectionName, featSelectionMap, sourceName); + +} + + +//////////////////////////////// Give Feat (by Name) /////////////////////////////////// + +function giveFeatByName(srcStruct, featName, locationID, optionalTags, sourceName){ + featName = featName.replace(/_/g," "); + featName = featName.replace(/’/g,"'"); + + // Make optional tags lowercase + if(optionalTags != null){ + for (let i = 0; i < optionalTags.length; i++) { + optionalTags[i] = optionalTags[i].toLowerCase().trim(); + } + } + + let featEntry = null; + g_featMap.forEach(function(value, key, map){ + if(value.Feat.isArchived === 0) { + if(value.Feat.name.toUpperCase() === featName){ + + if(optionalTags != null) { + let hasCorrectTags = false; + let sameOpsTagsArray = []; + for(let featTag of value.Tags){ + let featTagNameLower = featTag.name.toLowerCase(); + if(optionalTags.includes(featTagNameLower)){ + sameOpsTagsArray.push(featTagNameLower); + } + } + hasCorrectTags = (optionalTags.sort().join(',') === sameOpsTagsArray.sort().join(',')); + + if(hasCorrectTags) { + featEntry = value; + return; + } + } else { + featEntry = value; + return; + } + } + } + }); + if(featEntry == null){ + if(!isFeatHidden(featName)){ + if(optionalTags != null) { + displayError("Cannot find feat with the given traits: \'"+featName+" ["+optionalTags+"]\'"); + } else { + displayError("Cannot find feat: \'"+featName+"\'"); + } + } + statementComplete(); + return; + } + + let featCodeSectionID = "featCode-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + $('#'+locationID).append('
                  '); + + featsUpdateWSCChoiceStruct(srcStruct, featEntry.Feat); + socket.emit("requestFeatChangeByName", + getCharIDFromURL(), + {srcStruct, feat: featEntry, codeLocationID: featCodeSectionID}); + +} + +socket.on("returnFeatChangeByName", function(featChangePacket){ + // If leftStatsQuickview is open, refresh it + if($('#quickviewLeftDefault').hasClass('is-active')){ + openLeftQuickView('skillsView', null); + } + + processBuilderCode( + featChangePacket.feat.Feat.code, + featChangePacket.srcStruct, + featChangePacket.codeLocationID, + featChangePacket.feat.Feat.name); + + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-heritage.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-heritage.js new file mode 100644 index 00000000..50643964 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-heritage.js @@ -0,0 +1,193 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Heritage Effects -------------------------// +function processingHeritageEffects(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-HERITAGE-EFFECTS-NAME")){ // GIVE-HERITAGE-EFFECTS-NAME=Ancient Elf + let value = wscStatement.split('=')[1]; + giveHeritageEffectsByName(srcStruct, locationID, value, sourceName); + } else if(wscStatement.includes("GIVE-HERITAGE-EFFECTS-ANCESTRY")){ // GIVE-HERITAGE-EFFECTS-ANCESTRY=Elf + let value = wscStatement.split('=')[1]; + giveHeritageEffectsFindHeritages(srcStruct, locationID, value, sourceName); + } else { + displayError("Unknown statement (2-HeritageEffects): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + + +//////////////////////////////// Give Heritage Effects Selection /////////////////////////////////// +function giveHeritageEffectsFindHeritages(srcStruct, locationID, ancestryName, sourceName){ + + socket.emit("requestFindHeritagesFromAncestryName", + getCharIDFromURL(), + srcStruct, + ancestryName, + { locationID, sourceName }); + +} + +socket.on("returnFindHeritagesFromAncestryName", function(srcStruct, heritages, inputPacket){ + + let selectHeritageEffectsID = "selectHeritageEffects-"+inputPacket.locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectHeritageEffectsControlShellClass = selectHeritageEffectsID+'-ControlShell'; + let selectHeritageEffectsDescriptionID = selectHeritageEffectsID+"-Description"; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+selectHeritageEffectsID).length != 0) { statementComplete(); return; } + + const selectionTagInfo = getTagFromData(srcStruct, inputPacket.sourceName, 'Unselected Heritage', 'UNSELECTED'); + + $('#'+inputPacket.locationID).append('
                  '); + + $('#'+inputPacket.locationID).append('
                  '); + + $('#'+selectHeritageEffectsID).append(''); + $('#'+selectHeritageEffectsID).append(''); + + // Set saved prof choices to savedProfData + const savedHeritage = wscChoiceStruct.HeritageEffectsArray.find(heritageData => { + return hasSameSrc(heritageData, srcStruct); + }); + + for(const heritage of heritages){ + if(savedHeritage != null && savedHeritage.value != null && savedHeritage.value.id == heritage.id) { + $('#'+selectHeritageEffectsID).append(''); + } else { + $('#'+selectHeritageEffectsID).append(''); + } + } + + // On heritage choice change + $('#'+selectHeritageEffectsID).change(function(event, triggerSave) { + + if($(this).val() == "chooseDefault"){ + + $('.'+selectHeritageEffectsControlShellClass).addClass("is-info"); + + $('#'+selectHeritageEffectsDescriptionID).html(''); + + // Save heritage effects + if(triggerSave == null || triggerSave) { + socket.emit("requestHeritageEffectsChange", + getCharIDFromURL(), + srcStruct, + null, + true); + } + + heritageEffectsUpdateWSCChoiceStruct(srcStruct, null); + + } else { + + $('.'+selectHeritageEffectsControlShellClass).removeClass("is-info"); + + $('#'+selectHeritageEffectsDescriptionID).html(''); + + let heritageID = $(this).val(); + + const heritage = heritages.find(heritage => { + return heritage.id == heritageID; + }); + + // Save heritage effects + if(triggerSave == null || triggerSave) { + + socket.emit("requestHeritageEffectsChange", + getCharIDFromURL(), + srcStruct, + heritageID, + true); + + socket.once("returnHeritageEffectsChange", function(){ + displayAndProcessHeritageEffects( + srcStruct, heritage, selectHeritageEffectsDescriptionID, inputPacket.sourceName); + }); + + } else { + + displayAndProcessHeritageEffects(srcStruct, heritage, selectHeritageEffectsDescriptionID, inputPacket.sourceName); + + } + + + } + + $(this).blur(); + + }); + + $('#'+selectHeritageEffectsID).trigger("change", [false]); + + statementComplete(); + +}); + + + + +function giveHeritageEffectsByName(srcStruct, locationID, heritageName, sourceName) { + + socket.emit("requestAddHeritageEffect", + getCharIDFromURL(), + srcStruct, + heritageName, + { locationID, sourceName }); + +} + +socket.on("returnAddHeritageEffect", function(srcStruct, heritage, inputPacket){ + if(heritage == null) { statementComplete(); return; } + + displayAndProcessHeritageEffects(srcStruct, heritage, inputPacket.locationID, inputPacket.sourceName); + + statementComplete(); + +}); + + +function displayAndProcessHeritageEffects(srcStruct, heritage, locationID, sourceName){ + + let heritageLocationCodeID = locationID+'-heritageCode'; + + $('#'+locationID).append('
                  '+heritage.name+'
                  '+processText(heritage.description, false, null)+'
                  '); + + processBuilderCode( + heritage.code, + srcStruct, + heritageLocationCodeID, + heritage.name); + + heritageEffectsUpdateWSCChoiceStruct(srcStruct, heritage); + +} + +function heritageEffectsUpdateWSCChoiceStruct(srcStruct, heritage){ + + let heritageEffectsArray = wscChoiceStruct.HeritageEffectsArray; + + let foundHeritageData = false; + for(let heritageData of heritageEffectsArray){ + if(hasSameSrc(heritageData, srcStruct)){ + foundHeritageData = true; + if(heritage != null){ + heritageData.value = heritage; + } else { + heritageData.value = null; + } + break; + } + } + + if(!foundHeritageData && heritage != null){ + let heritageData = cloneObj(srcStruct); + heritageData.value = heritage; + heritageEffectsArray.push(heritageData); + } + + wscChoiceStruct.HeritageEffectsArray = heritageEffectsArray; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-keyAbility.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-keyAbility.js new file mode 100644 index 00000000..c8f7a141 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-keyAbility.js @@ -0,0 +1,24 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Key Ability --------------------// +function processingKeyAbilities(wscStatement, srcStruct, locationID, sourceName){ + + // SET-KEY-ABILITY=ALL + // SET-KEY-ABILITY=INT,WIS,CHA + if(wscStatement.includes("SET-KEY-ABILITY")){ + let selectionOptions = wscStatement.split('=')[1]; + let keyAbilitySrcStruct = { + sourceType: getClassSourceType(temp_classNum), + sourceLevel: 1, + sourceCode: 'keyAbility', + sourceCodeSNum: 'a' + }; + giveAbilityBoostSingle(keyAbilitySrcStruct, selectionOptions, locationID, sourceName); + } else { + displayError("Unknown statement (2-KeyAbility): \'"+wscStatement+"\'"); + statementComplete(); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-langs.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-langs.js new file mode 100644 index 00000000..feeafc7a --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-langs.js @@ -0,0 +1,197 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Langs -------------------------// +function processingLangs(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-LANG-NAME")){ // GIVE-LANG-NAME=Elven + let langName = wscStatement.split('=')[1]; + giveLangByName(srcStruct, langName, sourceName); + } + else if(wscStatement.includes("GIVE-LANG-BONUS-ONLY")){// GIVE-LANG-BONUS-ONLY + giveLang(srcStruct, locationID, sourceName, true); + } + else if(wscStatement.includes("GIVE-LANG")){// GIVE-LANG + giveLang(srcStruct, locationID, sourceName, false); + } else { + displayError("Unknown statement (2-Lang): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Lang /////////////////////////////////// + +function giveLang(srcStruct, locationID, sourceName, bonusOnly){ + + let selectLangID = "selectLang"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectLangControlShellClass = selectLangID+'ControlShell'; + let langDescriptionID = selectLangID+"Description"; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+selectLangID).length != 0) { statementComplete(); return; } + + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Language', 'UNSELECTED'); + + $('#'+locationID).append('
                  '); + + $('#'+locationID).append('
                  '); + + $('#'+selectLangID).append(''); + $('#'+selectLangID).append(''); + + // Set saved prof choices to savedProfData + let langArray = wscChoiceStruct.LangArray; + + let savedLang = langArray.find(lang => { + return hasSameSrc(lang, srcStruct); + }); + + let sortedLangMap = new Map([...g_langMap.entries()].sort( + function(a, b) { + return a[1].IsBonus && !b[1].IsBonus ? -1 : 1; + }) + ); + + let isStillBonusLang = true; + for(const [langID, langData] of sortedLangMap.entries()){ + + if(!langData.IsBonus){ + if(isStillBonusLang){ + $('#'+selectLangID).append(''); + } + isStillBonusLang = false; + } + + if(savedLang != null && savedLang.value.id == langID) { + if(bonusOnly && !langData.IsBonus){ + $('#'+selectLangID).append(''); + } else { + $('#'+selectLangID).append(''); + } + } else { + if(bonusOnly && !langData.IsBonus){ + $('#'+selectLangID).append(''); + } else { + $('#'+selectLangID).append(''); + } + } + + } + + // On lang choice change + $('#'+selectLangID).change(function(event, triggerSave) { + + if($(this).val() == "chooseDefault"){ + + $('.'+selectLangControlShellClass).removeClass("is-danger"); + $('.'+selectLangControlShellClass).addClass("is-info"); + + langsUpdateWSCChoiceStruct(srcStruct, null); + socket.emit("requestLanguageChange", + getCharIDFromURL(), + srcStruct, + null); + + } else { + + $('.'+selectLangControlShellClass).removeClass("is-danger"); + $('.'+selectLangControlShellClass).removeClass("is-info"); + + let langID = $(this).val(); + + // Save lang + if(triggerSave == null || triggerSave) { + + let langArray = wscChoiceStruct.LangArray; + if(!hasDuplicateLang(langArray, langID)) { + + $('#'+langDescriptionID).html(''); + + langsUpdateWSCChoiceStruct(srcStruct, langID); + socket.emit("requestLanguageChange", + getCharIDFromURL(), + srcStruct, + langID); + + } else { + $('.'+selectLangControlShellClass).addClass("is-danger"); + + $('#'+langDescriptionID).html('

                  You already know this language!

                  '); + + } + + } else { + + $('#'+langDescriptionID).html(''); + + langsUpdateWSCChoiceStruct(srcStruct, langID); + socket.emit("requestLanguageChange", + getCharIDFromURL(), + srcStruct, + langID); + + } + + } + + $(this).blur(); + + }); + + $('#'+selectLangID).trigger("change", [false]); + + statementComplete(); + +} + +socket.on("returnLanguageChange", function(){ + selectorUpdated(); + socket.emit("requestWSCUpdateLangs", getCharIDFromURL()); +}); + +//////////////////////////////// Give Lang (by Lang Name) /////////////////////////////////// + +function giveLangByName(srcStruct, langName, sourceName){ + + socket.emit("requestLanguageChangeByName", // No longer a socket request + getCharIDFromURL(), + srcStruct, + langName); + +} + +socket.on("returnLanguageChangeByName", function(){ + statementComplete(); +}); + + + +function langsUpdateWSCChoiceStruct(srcStruct, langID){ + + let langArray = wscChoiceStruct.LangArray; + let langStruct = (langID != null) ? g_langMap.get(langID+"") : null; + + let foundLangData = false; + for(let langData of langArray){ + if(hasSameSrc(langData, srcStruct)){ + foundLangData = true; + if(langStruct != null){ + langData.value = langStruct.Lang; + } else { + langData.value = {}; + } + break; + } + } + + if(!foundLangData && langStruct != null){ + let langData = cloneObj(srcStruct); + langData.value = langStruct.Lang; + langArray.push(langData); + } + + wscChoiceStruct.LangArray = langArray; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-lore.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-lore.js new file mode 100644 index 00000000..85b617a5 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-lore.js @@ -0,0 +1,160 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Lore --------------------// +function processingLore(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-LORE=")){ // GIVE-LORE=Sailing + let loreName = wscStatement.split('=')[1]; + giveLore(srcStruct, loreName, sourceName); + } else if(wscStatement.includes("GIVE-LORE-CHOOSE-INCREASING")){ // GIVE-LORE-CHOOSE-INCREASING + giveLoreChooseIncreasing(srcStruct, locationID, sourceName); + } else if(wscStatement.includes("GIVE-LORE-CHOOSE")){ // GIVE-LORE-CHOOSE + giveLoreChoose(srcStruct, locationID, sourceName); + } else { + displayError("Unknown statement (2-Lore): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Lore Choose /////////////////////////////////// + +function giveLoreChooseIncreasing(srcStruct, locationID, sourceName){ + // At 3rd, 7th, and 15th level automatically increase lore + let charLevel = wscChoiceStruct.Character.level; + if(charLevel >= 15){ + giveLoreChoose(srcStruct, locationID, sourceName, 'L'); + } else if(charLevel >= 7){ + giveLoreChoose(srcStruct, locationID, sourceName, 'M'); + } else if(charLevel >= 3){ + giveLoreChoose(srcStruct, locationID, sourceName, 'E'); + } else { + giveLoreChoose(srcStruct, locationID, sourceName, 'T'); + } +} + +function giveLoreChoose(srcStruct, locationID, sourceName, prof='T'){ + + let inputLoreID = "inputLore"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let inputLoreControlShell = inputLoreID+'ControlShell'; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+inputLoreID).length != 0) { statementComplete(); return; } + + $('#'+locationID).append('
                  '); + + // Set saved lore input data + let savedLoreData = wscChoiceStruct.LoreArray.find(loreData => { + return hasSameSrc(loreData, srcStruct); + }); + + $('#'+inputLoreID).change(function(event, isAutoLoad){ + isAutoLoad = (isAutoLoad == null) ? false : isAutoLoad; + + if($(this).val() == ''){ + + $(this).removeClass("is-danger"); + $('#'+inputLoreControlShell).addClass("is-loading"); + socket.emit("requestLoreChange", + getCharIDFromURL(), + srcStruct, + null, + { ControlShellID: inputLoreControlShell, isAutoLoad}, + prof, + sourceName); + + } else { + + let validNameRegex = /^[A-Za-z0-9 \-_']+$/; + if(validNameRegex.test($(this).val())) { + $(this).removeClass("is-danger"); + + $('#'+inputLoreControlShell).addClass("is-loading"); + socket.emit("requestLoreChange", + getCharIDFromURL(), + srcStruct, + $(this).val().toUpperCase(), + { ControlShellID: inputLoreControlShell, isAutoLoad}, + prof, + sourceName); + + } else { + $(this).addClass("is-danger"); + } + + } + + }); + + if(savedLoreData != null){ + $('#'+inputLoreID).val(capitalizeWords(savedLoreData.value)); + } + $('#'+inputLoreID).trigger("change", [true]); + + statementComplete(); + +} + +//////////////////////////////// Give Lore /////////////////////////////////// + +function giveLore(srcStruct, loreName, sourceName){ + + socket.emit("requestLoreChange", + getCharIDFromURL(), + srcStruct, + loreName, + null, + 'T', + sourceName); + +} + +socket.on("returnLoreChange", function(srcStruct, loreName, inputPacket, prof){ + + if(inputPacket != null){ + $('#'+inputPacket.ControlShellID).removeClass("is-loading"); + } else { + statementComplete(); + } + + loreUpdateWSCChoiceStruct(srcStruct, loreName); + if(loreName != null){ + //skillsUpdateWSCChoiceStruct(srcStruct, loreName+'_LORE', prof); + } else { + //skillsUpdateWSCChoiceStruct(srcStruct, null, null); + } + if(inputPacket == null || inputPacket.isAutoLoad == null || !inputPacket.isAutoLoad) { + updateSkillMap(true); + } + +}); + +function loreUpdateWSCChoiceStruct(srcStruct, loreName){ + + if(loreName != null){ loreName = loreName.toUpperCase(); } + let loreArray = wscChoiceStruct.LoreArray; + + let foundLoreData = false; + for(let loreData of loreArray){ + if(hasSameSrc(loreData, srcStruct)){ + foundLoreData = true; + if(loreName != null){ + loreData.value = loreName; + } else { + loreData.value = null; + } + break; + } + } + + if(!foundLoreData){ + let loreData = cloneObj(srcStruct); + loreData.value = loreName; + loreArray.push(loreData); + } + + wscChoiceStruct.LoreArray = loreArray; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-notes.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-notes.js new file mode 100644 index 00000000..83dcdb59 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-notes.js @@ -0,0 +1,65 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Notes --------------------// +function processingNotes(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-NOTES-FIELD")){ // GIVE-NOTES-FIELD=Placeholder Text + let placeholderText = wscStatement.split('=')[1]; // - Displays notes field for feats and class abilities + giveNotesField(srcStruct, placeholderText, locationID, sourceName); + } else { + displayError("Unknown statement (2-Notes): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Notes Field /////////////////////////////////// + +function giveNotesField(srcStruct, placeholderText, locationID, sourceName){ + placeholderText = capitalizeWord(placeholderText); + + socket.emit("requestNotesFieldChange", + getCharIDFromURL(), + srcStruct, + placeholderText, + { locationID, sourceName }); + +} + +socket.on("returnNotesFieldChange", function(notesData, noteChangePacket){ + statementComplete(); + if(noteChangePacket == null) { return; } + + let placeholderText = noteChangePacket.sourceName+' - '+notesData.placeholderText; + let notesText = notesData.text; + + let notesFieldID = getCharIDFromURL()+'-notesField-'+notesData.sourceType+'-'+notesData.sourceLevel+'-'+notesData.sourceCode+'-'+notesData.sourceCodeSNum; + let notesFieldControlShellID = notesFieldID+'ControlShell'; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+notesFieldID).length != 0) { return; } + + $('#'+noteChangePacket.locationID).append('
                  '); + + $("#"+notesFieldID).blur(function(){ + if(notesData.text != $(this).val()) { + + $("#"+notesFieldControlShellID).addClass("is-loading"); + + notesData.text = $(this).val(); + + socket.emit("requestNotesFieldSave", + getCharIDFromURL(), + notesData, + notesFieldControlShellID); + + } + }); + +}); + +socket.on("returnNotesFieldSave", function(notesFieldControlShellID){ + $("#"+notesFieldControlShellID).removeClass("is-loading"); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-phyFeats.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-phyFeats.js new file mode 100644 index 00000000..1c0aa6e4 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-phyFeats.js @@ -0,0 +1,31 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Physical Features --------------------// +function processingPhysicalFeatures(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-PHYSICAL-FEATURE-NAME")){ // GIVE-PHYSICAL-FEATURE-NAME=Tusks + let phyFeatName = wscStatement.split('=')[1]; + givePhysicalFeature(srcStruct, phyFeatName); + } else { + displayError("Unknown statement (2-PhyFeat): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Physical Feature /////////////////////////////////// + +function givePhysicalFeature(srcStruct, phyFeatName){ + + socket.emit("requestPhysicalFeaturesChangeByName", // No longer socket request + getCharIDFromURL(), + srcStruct, + phyFeatName); + +} + +socket.on("returnPhysicalFeaturesChangeByName", function(){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-profs.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-profs.js new file mode 100644 index 00000000..070b5f9e --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-profs.js @@ -0,0 +1,237 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Lore --------------------// +function processingProf(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-PROF-INCREASE-IN")){// GIVE-PROF-INCREASE-IN=Arcana + let profName = wscStatement.split('=')[1]; + giveProfIncrease(srcStruct, profName, locationID, sourceName); + } else if(wscStatement.includes("GIVE-PROF-IN")){// GIVE-PROF-IN=Arcana:T + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveProf(srcStruct, segments[0], segments[1], locationID, sourceName); + } else { + displayError("Unknown statement (2-Prof): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Prof /////////////////////////////////// + +function giveProfIncrease(srcStruct, profName, locationID, sourceName){ + giveInProf(srcStruct, profName, 'UP', locationID, sourceName); +} + +function giveProf(srcStruct, profName, prof, locationID, sourceName){ + if(prof === 'T'){ + giveProfSkillTraining(srcStruct, profName, prof, locationID, sourceName); + } else { + giveInProf(srcStruct, profName, prof, locationID, sourceName); + } +} + +function giveProfSkillTraining(srcStruct, profName, prof, locationID, sourceName){ + + let adjProfName = profName.replace(/\s+/g,""); + let profProperName = null; + let profCategory = null; + + let profData = g_profConversionMap.get(adjProfName); + if(profData != null){ + profProperName = profData.Name; + profCategory = profData.Category; + } + + let numUps = profToNumUp(prof); + if(numUps === -1){ + displayError("Not a proficiency type: \'"+prof+"\'"); + statementComplete(); + return; + } + + if(profCategory === 'Skill'){ + + for(const [profMapName, profDataArray] of g_profMap.entries()){ + const finalProfData = getFinalProf(profDataArray); + let tempSkillName = finalProfData.Name.toUpperCase(); + tempSkillName = tempSkillName.replace(/_|\s+/g,""); + if(adjProfName === tempSkillName && finalProfData.NumUps >= numUps){ + if(!hasSameSrcIterate(srcStruct, profDataArray)){ + processBuilderCode( + 'GIVE-SKILL='+prof, + srcStruct, + locationID, + sourceName); + window.setTimeout(() => { + $('#'+locationID).append('

                  You are already trained in '+finalProfData.Name+' which means you can select a new skill to become trained in instead.

                  '); + }, 100); + statementComplete(); + return; + } + + } + } + + //skillsUpdateWSCChoiceStruct(srcStruct, profProperName, prof); + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct, isSkill : true, isStatement : true}, + { For : profCategory, To : profProperName, Prof : prof, SourceName : sourceName }); + displayProfChange(locationID, prof, profProperName); + return; + + } else { + giveInProf(srcStruct, profName, prof, locationID, sourceName); + return; + } + +} + +function giveInProf(srcStruct, profName, prof, locationID, sourceName){ + + let profProperName = null; + let profCategory = null; + + if(profName.startsWith('LORE~')){ + profName = profName.replace(/LORE\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase()+'_LORE'; + profCategory = 'Skill'; + } + + if(profName.startsWith('WEAPON~')){ + profName = profName.replace(/WEAPON\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase(); + profCategory = 'Attack'; + } + + if(profName.startsWith('ARMOR~')){ + profName = profName.replace(/ARMOR\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase(); + profCategory = 'Defense'; + } + + if(profName.startsWith('GROUP~')){ + profName = profName.replace(/GROUP\~/g,''); + profProperName = profName.replace(/\s+/g,'_').toUpperCase(); + profCategory = 'Group'; + } + + profName = profName.replace(/\s+/g,''); + let profData = g_profConversionMap.get(profName); + if(profData != null){ + profProperName = profData.Name; + profCategory = profData.Category; + } + + let isSkill = false; + if(profCategory === 'Skill'){ + isSkill = true; + } + + if(profProperName != null && profCategory != null){ + if(isSkill){ + //skillsUpdateWSCChoiceStruct(srcStruct, profProperName, prof); + } + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct, isSkill : isSkill, isStatement : true}, + { For : profCategory, To : profProperName, Prof : prof, SourceName : sourceName }); + displayProfChange(locationID, prof, profProperName); + } else { + displayError("Unknown proficiency: \'"+profName+"\'"); + statementComplete(); + } + +} + +function displayProfChange(locationID, prof, profName){ + if(locationID == 'profSkillsCode-'+temp_classNum) { return; }// Skip for init skill profs from class + window.setTimeout(() => { + let innerHTML = '

                  Proficiency Change: You become '+profToWord(prof).toLowerCase()+' in '+profName.toLowerCase().replace(/_/g,' ').replace('class dc', 'your class DC').replace('spellattacks', ' spell attacks').replace('spelldcs', ' spell DCs')+'.

                  '; + if($('#'+locationID).html() != null && !$('#'+locationID).html().includes(innerHTML)) { $('#'+locationID).append(innerHTML); } + }, 100); +} + + + + +socket.on("returnProficiencyChange", function(profChangePacket){ + + proficienciesUpdateWSCChoiceStruct(profChangePacket); + + if(profChangePacket.isSkill){ + + detectMultipleSkillTrainings(); + + selectorUpdated(); + if(profChangePacket.isAutoLoad == null || !profChangePacket.isAutoLoad) { + updateSkillMap(true); + } + } + if(profChangePacket.isStatement != null && profChangePacket.isStatement){ + statementComplete(); + } + +}); + +function proficienciesUpdateWSCChoiceStruct(newProfChangePacket) { + + let removeProf = function(profChangePacket){ + // Delete prof + let newProfArray = []; + for(const profData of wscChoiceStruct.ProfArray){ + if(!hasSameSrc(profData, profChangePacket.srcStruct)){ + newProfArray.push(profData); + } + } + wscChoiceStruct.ProfArray = newProfArray; + }; + let addProf = function(profChangePacket){ + // Add prof + let profData = profChangePacket.srcStruct; + profData.For = profChangePacket.profStruct.For; + profData.Prof = profChangePacket.profStruct.Prof; + profData.To = profChangePacket.profStruct.To; + profData.SourceName = profChangePacket.profStruct.SourceName; + profData.value = profData.For+':::'+profData.To+':::'+profData.Prof+':::'+profData.SourceName; + wscChoiceStruct.ProfArray.push(profData); + }; + + + // Update profArray + if(newProfChangePacket.profStruct == null) { + removeProf(newProfChangePacket); + } else { + if(hasSameSrcIterate(newProfChangePacket.srcStruct, wscChoiceStruct.ProfArray)){ + removeProf(newProfChangePacket); + addProf(newProfChangePacket); + } else { + addProf(newProfChangePacket); + } + } + + // Re-build prof map + let profMap = new Map(); + for(const profData of wscChoiceStruct.ProfArray){ + + // Convert lores to be the same + if(profData.To.includes('_LORE')){ + profData.To = capitalizeWords(profData.To.replace('_LORE',' Lore')); + } + + let profMapValue = profMap.get(profData.To); + if(profMapValue != null){ + profMapValue.push(profData); + profMap.set(profData.To, profMapValue); + } else { + profMap.set(profData.To, [profData]); + } + } + wscChoiceStruct.ProfObject = mapToObj(profMap); + + injectWSCChoiceStruct(wscChoiceStruct); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-resistances.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-resistances.js new file mode 100644 index 00000000..27d4df56 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-resistances.js @@ -0,0 +1,47 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Resistances ------------------------// +function processingResistances(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-RESISTANCE")){// GIVE-RESISTANCE=cold:HALF_LEVEL/LEVEL/3 + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveResistance(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("GIVE-WEAKNESS")){// GIVE-WEAKNESS=cold:HALF_LEVEL/LEVEL/3 + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveVulnerability(srcStruct, segments[0], segments[1]); + } else { + displayError("Unknown statement (2-Resist/Weak): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Resistance /////////////////////////////////// +function giveResistance(srcStruct, resistType, resistAmount){ + socket.emit("requestResistanceChange", + getCharIDFromURL(), + srcStruct, + resistType, + resistAmount); +} + +socket.on("returnResistanceChange", function(data){ + statementComplete(); +}); + +//////////////////////////////// Give Vulnerability /////////////////////////////////// +function giveVulnerability(srcStruct, vulnerableType, vulnerableAmount){ + socket.emit("requestVulnerabilityChange", + getCharIDFromURL(), + srcStruct, + vulnerableType, + vulnerableAmount); +} + +socket.on("returnVulnerabilityChange", function(data){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-scfs.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-scfs.js new file mode 100644 index 00000000..ba28586a --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-scfs.js @@ -0,0 +1,158 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing SCFS -------------------------// +function processingSCFS(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-SCFS=")){ // GIVE-SCFS=Class Feature Selector Name:WSC Statement Name + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + createSCFS(srcStruct, locationID, segments[0], segments[1], sourceName); + } else { + displayError("Unknown statement (2-SCFS): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Create SCFS /////////////////////////////////// + +function createSCFS(srcStruct, locationID, featureName, statementName, sourceName){ + + socket.emit("requestFindClassFeatureForSCFS", + getCharIDFromURL(), + featureName, + { locationID, srcStruct, statementName, sourceName }); + +} + +socket.on("returnFindClassFeatureForSCFS", function(classFeature, allClassFeatureOptions, inputPacket){ + if(classFeature == null) { statementComplete(); return; } + + + let scfsID = "scfs-"+inputPacket.locationID+"-"+inputPacket.srcStruct.sourceCode+"-"+inputPacket.srcStruct.sourceCodeSNum; + let scfsCodeID = scfsID+"-Code"; + let scfsControlShellClass = scfsID+'-ControlShell'; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+scfsID).length != 0) { statementComplete(); return; } + + const selectionTagInfo = getTagFromData(inputPacket.srcStruct, inputPacket.sourceName, 'Unselected Option', 'UNSELECTED'); + + $('#'+inputPacket.locationID).append('
                  '); + + $('#'+scfsID).append(''); + $('#'+scfsID).append(''); + + /// + + let SCFSData = wscChoiceStruct.SCFSDataArray.find(SCFSData => { + return hasSameSrc(SCFSData, inputPacket.srcStruct); + }); + + let selectedClassFeatureOption = null; + if(SCFSData != null && SCFSData.value != null){ + selectedClassFeatureOption = allClassFeatureOptions.find(classFeatureOption => { + return classFeatureOption.id == SCFSData.value; + }); + } + + /// + + let optionsMap = new Map(); // { option ID } -> { WSC statement } + + for(const classFeatureOption of allClassFeatureOptions) { + if(classFeatureOption.selectType === 'SELECT_OPTION' && (classFeatureOption.selectOptionFor === classFeature.id || classFeatureOption.indivClassAbilName === classFeature.name)) { + + const codeStatements = classFeatureOption.code.split(/\n/); + const wscStatement = codeStatements.find(statement => { + return statement.startsWith(inputPacket.statementName); + }); + + if(wscStatement != null){ + + if(selectedClassFeatureOption != null && selectedClassFeatureOption.id == classFeatureOption.id) { + $('#'+scfsID).append(''); + } else { + $('#'+scfsID).append(''); + } + + optionsMap.set(classFeatureOption.id+"", wscStatement); + + } + + } + } + + /// + + $('#'+scfsID).change(function() { + + let classFeatureOptionID = $(this).val(); + let wscStatement = optionsMap.get(classFeatureOptionID+""); + + if($(this).val() == "chooseDefault"){ + $('.'+scfsControlShellClass).addClass("is-info"); + + // Clear generated code + $('#'+scfsCodeID).html(''); + + // Delete SCFS + socket.emit("requestSCFSChange", + getCharIDFromURL(), + inputPacket.srcStruct, + null, + { + wscStatement: null, + scfsControlShellClass, + srcStruct: inputPacket.srcStruct, + locationID: scfsCodeID, + sourceName: inputPacket.sourceName, + }); + + } else { + $('.'+scfsControlShellClass).removeClass("is-info"); + + // Clear generated code + $('#'+scfsCodeID).html(''); + + // Save SCFS + $('.'+scfsControlShellClass).addClass("is-loading"); + socket.emit("requestSCFSChange", + getCharIDFromURL(), + inputPacket.srcStruct, + classFeatureOptionID, + { + wscStatement, + scfsControlShellClass, + srcStruct: inputPacket.srcStruct, + locationID: scfsCodeID, + sourceName: inputPacket.sourceName, + }); + + } + + }); + + $('#'+scfsID).trigger("change"); + + statementComplete(); + +}); + + +socket.on("returnSCFSChange", function(inputPacket){ + if(inputPacket.scfsControlShellClass != null) { + $('.'+inputPacket.scfsControlShellClass).removeClass("is-loading"); + $('.'+inputPacket.scfsControlShellClass+'>select').blur(); + selectorUpdated(); + } + if(inputPacket.wscStatement != null){ + processBuilderCode( + inputPacket.wscStatement, + inputPacket.srcStruct, + inputPacket.locationID, + inputPacket.sourceName); + } +}); diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-senses.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-senses.js new file mode 100644 index 00000000..1a200836 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-senses.js @@ -0,0 +1,31 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Senses --------------------// +function processingSenses(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-SENSE-NAME")){ // GIVE-SENSE-NAME=Darkvision + let senseName = wscStatement.split('=')[1]; + giveSense(srcStruct, senseName); + } else { + displayError("Unknown statement (2-Sense): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Sense /////////////////////////////////// + +function giveSense(srcStruct, senseName){ + + socket.emit("requestSensesChangeByName", // No longer socket request + getCharIDFromURL(), + srcStruct, + senseName); + +} + +socket.on("returnSensesChangeByName", function(){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-skills.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-skills.js new file mode 100644 index 00000000..ebfd7655 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-skills.js @@ -0,0 +1,208 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Skills -------------------------// +function processingSkills(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-SKILL-INCREASE")){// GIVE-SKILL-INCREASE + giveSkillIncrease(srcStruct, locationID, sourceName); + } + else if(wscStatement.includes("GIVE-SKILL")){// GIVE-SKILL=T[arcana,deception] + let value = wscStatement.split('=')[1]; + let optionals = value.match(/^.+?\[(.+?)\]$/); + if(optionals != null){ + value = value.split('[')[0]; + optionals = optionals[1].split(','); + } + giveSkillProf(srcStruct, locationID, sourceName, value, optionals); + } else { + displayError("Unknown statement (2-Skill): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Skill Increase /////////////////////////////////// + +function giveSkillIncrease(srcStruct, locationID, sourceName){ + giveSkill(srcStruct, locationID, sourceName, 'UP'); +} + +function giveSkillProf(srcStruct, locationID, sourceName, prof, optionals){ + giveSkill(srcStruct, locationID, sourceName, prof, optionals); +} + +function giveSkill(srcStruct, locationID, sourceName, profType, optionals=null){ + + let selectIncreaseID = "selectIncrease-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectIncreaseControlShellClass = selectIncreaseID+'ControlShell'; + let increaseDescriptionID = "selectIncreaseDescription-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let increaseCodeID = "selectIncreaseCode-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+selectIncreaseID).length != 0) { statementComplete(); return; } + + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Skill', 'UNSELECTED'); + + let optionalsString = JSON.stringify(optionals).replace(/"/g, '`'); + $('#'+locationID).append('
                  '); + + $('#'+locationID).append('
                  '); + $('#'+locationID).append('
                  '); + + populateSkillLists(selectIncreaseID, srcStruct, profType, optionals); + + // On increase choice change + $('#'+selectIncreaseID).change(function(event, isAutoLoad) { + $('#'+increaseCodeID).html(''); + isAutoLoad = (isAutoLoad == null) ? false : isAutoLoad; + + if($(this).val() == "chooseDefault"){ + + $('.'+selectIncreaseControlShellClass).removeClass("is-danger"); + $('.'+selectIncreaseControlShellClass).addClass("is-info"); + + if(profType === 'UP') { + $('#'+increaseDescriptionID).html(''); + } + + //skillsUpdateWSCChoiceStruct(srcStruct, null, null); + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct, isSkill : true, isAutoLoad}, + null); + + } else if($(this).val() == "addLore"){ + + $('.'+selectIncreaseControlShellClass).removeClass("is-danger"); + $('.'+selectIncreaseControlShellClass).removeClass("is-info"); + + if(profType === 'UP') { + $('#'+increaseDescriptionID).html(''); + } + + //skillsUpdateWSCChoiceStruct(srcStruct, 'addLore', profType); + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct, isSkill : true, isAutoLoad}, + { For : "Skill", To : 'addLore', Prof : profType, SourceName : sourceName }); + processBuilderCode( + 'GIVE-LORE-CHOOSE', + srcStruct, + increaseCodeID, + 'Skill Training'); + + } else { + + $('.'+selectIncreaseControlShellClass).removeClass("is-info"); + + let canSave = false; + if(profType === 'UP') { + let skillName = $('#'+selectIncreaseID).val(); + let numUps = g_skillMap.get(skillName).NumUps; + if(isAutoLoad || isAbleToSelectIncrease(numUps+1, srcStruct.sourceLevel)) { + canSave = true; + $('#'+increaseDescriptionID).html(''); + } else { + $('.'+selectIncreaseControlShellClass).addClass("is-danger"); + $('#'+increaseDescriptionID).html('

                  You cannot increase the proficiency of this skill any further at this level!

                  '); + } + } else { + canSave = true; + } + + if(canSave) { + $('.'+selectIncreaseControlShellClass).removeClass("is-danger"); + + let skillName = $(this).val(); + if(skillName.includes(' Lore')){ + skillName = skillName.toUpperCase().replace(/ /g,'_'); + } + + //skillsUpdateWSCChoiceStruct(srcStruct, skillName, profType); + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct, isSkill : true, isAutoLoad}, + { For : "Skill", To : skillName, Prof : profType, SourceName : sourceName }); + } + + } + + $(this).blur(); + + }); + + $('#'+selectIncreaseID).trigger("change", [true]); + + statementComplete(); + +} + +function isAbleToSelectIncrease(numUps, charLevel){ + if(numUps == 3){ + return (charLevel >= 7); + } else if (numUps == 4){ + return (charLevel >= 15); + } else if (numUps > 4) { + return false; + } else { + return true; + } +} + +function populateSkillLists(selectIncreaseID, srcStruct, profType, optionals){ + + $('#'+selectIncreaseID).html(''); + $('#'+selectIncreaseID).append(''); + $('#'+selectIncreaseID).append(''); + + // Set saved skill choices + let savedSkillData = wscChoiceStruct.ProfArray.find(prof => { + return hasSameSrc(prof, srcStruct); + }); + + for(const [skillName, skillData] of g_skillMap.entries()){ + + if(optionals != null){ + if(!optionals.includes(skillName.toUpperCase())){ + continue; + } + } + + if(savedSkillData != null && savedSkillData.To != null && similarSkills(savedSkillData, skillName)) { + $('#'+selectIncreaseID).append(''); + } else { + if(skillData.NumUps < profToNumUp(profType)) { + $('#'+selectIncreaseID).append(''); + } else { + $('#'+selectIncreaseID).append(''); + } + } + + } + + if(optionals == null){ + // Add Lore Option + $('#'+selectIncreaseID).append(''); + if(savedSkillData != null && savedSkillData.To == 'addLore') { + $('#'+selectIncreaseID).append(''); + } else { + $('#'+selectIncreaseID).append(''); + } + } + + // Exists to guarantee it will be blue when at chooseDefault or not + if($('#'+selectIncreaseID).val() == 'chooseDefault'){ + $('#'+selectIncreaseID).parent().addClass("is-info"); + } else { + $('#'+selectIncreaseID).parent().removeClass("is-info"); + } + +} + +function similarSkills(savedSkillData, skillName){ + let skillNameOne = savedSkillData.To.toUpperCase().replace(/ /g,"_"); + let skillNameTwo = skillName.toUpperCase().replace(/ /g,"_"); + return (skillNameOne === skillNameTwo); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-specializations.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-specializations.js new file mode 100644 index 00000000..62782519 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-specializations.js @@ -0,0 +1,79 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Specializations --------------------// +function processingSpecializations(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-WEAPON-SPECIALIZATION")){ // GIVE-WEAPON-SPECIALIZATION + giveWeaponSpecialization(srcStruct, 1); + } else if(wscStatement.includes("GIVE-GREATER-WEAPON-SPECIALIZATION")){ // GIVE-GREATER-WEAPON-SPECIALIZATION + giveWeaponSpecialization(srcStruct, 2); + } else if(wscStatement.includes("GIVE-WEAPON-CRITICAL-SPECIALIZATION")){ // GIVE-WEAPON-CRITICAL-SPECIALIZATION= + let weapName = wscStatement.split('=')[1]; + giveWeaponCriticalSpecialization(srcStruct, weapName); + } else if(wscStatement.includes("GIVE-ARMOR-SPECIALIZATION")){ // GIVE-ARMOR-SPECIALIZATION= + let armorName = wscStatement.split('=')[1]; + giveArmorSpecialization(srcStruct, armorName); + } else { + displayError("Unknown statement (2-Specialization): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Weapon Specialization /////////////////////////////////// +// GIVE-WEAPON-SPECIALIZATION +// GIVE-GREATER-WEAPON-SPECIALIZATION + +function giveWeaponSpecialization(srcStruct, type){ + + socket.emit("requestWeaponSpecializationChange", + getCharIDFromURL(), + srcStruct, + type); + +} + +socket.on("returnWeaponSpecializationChange", function(){ + statementComplete(); +}); + +//////////////////////////////// Give Armor Specialization /////////////////////////////////// +// GIVE-ARMOR-SPECIALIZATION=TRAIT~Dwarf +// GIVE-ARMOR-SPECIALIZATION=NAME~Leather +// GIVE-ARMOR-SPECIALIZATION=Light_Armor + +function giveArmorSpecialization(srcStruct, armorName){ + + socket.emit("requestArmorSpecializationChange", + getCharIDFromURL(), + srcStruct, + armorName); + +} + +socket.on("returnArmorSpecializationChange", function(){ + statementComplete(); +}); + +//////////////////////////////// Give Critical Specialization /////////////////////////////////// +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=TRAIT~Dwarf +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=NAME~Spear +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=GROUP~Polearm +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=PROF~E +// GIVE-WEAPON-CRITICAL-SPECIALIZATION=Simple_Weapons + + +function giveWeaponCriticalSpecialization(srcStruct, weapName){ + + socket.emit("requestWeaponCriticalSpecializationChange", + getCharIDFromURL(), + srcStruct, + weapName); + +} + +socket.on("returnWeaponCriticalSpecializationChange", function(){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-speeds.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-speeds.js new file mode 100644 index 00000000..5d547d88 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-speeds.js @@ -0,0 +1,33 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//--------------------- Processing Speeds --------------------// +function processingSpeeds(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-SPEED")){ // GIVE-SPEED=Swim:15 + let data = wscStatement.split('=')[1]; // GIVE-SPEED=Swim:LAND_SPEED + let segments = data.split(':'); + giveSpeed(srcStruct, segments[0], segments[1]); + } else { + displayError("Unknown statement (2-Speed): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Speed /////////////////////////////////// + +function giveSpeed(srcStruct, speedType, speedAmt){ + + socket.emit("requestSpeedChange", + getCharIDFromURL(), + srcStruct, + speedType, + speedAmt); + +} + +socket.on("returnSpeedChange", function(){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-spells-focus.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-spells-focus.js new file mode 100644 index 00000000..fbefb7c0 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-spells-focus.js @@ -0,0 +1,45 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Focus Spells ------------------------// +function processingFocusSpells(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-FOCUS-SPELL")){// GIVE-FOCUS-SPELL=Bard:Meld_Into_Stone + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveFocusSpell(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("GIVE-FOCUS-POINT")){// GIVE-FOCUS-POINT + giveFocusPoint(srcStruct); + } else { + displayError("Unknown statement (2-SpellFocus): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Focus Spell /////////////////////////////////// +function giveFocusSpell(srcStruct, spellSRC, spellName){ + spellName = spellName.replace(/_/g," "); + spellName = spellName.replace(/’/g,"'"); + socket.emit("requestFocusSpellChange", + getCharIDFromURL(), + srcStruct, + spellSRC, + spellName); +} + +socket.on("returnFocusSpellChange", function(){ + statementComplete(); +}); + +//////////////////////////////// Give Focus Point /////////////////////////////////// +function giveFocusPoint(srcStruct){ + socket.emit("requestFocusPointChange", + getCharIDFromURL(), + srcStruct); +} + +socket.on("returnFocusPointChange", function(){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-spells-innate.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-spells-innate.js new file mode 100644 index 00000000..25599b82 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-spells-innate.js @@ -0,0 +1,184 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Innate Spells -------------------------// +function processingInnateSpells(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("GIVE-INNATE-SPELL=")){// GIVE-INNATE-SPELL=3:divine:1(:ANY) + let data = wscStatement.split('=')[1]; // Set cast times per day to 0 to cast an unlimited number + let segments = data.split(':');// For cantrips just do: GIVE-INNATE-SPELL=0:divine:0 + giveInnateSpell(srcStruct, locationID, sourceName, segments[0], segments[1], segments[2], segments[3], segments[4]); + } else if(wscStatement.includes("GIVE-INNATE-SPELL-NAME=")){// GIVE-INNATE-SPELL-NAME=Meld_Into_Stone:3:divine:1 + let data = wscStatement.split('=')[1]; // Set cast times per day to 0 to cast an unlimited number + let segments = data.split(':');// For cantrips just do: GIVE-INNATE-SPELL-NAME=Daze:0:divine:0 + giveInnateSpellByName(srcStruct, sourceName, segments[0], segments[1], segments[2], segments[3]); + } else { + displayError("Unknown statement (2-SpellInnate): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + +//////////////////////////////// Give Innate Spell /////////////////////////////////// +function giveInnateSpell(srcStruct, locationID, sourceName, spellLevel, spellTradition, timesPerDay, optionalSelectFromAnyTradition){ + let selectFromAnyTradition = (optionalSelectFromAnyTradition != null); + if(spellTradition != null){ + if(spellTradition === 'OCCULT' || spellTradition === 'ARCANE' || spellTradition === 'DIVINE' || spellTradition === 'PRIMAL') { + if(!isNaN(parseInt(spellLevel))) { + displayInnateSpellChoice(srcStruct, locationID, sourceName, spellLevel, spellTradition, timesPerDay, selectFromAnyTradition); + } else { + displayError("Spell Level is Not a Number: \'"+spellLevel+"\'"); + statementComplete(); + } + } else { + displayError("Unknown Spell Tradition: \'"+spellTradition+"\'"); + statementComplete(); + } + } else { + displayError("Invalid Spell Tradition"); + statementComplete(); + } +} + +function displayInnateSpellChoice(srcStruct, locationID, sourceName, spellLevel, spellTradition, timesPerDay, selectFromAnyTradition){ + + let selectionName = (spellLevel == 0) ? 'Choose a Cantrip' : 'Choose a Level '+spellLevel+' Spell'; + let selectSpellID = "selectInnateSpell-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let descriptionSpellID = "descriptionInnateSpell-"+locationID+"-"+srcStruct.sourceCode+"-"+srcStruct.sourceCodeSNum; + let selectSpellControlShellClass = selectSpellID+'-ControlShell'; + + // If ID already exists, just return. This is a temporary fix - this shouldn't be an issue in the first place. + if($('#'+selectSpellID).length != 0) { statementComplete(); return; } + + const selectionTagInfo = getTagFromData(srcStruct, sourceName, 'Unselected Spell', 'UNSELECTED'); + + $('#'+locationID).append('
                  '); + + $('#'+selectSpellID).append(''); + $('#'+selectSpellID).append(''); + + let triggerChange = false; + // Set saved spell choices + + let innateSpellArray = wscChoiceStruct.InnateSpellArray; + + let innateSpellData = innateSpellArray.find(innateSpellData => { + return hasSameSrc(innateSpellData, srcStruct); + }); + + let selectedSpell = null; + if(innateSpellData != null){ + selectedSpell = innateSpellData; + triggerChange = true; + } + + for(const [spellID, spellData] of g_spellMap.entries()){ + if(spellData.Spell.level != spellLevel){ continue; } + + if(selectFromAnyTradition){ + if(spellData.Spell.traditions == '[]'){ continue; }// If has no tradition, + } else { + if(!spellData.Spell.traditions.includes(spellTradition.toLowerCase())){ continue; } + } + + let spellName = spellData.Spell.name; + if(spellData.Spell.isArchived === 1){ + if(selectedSpell != null && selectedSpell.SpellID == spellData.Spell.id){ + spellName += ' - Archived'; + } else { + continue; + } + } + + $('#'+selectSpellID).append(''); + + } + + if(selectedSpell != null){ + $('#'+selectSpellID).val(selectedSpell.SpellID); + if ($('#'+selectSpellID).val() != selectedSpell.SpellID){ + $('#'+selectSpellID).val($("#"+selectSpellID+" option:first").val()); + $('#'+selectSpellID).parent().addClass("is-info"); + } + } + + // On spell choice change + $('#'+selectSpellID).change(function(event, triggerSave) { + + let spellID = $(this).val(); + let spell = g_spellMap.get(spellID+""); + + if($(this).val() == "chooseDefault" || spell == null){ + $('.'+selectSpellControlShellClass).addClass("is-info"); + + // Display nothing + $('#'+descriptionSpellID).html(''); + + socket.emit("requestWSCInnateSpellChange", + getCharIDFromURL(), + srcStruct, + null, + selectSpellControlShellClass); + + } else { + $('.'+selectSpellControlShellClass).removeClass("is-info"); + + // Display spell + displaySpell(descriptionSpellID, spell); + + // Save spell + if(triggerSave == null || triggerSave) { + $('.'+selectSpellControlShellClass).addClass("is-loading"); + socket.emit("requestWSCInnateSpellChange", + getCharIDFromURL(), + srcStruct, + {name: spell.Spell.name, level: spell.Spell.level, tradition: spellTradition, tPd: timesPerDay}, + selectSpellControlShellClass); + } + + } + + }); + + $('#'+selectSpellID).trigger("change", [triggerChange]); + + statementComplete(); + +} + + +socket.on("returnWSCInnateSpellChange", function(selectControlShellClass){ + if(selectControlShellClass != null) { + $('.'+selectControlShellClass).removeClass("is-loading"); + $('.'+selectControlShellClass+'>select').blur(); + } + selectorUpdated(); +}); + + +//////////////////////////////// Give Innate Spell by Name /////////////////////////////////// +function giveInnateSpellByName(srcStruct, sourceName, spellName, spellLevel, spellTradition, timesPerDay){ + if(spellTradition != null){ + spellName = spellName.replace(/_/g," "); + if(spellTradition === 'OCCULT' || spellTradition === 'ARCANE' || spellTradition === 'DIVINE' || spellTradition === 'PRIMAL') { + socket.emit("requestInnateSpellChange", + getCharIDFromURL(), + srcStruct, + spellName, + spellLevel, + spellTradition, + timesPerDay); + } else { + displayError("Unknown Spell Tradition: \'"+spellTradition+"\'"); + statementComplete(); + } + } else { + displayError("Invalid Spell Tradition"); + statementComplete(); + } +} + +socket.on("returnInnateSpellChange", function(){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_builders/wsc/wsc-spells.js b/client/vue-src/legacy-js/char_builders/wsc/wsc-spells.js new file mode 100644 index 00000000..28b1c953 --- /dev/null +++ b/client/vue-src/legacy-js/char_builders/wsc/wsc-spells.js @@ -0,0 +1,167 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//------------------------- Processing Spells ------------------------// +function processingSpells(wscStatement, srcStruct, locationID, sourceName){ + + if(wscStatement.includes("SET-SPELL-SLOTS")){// SET-SPELL-SLOTS=Bard:Three-Quarters/Full/Single-Set + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveSpellCasting(srcStruct, segments[0], segments[1], segments[2]); + } else if(wscStatement.includes("GIVE-SPELL-SLOT")){// GIVE-SPELL-SLOT=Bard:10 + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + let color = ''; + if(segments[2] != null){ color = segments[2]; } + giveSpellSlot(srcStruct, segments[0], segments[1], color); + } else if(wscStatement.includes("SET-SPELL-KEY-ABILITY")){// SET-SPELL-KEY-ABILITY=Bard:INT + let data = wscStatement.split('=')[1]; // Will default to CHA if nothing is set + let segments = data.split(':'); + setSpellKeyAbility(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("SET-SPELL-CASTING-TYPE")){ + let data = wscStatement.split('=')[1]; // Will default to PREPARED-LIST + let segments = data.split(':');// SET-SPELL-CASTING-TYPE=Bard:PREPARED-LIST/PREPARED-BOOK/SPONTANEOUS-REPERTOIRE + setSpellCastingType(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("SET-SPELL-TRADITION")){// SET-SPELL-TRADITION=Wizard:Primal/Divine/Occult/Arcane + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + giveSpellList(srcStruct, segments[0], segments[1]); + } else if(wscStatement.includes("ADD-SPELL-TO-LIST")){// ADD-SPELL-TO-LIST=Wizard:Meld_Into_Stone:3 + let data = wscStatement.split('=')[1]; + let segments = data.split(':'); + let color = ''; + if(segments[3] != null){ color = segments[3]; } + addSpellToSpellbook(srcStruct, segments[0], segments[1], segments[2], color); + } else { + displayError("Unknown statement (2-Spell): \'"+wscStatement+"\'"); + statementComplete(); + } + +} + + +//////////////////////////////// Set Spell Slots /////////////////////////////////// +function giveSpellCasting(srcStruct, spellSRC, spellcasting, reduceSlotsByOne){ + reduceSlotsByOne = (reduceSlotsByOne != null && reduceSlotsByOne.toUpperCase() == 'REDUCE-SLOTS-BY-ONE') ? true : false; + socket.emit("requestSpellCastingSlotChange", + getCharIDFromURL(), + srcStruct, + spellSRC, + spellcasting, + reduceSlotsByOne); +} + +function giveSpellSlot(srcStruct, spellSRC, spellSlot, color){ + + let slotType = ''; + switch(color.trim().toLowerCase()){ + case 'green': slotType = 'R:0,G:1,B:0'; break; + case 'blue': slotType = 'R:0,G:0,B:1'; break; + case 'red': slotType = 'R:1,G:0,B:0'; break; + case 'brown': slotType = 'R:1,G:1,B:0'; break; + case 'aqua': slotType = 'R:0,G:1,B:1'; break; + case 'purple': slotType = 'R:1,G:0,B:1'; break; + case 'gold': slotType = 'R:1,G:1,B:1'; break; + default: break; + } + + socket.emit("requestSpellSlotChange", + getCharIDFromURL(), + srcStruct, + spellSRC, + spellSlot, + slotType); +} + +socket.on("returnSpellCastingSlotChange", function(spellSRC, spellSlots){ + statementComplete(); +}); + +socket.on("returnSpellSlotChange", function(spellSRC, spellSlot){ + statementComplete(); +}); + +//////////////////////////////// Set Key Ability /////////////////////////////////// +function setSpellKeyAbility(srcStruct, spellSRC, abilityScore){ + if(getAllAbilityTypes().includes(lengthenAbilityType(abilityScore))){ + socket.emit("requestKeySpellAbilityChange", + getCharIDFromURL(), + srcStruct, + spellSRC, + abilityScore); + } else { + displayError("Cannot identify ability score (case sensitive): '"+abilityScore+"'!"); + statementComplete(); + } +} + +socket.on("returnKeySpellAbilityChange", function(){ + statementComplete(); +}); + +//////////////////////////////// Give Spell List /////////////////////////////////// +function giveSpellList(srcStruct, spellSRC, spellList){ + if(spellList === 'OCCULT' || spellList === 'ARCANE' || spellList === 'DIVINE' || spellList === 'PRIMAL') { + socket.emit("requestSpellTraditionChange", + getCharIDFromURL(), + srcStruct, + spellSRC, + spellList); + } else { + displayError("Unknown Spell Tradition: \'"+spellList+"\'"); + statementComplete(); + } +} + +socket.on("returnSpellListChange", function(){ + statementComplete(); +}); + +//////////////////////////////// Set Casting Type /////////////////////////////////// +function setSpellCastingType(srcStruct, spellSRC, castingType){ + if(castingType === 'PREPARED-LIST' || castingType === 'PREPARED-BOOK' || castingType === 'PREPARED-FAMILIAR' || castingType === 'SPONTANEOUS-REPERTOIRE' || castingType === 'FLEXIBLE-COLLECTION') { + socket.emit("requestSpellCastingTypeChange", + getCharIDFromURL(), + srcStruct, + spellSRC, + castingType); + } else { + displayError("Unknown Spellcasting Type: \'"+castingType+"\'"); + statementComplete(); + } +} + +socket.on("returnSpellCastingTypeChange", function(){ + statementComplete(); +}); + + +//////////////////////////////// Add Spell to Spellbook /////////////////////////////////// +function addSpellToSpellbook(srcStruct, spellSRC, spellName, spellLevel, color){ + + let spellType = null; + switch(color.trim().toLowerCase()){ + case 'green': spellType = 'R:0,G:1,B:0'; break; + case 'blue': spellType = 'R:0,G:0,B:1'; break; + case 'red': spellType = 'R:1,G:0,B:0'; break; + case 'brown': spellType = 'R:1,G:1,B:0'; break; + case 'aqua': spellType = 'R:0,G:1,B:1'; break; + case 'purple': spellType = 'R:1,G:0,B:1'; break; + case 'gold': spellType = 'R:1,G:1,B:1'; break; + default: break; + } + + spellName = spellName.replace(/_/g," "); + socket.emit("requestBuilderSpellAddToSpellBook", + getCharIDFromURL(), + srcStruct, + spellSRC, + spellName, + spellLevel, + spellType); +} + +socket.on("returnBuilderSpellAddToSpellBook", function(){ + statementComplete(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_export/export-handler.js b/client/vue-src/legacy-js/char_export/export-handler.js new file mode 100644 index 00000000..8c9ed3d6 --- /dev/null +++ b/client/vue-src/legacy-js/char_export/export-handler.js @@ -0,0 +1,42 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ~~~~~ Character Export ~~~~~ // +function exportCharacter(charID){ + startSpinnerSubLoader(); + socket.emit("requestCharExport", charID); +} + +socket.on("returnCharExport", function(charExportData){ + stopSpinnerSubLoader(); + let charExportDataJSON = JSON.stringify(charExportData); + let fileName = charExportData.character.name.replaceAll(/[^a-zA-Z]/g, '').replaceAll(' ', '_'); + charExportDataFileDownload(fileName+'.guidechar', charExportDataJSON); + $('.modal-card-close').trigger('click'); +}); + +function charExportDataFileDownload(filename, text) { + let element = document.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', filename); + + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); +} + + + +// ~~~~~ Character Copy ~~~~~ // +function copyCharacter(charID){ + socket.emit("requestCharCopy", charID); +} + +socket.on("returnCharCopy", function(){ + // Hardcoded redirect + window.location.href = '/profile/characters'; +}); diff --git a/client/vue-src/legacy-js/char_export/populate-pdf.js b/client/vue-src/legacy-js/char_export/populate-pdf.js new file mode 100644 index 00000000..77324cca --- /dev/null +++ b/client/vue-src/legacy-js/char_export/populate-pdf.js @@ -0,0 +1,983 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +const { PDFDocument } = PDFLib; + +export function setup(socket) { + socket.on("returnCharExportPDFInfo", function (charInfo, extraData) { + try { + charExportGeneratePDF(charInfo, extraData); + } catch (err) { + console.error("Failed to generate character PDF:"); + console.error(err); + } + }); +} + +export function getMod(abilScore) { + let mod = Math.floor((abilScore - 10) / 2); + return mod; +} + +export function getNumZeroIfNull(number) { + return number != null ? number : 0; +} + +export function initCharacterExportToPDF() { + $("#btn-export-to-pdf").click(function () { + startSpinnerSubLoader(); + socket.emit("requestCharExportPDFInfo", activeModalCharID); + }); +} + +let g_featMap = null; + +// HARDCODED Names of final profs and PDF fields + +// Field names: https://www.pdfescape.com + +async function charExportGeneratePDF(charInfo, extraData) { + g_featMap = objToMap(extraData.featsObject); + + console.log(charInfo); + + const formUrl = "/pdf/character_sheet.pdf"; + const formPdfBytes = await fetch(formUrl).then((res) => res.arrayBuffer()); + + const pdfDoc = await PDFDocument.load(formPdfBytes); + + const form = pdfDoc.getForm(); + + const profMap = objToMap(charInfo.profs); + + console.log(profMap); + + const nameField = form.getTextField("Character Name"); + const playerNameField = form.getTextField("Player Name"); + const xpField = form.getTextField("Experience Points XP"); + const ancestryHeritageField = form.getTextField("Ancestry and Heritage"); + const backgroundField = form.getTextField("Background"); + const classField = form.getTextField("Class"); + const sizeField = form.getTextField("Size"); + const alignmentField = form.getTextField("Alignment"); + const traitsField = form.getTextField("Traits"); + const deityField = form.getTextField("Deity"); + const levelField = form.getTextField("Level"); + const heroPointsField = form.getTextField("Text2"); + + const strModField = form.getTextField("Text4"); + const dexModField = form.getTextField("Text5"); + const conModField = form.getTextField("Text6"); + const intModField = form.getTextField("Text7"); + const wisModField = form.getTextField("Text8"); + const chaModField = form.getTextField("Text9"); + + const strScoreField = form.getTextField("STRENGTH"); + const dexScoreField = form.getTextField("DEXTERITY"); + const conScoreField = form.getTextField("CONSTITUTION"); + const intScoreField = form.getTextField("INTELLIGENCE"); + const wisScoreField = form.getTextField("WISDOM"); + const chaScoreField = form.getTextField("CHARISMA"); + + let strMod = 0; + let dexMod = 0; + let conMod = 0; + let intMod = 0; + let wisMod = 0; + let chaMod = 0; + + let totalAbilityScores = JSON.parse(charInfo.stats.totalAbilityScores); + for (let abilityScore of totalAbilityScores) { + switch (abilityScore.Name) { + case "Strength": + strMod = getMod(abilityScore.Score); + strScoreField.setText(abilityScore.Score + ""); + strModField.setText(signNumber(strMod) + ""); + break; + case "Dexterity": + dexMod = getMod(abilityScore.Score); + dexScoreField.setText(abilityScore.Score + ""); + dexModField.setText(signNumber(dexMod) + ""); + break; + case "Constitution": + conMod = getMod(abilityScore.Score); + conScoreField.setText(abilityScore.Score + ""); + conModField.setText(signNumber(conMod) + ""); + break; + case "Intelligence": + intMod = getMod(abilityScore.Score); + intScoreField.setText(abilityScore.Score + ""); + intModField.setText(signNumber(intMod) + ""); + break; + case "Wisdom": + wisMod = getMod(abilityScore.Score); + wisScoreField.setText(abilityScore.Score + ""); + wisModField.setText(signNumber(wisMod) + ""); + break; + case "Charisma": + chaMod = getMod(abilityScore.Score); + chaScoreField.setText(abilityScore.Score + ""); + chaModField.setText(signNumber(chaMod) + ""); + break; + default: + break; + } + } + + const totalSpeedField = form.getTextField("Text18"); + const otherSpeedsField = form.getTextField("MOVEMENT TYPES NOTES"); + + const totalClassDCField = form.getTextField("Text10"); + + // // + const totalACField = form.getTextField("Text3"); + + const acDexModField = form.getTextField("Text12"); + const acCapField = form.getTextField("Text13"); + const acProfBonusField = form.getTextField("PROF"); + const acProfTrainedField = form.getCheckBox("Check Box4"); + const acProfExpertField = form.getCheckBox("Check Box5"); + const acProfMasterField = form.getCheckBox("Check Box6"); + const acProfLegendaryField = form.getCheckBox("Check Box7"); + const acItemBonusField = form.getTextField("ITEM"); + + const unarmoredTBox = form.getCheckBox("Check Box28"); + const unarmoredEBox = form.getCheckBox("Check Box29"); + const unarmoredMBox = form.getCheckBox("Check Box30"); + const unarmoredLBox = form.getCheckBox("Check Box31"); + setProfCheckBox( + profMap.get("Unarmored_Defense"), + unarmoredTBox, + unarmoredEBox, + unarmoredMBox, + unarmoredLBox, + ); + + const lightArmorTBox = form.getCheckBox("Check Box32"); + const lightArmorEBox = form.getCheckBox("Check Box33"); + const lightArmorMBox = form.getCheckBox("Check Box34"); + const lightArmorLBox = form.getCheckBox("Check Box35"); + setProfCheckBox( + profMap.get("Light_Armor"), + lightArmorTBox, + lightArmorEBox, + lightArmorMBox, + lightArmorLBox, + ); + + const mediumArmorTBox = form.getCheckBox("Check Box36"); + const mediumArmorEBox = form.getCheckBox("Check Box37"); + const mediumArmorMBox = form.getCheckBox("Check Box38"); + const mediumArmorLBox = form.getCheckBox("Check Box39"); + setProfCheckBox( + profMap.get("Medium_Armor"), + mediumArmorTBox, + mediumArmorEBox, + mediumArmorMBox, + mediumArmorLBox, + ); + + const heavyArmorTBox = form.getCheckBox("Check Box40"); + const heavyArmorEBox = form.getCheckBox("Check Box41"); + const heavyArmorMBox = form.getCheckBox("Check Box42"); + const heavyArmorLBox = form.getCheckBox("Check Box43"); + setProfCheckBox( + profMap.get("Heavy_Armor"), + heavyArmorTBox, + heavyArmorEBox, + heavyArmorMBox, + heavyArmorLBox, + ); + + const shieldACBonusField = form.getTextField("Text16"); + const shieldHardnessField = form.getTextField("HARDNESS"); + const shieldHealthAndBTField = form.getTextField("BT"); + const shieldCurrentHPField = form.getTextField("CURRENT HP"); + + // // + const maxHPField = form.getTextField("Text1"); + const currentHPField = form.getTextField("CURRENT MAX"); + const tempHPField = form.getTextField("TEMPORARY"); + + const dyingField = form.getTextField("DYING"); + const woundedField = form.getTextField("WOUNDED"); + + const resistancesField = form.getTextField("RESISTANCES AND IMMUNITIES"); + + const conditionsField = form.getTextField("CONDITIONS"); + + const totalPerceptionField = form.getTextField("Text17"); + totalPerceptionField.setText(signNumber(charInfo.stats.totalPerception)); + + const perceptionWisModField = form.getTextField("WIS_2"); + const perceptionProfBonusField = form.getTextField("PROF_5"); + const perceptionItemBonusField = form.getTextField("ITEM_5"); + + const percepTBox = form.getCheckBox("Check Box24"); + const percepEBox = form.getCheckBox("Check Box25"); + const percepMBox = form.getCheckBox("Check Box26"); + const percepLBox = form.getCheckBox("Check Box27"); + setProfCheckBox( + profMap.get("Perception"), + percepTBox, + percepEBox, + percepMBox, + percepLBox, + ); + + const sensesField = form.getTextField("SENSES"); + let sensesText = ""; + for (let sense of charInfo.build.senses) { + sensesText += sense.value.name + ", "; + } + sensesText = sensesText.slice(0, -2); // Trim off that last ', ' + sensesField.setText(sensesText); + + // Saves + + let totalSaves = JSON.parse(charInfo.stats.totalSaves); + + const totalFortField = form.getTextField("Text11"); + totalFortField.setText(signNumber(totalSaves[0].Bonus) + ""); + + const fortConModField = form.getTextField("CON"); + const fortProfBonusField = form.getTextField("PROF_2"); + const fortItemBonusField = form.getTextField("ITEM_2"); + + const fortTBox = form.getCheckBox("Check Box8"); + const fortEBox = form.getCheckBox("Check Box9"); + const fortMBox = form.getCheckBox("Check Box10"); + const fortLBox = form.getCheckBox("Check Box11"); + setProfCheckBox( + profMap.get("Fortitude"), + fortTBox, + fortEBox, + fortMBox, + fortLBox, + ); + + const totalReflexField = form.getTextField("Text14"); + totalReflexField.setText(signNumber(totalSaves[1].Bonus) + ""); + + const reflexDexModField = form.getTextField("DEX"); + const reflexProfBonusField = form.getTextField("PROF_3"); + const reflexItemBonusField = form.getTextField("ITEM_3"); + + const reflexTBox = form.getCheckBox("Check Box12"); + const reflexEBox = form.getCheckBox("Check Box13"); + const reflexMBox = form.getCheckBox("Check Box14"); + const reflexLBox = form.getCheckBox("Check Box15"); + setProfCheckBox( + profMap.get("Reflex"), + reflexTBox, + reflexEBox, + reflexMBox, + reflexLBox, + ); + + const totalWillField = form.getTextField("Text15"); + totalWillField.setText(signNumber(totalSaves[1].Bonus) + ""); + + const willWisModField = form.getTextField("WIS"); + const willProfBonusField = form.getTextField("PROF_4"); + const willItemBonusField = form.getTextField("ITEM_4"); + + const willTBox = form.getCheckBox("Check Box16"); + const willEBox = form.getCheckBox("Check Box17"); + const willMBox = form.getCheckBox("Check Box18"); + const willLBox = form.getCheckBox("Check Box19"); + setProfCheckBox(profMap.get("Will"), willTBox, willEBox, willMBox, willLBox); + + // Melee + const weap1NameField = form.getTextField("Weapon"); + const weap1HitBonusField = form.getTextField("Text37"); + const weap1DmgDiceField = form.getTextField("DICE"); + const weap1TraitsField = form.getTextField("TRAITS"); + const weap1StrField = form.getTextField("STR_2"); + + const weap2NameField = form.getTextField("Weapon_2"); + const weap2HitBonusField = form.getTextField("Text38"); + const weap2DmgDiceField = form.getTextField("DICE_2"); + const weap2TraitsField = form.getTextField("TRAITS_2"); + const weap2StrField = form.getTextField("STR_5"); + + const weap3NameField = form.getTextField("Weapon_3"); + const weap3HitBonusField = form.getTextField("Text39"); + const weap3DmgDiceField = form.getTextField("DICE_3"); + const weap3TraitsField = form.getTextField("TRAITS_3"); + const weap3StrField = form.getTextField("STR_7"); + + // Ranged + const weap4NameField = form.getTextField("Weapon_4"); + const weap4HitBonusField = form.getTextField("Text40"); + const weap4DmgDiceField = form.getTextField("DICE_4"); + const weap4TraitsField = form.getTextField("TRAITS_4"); + const weap4SpeField = form.getTextField("undefined"); + + const weap5NameField = form.getTextField("Weapon_5"); + const weap5HitBonusField = form.getTextField("Text41"); + const weap5DmgDiceField = form.getTextField("DICE_5"); + const weap5TraitsField = form.getTextField("TRAITS_5"); + const weap5SpeField = form.getTextField("undefined_2"); + + const weap6NameField = form.getTextField("Weapon_6"); + const weap6HitBonusField = form.getTextField("Text42"); + const weap6DmgDiceField = form.getTextField("DICE_6"); + const weap6TraitsField = form.getTextField("TRAITS_6"); + const weap6SpeField = form.getTextField("undefined_3"); + + let weapons = JSON.parse(charInfo.stats.weapons); + console.log(weapons); + if (weapons.length >= 1) { + weap1NameField.setText(weapons[0].Name); + weap1HitBonusField.setText(weapons[0].Bonus); + weap1DmgDiceField.setText(weapons[0].Damage); + } + if (weapons.length >= 2) { + weap2NameField.setText(weapons[1].Name); + weap2HitBonusField.setText(weapons[1].Bonus); + weap2DmgDiceField.setText(weapons[1].Damage); + } + if (weapons.length >= 3) { + weap3NameField.setText(weapons[2].Name); + weap3HitBonusField.setText(weapons[2].Bonus); + weap3DmgDiceField.setText(weapons[2].Damage); + } + if (weapons.length >= 4) { + weap4NameField.setText(weapons[3].Name); + weap4HitBonusField.setText(weapons[3].Bonus); + weap4DmgDiceField.setText(weapons[3].Damage); + } + if (weapons.length >= 5) { + weap5NameField.setText(weapons[4].Name); + weap5HitBonusField.setText(weapons[4].Bonus); + weap5DmgDiceField.setText(weapons[4].Damage); + } + if (weapons.length >= 6) { + weap6NameField.setText(weapons[5].Name); + weap6HitBonusField.setText(weapons[5].Bonus); + weap6DmgDiceField.setText(weapons[5].Damage); + } + + // Skills + + let totalSkills = JSON.parse(charInfo.stats.totalSkills); + + const acroBonusField = form.getTextField("Text19"); + acroBonusField.setText(signNumber(totalSkills[0].Bonus) + ""); + + const arcanaBonusField = form.getTextField("Text20"); + arcanaBonusField.setText(signNumber(totalSkills[1].Bonus) + ""); + + const athBonusField = form.getTextField("Text21"); + athBonusField.setText(signNumber(totalSkills[2].Bonus) + ""); + + const craftBonusField = form.getTextField("Text22"); + craftBonusField.setText(signNumber(totalSkills[3].Bonus) + ""); + + const decepBonusField = form.getTextField("Text23"); + decepBonusField.setText(signNumber(totalSkills[4].Bonus) + ""); + + const diploBonusField = form.getTextField("Text24"); + diploBonusField.setText(signNumber(totalSkills[5].Bonus) + ""); + + const intimBonusField = form.getTextField("Text25"); + intimBonusField.setText(signNumber(totalSkills[6].Bonus) + ""); + + const medicineBonusField = form.getTextField("Text28"); + medicineBonusField.setText(signNumber(totalSkills[7].Bonus) + ""); + + const natureBonusField = form.getTextField("Text29"); + natureBonusField.setText(signNumber(totalSkills[8].Bonus) + ""); + + const occultBonusField = form.getTextField("Text30"); + occultBonusField.setText(signNumber(totalSkills[9].Bonus) + ""); + + const performBonusField = form.getTextField("Text31"); + performBonusField.setText(signNumber(totalSkills[10].Bonus) + ""); + + const religionBonusField = form.getTextField("Text32"); + religionBonusField.setText(signNumber(totalSkills[11].Bonus) + ""); + + const societyBonusField = form.getTextField("Text33"); + societyBonusField.setText(signNumber(totalSkills[12].Bonus) + ""); + + const stealthBonusField = form.getTextField("Text34"); + stealthBonusField.setText(signNumber(totalSkills[13].Bonus) + ""); + + const survivalBonusField = form.getTextField("Text35"); + survivalBonusField.setText(signNumber(totalSkills[14].Bonus) + ""); + + const thieveryBonusField = form.getTextField("Text36"); + thieveryBonusField.setText(signNumber(totalSkills[15].Bonus) + ""); + + const oneLoreNameField = form.getTextField("INTIMIDATION"); + const oneLoreBonusField = form.getTextField("Text26"); + let lore1Data = totalSkills[16]; + if (lore1Data != null) { + oneLoreNameField.setText(lore1Data.Name.replace(" Lore", "")); + oneLoreBonusField.setText(signNumber(lore1Data.Bonus) + ""); + } + + const twoLoreNameField = form.getTextField("LORE"); + const twoLoreBonusField = form.getTextField("Text27"); + let lore2Data = totalSkills[17]; + if (lore2Data != null) { + twoLoreNameField.setText(lore2Data.Name.replace(" Lore", "")); + twoLoreBonusField.setText(signNumber(lore2Data.Bonus) + ""); + } + + // Weap Prof + const simpleWeapTBox = form.getCheckBox("Check Box140"); + const simpleWeapEBox = form.getCheckBox("Check Box141"); + const simpleWeapMBox = form.getCheckBox("Check Box142"); + const simpleWeapLBox = form.getCheckBox("Check Box143"); + setProfCheckBox( + profMap.get("Simple_Weapons"), + simpleWeapTBox, + simpleWeapEBox, + simpleWeapMBox, + simpleWeapLBox, + ); + + const martialWeapTBox = form.getCheckBox("Check Box144"); + const martialWeapEBox = form.getCheckBox("Check Box145"); + const martialWeapMBox = form.getCheckBox("Check Box146"); + const martialWeapLBox = form.getCheckBox("Check Box147"); + setProfCheckBox( + profMap.get("Martial_Weapons"), + martialWeapTBox, + martialWeapEBox, + martialWeapMBox, + martialWeapLBox, + ); + + // Get profs of attacks from metadata + let otherAttackProfMap = new Map(); + let attackProfValueDatas = []; + for (let metadata of charInfo.metaData) { + if ( + metadata.source == "proficiencies" && + metadata.value.startsWith("Attack") + ) { + if ( + metadata.value.includes("Simple_Weapons") || + metadata.value.includes("Martial_Weapons") + ) { + continue; + } + // HARDCODED metadata separator in Regex + attackProfValueDatas.push(metadata.value.match(/Attack:::(.+?):::/)[1]); + } + } + for (const [profName, prof] of profMap) { + if (attackProfValueDatas.includes(profName)) { + let profOtherAttacks = otherAttackProfMap.get(prof); + const profNamePretty = profName.replace(/_/g, " "); + if (profOtherAttacks != null) { + otherAttackProfMap.set(prof, profOtherAttacks + ", " + profNamePretty); + } else { + otherAttackProfMap.set(prof, profNamePretty); + } + } + } + + let count = 0; + for (const [prof, profNames] of otherAttackProfMap.entries()) { + if (count == 0) { + const other1WeapTBox = form.getCheckBox("Check Box148"); + const other1WeapEBox = form.getCheckBox("Check Box149"); + const other1WeapMBox = form.getCheckBox("Check Box150"); + const other1WeapLBox = form.getCheckBox("Check Box151"); + setProfCheckBox( + prof, + other1WeapTBox, + other1WeapEBox, + other1WeapMBox, + other1WeapLBox, + ); + + const other1WeapField = form.getTextField("Weapon Proficiencies"); + other1WeapField.setText(profNames); + } + if (count == 1) { + const other2WeapTBox = form.getCheckBox("Check Box152"); + const other2WeapEBox = form.getCheckBox("Check Box153"); + const other2WeapMBox = form.getCheckBox("Check Box154"); + const other2WeapLBox = form.getCheckBox("Check Box155"); + setProfCheckBox( + prof, + other2WeapTBox, + other2WeapEBox, + other2WeapMBox, + other2WeapLBox, + ); + + const other2WeapField = form.getTextField("L"); + other2WeapField.setText(profNames); + } + count++; + } + + // Langs + const languagesField = form.getTextField("Languages"); + let langNameStr = ""; + for (let language of charInfo.build.languages) { + if (language.value != null) { + langNameStr += language.value.name + ", "; + } + } + langNameStr = langNameStr.slice(0, -2); // Trim off that last ', ' + languagesField.setText(langNameStr); + + /// Feats and Features /// + + // Ancestry Feats + const ancestryFeatSpecialField = form.getTextField("Text43"); + + const ancestryFeatHeritageField = form.getTextField("Text88"); + ancestryFeatHeritageField.setText( + findFeatName(charInfo.build.feats, "ancestry", 1, "heritage"), + ); + + const ancestryFeat1Field = form.getTextField("Text89"); + ancestryFeat1Field.setText(findFeatName(charInfo.build.feats, "ancestry", 1)); + + const ancestryFeat5Field = form.getTextField("Text90"); + ancestryFeat5Field.setText(findFeatName(charInfo.build.feats, "ancestry", 5)); + + const ancestryFeat9Field = form.getTextField("Text91"); + ancestryFeat9Field.setText(findFeatName(charInfo.build.feats, "ancestry", 9)); + + const ancestryFeat13Field = form.getTextField("Text92"); + ancestryFeat13Field.setText( + findFeatName(charInfo.build.feats, "ancestry", 13), + ); + + const ancestryFeat17Field = form.getTextField("Text93"); + ancestryFeat17Field.setText( + findFeatName(charInfo.build.feats, "ancestry", 17), + ); + + // Skill Feats + const skillFeatBackgroundField = form.getTextField("Text50"); + skillFeatBackgroundField.setText( + findFeatName(charInfo.build.feats, "background", 1), + ); + + const skillFeat2Field = form.getTextField("Text51"); + skillFeat2Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 2), + ); + + const skillFeat4Field = form.getTextField("Text52"); + skillFeat4Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 4), + ); + + const skillFeat6Field = form.getTextField("Text53"); + skillFeat6Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 6), + ); + + const skillFeat8Field = form.getTextField("Text54"); + skillFeat8Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 8), + ); + + const skillFeat10Field = form.getTextField("Text55"); + skillFeat10Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 10), + ); + + const skillFeat12Field = form.getTextField("Text56"); + skillFeat12Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 12), + ); + + const skillFeat14Field = form.getTextField("Text57"); + skillFeat14Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 14), + ); + + const skillFeat16Field = form.getTextField("Text58"); + skillFeat16Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 16), + ); + + const skillFeat18Field = form.getTextField("Text59"); + skillFeat18Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 18), + ); + + const skillFeat20Field = form.getTextField("Text60"); + skillFeat20Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 20), + ); + + // General Feats + + const generalFeat3Field = form.getTextField("Text61"); + generalFeat3Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "general", "class", 3), + ); + + const generalFeat7Field = form.getTextField("Text62"); + generalFeat7Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "general", "class", 7), + ); + + const generalFeat11Field = form.getTextField("Text63"); + generalFeat11Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "general", "class", 11), + ); + + const generalFeat15Field = form.getTextField("Text64"); + generalFeat15Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "general", "class", 15), + ); + + const generalFeat19Field = form.getTextField("Text65"); + generalFeat19Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "general", "class", 19), + ); + + // Class Feats (check if NOT skill trait) + + const classFeat1Field = form.getTextField("Text68"); + classFeat1Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 1, true), + ); + + const classFeat2Field = form.getTextField("Text69"); + classFeat2Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 2, true), + ); + + const classFeat4Field = form.getTextField("Text71"); + classFeat4Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 4, true), + ); + + const classFeat6Field = form.getTextField("Text73"); + classFeat6Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 6, true), + ); + + const classFeat8Field = form.getTextField("Text75"); + classFeat8Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 8, true), + ); + + const classFeat10Field = form.getTextField("Text77"); + classFeat10Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 10, true), + ); + + const classFeat12Field = form.getTextField("Text79"); + classFeat12Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 12, true), + ); + + const classFeat14Field = form.getTextField("Text81"); + classFeat14Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 14, true), + ); + + const classFeat16Field = form.getTextField("Text83"); + classFeat16Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 16, true), + ); + + const classFeat18Field = form.getTextField("Text85"); + classFeat18Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 18, true), + ); + + const classFeat20Field = form.getTextField("Text87"); + classFeat20Field.setText( + findFeatNameWithTrait(charInfo.build.feats, "skill", "class", 20, true), + ); + + // Class Features + + //// + + nameField.setText(charInfo.character.name); + + let heritageAndAncestryName = ""; + if (charInfo.character._heritage == null) { + heritageAndAncestryName = charInfo.character._ancestry.name; + } else { + heritageAndAncestryName = charInfo.character._heritage.name; + } + ancestryHeritageField.setText(heritageAndAncestryName); + + if (charInfo.character._class != null) { + classField.setText(charInfo.character._class.name); + } + + if (charInfo.character._background != null) { + backgroundField.setText(charInfo.character._background.name); + } + + // + + totalACField.setText(charInfo.stats.totalAC + ""); + totalSpeedField.setText(charInfo.stats.totalSpeed + ""); + + maxHPField.setText(charInfo.stats.maxHP + ""); + currentHPField.setText( + getNumZeroIfNull(charInfo.character.currentHealth) + "", + ); + tempHPField.setText(getNumZeroIfNull(charInfo.character.tempHealth) + ""); + + heroPointsField.setText(charInfo.character.heroPoints + ""); + levelField.setText(charInfo.character.level + ""); + xpField.setText(getNumZeroIfNull(charInfo.character.experience) + ""); + + if (charInfo.Ancestry != null) { + sizeField.setText(charInfo.Ancestry.size.charAt(0)); + } + + totalClassDCField.setText(charInfo.stats.totalClassDC + ""); + + let charConditionsString = ""; + for (const condition of charInfo.conditions) { + charConditionsString += condition._conditionName; + if (condition.value != null) { + charConditionsString += " " + condition.value; + } + charConditionsString += ", "; + } + charConditionsString = charConditionsString.slice(0, -2); // Trim off that last ', ' + conditionsField.setText(charConditionsString); + + let charTraitString = ""; + for (let charTrait of charInfo.charTraits) { + charTraitString += charTrait.value + ", "; + } + charTraitString = charTraitString.slice(0, -2); // Trim off that last ', ' + traitsField.setText(charTraitString); + + // Inventory + + const itemsField = form.getTextField("WORN ITEMS"); + const bulkField = form.getTextField("BULK"); + const investField = form.getTextField("INVEST MAX 10"); + let itemsStr = ""; + let bulkStr = ""; + let bulkCount = 0; + let investCount = 0; + + let copperCount = 0; + let silverCount = 0; + let goldCount = 0; + let platinumCount = 0; + + for (let invItem of charInfo.invItems) { + if (invItem.name == "Copper (cp)") { + copperCount += invItem.quantity; + continue; + } + if (invItem.name == "Silver (sp)") { + silverCount += invItem.quantity; + continue; + } + if (invItem.name == "Gold (gp)") { + goldCount += invItem.quantity; + continue; + } + if (invItem.name == "Platinum (pp)") { + platinumCount += invItem.quantity; + continue; + } + + itemsStr += invItem.name + "\n"; + bulkStr += invItem.bulk + "\n"; + bulkCount += invItem.bulk; + if (invItem.isInvested == 1) { + investCount++; + } + } + bulkCount = round(bulkCount, 1); + + itemsField.setText(itemsStr); + bulkField.setText(bulkStr + ""); + investField.setText(investCount + ""); + + const totalField = form.getTextField("Text44"); + totalField.setText(bulkCount + ""); + + const encumberedBulkField = form.getTextField("Text49"); + encumberedBulkField.setText(strMod + 5 + ""); + + const maximumBulkField = form.getTextField("Text94"); + maximumBulkField.setText(strMod + 10 + ""); + + const cpField = form.getTextField("Text45"); + cpField.setText(copperCount + ""); + const spField = form.getTextField("Text46"); + spField.setText(silverCount + ""); + const gpField = form.getTextField("Text47"); + gpField.setText(goldCount + ""); + const ppField = form.getTextField("Text48"); + ppField.setText(platinumCount + ""); + + // Character Extra Info + + let extraInfo = JSON.parse(charInfo.character.infoJSON); + + if (extraInfo?.ethnicity) { + form.getTextField("ETHNICITY").setText(extraInfo.ethnicity); + } + if (extraInfo?.nationality) { + form.getTextField("NATIONALITY").setText(extraInfo.nationality); + } + if (extraInfo?.age) { + form.getTextField("AGE").setText(extraInfo.age); + } + let genderPronouns = ""; + if (extraInfo?.gender) { + genderPronouns += extraInfo.gender; + } + if (extraInfo?.pronouns) { + if (genderPronouns == "") { + genderPronouns += extraInfo.pronouns; + } else { + genderPronouns += " & " + extraInfo.pronouns; + } + } + form.getTextField("GENDER PRONOUNS").setText(genderPronouns); + + if (extraInfo?.appearance) { + form.getTextField("APPEARANCE").setText(extraInfo.appearance); + } + if (extraInfo?.personality) { + form.getTextField("ATTITUDE").setText(extraInfo.personality); + } + if (extraInfo?.beliefs) { + form.getTextField("BELIEFS").setText(extraInfo.beliefs); + } + + const pdfBytes = await pdfDoc.save(); + + // Trigger the browser to download the PDF document + download( + pdfBytes, + charInfo.character.name + " - Character Sheet.pdf", + "application/pdf", + ); + + $(".modal-card-close").trigger("click"); + stopSpinnerSubLoader(); +} + +export function setProfCheckBox( + prof, + trainedBox, + expertBox, + masterBox, + legendaryBox, +) { + switch (prof) { + case "U": + return; + case "T": + trainedBox.check(); + return; + case "E": + trainedBox.check(); + expertBox.check(); + return; + case "M": + trainedBox.check(); + expertBox.check(); + masterBox.check(); + return; + case "L": + trainedBox.check(); + expertBox.check(); + masterBox.check(); + legendaryBox.check(); + return; + default: + return; + } +} + +export function findFeat( + featsArray, + sourceType, + sourceLevel, + sourceCode = null, +) { + let featData; + if (sourceCode == null) { + featData = featsArray.find((featData) => { + return ( + featData.source == "chosenFeats" && + featData.sourceType == sourceType && + featData.sourceLevel == sourceLevel + ); + }); + } else { + featData = featsArray.find((featData) => { + return ( + featData.source == "chosenFeats" && + featData.sourceType == sourceType && + featData.sourceLevel == sourceLevel && + featData.sourceCode == sourceCode + ); + }); + } + + if (featData != null && featData.value != null) { + return featData.value; + } else { + return null; + } +} + +export function findFeatName( + featsArray, + sourceType, + sourceLevel, + sourceCode = null, +) { + let feat = findFeat(featsArray, sourceType, sourceLevel, sourceCode); + if (feat != null) { + return feat.name; + } else { + return ""; + } +} + +export function findFeatNameWithTrait( + featsArray, + traitName, + sourceType, + sourceLevel, + not = false, +) { + for (let featData of featsArray) { + if ( + featData.source == "chosenFeats" && + featData.sourceType == sourceType && + featData.sourceLevel == sourceLevel && + featData.value != null + ) { + let featStruct = g_featMap.get(featData.value.id + ""); + let tag = featStruct.Tags.find((tag) => { + return tag.name.toLowerCase() == traitName.toLowerCase(); + }); + if (tag != null && !not) { + return featData.value.name; + } else if (not) { + return featData.value.name; + } + } + } + return ""; +} diff --git a/client/vue-src/legacy-js/character-list.js b/client/vue-src/legacy-js/character-list.js new file mode 100644 index 00000000..1ed479ce --- /dev/null +++ b/client/vue-src/legacy-js/character-list.js @@ -0,0 +1,165 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ +import "./build_planner/ui-handler"; +import { isTabletView } from "./general-utils"; +import { + initCharacterExportToPDF, + setup as setupPopulatePdf, +} from "./char_export/populate-pdf"; + +let activeModalCharID = -1; +let activeModalCharName = ""; +let socket = io(); + +setupPopulatePdf(socket); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +export function setup() { + // If in tablet view, just show icons + if (isTabletView()) { + $(".character-card-edit-text").remove(); + $(".character-card-options-text").remove(); + $(".character-card-delete-text").remove(); + } + // + + let characterCards = $(".character-card"); + for (const characterCard of characterCards) { + let characterID = $(characterCard).attr("data-char-id"); + let characterName = $(characterCard).attr("data-char-name"); + let cardContent = $(characterCard).find(".card-content"); + let cardEdit = $(characterCard).find(".character-card-edit"); + let cardDelete = $(characterCard).find(".character-card-delete"); + let cardOptions = $(characterCard).find(".character-card-options"); + + cardContent.mouseenter(function () { + $(this).addClass("card-content-hover"); + }); + cardContent.mouseleave(function () { + $(this).removeClass("card-content-hover"); + }); + cardContent.click(function () { + window.location.href = "/profile/characters/" + characterID; + }); + + cardEdit.mouseenter(function () { + $(this).addClass("card-footer-hover"); + }); + cardEdit.mouseleave(function () { + $(this).removeClass("card-footer-hover"); + }); + cardEdit.click(function () { + window.location.href = + "/profile/characters/builder/basics/?id=" + characterID; + }); + + cardDelete.mouseenter(function () { + $(this).addClass("card-footer-hover"); + }); + cardDelete.mouseleave(function () { + $(this).removeClass("card-footer-hover"); + }); + cardDelete.click(function () { + $(".modal-char-delete").addClass("is-active"); + $("html").addClass("is-clipped"); + activeModalCharID = characterID; + activeModalCharName = characterName; + $("#modal-char-delete-title").text( + "Delete Character: " + activeModalCharName, + ); + }); + + cardOptions.mouseenter(function () { + $(this).addClass("card-footer-hover"); + }); + cardOptions.mouseleave(function () { + $(this).removeClass("card-footer-hover"); + }); + cardOptions.click(function () { + $(".modal-char-options").addClass("is-active"); + $("html").addClass("is-clipped"); + activeModalCharID = characterID; + activeModalCharName = characterName; + }); + } + + $(".modal-card-close").click(function () { + $(".modal").removeClass("is-active"); + $("html").removeClass("is-clipped"); + activeModalCharID = -1; + activeModalCharName = ""; + }); + $(".modal-background").click(function () { + $(".modal").removeClass("is-active"); + $("html").removeClass("is-clipped"); + activeModalCharID = -1; + activeModalCharName = ""; + }); + + $("#delete-confirmation-btn").click(function () { + window.location.href = "/profile/characters/delete/" + activeModalCharID; + }); + + if ($("#icon-character-import").length) { + // If icon-character-import exists, AKA has permissions + initCharacterImport(); + initCharacterCopy(); + } + + initCharacterExport(); + initCharacterExportToPDF(); // <- PDF +} +export function teardown() { + //once we implement actual pages, this will need to be run to clean the state of this file +} + +// ~~~~~ Character Import ~~~~~ // +function initCharacterImport() { + const fileInput = document.querySelector("#input-character-import"); + fileInput.onchange = () => { + if (fileInput.files.length > 0) { + let file = fileInput.files[0]; + let fileReader = new FileReader(); + + // Closure to capture the file information. + fileReader.onload = (function (capturedFile) { + return function (e) { + if (capturedFile.name.endsWith(".guidechar")) { + try { + let charExportData = JSON.parse(e.target.result); + socket.emit("requestCharImport", charExportData); + startSpinnerSubLoader(); + } catch (err) { + console.log(err); + console.log('Failed to import "' + capturedFile.name + '"'); + } + } + }; + })(file); + + fileReader.readAsText(file); + } + }; +} + +socket.on("returnCharImport", function () { + // Hardcoded redirect + window.location.href = "/profile/characters"; +}); + +// ~~~~~ Character Export ~~~~~ // +function initCharacterExport() { + $("#btn-export-character").click(function () { + exportCharacter(activeModalCharID); + }); +} + +// ~~~~~ Character Copy ~~~~~ // +function initCharacterCopy() { + $("#btn-duplicate-character").click(function () { + copyCharacter(activeModalCharID); + $(".modal-card-close").trigger("click"); + startSpinnerSubLoader(); + }); +} diff --git a/client/vue-src/legacy-js/confirm-page-leave.js b/client/vue-src/legacy-js/confirm-page-leave.js new file mode 100644 index 00000000..a54e88f9 --- /dev/null +++ b/client/vue-src/legacy-js/confirm-page-leave.js @@ -0,0 +1,22 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + + let page_dontLeave = true; + window.onbeforeunload = function (e) { + if(page_dontLeave){ + e = e || window.event; + + // For IE and Firefox prior to version 4 + if (e) { + e.returnValue = 'Sure?'; + } + + // For Safari + return 'Sure?'; + } + }; + + function canLeavePage() { + page_dontLeave = false; + } \ No newline at end of file diff --git a/client/vue-src/legacy-js/general-utils.js b/client/vue-src/legacy-js/general-utils.js new file mode 100644 index 00000000..ffc4d16c --- /dev/null +++ b/client/vue-src/legacy-js/general-utils.js @@ -0,0 +1,432 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* Constants */ +const g_tagStringLengthMax = 620; // Hardcoded - Tag String Length Max +const g_conditionStringLengthMax = 450; // Hardcoded - Condition String Length Max + +/* Object Funcs */ +export function objToMap(obj) { + let strMap = new Map(); + for (let k of Object.keys(obj)) { + strMap.set(k, obj[k]); + } + return strMap; +} +export function mapToObj(strMap) { + let obj = Object.create(null); + for (let [k,v] of strMap) { + // Doesn't escape the key '__proto__' + // which can cause problems on older engines + obj[k] = v; + } + return obj; +} + +export function cloneObj(obj){ + if(obj == null){ return null; } + return JSON.parse(JSON.stringify(obj)); +} + +export function hasSameSrc(dataStruct, srcStruct){ + if(dataStruct == null || srcStruct == null) { return false; } + return (dataStruct.sourceType == srcStruct.sourceType && dataStruct.sourceLevel == srcStruct.sourceLevel && dataStruct.sourceCode == srcStruct.sourceCode && dataStruct.sourceCodeSNum == srcStruct.sourceCodeSNum); +} + +export function hasSameSrcIterate(dataStruct, srcStructArray){ + if(srcStructArray == null) { return false; } + for(let srcStruct of srcStructArray){ + if(hasSameSrc(dataStruct, srcStruct)){ return true; } + } + return false; +} + +export function hasSameSrcAnySNum(dataStruct, srcStruct){ + if(dataStruct == null || srcStruct == null) { return false; } + return (dataStruct.sourceType == srcStruct.sourceType && dataStruct.sourceLevel == srcStruct.sourceLevel && dataStruct.sourceCode == srcStruct.sourceCode); +} + +export function srcStructToCompositeKey(srcStruct){ + return `${srcStruct.sourceType}:::${srcStruct.sourceLevel}:::${srcStruct.sourceCode}:::${srcStruct.sourceCodeSNum}`; +} + +export function parameterizeSrcStruct(in_source, in_srcStruct){ + return { + source: in_source+'', + sourceType: in_srcStruct.sourceType+'', + sourceLevel: in_srcStruct.sourceLevel+'', + sourceCode: in_srcStruct.sourceCode+'', + sourceCodeSNum: in_srcStruct.sourceCodeSNum+'', + }; +} + +/* Content Sources */ + +const g_contentSources = [ + {TextName: 'Core Rulebook', CodeName: 'CRB', Link: 'https://paizo.com/products/btq01zp3?Pathfinder-Core-Rulebook'}, + {TextName: 'Advanced Player’s Guide', CodeName: 'ADV-PLAYER-GUIDE', Link: 'https://paizo.com/products/btq023ih?Pathfinder-Advanced-Players-Guide'}, + {TextName: 'Gamemastery Guide', CodeName: 'GM-GUIDE', Link: 'https://paizo.com/products/btq022c1?Pathfinder-Gamemastery-Guide'}, + {TextName: 'Secrets of Magic', CodeName: 'SECRETS-OF-MAGIC', Link: 'https://paizo.com/products/btq026l5?Pathfinder-Secrets-of-Magic'}, + {TextName: 'Guns & Gears', CodeName: 'GUNS-AND-GEARS', Link: 'https://paizo.com/products/btq026mw?Pathfinder-Guns-Gears'}, + {TextName: 'Dark Archive', CodeName: 'DARK-ARCHIVE', Link: 'https://paizo.com/products/btq02d8j'}, + {TextName: 'Book of the Dead', CodeName: 'BOOK-OF-DEAD', Link: 'https://paizo.com/products/btq02c0j'}, + {TextName: 'Rage of Elements', CodeName: 'RAGE-OF-ELEMENTS', Link: 'https://downloads.paizo.com/PZO2113_KineticistClassPlaytest.pdf'}, + {TextName: 'Lost Omens: Ancestry Guide', CodeName: 'LOST-ANCESTRY-GUIDE', Link: 'https://paizo.com/products/btq026k5?Pathfinder-Lost-Omens-Ancestry-Guide' }, + {TextName: 'Lost Omens: Character Guide', CodeName: 'LOST-CHAR-GUIDE', Link: 'https://paizo.com/products/btq01zt4?Pathfinder-Lost-Omens-Character-Guide'}, + {TextName: 'Lost Omens: City of Absalom', CodeName: 'LOST-CITY-ABSALOM', Link: 'https://paizo.com/products/btq02ap2'}, + {TextName: 'Lost Omens: Gods & Magic', CodeName: 'LOST-GOD-MAGIC', Link: 'https://paizo.com/products/btq021wf?Pathfinder-Lost-Omens-Gods-Magic'}, + {TextName: 'Lost Omens: Grand Bazaar', CodeName: 'LOST-GRAND-BAZAAR', Link: 'https://paizo.com/products/btq029xo?Pathfinder-Lost-Omens-The-Grand-Bazaar'}, + {TextName: 'Lost Omens: Impossible Lands', CodeName: 'LOST-IMPOSSIBLE-LANDS', Link: 'https://paizo.com/products/btq02dxx?Pathfinder-Lost-Omens-Impossible-Lands'}, + {TextName: 'Lost Omens: Knights of Lastwall', CodeName: 'LOST-KNIGHTS-WALL', Link: 'https://paizo.com/products/btq02ajm?Pathfinder-Lost-Omens-Knights-of-Lastwall'}, + {TextName: 'Lost Omens: Legends', CodeName: 'LOST-LEGENDS', Link: 'https://paizo.com/products/btq023gd?Pathfinder-Lost-Omens-Legends'}, + {TextName: 'Lost Omens: Monsters of Myth', CodeName: 'LOST-MONSTERS-MYTH', Link: 'https://paizo.com/products/btq02aoy'}, + {TextName: 'Lost Omens: The Mwangi Expanse', CodeName: 'LOST-MWANGI', Link: 'https://paizo.com/products/btq027ot?Pathfinder-Lost-Omens-The-Mwangi-Expanse'}, + {TextName: 'Lost Omens: Pathfinder Society Guide', CodeName: 'LOST-SOCIETY-GUIDE', Link: 'https://paizo.com/products/btq0233q?Pathfinder-Lost-Omens-Pathfinder-Society-Guide'}, + {TextName: 'Lost Omens: Travel Guide', CodeName: 'LOST-TRAVEL-GUIDE', Link: 'https://paizo.com/products/btq02dv8'}, + {TextName: 'Lost Omens: World Guide', CodeName: 'LOST-WORLD-GUIDE', Link: 'https://paizo.com/products/btq01zoj?Pathfinder-Lost-Omens-World-Guide'}, + {TextName: 'Abomination Vaults', CodeName: 'ABOMINATION-VAULTS', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/abominationVaults'}, + {TextName: 'Agents of Edgewatch', CodeName: 'AGENTS-OF-EDGEWATCH', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/agentsOfEdgewatch'}, + {TextName: 'Age of Ashes', CodeName: 'AGE-OF-ASHES', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/ageOfAshes'}, + {TextName: 'Blood Lords', CodeName: 'BLOOD-LORDS', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/bloodLords'}, + {TextName: 'Crown of the Kobold King', CodeName: 'CROWN-OF-KOBOLD-KING', Link: 'https://paizo.com/products/btq02ase'}, + {TextName: 'Extinction Curse', CodeName: 'EXTINCTION-CURSE', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/extinctioncurse'}, + {TextName: 'The Fall of Plaguestone', CodeName: 'FALL-OF-PLAGUE', Link: 'https://paizo.com/products/btq01zoh?Pathfinder-Adventure-The-Fall-of-Plaguestone'}, + {TextName: 'Fists of the Ruby Phoenix', CodeName: 'FIST-PHOENIX', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/fistsOfTheRubyPhoenix'}, + {TextName: 'Kingmaker', CodeName: 'KINGMAKER', Link: 'https://paizo.com/products/btq02e0d?Pathfinder-Kingmaker-Adventure-Path'}, + {TextName: 'Malevolence', CodeName: 'MALEVOLENCE', Link: 'https://paizo.com/products/btq027qf?Pathfinder-Adventure-Malevolence'}, + {TextName: 'Night of the Gray Death', CodeName: 'NIGHT-GRAY-DEATH', Link: 'https://paizo.com/products/btq02alp?Pathfinder-Adventure-Night-of-the-Gray-Death'}, + {TextName: 'Outlaws of Alkenstar', CodeName: 'OUTLAWS-ALKENSTAR', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/outlawsOfAlkenstar'}, + {TextName: 'Quest for the Frozen Flame', CodeName: 'QUEST-FROZEN-FLAME', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/questForTheFrozenFlame'}, + {TextName: 'The Slithering', CodeName: 'SLITHERING', Link: 'https://paizo.com/products/btq023hg?Pathfinder-Adventure-The-Slithering'}, + {TextName: 'Strength of Thousands', CodeName: 'STRENGTH-THOUSANDS', Link: 'https://paizo.com/store/pathfinder/adventures/adventurePath/strengthOfThousands'}, + {TextName: 'Threshold of Knowledge', CodeName: 'THRESHOLD-KNOWLEDGE', Link: 'https://paizo.com/products/btq02apx?Pathfinder-Adventure-Threshold-of-Knowledge'}, + {TextName: 'Troubles in Otari', CodeName: 'TROUBLES-IN-OTARI', Link: 'https://paizo.com/products/btq026k1?Pathfinder-Adventure-Troubles-in-Otari'}, + {TextName: 'Bestiary', CodeName: 'BEST-1', Link: 'https://paizo.com/products/btq01zp4?Pathfinder-Bestiary'}, + {TextName: 'Bestiary 2', CodeName: 'BEST-2', Link: 'https://paizo.com/products/btq022yq?Pathfinder-Bestiary-2'}, + {TextName: 'Bestiary 3', CodeName: 'BEST-3', Link: 'https://paizo.com/products/btq027mn?Pathfinder-Bestiary-3'}, + {TextName: 'Pathfinder Society', CodeName: 'PATH-SOCIETY', Link: 'https://paizo.com/pathfindersociety'}, +]; + +const g_currentContentSource = 'BEST-1'; +const g_hiddenFromBrowseContentSources = [''];// TODO - Temp solution + +export function getContentSourceTextName(codeName){ + let contentSourceData = g_contentSources.find(contentSourceData => { + return contentSourceData.CodeName === codeName; + }); + if(contentSourceData != null){ + return contentSourceData.TextName; + } else { + return null; + } +} + +export function getContentSourceLink(codeName){ + let contentSourceData = g_contentSources.find(contentSourceData => { + return contentSourceData.CodeName === codeName; + }); + if(contentSourceData != null){ + return contentSourceData.Link; + } else { + return null; + } +} + +export function isContentSourceReleased(codeName){ + let contentSourceData = g_contentSources.find(contentSourceData => { + return contentSourceData.CodeName === codeName; + }); + if(contentSourceData != null){ + return (contentSourceData.Unreleased == null) ? true : !contentSourceData.Unreleased; + } else { + return false; + } +} + +/* Capitalizing */ +export function capitalizeWord(word){ + if(word == null){ return null;} + return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); +} + +export function capitalizeFirstLetterOfWord(word){ + if(word == null){ return null;} + return word.charAt(0).toUpperCase() + word.slice(1); +} + +export function capitalizeWords(str){ + if(str == null){ return null;} + return str.toLowerCase().replace(/(?:^|\s|["([{_-])+\S/g, match => match.toUpperCase()); +} + +/* Ability Conversions */ +export function shortenAbilityType(longType) { + switch(longType) { + case 'Strength': return "STR"; + case 'Dexterity': return "DEX"; + case 'Constitution': return "CON"; + case 'Intelligence': return "INT"; + case 'Wisdom': return "WIS"; + case 'Charisma': return "CHA"; + case 'Free': return "ALL"; + case 'Anything': return "ALL"; + default: return null; + } +} + +export function lengthenAbilityType(shortType) { + switch(shortType) { + case 'STR': return "Strength"; + case 'DEX': return "Dexterity"; + case 'CON': return "Constitution"; + case 'INT': return "Intelligence"; + case 'WIS': return "Wisdom"; + case 'CHA': return "Charisma"; + case 'ALL': return "Free"; + default: return null; + } +} + +/* Prof Conversions */ +export function profToNumUp(prof, noUP=false){ + if(noUP) { if(prof == 'UP') { prof = ''; } } + switch(prof) { + case "U": return 0; + case "T": return 1; + case "E": return 2; + case "M": return 3; + case "L": return 4; + case "UP": return 10; + default: return -1; + } +} + +export function getProfLetterFromNumUps(numUps) { + switch(numUps) { + case 0: return "U"; + case 1: return "T"; + case 2: return "E"; + case 3: return "M"; + case 4: return "L"; + default: return "?"; + } +} + +export function getProfNameFromNumUps(numUps) { + switch(numUps) { + case 0: return "Untrained"; + case 1: return "Trained"; + case 2: return "Expert"; + case 3: return "Master"; + case 4: return "Legendary"; + default: return "Unknown"; + } +} + +export function getBonusFromProfName(profName) { + switch(profName) { + case 'Untrained': return 0; + case 'Trained': return 2; + case 'Expert': return 4; + case 'Master': return 6; + case 'Legendary': return 8; + default: return -1; + } +} + +export function profToWord(prof){ + if(prof != null) {prof = prof.toUpperCase();} + switch(prof) { + case "UNTRAINED": return "Untrained"; + case "U": return "Untrained"; + case "TRAINED": return "Trained"; + case "T": return "Trained"; + case "EXPERT": return "Expert"; + case "E": return "Expert"; + case "MASTER": return "Master"; + case "M": return "Master"; + case "LEGENDARY": return "Legendary"; + case "L": return "Legendary"; + case "UP": return "Increase"; + case "DOWN": return "Decrease"; + default: return "Unknown"; + } +} + +export function profToLetter(prof){ + if(prof != null) {prof = prof.toUpperCase();} + switch(prof) { + case "UNTRAINED": return "U"; + case "TRAINED": return "T"; + case "EXPERT": return "E"; + case "MASTER": return "M"; + case "LEGENDARY": return "L"; + default: return "?"; + } +} + +export function getBetterProf(prof1, prof2){ + let profNumber1 = profToNumUp(prof1, true); + let profNumber2 = profToNumUp(prof2, true); + return (profNumber1 > profNumber2) ? prof1 : prof2; +} + +export function getUpAmt(profType){ + if(profType == "UP"){ + return 1; + } + if(profType == "DOWN"){ + return -1; + } + return 0; +} + +export function getProfNumber(numUps, charLevel) { + if(typeof gOption_hasProfWithoutLevel !== 'undefined' && gOption_hasProfWithoutLevel){ + switch(numUps) { + case 0: + return -2; + case 1: + return 2; + case 2: + return 4; + case 3: + return 6; + case 4: + return 8; + default: + return 0; + } + } else { + switch(numUps) { + case 0: + return 0; + case 1: + return charLevel+2; + case 2: + return charLevel+4; + case 3: + return charLevel+6; + case 4: + return charLevel+8; + default: + return 0; + } + } +} + +/* HTML */ +export function convertActionToHTML(actionsType){ + switch(actionsType) { + case 'FREE_ACTION': return '
                  [free-action]
                  '; + case 'REACTION': return '
                  [reaction]
                  '; + case 'ACTION': return '
                  [one-action]
                  '; + case 'TWO_ACTIONS': return '
                  [two-actions]
                  '; + case 'THREE_ACTIONS': return '
                  [three-actions]
                  '; + default: return ''; + } +} + +export function convertRarityToHTML(rarityType, uniqueIsSpecial = false, size='is-very-small'){ + switch(rarityType) { + case 'UNCOMMON': return ''; + case 'RARE': return ''; + case 'UNIQUE': let uniqueText = (uniqueIsSpecial) ? 'Special' : 'Unique'; return ''; + default: return ''; + } +} + +export function convertRarityToIconHTML(rarityType, uniqueIsSpecial = false, size='is-size-7-5'){ + switch(rarityType) { // + case 'UNCOMMON': return 'U'; + case 'RARE': return 'R'; + case 'UNIQUE': let uniqueTextLetter = (uniqueIsSpecial) ? 'S' : 'U'; return ''+uniqueTextLetter+''; + default: return ' '; + } +} + +export function getImportantTraitIcon(trait){ + if(trait.isImportant == 1){ + return ``; + } else { + return ``; + } +} + +/* Misc */ +export function hashCode(str) { + return str.split('').reduce((prevHash, currVal) => + (((prevHash << 5) - prevHash) + currVal.charCodeAt(0))|0, 0); +} + +export function signNumber(number) { + return number < 0 ? `${number}` : `+${number}`; +} + +export function rankLevel(level){ + switch(level) { + case 1: return "1st"; + case 2: return "2nd"; + case 3: return "3rd"; + default: return level+"th"; + } +} + +export function numToRepetitionWord(num){ + switch(num) { + case 1: return ""; + case 2: return "Twice"; + case 3: return "Three Times"; + case 4: return "Four Times"; + case 5: return "Five Times"; + default: return num+" Times"; + } +} + +export function selectOptionRarity(rarity){ + switch(rarity) { + case 'UNCOMMON': return 'is-uncommon'; + case 'RARE': return 'is-rare'; + case 'UNIQUE': return 'is-unique'; + default: return ''; + } +} + +export function getMod(abilScore) { + let mod = Math.floor((abilScore-10)/2); + return mod; +} + +export function round(value, precision) { + let multiplier = Math.pow(10, precision || 0); + return Math.floor(value * multiplier) / multiplier; +} + +export function isOverflown(jQueryElement){ + let element = jQueryElement[0]; + return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth; +} +export function hasGreaterHeight(jQueryElement, pixelHeight){ + let element = jQueryElement[0]; + return element.clientHeight > pixelHeight; +} +export function hasGreaterWidth(jQueryElement, pixelWidth){ + let element = jQueryElement[0]; + return element.clientWidth > pixelWidth; +} + +export function isMobileView(){ + return window.matchMedia("screen and (max-width: 768px)").matches; +} +export function isTabletView(){ + return window.matchMedia("screen and (min-width : 769px) and (max-width : 1023px)").matches; +} + +export function isSheetPage(){ + return typeof isSheetInit !== 'undefined'; +} + +export function isBuilderPage(){ + return typeof isBuilderInit !== 'undefined'; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/campaigns/conditions-handler.js b/client/vue-src/legacy-js/gm_tools/campaigns/conditions-handler.js new file mode 100644 index 00000000..85244d0a --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/campaigns/conditions-handler.js @@ -0,0 +1,75 @@ +/* Copyright (C) 2022, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_allConditions = null; + +function addCondition(accessToken, conditionName, conditionValue = null) { + + let condition = g_allConditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if(condition){ + + socket.emit(`requestCharacterUpdate-ConditionAdd`, accessToken.charID, condition.name, condition.id, conditionValue, null, null, accessToken.calculatedStat, (calcConditions) => { + // Callback function + accessToken.calculatedStat.conditions = calcConditions; + populateConditions(accessToken, `character-container-conditions-${accessToken.charID}`, false); + }); + + } + +} + +function removeCondition(accessToken, conditionName) { + + let condition = accessToken.calculatedStat.conditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if(condition){ + + // Not a clean solution, needs BFS but this works. + // Going 2 layers deep, removes condition if parent doesn't exist. + + let consMap = new Map(); + for(let con of accessToken.calculatedStat.conditions){ + if(con.conditionID == condition.conditionID) { continue; } + consMap.set(con.entryID, con); + } + + for(let i = 0; i < 2; i++){// repeat 2 times + for(const [entryID, con] of consMap.entries()){ + if(con.parentEntryID && !consMap.get(con.parentEntryID+'')){ + consMap.delete(entryID); + } + } + } + + let newConditions = []; + for(const [entryID, con] of consMap.entries()){ + newConditions.push(con); + } + accessToken.calculatedStat.conditions = newConditions; + + populateConditions(accessToken, `character-container-conditions-${accessToken.charID}`, false); + + socket.emit(`requestCharacterUpdate-ConditionRemove`, accessToken.charID, condition.conditionID, accessToken.calculatedStat); + } + +} + +function updateCondition(accessToken, conditionName, newValue) { + + let condition = accessToken.calculatedStat.conditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if(condition){ + + condition.value = newValue; + populateConditions(accessToken, `character-container-conditions-${accessToken.charID}`, false); + + socket.emit(`requestCharacterUpdate-ConditionUpdate`, accessToken.charID, condition.conditionID, newValue, condition.sourceText, condition.parentEntryID, accessToken.calculatedStat); + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/campaigns/ui-handler.js b/client/vue-src/legacy-js/gm_tools/campaigns/ui-handler.js new file mode 100644 index 00000000..e9d3ea96 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/campaigns/ui-handler.js @@ -0,0 +1,156 @@ + +let activeModalCampaign = null; +let campaignMap = new Map(); + +let socket = io(); + +$(function () { + + for (let campaign of rawCampaigns) { + campaignMap.set(campaign.id + '', campaign); + } + + let campaignCards = $('.campaign-card'); + for (const campaignCard of campaignCards) { + + let campaignID = $(campaignCard).attr('data-campaign-id'); + let cardContent = $(campaignCard).find('.card-content'); + let cardEdit = $(campaignCard).find('.campaign-card-edit'); + let cardDelete = $(campaignCard).find('.campaign-card-delete'); + + cardContent.mouseenter(function () { + $(this).addClass('card-content-hover'); + }); + cardContent.mouseleave(function () { + $(this).removeClass('card-content-hover'); + }); + cardContent.click(function () { + openViewCampaign(campaignID+''); + }); + + cardEdit.mouseenter(function () { + $(this).addClass('card-footer-hover'); + }); + cardEdit.mouseleave(function () { + $(this).removeClass('card-footer-hover'); + }); + cardEdit.click(function () { + openEditCampaign(campaignMap.get(campaignID + '')); + }); + + cardDelete.mouseenter(function () { + $(this).addClass('card-footer-hover'); + }); + cardDelete.mouseleave(function () { + $(this).removeClass('card-footer-hover'); + }); + cardDelete.click(function () { + activeModalCampaign = campaignMap.get(campaignID + ''); + new ConfirmMessage('Delete “' + activeModalCampaign.name + '”', '

                  Are you sure you want to delete this campaign?

                  ', 'Delete', 'modal-delete-campaign', 'modal-delete-campaign-btn'); + $('#modal-delete-campaign-btn').click(function () { + socket.emit(`requestDeleteCampaign`, campaignID); + activeModalCampaign = null; + }); + }); + + } + + $('.modal-card-close, .modal-background').click(function () { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + activeModalCampaign = null; + }); + + $(`#campaign-create-btn`).click(() => { + socket.emit(`requestAddCampaign`); + }); + + handleCampaignForwardingFromURL(); +}); + +socket.on('returnAddCampaign', (campaign) => { + window.location.reload(true); +}); + +socket.on('returnDeleteCampaign', () => { + window.location.reload(true); +}); + +socket.on('returnEditCampaign', () => { + $('#inputCampaignName').parent().removeClass("is-loading"); + $('#inputCampaignDescription').parent().removeClass("is-loading"); + $('#inputCampaignImageURL').parent().removeClass("is-loading"); + + $('#selectCampaignOption-DisplayPlayerHealth').parent().removeClass("is-loading"); +}); + + +function openViewCampaign(campaignID) { + window.history.pushState({}, null, '/gm-tools/campaigns/'+campaignID); + new DisplayCampaign('campaigns-container', campaignID); +} + +function openEditCampaign(campaign) { + + activeModalCampaign = campaign; + + $("#inputCampaignName").val(activeModalCampaign.name); + $("#inputCampaignDescription").val(activeModalCampaign.description); + $("#inputCampaignImageURL").val(activeModalCampaign.imageURL); + + $(`#selectCampaignOption-DisplayPlayerHealth option[value="${activeModalCampaign.optionDisplayPlayerHealth}"]`).attr('selected', 'selected'); + + $('#editModalDefault').addClass('is-active'); + $('html').addClass('is-clipped'); + + $("#inputCampaignName, #inputCampaignDescription, #inputCampaignImageURL, #selectCampaignOption-DisplayPlayerHealth").off('blur'); + $("#inputCampaignName, #inputCampaignDescription, #inputCampaignImageURL, #selectCampaignOption-DisplayPlayerHealth").blur(function(){ + + let name = $('#inputCampaignName').val(); + let description = $('#inputCampaignDescription').val(); + let imageURL = $('#inputCampaignImageURL').val(); + + let optionDisplayPlayerHealth = parseInt($('#selectCampaignOption-DisplayPlayerHealth').val()); + + if(activeModalCampaign.name != name + || activeModalCampaign.description != description + || activeModalCampaign.imageURL != imageURL + || activeModalCampaign.optionDisplayPlayerHealth != optionDisplayPlayerHealth){ + + $(this).parent().addClass("is-loading"); + + if(name.trim() == ''){ + name = 'Unnamed Campaign'; + $("#inputCampaignName").val(name); + } + + socket.emit(`requestEditCampaign`, activeModalCampaign.id, { + name: name, + description: description, + imageURL: imageURL, + optionDisplayPlayerHealth: optionDisplayPlayerHealth, + }); + + activeModalCampaign.name = name; + activeModalCampaign.description = description; + activeModalCampaign.imageURL = imageURL; + + activeModalCampaign.optionDisplayPlayerHealth = optionDisplayPlayerHealth; + + $(`#campaign-${activeModalCampaign.id}-name`).text(activeModalCampaign.name); + + } + }); + +} + + +/* Handle campaign opening from URL id */ +function handleCampaignForwardingFromURL(){ + + let campaignID = parseInt(window.location.pathname.split("campaigns/")[1]); + if(!isNaN(campaignID) && campaignMap.get(campaignID+'') != null){ + openViewCampaign(campaignID+''); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/encounter_builder/balance-utils.js b/client/vue-src/legacy-js/gm_tools/encounter_builder/balance-utils.js new file mode 100644 index 00000000..e37cff94 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/encounter_builder/balance-utils.js @@ -0,0 +1,102 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getBalanceResults(encounter) { + + let partySize = encounter.partySize; + let partyLevel = encounter.partyLevel; + + if (encounter.campaignID != null) { + let totalLevel = 0; + let totalSize = 0; + for (let member of encounter.members) { + if (member.isCharacter) { + totalLevel += member.level; + totalSize++; + } + } + partySize = totalSize; + partyLevel = parseInt(totalLevel / partySize); + } + + let xpBudget = 0; + for (let member of encounter.members) { + if (member.isCharacter) { continue; } + switch (member.level - partyLevel) { + case -4: xpBudget += 10; break; + case -3: xpBudget += 15; break; + case -2: xpBudget += 20; break; + case -1: xpBudget += 30; break; + case 0: xpBudget += 40; break; + case 1: xpBudget += 60; break; + case 2: xpBudget += 80; break; + case 3: xpBudget += 120; break; + case 4: xpBudget += 160; break; + default: + if (member.level > partyLevel) { // greater than +4 + xpBudget += (member.level - partyLevel) * 40; + } else if (member.level < partyLevel) { // less than -4 + xpBudget += 0; + } + break; + } + } + + let partySizeDiff = partySize - 4; + + let difficulty; + if (xpBudget >= 200 + (partySizeDiff * 40)) { // 200+ is impossible + difficulty = 'IMPOSSIBLE'; + } else if (xpBudget >= 140 + (partySizeDiff * 40)) { // 140-199 is extreme + difficulty = 'Extreme'; + } else if (xpBudget >= 100 + (partySizeDiff * 30)) { // 100-139 is severe + difficulty = 'Severe'; + } else if (xpBudget >= 70 + (partySizeDiff * 20)) { // 70-99 is moderate + difficulty = 'Moderate'; + } else if (xpBudget >= 50 + (partySizeDiff * 15)) { // 50-69 is low + difficulty = 'Low'; + } else { // 0-50 is trivial + difficulty = 'Trivial'; + } + + return { + difficulty: difficulty, + xp: xpBudget, + }; + +} + + +function showBalanceResults(encounter) { + + if (encounter.campaignID != null) { + + let hasCharacters = false; + let hasEnemies = false; + for (let member of encounter.members) { + if (member.isCharacter) { + hasCharacters = true; + } else { + hasEnemies = true; + } + if (hasCharacters && hasEnemies) { + break; + } + } + return hasCharacters && hasEnemies; + + } else { + + let hasEnemies = false; + for (let member of encounter.members) { + if (!member.isCharacter) { + hasEnemies = true; + break; + } + } + return hasEnemies; + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/encounter_builder/campaigns-handler.js b/client/vue-src/legacy-js/gm_tools/encounter_builder/campaigns-handler.js new file mode 100644 index 00000000..64e2a5c7 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/encounter_builder/campaigns-handler.js @@ -0,0 +1,177 @@ +/* Copyright (C) 2022, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function addCharacterToEncounter(accessToken) { + + // Don't add a duplicate character + let existingMember = allEncounters[currentEncounterIndex].members.find(member => { + return member.isCharacter && member.characterData.charID == accessToken.charID; + }); + if(existingMember) { return; } + + // If current HP is null, set it to max + accessToken.character.currentHealth = (accessToken.character.currentHealth === null) ? accessToken.calculatedStat.maxHP : accessToken.character.currentHealth; + + // Add character as an encounter member + allEncounters[currentEncounterIndex].members.push({ + creatureID: null, + init: 0, + name: accessToken.character.name, + level: accessToken.character.level, + currentHP: -9999, + maxHP: -9999, + conditions: [], + eliteWeak: 'normal', + commentsOpen: false, + comments: ``, + isCustom: false, + customData: null, + isCharacter: true, + characterData: accessToken, + }); + + // Reload encounter + reloadEncounterMembers(); + reloadBalanceResults(); + +} + + +// Data pipeline from encounter-builder.js condition handling to character update // + +function processCharacter_addCondition(accessToken, conditionName, conditionValue = null) { + + let condition = g_allConditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if(condition){ + + socket.emit(`requestCharacterUpdate-ConditionAdd`, accessToken.charID, condition.name, condition.id, conditionValue, null, null, accessToken.calculatedStat, (calcConditions) => { + // Callback function + accessToken.calculatedStat.conditions = calcConditions; + reloadEncounterMembers(); + populateConditions(accessToken, `character-container-conditions-${accessToken.charID}`, true); + }); + + } + +} + +function processCharacter_removeCondition(accessToken, conditionName) { + + let condition = accessToken.calculatedStat.conditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if(condition){ + + // Not a clean solution, needs BFS but this works. + // Going 2 layers deep, removes condition if parent doesn't exist. + + let consMap = new Map(); + for(let con of accessToken.calculatedStat.conditions){ + if(con.conditionID == condition.conditionID) { continue; } + consMap.set(con.entryID, con); + } + + for(let i = 0; i < 2; i++){// repeat 2 times + for(const [entryID, con] of consMap.entries()){ + if(con.parentEntryID && !consMap.get(con.parentEntryID+'')){ + consMap.delete(entryID); + } + } + } + + let newConditions = []; + for(const [entryID, con] of consMap.entries()){ + newConditions.push(con); + } + accessToken.calculatedStat.conditions = newConditions; + + reloadEncounterMembers(); + populateConditions(accessToken, `character-container-conditions-${accessToken.charID}`, true); + + socket.emit(`requestCharacterUpdate-ConditionRemove`, accessToken.charID, condition.conditionID, accessToken.calculatedStat); + } + +} + +function processCharacter_updateCondition(accessToken, conditionName, newValue) { + + let condition = accessToken.calculatedStat.conditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if(condition){ + + condition.value = newValue; + reloadEncounterMembers(); + populateConditions(accessToken, `character-container-conditions-${accessToken.charID}`, true); + + socket.emit(`requestCharacterUpdate-ConditionUpdate`, accessToken.charID, condition.conditionID, newValue, condition.sourceText, condition.parentEntryID, accessToken.calculatedStat); + + } + +} + +// Update encounter characters on update // + +socket.on("sendCharacterUpdateToGM", function (charID, updates) { + + if(allEncounters[currentEncounterIndex]?.members?.length > 0){ + } else { + return; + } + + let member = allEncounters[currentEncounterIndex].members.find(member => { + return member.isCharacter && member.characterData.charID == charID; + }); + if (!member) { return; } + + let accessToken = member.characterData; + + /* Data: (copy from remote-updates.js) + hp - { value } + temp-hp - { value } + exp - { value } + stamina - { value } + resolve - { value } + hero-points - { value } + calculated-stats - g_calculatedStats + char-info - charInfoJSON + roll-history - rollHistoryJSON + */ + + for (let update of updates) { + + if (update.type == 'hp') { + accessToken.character.currentHealth = update.data.value; + } else if (update.type == 'temp-hp') { + accessToken.character.tempHealth = update.data.value; + } else if (update.type == 'exp') { + accessToken.character.experience = update.data.value; + } else if (update.type == 'stamina') { + accessToken.character.currentStamina = update.data.value; + } else if (update.type == 'resolve') { + accessToken.character.currentResolve = update.data.value; + } else if (update.type == 'hero-points') { + accessToken.character.heroPoints = update.data.value; + } else if (update.type == 'calculated-stats') { + accessToken.calculatedStat = update.data; + } else if (update.type == 'char-info') { + accessToken.character.infoJSON = update.data; + } else if (update.type == 'roll-history') { + accessToken.character.rollHistoryJSON = update.data; + } + + } + + enablePreventQuickViewAutoClose(); + reloadEncounterMembers(); + disablePreventQuickViewAutoClose(); + + /* Note: Don't insert accessToken as a parameter because doing so causes a bug + with jumping to a new character every update. + */ + refreshQuickView(); + +}); diff --git a/client/vue-src/legacy-js/gm_tools/encounter_builder/campaigns-ui.js b/client/vue-src/legacy-js/gm_tools/encounter_builder/campaigns-ui.js new file mode 100644 index 00000000..d77d8a31 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/encounter_builder/campaigns-ui.js @@ -0,0 +1,113 @@ +/* Copyright (C) 2022, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + + +$(function () { + + $('#campaignsSelectModalBackground').click(function () { + closeSelectCampaignModal(); + }); + $('#campaignsSelectModalCloseButton').click(function () { + closeSelectCampaignModal(); + }); + +}); + + +function openSelectCampaignModal() { + + $('#campaignsSelectModalContent').html(''); + + for (const campaign of g_campaigns) { + + let campaignSectionID = 'campaignSection' + campaign.id; + + $('#campaignsSelectModalContent').append('

                  ' + campaign.name + '

                  '); + + $('#' + campaignSectionID).mouseenter(function () { + $(this).addClass('has-bg-selectable'); + }); + $('#' + campaignSectionID).mouseleave(function () { + $(this).removeClass('has-bg-selectable'); + }); + + $('#' + campaignSectionID).click(function () { + allEncounters[currentEncounterIndex].campaignID = campaign.id; + displayEncounter(currentEncounterIndex); + closeSelectCampaignModal(); + openCampaignView(allEncounters[currentEncounterIndex].campaignID); + }); + + } + + $('#campaignsSelectModalDefault').addClass('is-active'); + $('html').addClass('is-clipped'); + +} + +function closeSelectCampaignModal() { + + $('#campaignsSelectModalDefault').removeClass('is-active'); + $('html').removeClass('is-clipped'); + +} + + + +/* Open Campaign View */ + +function openCampaignView(campaignID) { + + let modalID = 'campaignViewModal'; + let title = 'Campaign'; + + $('#center-body').parent().append(` + + `); + $('#' + modalID + '-card-close, #' + modalID + '-background').click(function () { + $('#' + modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#' + modalID).remove(); + }); + + // Allow quickview to close by clicking on modal + $('#'+modalID).click(function(){ + if($('#quickviewDefault').hasClass('quickview-auto-close-protection')){ + $('#quickviewDefault').removeClass('quickview-auto-close-protection'); + } else { + closeQuickView(); + } + }); + + // Delete any generated display containers + $('.generated-display-container').each(function() { + $(this).remove(); + }); + + new DisplayCampaign(modalID+'-view', campaignID+'', false, true); + + // Open Modal + $('#'+modalID).addClass('is-active'); + $('html').addClass('is-clipped'); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/encounter_builder/conditions-ui.js b/client/vue-src/legacy-js/gm_tools/encounter_builder/conditions-ui.js new file mode 100644 index 00000000..8f8776af --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/encounter_builder/conditions-ui.js @@ -0,0 +1,232 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let conditionsModal_currentMember = null; +let conditionsModal_currentConditionName = null; + +$(function () { + + $('#conditionsModalBackground').click(function(){ + closeConditionsModal(); + }); + $('#conditionsModalCloseButton').click(function(){ + closeConditionsModal(); + }); + + $('#conditionsModalSubtractButton').click(function(){ + let value = parseInt($('#conditionsModalValue').text()); + if(!isNaN(value)){ + value--; + value = (value > 9) ? 9 : value; + value = (value < 1) ? 1 : value; + $('#conditionsModalValue').text(value); + } + }); + + $('#conditionsModalAddButton').click(function(){ + let value = parseInt($('#conditionsModalValue').text()); + if(!isNaN(value)){ + value++; + value = (value > 9) ? 9 : value; + value = (value < 1) ? 1 : value; + $('#conditionsModalValue').text(value); + } + }); + + $('#conditionsSelectModalBackground').click(function(){ + closeSelectConditionsModal(); + }); + $('#conditionsSelectModalCloseButton').click(function(){ + closeSelectConditionsModal(); + }); + +}); + + + + +function openConditionsModal(member, conditionData){ + + let condition = g_allConditions.find(condition => { + return condition.name.toLowerCase() == conditionData.name.toLowerCase(); + }); + + if(conditionData.value != null){ + $('#conditionsModalFooter').addClass('buttons'); + $('#conditionsModalSubtractButton').removeClass('is-hidden'); + $('#conditionsModalValueButton').removeClass('is-hidden'); + $('#conditionsModalAddButton').removeClass('is-hidden'); + $('#conditionsModalValue').text(conditionData.value); + } else { + $('#conditionsModalFooter').removeClass('buttons'); + $('#conditionsModalSubtractButton').addClass('is-hidden'); + $('#conditionsModalValueButton').addClass('is-hidden'); + $('#conditionsModalAddButton').addClass('is-hidden'); + $('#conditionsModalValue').text(''); + } + + + if (conditionData.parentSource != null) { + $('#conditionsModalRemoveButton').addClass('is-hidden'); + $('#conditionsModalTitle').removeClass('pl-5'); + $('#conditionsModalSourceContent').html(conditionData.parentSource); + $('#conditionsModalSourceSection').removeClass('is-hidden'); + } else { + $('#conditionsModalRemoveButton').removeClass('is-hidden'); + $('#conditionsModalSourceSection').addClass('is-hidden'); + $('#conditionsModalTitle').addClass('pl-5'); + + $('#conditionsModalRemoveButton').off('click'); + $('#conditionsModalRemoveButton').click(function(){ + removeCondition(member, conditionData.name); + closeConditionsModal(); + }); + } + + + $('#conditionsModalTitle').html(condition.name); + $('#conditionsModalContent').html(processText(condition.description, true, true, 'MEDIUM', false)); + + + $('#conditionsModalDefault').addClass('is-active'); + $('html').addClass('is-clipped'); + + conditionsModal_currentMember = member; + conditionsModal_currentConditionName = conditionData.name; + +} + +function closeConditionsModal(){ + + $('#conditionsModalDefault').removeClass('is-active'); + $('html').removeClass('is-clipped'); + + if(conditionsModal_currentMember != null){ + let value = parseInt($('#conditionsModalValue').text()); + if(!isNaN(value)){ + updateCondition(conditionsModal_currentMember, conditionsModal_currentConditionName, value); + } + } + + conditionsModal_currentMember = null; + conditionsModal_currentConditionName = null; + +} + + +function openSelectConditionsModal(member) { + + $('#conditionsSelectModalContent').html(''); + + for (const condition of g_allConditions) { + + let conditionSectionID = 'conditionSection' + condition.id; + + $('#conditionsSelectModalContent').append('

                  ' + condition.name + '

                  '); + + $('#' + conditionSectionID).mouseenter(function () { + $(this).addClass('has-bg-selectable'); + }); + $('#' + conditionSectionID).mouseleave(function () { + $(this).removeClass('has-bg-selectable'); + }); + + $('#' + conditionSectionID).click(function () { + let value = (condition.hasValue == 1) ? 1 : null; + addCondition(member, condition.name, value); + closeSelectConditionsModal(); + }); + + + + } + + $('#conditionsSelectModalDefault').addClass('is-active'); + $('html').addClass('is-clipped'); + +} + +function closeSelectConditionsModal() { + + $('#conditionsSelectModalDefault').removeClass('is-active'); + $('html').removeClass('is-clipped'); + +} + + +function getAppliedConditions(conditions){ + + let conditionsMap = new Map(); + let addToMap = function(conditionName, condition){ + conditionName = conditionName.toLowerCase(); + let existingCondition = conditionsMap.get(conditionName); + if(existingCondition){ + + if(existingCondition.parentSource){ + conditionsMap.set(conditionName, condition); + } else { + if(condition.value && existingCondition.value){ + if(condition.value > existingCondition.value){ + conditionsMap.set(conditionName, condition); + } + } + } + + } else { + conditionsMap.set(conditionName, condition); + } + }; + + // Apply Indirect Conditions + for(let condition of conditions){ + addToMap(condition.name, condition); + + if(condition.name.toLowerCase() == 'encumbered'){ + addToMap('clumsy', { name: 'clumsy', value: 1, parentSource: 'Encumbered' }); + + } else if(condition.name.toLowerCase() == 'confused'){ + addToMap('flat-footed', { name: 'flat-footed', value: null, parentSource: 'Confused' }); + + } else if(condition.name.toLowerCase() == 'dying'){ + addToMap('unconscious', { name: 'unconscious', value: null, parentSource: 'Dying' }); + // + conditions from unconscious + addToMap('blinded', { name: 'blinded', value: null, parentSource: 'Unconscious' }); + addToMap('flat-footed', { name: 'flat-footed', value: null, parentSource: 'Unconscious' }); + + } else if(condition.name.toLowerCase() == 'grabbed'){ + addToMap('flat-footed', { name: 'flat-footed', value: null, parentSource: 'Grabbed' }); + addToMap('immobilized', { name: 'immobilized', value: null, parentSource: 'Grabbed' }); + + } else if(condition.name.toLowerCase() == 'paralyzed'){ + addToMap('flat-footed', { name: 'flat-footed', value: null, parentSource: 'Paralyzed' }); + + } else if(condition.name.toLowerCase() == 'prone'){ + addToMap('flat-footed', { name: 'flat-footed', value: null, parentSource: 'Prone' }); + + } else if(condition.name.toLowerCase() == 'restrained'){ + addToMap('flat-footed', { name: 'flat-footed', value: null, parentSource: 'Restrained' }); + addToMap('immobilized', { name: 'immobilized', value: null, parentSource: 'Restrained' }); + + } else if(condition.name.toLowerCase() == 'unconscious'){ + addToMap('blinded', { name: 'blinded', value: null, parentSource: 'Unconscious' }); + addToMap('flat-footed', { name: 'flat-footed', value: null, parentSource: 'Unconscious' }); + + } else if(condition.name.toLowerCase() == 'unnoticed'){ + addToMap('undetected', { name: 'undetected', value: null, parentSource: 'Unnoticed' }); + + } + } + + let appliedConditions = []; + for(const [conditionName, condition] of conditionsMap.entries()){ + appliedConditions.push(condition); + } + + return appliedConditions.sort( + function(a, b) { + return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1; + } + ); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/encounter_builder/creature-select-quickview.js b/client/vue-src/legacy-js/gm_tools/encounter_builder/creature-select-quickview.js new file mode 100644 index 00000000..14e7ebb0 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/encounter_builder/creature-select-quickview.js @@ -0,0 +1,768 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +const CREATURE_MIN_LVL = -1; +const CREATURE_MAX_LVL = 30; + +let g_addCreature_advanced_appliedFilters = 0; + +let g_addCreature_creatureMaxDisplay = 0; +const g_addCreature_displayIncrement = 20; + +function openCustomCreatureQuickview() { + + $('#quickViewLeftTitle').html('Add Custom'); + + $('#quickViewLeftTitleClose').html(''); + $('#quickViewLeftClose').click(function () { + $('#quickviewLeftDefault').removeClass('is-active'); + }); + + $('#quickviewLeftDefault').addClass('is-active'); + + let qContent = $(`#quickViewLeftContent`); + qContent.html(` + +
                  + +
                  +

                  + +

                  +
                  + +
                  +

                  + + + Lvl + +

                  +
                  + +
                  +

                  + + + HP + +

                  +
                  +
                  + +
                  +

                  + + Add + +

                  +
                  + + `); + + $(`#creature-custom-add-btn`).click(function () { + + let name = $(`#creature-custom-name-input`).val(); + let level = parseInt($(`#creature-custom-level-input`).val()); + let maxHP = parseInt($(`#creature-custom-hp-input`).val()); + if (isNaN(level)) { level = 1; } + if (isNaN(maxHP)) { maxHP = 100; } + + addCustomMember(allEncounters[currentEncounterIndex], name, level, maxHP); + reloadEncounterMembers(); + reloadBalanceResults(); + + $('#quickviewLeftDefault').removeClass('is-active'); + }); + +} + +function openCreatureSelectQuickview() { + + $('#quickViewLeftTitle').html('Add Creatures'); + + $('#quickViewLeftTitleClose').html(''); + $('#quickViewLeftClose').click(function () { + $('#quickviewLeftDefault').removeClass('is-active'); + }); + + $('#quickviewLeftDefault').addClass('is-active'); + + let qContent = $(`#quickViewLeftContent`); + qContent.html(` + +
                  + +
                  + +
                  +
                  + + `); + + $('#creature-add-tab-search').click(function(){ + + $('#creature-add-tab-search').parent().addClass("is-active"); + $('#creature-add-tab-advanced').parent().removeClass("is-active"); + + creatureAdd_openSearchTab(); + }); + + $('#creature-add-tab-advanced').click(function(){ + + $('#creature-add-tab-search').parent().removeClass("is-active"); + $('#creature-add-tab-advanced').parent().addClass("is-active"); + + creatureAdd_openAdvancedTab(); + }); + + + $('#creature-add-tab-search').click(); + +} + + +function creatureAdd_openSearchTab(){ + + // Set display amount to first increment + g_addCreature_creatureMaxDisplay = g_addCreature_displayIncrement; + + $(`#creature-add-display-view`).html(` + +
                  +
                  +
                  + + + + +
                  +

                  + + + +

                  +

                  + to +

                  +

                  + + + +

                  +
                  +
                  +

                  + + + + +

                  +
                  +
                  +
                  + +
                  +
                  + + `); + + $(`#creature-add-min-lvl-input`).change(function () { + let minValue = $(`#creature-add-min-lvl-input option:selected`).val(); + let maxValue = $(`#creature-add-max-lvl-input option:selected`).val(); + if(minValue == 'Min'){ minValue = CREATURE_MIN_LVL; } + if(maxValue == 'Max'){ maxValue = CREATURE_MAX_LVL; } + minValue = parseInt(minValue); + maxValue = parseInt(maxValue); + + if(minValue > maxValue){ + $(`#creature-add-max-lvl-input`).val(minValue); + } + + generateCreatureResults(false); + }); + $(`#creature-add-max-lvl-input`).change(function () { + let minValue = $(`#creature-add-min-lvl-input option:selected`).val(); + let maxValue = $(`#creature-add-max-lvl-input option:selected`).val(); + if(minValue == 'Min'){ minValue = CREATURE_MIN_LVL; } + if(maxValue == 'Max'){ maxValue = CREATURE_MAX_LVL; } + minValue = parseInt(minValue); + maxValue = parseInt(maxValue); + + if(minValue > maxValue){ + $(`#creature-add-min-lvl-input`).val(maxValue); + } + + generateCreatureResults(false); + }); + + $('#creature-add-search-name-input').on('input', function () { + generateCreatureResults(false); + }); + + $('#creature-add-search-statblock-input').on('input', function () { + generateCreatureResults(false); + }); + +} + +function creatureAdd_openAdvancedTab(){ + + // Set display amount to first increment + g_addCreature_creatureMaxDisplay = g_addCreature_displayIncrement; + + $(`#creature-add-display-view`).html(` + +
                  +
                  +

                  Applied Filters 0

                  +
                  +
                  + +
                  +
                  +
                  + +
                  + +
                  +
                  + +
                  +
                  + +
                  + +
                  + +
                  +

                  + + + +

                  +

                  + to +

                  +

                  + + + +

                  +
                  + +
                  + +
                  + +
                  + +
                  + +
                  + +
                  + +
                  + +
                  + +
                  + +
                  + +
                  + +
                  +
                  + +
                  +
                  + + `); + + + for(let trait of g_foundCreatureTraitsSet){ + $('#creature-add-filter-traits-input').append(``); + } + $("#creature-add-filter-traits-input").chosen({width: "100%"}); + $("#creature-add-filter-traits-input").chosen(); + + for(let book of g_foundCreatureBooksSet){ + let bookName = getContentSourceTextName(book); + if(bookName == null) { bookName = book; } + $('#creature-add-filter-books-input').append(``); + } + $("#creature-add-filter-books-input").chosen({width: "100%"}); + $("#creature-add-filter-books-input").chosen(); + + $("#creature-add-filter-rarity-input").chosen({width: "100%"}); + $("#creature-add-filter-rarity-input").chosen(); + + $("#creature-add-filter-size-input").chosen({width: "100%"}); + $("#creature-add-filter-size-input").chosen(); + + for(let family of g_foundCreatureFamiliesSet){ + $('#creature-add-filter-family-input').append(``); + } + $("#creature-add-filter-family-input").chosen({width: "100%"}); + $("#creature-add-filter-family-input").chosen(); + + $("#creature-add-filter-alignment-input").chosen({width: "100%"}); + $("#creature-add-filter-alignment-input").chosen(); + + $('.chosen-container .chosen-results').addClass('use-custom-scrollbar'); + $('.chosen-container .chosen-choices').addClass('use-custom-scrollbar'); + + + $('#creature-add-filter-reveal').click(function(){ + if($('#creature-add-filter-apply-section').hasClass('is-hidden')){ + $('#creature-add-filter-chevron').removeClass('fa-chevron-up'); + $('#creature-add-filter-chevron').addClass('fa-chevron-down'); + $('#creature-add-filter-apply-section').removeClass('is-hidden'); + } else { + $('#creature-add-filter-chevron').removeClass('fa-chevron-down'); + $('#creature-add-filter-chevron').addClass('fa-chevron-up'); + $('#creature-add-filter-apply-section').addClass('is-hidden'); + } + }); + + + $(`#creature-add-min-lvl-input`).change(function () { + let minValue = $(`#creature-add-min-lvl-input option:selected`).val(); + let maxValue = $(`#creature-add-max-lvl-input option:selected`).val(); + if(minValue == 'Min'){ minValue = CREATURE_MIN_LVL; } + if(maxValue == 'Max'){ maxValue = CREATURE_MAX_LVL; } + minValue = parseInt(minValue); + maxValue = parseInt(maxValue); + + if(minValue > maxValue){ + $(`#creature-add-max-lvl-input`).val(minValue); + } + + generateCreatureResults(true); + }); + $(`#creature-add-max-lvl-input`).change(function () { + let minValue = $(`#creature-add-min-lvl-input option:selected`).val(); + let maxValue = $(`#creature-add-max-lvl-input option:selected`).val(); + if(minValue == 'Min'){ minValue = CREATURE_MIN_LVL; } + if(maxValue == 'Max'){ maxValue = CREATURE_MAX_LVL; } + minValue = parseInt(minValue); + maxValue = parseInt(maxValue); + + if(minValue > maxValue){ + $(`#creature-add-min-lvl-input`).val(maxValue); + } + + generateCreatureResults(true); + }); + + $('#creature-add-search-name-input').on('input', function () { + generateCreatureResults(true); + }); + + $('#creature-add-filter-traits-input, #creature-add-filter-books-input, #creature-add-filter-rarity-input, #creature-add-filter-size-input, #creature-add-filter-family-input, #creature-add-filter-alignment-input').change(function(){ + generateCreatureResults(true); + }); + +} + + +function generateCreatureResults(advancedSearch, resetMaxDisplay=true){ + $(`#creature-add-results-display`).html(``); + + if(resetMaxDisplay){ + // Set display amount to first increment + g_addCreature_creatureMaxDisplay = g_addCreature_displayIncrement; + } + + g_addCreature_advanced_appliedFilters = 0; + + let statWords = []; + if(!advancedSearch){ + if($(`#creature-add-search-statblock-input`).val().trim() != ``){ + statWords = $(`#creature-add-search-statblock-input`).val().replace(/\W/g, ' ').split(' '); + if (statWords.length == 1 && statWords[0].length < 3) { + statWords = []; + } + } + } + + let nameWords = []; + if($(`#creature-add-search-name-input`).val().trim() != ``){ + nameWords = $(`#creature-add-search-name-input`).val().split(' '); + g_addCreature_advanced_appliedFilters++; + } + + let minLvl = $(`#creature-add-min-lvl-input option:selected`).val(); + let maxLvl = $(`#creature-add-max-lvl-input option:selected`).val(); + if(minLvl != 'Min' || maxLvl != 'Max'){ + g_addCreature_advanced_appliedFilters++; + } + if(minLvl == 'Min'){ + minLvl = CREATURE_MIN_LVL; + } else if(maxLvl == 'Max'){ + maxLvl = CREATURE_MAX_LVL; + } + minLvl = parseInt(minLvl); + maxLvl = parseInt(maxLvl); + + let traits = []; + let books = []; + let rarities = []; + let sizes = []; + let families = []; + let alignments = []; + + if(advancedSearch){ + + traits = $('#creature-add-filter-traits-input').val(); + if(traits.length > 0){ + g_addCreature_advanced_appliedFilters++; + } + books = $("#creature-add-filter-books-input").val(); + if(books.length > 0){ + g_addCreature_advanced_appliedFilters++; + } + rarities = $("#creature-add-filter-rarity-input").val(); + if(rarities.length > 0){ + g_addCreature_advanced_appliedFilters++; + } + sizes = $("#creature-add-filter-size-input").val(); + if(sizes.length > 0){ + g_addCreature_advanced_appliedFilters++; + } + families = $("#creature-add-filter-family-input").val(); + if(families.length > 0){ + g_addCreature_advanced_appliedFilters++; + } + alignments = $("#creature-add-filter-alignment-input").val(); + if(alignments.length > 0){ + g_addCreature_advanced_appliedFilters++; + } + + } + + $(`#creature-add-filter-count`).text(g_addCreature_advanced_appliedFilters); + + let containsWords = function (stringD, words) { + for (let word of words) { + if (!stringD.includes(word.toLowerCase())) { + return false; + } + } + return true; + }; + + if(statWords.length > 0 || g_addCreature_advanced_appliedFilters > 0){ + let creatureCount = 0; + let didntLoadAll = false; + for (const [creatureID, data] of g_creaturesMap.entries()) { + + let toDisplay = true; + + if(!advancedSearch){ + if(!containsWords(g_extractedCreaturesMap.get(creatureID), statWords)){ + toDisplay = false; + } + } + + if(!containsWords(data.name.toLowerCase(), nameWords)){ + toDisplay = false; + } + + if(data.level > maxLvl) { toDisplay = false; } + if(data.level < minLvl) { toDisplay = false; } + + if(advancedSearch){ + + let foundTraits = traits.filter(trait => { + return data.traitsJSON.toLowerCase().includes(`"${trait}"`); + }); + if(traits.length > 0 && foundTraits.length !== traits.length){ + toDisplay = false; + } + + if(books.length > 0 && !books.includes(data.contentSrc)){ + toDisplay = false; + } + + if(rarities.length > 0 && !rarities.includes(data.rarity)){ + toDisplay = false; + } + + if(sizes.length > 0 && !sizes.includes(data.size)){ + toDisplay = false; + } + + let familyType = (data.familyType != null) ? data.familyType.toLowerCase() : 'other'; + if(families.length > 0 && !families.includes(familyType)){ + toDisplay = false; + } + + if(alignments.length > 0 && !alignments.includes(data.alignment)){ + toDisplay = false; + } + + } + + if (toDisplay) { + creatureCount++; + + let creatureAddViewBtn = `creature-add-view-btn-${creatureID}`; + let creatureAddEliteWeak = `creature-add-eliteweak-input-${creatureID}`; + let creatureAddBtn = `creature-add-btn-${creatureID}`; + + $(`#creature-add-results-display`).append(` +
                  +
                  +

                  ${data.level >= 0 && data.level <= 9 ? ` ` : ``}${data.level} - ${data.name}

                  +
                  + +
                  + + +
                  +
                  +
                  + +
                  +
                  +
                  + +
                  +
                  +
                  + +
                  +
                  + `); + + $(`#${creatureAddViewBtn}`).click(function () { + let eliteWeak = $(`#${creatureAddEliteWeak}`).val(); + openQuickView('creatureView', { + data: data, + conditions: [], + eliteWeak: eliteWeak, + }, true); + }); + + $(`#${creatureAddEliteWeak}`).change(function () { + // Update the opened quickview + if($('#quickviewDefault').hasClass('is-active')){ + $(`#${creatureAddViewBtn}`).click(); + } + }); + + $(`#${creatureAddBtn}`).click(function () { + + let eliteWeak = $(`#${creatureAddEliteWeak}`).val(); + addMember(allEncounters[currentEncounterIndex], creatureID, eliteWeak); + reloadEncounterMembers(); + reloadBalanceResults(); + + //$('#quickviewLeftDefault').removeClass('is-active'); + }); + + if(creatureCount >= g_addCreature_creatureMaxDisplay){ didntLoadAll = true; break; } + } + + } + + if(didntLoadAll){ + $(`#creature-add-results-display`).append(` + + `); + $('#creature-add-results-load-more').click(function(){ + g_addCreature_creatureMaxDisplay += g_addCreature_displayIncrement; + generateCreatureResults(advancedSearch, false); + }); + } + + if ($(`#creature-add-results-display`).html() == ``) { + $(`#creature-add-results-display`).html(` +

                  No creatures found.

                  + `); + } + + } else { + + $(`#creature-add-results-display`).html(``); + + } + + +} diff --git a/client/vue-src/legacy-js/gm_tools/encounter_builder/creature-utils.js b/client/vue-src/legacy-js/gm_tools/encounter_builder/creature-utils.js new file mode 100644 index 00000000..22433e23 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/encounter_builder/creature-utils.js @@ -0,0 +1,295 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function applyEliteWeak(inputData, eliteWeak){ + let data = cloneObj(inputData); + + let adj_rangedAttack = 0; + let adj_rangedDamage = 0; + let adj_meleeAttack = 0; + let adj_meleeDamage = 0; + let adj_spellAttack = 0; + let adj_spellDC = 0; + + let adj_generalDC = 0; + let adj_generalDamage = 0; + let adj_generalDamageLimited = 0; + + let skills = JSON.parse(data.skillsJSON); + + if(eliteWeak == 'elite' || eliteWeak == 'weak'){ + let sign = (eliteWeak == 'elite') ? 1 : -1; + + data.acValue += sign*2; + adj_meleeAttack = sign*2; + adj_rangedAttack = sign*2; + adj_spellAttack = sign*2; + adj_spellDC = sign*2; + + adj_generalDC = sign*2; + adj_generalDamage = sign*2; + + adj_generalDamageLimited = sign*4; // TODO + + adj_meleeDamage = sign*2; + adj_rangedDamage = sign*2; + + data.reflexBonus += sign*2; + data.fortBonus += sign*2; + data.willBonus += sign*2; + + data.perceptionBonus += sign*2; + for(let skill of skills){ + skill.bonus += sign*2; + } + + data.hpMax = getCreatureMaxHP(data.level, data.hpMax, eliteWeak); + data.level = getCreatureLevel(data.level, eliteWeak); + + } + + data.skills = skills; + data.adj_rangedAttack = adj_rangedAttack; + data.adj_rangedDamage = adj_rangedDamage; + data.adj_meleeAttack = adj_meleeAttack; + data.adj_meleeDamage = adj_meleeDamage; + data.adj_spellAttack = adj_spellAttack; + data.adj_spellDC = adj_spellDC; + data.adj_generalDC = adj_generalDC; + data.adj_generalDamage = adj_generalDamage; + data.adj_generalDamageLimited = adj_generalDamageLimited; + + return data; + +} + +function calculateCreatureStats(data, conditions){ + + let perceptionConditionals = ''; + + let adjustmentMap = new Map(); + let addAdjustment = function(variable, type, value){ + let adjustments = adjustmentMap.get(variable); + if(adjustments == null){adjustments = new Map();} + adjustments.set(type, value); + adjustmentMap.set(variable, adjustments); + }; + let getTotalAdjustment = function(variable){ + let adjustments = adjustmentMap.get(variable); + if(adjustments != null){ + let result = 0; + for(const [type, value] of adjustments.entries()){ + result += value; + } + return result; + } else { + return 0; + } + }; + + // Handle Conditions // + let appliedConditions = getAppliedConditions(conditions); + + // Process each applied condition + for(let condition of appliedConditions){ + if(condition.name.toLowerCase() == 'encumbered'){ + addAdjustment('speed', 'encumbered', -10); + + } else if(condition.name.toLowerCase() == 'clumsy'){ + addAdjustment('dex', 'status', -1*condition.value); + addAdjustment('ac', 'status', -1*condition.value); + addAdjustment('reflex', 'status', -1*condition.value); + addAdjustment('ranged_attack', 'status', -1*condition.value); + addAdjustment('skill_acrobatics', 'status', -1*condition.value); + addAdjustment('skill_stealth', 'status', -1*condition.value); + addAdjustment('skill_thievery', 'status', -1*condition.value); + + } else if(condition.name.toLowerCase() == 'blinded'){ + addAdjustment('perception', 'status', -4); + + } else if(condition.name.toLowerCase() == 'deafened'){ + perceptionConditionals += ', -2 status penalty to checks for initiative or that involve sound but also rely on other senses'; + + } else if(condition.name.toLowerCase() == 'drained'){ + addAdjustment('con', 'status', -1*condition.value); + addAdjustment('fort', 'status', -1*condition.value); + addAdjustment('hp', 'drained', -1*condition.value*((data.level > 1) ? data.level : 1)); + + } else if(condition.name.toLowerCase() == 'enfeebled'){ + addAdjustment('str', 'status', -1*condition.value); + addAdjustment('melee_attack', 'status', -1*condition.value); + addAdjustment('melee_damage', 'status', -1*condition.value); + addAdjustment('skill_athletics', 'status', -1*condition.value); + + } else if(condition.name.toLowerCase() == 'fascinated'){ + addAdjustment('perception', 'status', -2); + addAdjustment('skill', 'status', -2); + + } else if(condition.name.toLowerCase() == 'fatigued'){ + addAdjustment('ac', 'status', -1); + addAdjustment('reflex', 'status', -1); + addAdjustment('fort', 'status', -1); + addAdjustment('will', 'status', -1); + + } else if(condition.name.toLowerCase() == 'flat-footed'){ + addAdjustment('ac', 'circum', -2); + + } else if(condition.name.toLowerCase() == 'frightened'){ + addAdjustment('perception', 'status', -1*condition.value); + addAdjustment('skill', 'status', -1*condition.value); + + addAdjustment('ac', 'status', -1*condition.value); + addAdjustment('reflex', 'status', -1*condition.value); + addAdjustment('fort', 'status', -1*condition.value); + addAdjustment('will', 'status', -1*condition.value); + + addAdjustment('melee_attack', 'status', -1*condition.value); + addAdjustment('ranged_attack', 'status', -1*condition.value); + + addAdjustment('spell_attack', 'status', -1*condition.value); + addAdjustment('spell_dc', 'status', -1*condition.value); + + } else if(condition.name.toLowerCase() == 'prone'){ + addAdjustment('melee_attack', 'circum', -2); + addAdjustment('ranged_attack', 'circum', -2); + addAdjustment('spell_attack', 'circum', -2); + + } else if(condition.name.toLowerCase() == 'sickened'){ + addAdjustment('perception', 'status', -1*condition.value); + addAdjustment('skill', 'status', -1*condition.value); + + addAdjustment('ac', 'status', -1*condition.value); + addAdjustment('reflex', 'status', -1*condition.value); + addAdjustment('fort', 'status', -1*condition.value); + addAdjustment('will', 'status', -1*condition.value); + + addAdjustment('melee_attack', 'status', -1*condition.value); + addAdjustment('ranged_attack', 'status', -1*condition.value); + + addAdjustment('spell_attack', 'status', -1*condition.value); + addAdjustment('spell_dc', 'status', -1*condition.value); + + } else if(condition.name.toLowerCase() == 'stupefied'){ + addAdjustment('int', 'status', -1*condition.value); + addAdjustment('wis', 'status', -1*condition.value); + addAdjustment('cha', 'status', -1*condition.value); + + addAdjustment('will', 'status', -1*condition.value); + addAdjustment('spell_attack', 'status', -1*condition.value); + addAdjustment('spell_dc', 'status', -1*condition.value); + + addAdjustment('perception', 'status', -1*condition.value); + addAdjustment('skill_arcana', 'status', -1*condition.value); + addAdjustment('skill_crafting', 'status', -1*condition.value); + addAdjustment('skill_deception', 'status', -1*condition.value); + addAdjustment('skill_diplomacy', 'status', -1*condition.value); + addAdjustment('skill_intimidation', 'status', -1*condition.value); + addAdjustment('skill_medicine', 'status', -1*condition.value); + addAdjustment('skill_nature', 'status', -1*condition.value); + addAdjustment('skill_occultism', 'status', -1*condition.value); + addAdjustment('skill_performance', 'status', -1*condition.value); + addAdjustment('skill_religion', 'status', -1*condition.value); + addAdjustment('skill_society', 'status', -1*condition.value); + addAdjustment('skill_survival', 'status', -1*condition.value); + addAdjustment('skill_lore', 'status', -1*condition.value); + + } else if(condition.name.toLowerCase() == 'unconscious'){ + addAdjustment('ac', 'status', -4); + addAdjustment('perception', 'status', -4); + addAdjustment('reflex', 'status', -4); + + } else { + console.warn('Unknown condition: '+condition.name); + } + } + + let perception = data.perceptionBonus + getTotalAdjustment('perception'); + for(let skill of data.skills){ + if(skill.name.toLowerCase().includes(' lore')){ + skill.bonus += getTotalAdjustment('skill_lore'); + } else { + skill.bonus += getTotalAdjustment('skill_'+skill.name.toLowerCase()); + } + skill.bonus += getTotalAdjustment('skill'); + } + + let abilityMods = { + str: data.strMod + getTotalAdjustment('str'), + dex: data.dexMod + getTotalAdjustment('dex'), + con: data.conMod + getTotalAdjustment('con'), + int: data.intMod + getTotalAdjustment('int'), + wis: data.wisMod + getTotalAdjustment('wis'), + cha: data.chaMod + getTotalAdjustment('cha'), + }; + let ac = data.acValue + getTotalAdjustment('ac'); + let saves = { + fort: data.fortBonus + getTotalAdjustment('fort'), + reflex: data.reflexBonus + getTotalAdjustment('reflex'), + will: data.willBonus + getTotalAdjustment('will'), + }; + let hpMax = data.hpMax + getTotalAdjustment('hp'); + + return { + perception, + skills: data.skills, + abilityMods, + ac, + saves, + hpMax, + perceptionConditionals, + adj_speed: getTotalAdjustment('speed'), + adj_rangedAttack: getTotalAdjustment('ranged_attack')+data.adj_rangedAttack, + adj_rangedDamage: getTotalAdjustment('ranged_damage')+data.adj_rangedDamage, + adj_meleeAttack: getTotalAdjustment('melee_attack')+data.adj_meleeAttack, + adj_meleeDamage: getTotalAdjustment('melee_damage')+data.adj_meleeDamage, + adj_spellAttack: getTotalAdjustment('spell_attack')+data.adj_spellAttack, + adj_spellDC: getTotalAdjustment('spell_dc')+data.adj_spellDC, + + adj_generalDC: getTotalAdjustment('general_dc')+data.adj_generalDC, + adj_generalDamage: getTotalAdjustment('general_damage')+data.adj_generalDamage, + }; + + +} + + +function getBonusForInitiative(){ + // Get after condition bonus for perception / skill. If has defeaned condition, give -2. +} + +function getCreatureMaxHP(level, hpMax, eliteWeak){ + + let maxHp = hpMax; + if(eliteWeak == 'elite' || eliteWeak == 'weak'){ + let sign = (eliteWeak == 'elite') ? 1 : -1; + if(level >= 20){ + maxHp = hpMax + sign*30; + } else if(level >= 5){ + maxHp = hpMax + sign*20; + } else if(level >= 2){ + maxHp = hpMax + sign*15; + } else { + maxHp = hpMax + sign*10; + } + } + return maxHp; + +} + +function getCreatureLevel(level, eliteWeak){ + + let lvl = level; + if(eliteWeak == 'elite' || eliteWeak == 'weak'){ + let sign = (eliteWeak == 'elite') ? 1 : -1; + if(level == -1 && eliteWeak == 'elite'){ + lvl = 1; + } else if(level == 1 && eliteWeak == 'weak'){ + lvl = -1; + } else { + lvl = level + sign; + } + } + return lvl; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/encounter_builder/encounter-builder.js b/client/vue-src/legacy-js/gm_tools/encounter_builder/encounter-builder.js new file mode 100644 index 00000000..ce6c7f02 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/encounter_builder/encounter-builder.js @@ -0,0 +1,763 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +$(function () { + + startSpinnerLoader(); + socket.emit("requestEncounterDetails"); + + // Save every 1 minute + window.setInterval(() => { + saveData(); + }, 60000); + + // Save on tab close + window.onbeforeunload = function (e) { + saveData(); + }; + +}); + +let g_creaturesMap; +let g_extractedCreaturesMap; +let g_foundCreatureTraitsSet; +let g_foundCreatureFamiliesSet; +let g_foundCreatureBooksSet; + +let g_allConditions; +let g_allTags; +let g_featMap; +let g_itemMap; +let g_spellMap; +let g_skillMap; + +let g_campaigns; + +socket.on("returnEncounterDetails", function (allCreatures, allTags, featsObject, itemsObject, spellsObject, allConditions, skillObject, campaigns) { + + g_creaturesMap = new Map(); + for (let creature of allCreatures) { + g_creaturesMap.set(creature.id, creature); + } + let extractDataToString = function(data){ + let resultStr = ``; + for(let d in data) { + if(data[d] != '' && data[d] != null){ + resultStr += ` ${JSON.stringify(data[d])} `; + } + } + return resultStr.replace(/\W/g, ' ').toLowerCase(); + }; + g_extractedCreaturesMap = new Map(); + g_foundCreatureTraitsSet = new Set(); + g_foundCreatureFamiliesSet = new Set(); + g_foundCreatureBooksSet = new Set(); + for (const [creatureID, data] of g_creaturesMap.entries()) { + g_extractedCreaturesMap.set(creatureID, extractDataToString(data)); + + try { + let traits = JSON.parse(data.traitsJSON.toLowerCase()); + for(let trait of traits){ + g_foundCreatureTraitsSet.add(trait); + } + } catch (error) {} + + let familyType = (data.familyType != null) ? data.familyType.toLowerCase() : 'other'; + g_foundCreatureFamiliesSet.add(familyType); + g_foundCreatureBooksSet.add(data.contentSrc); + + } + + g_foundCreatureTraitsSet = Array.from(g_foundCreatureTraitsSet).sort( + function(a, b) { + return a > b ? 1 : -1; + } + ); + g_foundCreatureFamiliesSet = Array.from(g_foundCreatureFamiliesSet).sort( + function(a, b) { + return a > b ? 1 : -1; + } + ); + g_foundCreatureBooksSet = Array.from(g_foundCreatureBooksSet).sort( + function(a, b) { + return a > b ? 1 : -1; + } + ); + + g_allConditions = allConditions.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + g_allTags = allTags; + g_featMap = objToMap(featsObject); + g_itemMap = objToMap(itemsObject); + g_spellMap = objToMap(spellsObject); + g_skillMap = objToMap(skillObject); + + g_campaigns = campaigns; + + loadData(); + + $(`#encounter-add-btn`).click(function () { + if (allEncounters.length >= 25) { return; } + addEncounter(); + displayEncounter(allEncounters.length - 1); + reloadEncounters(); + }); + + reloadEncounters(); + initEncounterView(); + + stopSpinnerLoader(); + +}); + + +let currentEncounterIndex = null; +let allEncounters = []; + +function reloadEncounters() { + + $(`#encounter-tab-list`).html(``); + for (let i = 0; i < allEncounters.length; i++) { + let encounter = allEncounters[i]; + + let btn_encounterView = `encounter-btn-view-${i}`; + let btn_encounterDelete = `encounter-btn-delete-${i}`; + + $(`#encounter-tab-list`).append(` +
                  +

                  + +

                  +

                  + +

                  +
                  + `); + + $(`#${btn_encounterView}`).click(function () { + displayEncounter(i); + }); + + $(`#${btn_encounterDelete}`).click(function () { + new ConfirmMessage('Delete “' + encounter.name + '”', '

                  Are you sure you want to delete this encounter?

                  ', 'Delete', 'modal-delete-encounter', 'modal-delete-encounter-btn'); + $('#modal-delete-encounter-btn').click(function () { + removeEncounter(i); + }); + }); + + } + + if (allEncounters.length == 0) { + $(`#encounter-add-btn`).click(); + } + if (allEncounters[currentEncounterIndex] == null) { + currentEncounterIndex = 0; + } + + displayEncounter(currentEncounterIndex); + +} + +function displayEncounter(encounterIndex) { + currentEncounterIndex = encounterIndex; + $(`#encounter-name-input`).val(allEncounters[currentEncounterIndex].name); + $(`#encounter-party-size-input`).val(allEncounters[currentEncounterIndex].partySize); + $(`#encounter-party-level-input`).val(allEncounters[currentEncounterIndex].partyLevel); + + if(allEncounters[currentEncounterIndex].campaignID == null){ + $('#encounter-set-campaign-btn').addClass('is-outlined'); + $('#encounter-set-campaign-title').text('Set Campaign'); + + $(`#encounter-section-party-size`).show(); + $(`#encounter-section-party-level`).show(); + } else { + $('#encounter-set-campaign-btn').removeClass('is-outlined'); + $('#encounter-set-campaign-title').text('View Campaign'); + + $(`#encounter-section-party-size`).hide(); + $(`#encounter-section-party-level`).hide(); + } + + $(`.encounterViewBtn`).removeClass('is-hovered'); + $(`#encounter-btn-view-${currentEncounterIndex}`).addClass('is-hovered'); + + reloadEncounterMembers(); + reloadBalanceResults(); +} + +function initEncounterView() { + + $(`#encounter-name-input`).on('keypress', function (e) { + if (e.which == 13) { + $(`#encounter-name-input`).blur(); + } + }); + $(`#encounter-name-input`).change(function () { + allEncounters[currentEncounterIndex].name = $(this).val().trim(); + reloadEncounters(); + }); + + $(`#encounter-party-size-input`).on('keypress', function (e) { + if (e.which == 13) { + $(`#encounter-party-size-input`).blur(); + } + }); + $(`#encounter-party-size-input`).change(function () { + allEncounters[currentEncounterIndex].partySize = parseInt($(this).val()); + reloadBalanceResults(); + }); + + $(`#encounter-party-level-input`).on('keypress', function (e) { + if (e.which == 13) { + $(`#encounter-party-level-input`).blur(); + } + }); + $(`#encounter-party-level-input`).change(function () { + allEncounters[currentEncounterIndex].partyLevel = parseInt($(this).val()); + reloadBalanceResults(); + }); + + + $(`#encounter-roll-initiative-btn`).click(function () { + $('#quickviewLeftDefault').removeClass('is-active'); + $('#quickviewDefault').removeClass('is-active'); + + openRollInitiativeModal(); + }); + $(`#encounter-add-creature-btn`).click(function () { + $('#quickviewLeftDefault').removeClass('is-active'); + $('#quickviewDefault').removeClass('is-active'); + + openCreatureSelectQuickview(); + }); + $(`#encounter-add-custom-btn`).click(function () { + $('#quickviewLeftDefault').removeClass('is-active'); + $('#quickviewDefault').removeClass('is-active'); + + openCustomCreatureQuickview(); + }); + + if(g_campaigns.length === 0){ + $(`#encounter-set-campaign-btn`).prop('disabled', true); + } else { + $(`#encounter-set-campaign-btn`).click(function () { + $('#quickviewLeftDefault').removeClass('is-active'); + $('#quickviewDefault').removeClass('is-active'); + + let campaignID = allEncounters[currentEncounterIndex].campaignID; + if(campaignID == null){ + openSelectCampaignModal(); + } else { + openCampaignView(campaignID); + } + }); + } + +} + +function addEncounter() { + allEncounters.push({ + name: `Encounter #${allEncounters.length + 1}`, + partySize: 4, + partyLevel: 1, + members: [], + campaignID: null, + }); +} + +function removeEncounter(encounterIndex) { + allEncounters.splice(encounterIndex, 1); + reloadEncounters(); +} + +function addMember(encounter, creatureID, eliteWeak = null) { + let creature = g_creaturesMap.get(creatureID); + if (creature == null) { console.error(`Unknown creature ${creatureID}!`); return; } + encounter.members.push({ + creatureID: creatureID, + init: 0, + name: `${eliteWeak == 'elite' || eliteWeak == 'weak' ? `${capitalizeWord(eliteWeak)} - ` : ``}${creature.name}`, + level: getCreatureLevel(creature.level, eliteWeak), + currentHP: getCreatureMaxHP(creature.level, creature.hpMax, eliteWeak), + maxHP: getCreatureMaxHP(creature.level, creature.hpMax, eliteWeak), + conditions: [], + eliteWeak: eliteWeak, + commentsOpen: false, + comments: ``, + isCustom: false, + customData: null, + isCharacter: false, + characterData: null, + }); +} + +function addCustomMember(encounter, name, level, maxHP) { + encounter.members.push({ + creatureID: null, + init: 0, + name: name, + level: level, + currentHP: maxHP, + maxHP: maxHP, + conditions: [], + eliteWeak: 'normal', + commentsOpen: false, + comments: ``, + isCustom: true, + customData: { name: name, level: level, hpMax: maxHP }, + isCharacter: false, + characterData: null, + }); +} + +function removeMember(encounter, member) { + encounter.members = encounter.members.filter((mem) => { + return mem != member; + }); + reloadEncounterMembers(); + reloadBalanceResults(); +} + +function getOriginalCreature(member){ + if(member.isCharacter){ + return member.characterData; + } else if(member.isCustom){ + return member.customData; + } else { + return g_creaturesMap.get(member.creatureID); + } +} + +function addCondition(member, conditionName, conditionValue = null) { + + if(member.isCharacter){ + processCharacter_addCondition(member.characterData, conditionName, conditionValue); + return; + } + + const condition = member.conditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if (condition == null) { + if (conditionName.toLowerCase() == 'drained') { + member.currentHP -= (member.level > 1 ? member.level : 1) * conditionValue; + member.maxHP = getCreatureMaxHP(member.level, getOriginalCreature(member).hpMax, member.eliteWeak) - (member.level > 1 ? member.level : 1) * conditionValue; + } + if (conditionName.toLowerCase() == 'dying') { + const woundedCondition = member.conditions.find(condition => { + return condition.name.toLowerCase() == 'wounded'; + }); + if (woundedCondition != null) { + conditionValue += woundedCondition.value; + } + } + + member.conditions.push({ + name: conditionName, + value: conditionValue, + parentSource: null, + }); + reloadEncounterMembers(); + } +} + +function removeCondition(member, conditionName) { + + if(member.isCharacter){ + processCharacter_removeCondition(member.characterData, conditionName); + return; + } + + const condition = member.conditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if (condition != null) { + if (conditionName.toLowerCase() == 'drained') { + member.maxHP = getCreatureMaxHP(member.level, getOriginalCreature(member).hpMax, member.eliteWeak); + } + if (conditionName.toLowerCase() == 'dying') { + const woundedCondition = member.conditions.find(condition => { + return condition.name.toLowerCase() == 'wounded'; + }); + if (woundedCondition != null) { + woundedCondition.value++; + } else { + addCondition(member, 'Wounded', 1); + } + } + + // Filter out all conditions with same name + member.conditions = member.conditions.filter((condition) => { + return condition.name.toLowerCase() != conditionName.toLowerCase(); + }); + reloadEncounterMembers(); + } +} + +function updateCondition(member, conditionName, newValue) { + + if(member.isCharacter){ + processCharacter_updateCondition(member.characterData, conditionName, newValue); + return; + } + + let condition = member.conditions.find(condition => { + return condition.name.toLowerCase() == conditionName.toLowerCase(); + }); + if (condition != null) { + if (conditionName.toLowerCase() == 'drained') { + if (newValue > condition.value) { + member.currentHP -= (member.level > 1 ? member.level : 1) * (newValue - condition.value); + } + member.maxHP = getCreatureMaxHP(member.level, getOriginalCreature(member).hpMax, member.eliteWeak) - (member.level > 1 ? member.level : 1) * newValue; + } + + condition.value = newValue; + reloadEncounterMembers(); + } +} + + +function reloadEncounterMembers() { + $(`#encounter-members-view`).html(``); + if (currentEncounterIndex == null) { return; } + + let encounter = allEncounters[currentEncounterIndex]; + + encounter.members = encounter.members.sort( + function (a, b) { + if (b.init === a.init) { + // Name is only important when init are the same + return a.name > b.name ? 1 : -1; + } + return b.init - a.init; + } + ); + + if (encounter.members.length == 0) { + $(`#encounter-members-view`).html(` +

                  Empty encounter...

                  + `); + return; + } + + for (let i = 0; i < encounter.members.length; i++) { + + let member = encounter.members[i]; + + let input_memberInit = `member-input-init-${i}`; + let input_memberName = `member-input-name-${i}`; + let input_memberCurrentHP = `member-input-hp-${i}`; + let input_memberComments = `member-input-comments-${i}`; + + let btn_memberAddCondition = `member-btn-condition-add-${i}`; + let btn_memberView = `member-btn-view-${i}`; + let btn_memberViewComments = `member-btn-comments-view-${i}`; + let btn_memberDelete = `member-btn-delete-${i}`; + + let container_memberConditions = `member-container-conditions-${i}`; + let container_memberComments = `member-container-comments-${i}`; + + let currentHP = (member.isCharacter) ? member.characterData.character.currentHealth : member.currentHP; + let maxHP = (member.isCharacter) ? member.characterData.calculatedStat.maxHP : member.maxHP; + + $(`#encounter-members-view`).append(` +
                  +
                  +
                  + +
                  +
                  +
                  +
                  + +
                  +
                  +
                  +
                  + +
                  +
                  +
                  +
                  +

                  +

                  /

                  +

                  ${maxHP} +

                  +
                  +
                  +
                  +
                  +
                  + + + +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + +
                  +
                  + +
                  + `); + + // Init // + $(`#${input_memberInit}`).on('keypress', function (e) { + if (e.which == 13) { + $(`#${input_memberInit}`).blur(); + } + }); + $(`#${input_memberInit}`).blur(function () { + member.init = parseInt($(this).val()); + reloadEncounterMembers(); + }); + + // Name // + if(member.isCharacter){ + $(`#${input_memberName}`).prop('readonly', true); + $(`#${input_memberName}`).addClass('is-bold'); + } else { + $(`#${input_memberName}`).on('keypress', function (e) { + if (e.which == 13) { + $(`#${input_memberName}`).blur(); + } + }); + $(`#${input_memberName}`).blur(function () { + member.name = $(this).val(); + }); + } + + // View // + $(`#${btn_memberView}`).click(function () { + let creatureData = getOriginalCreature(member); + if(member.isCharacter){ + g_characterViewOpenedTab_rollHistory = false; + g_characterViewOpenedTab_charInfo = false; + openQuickView('characterView', creatureData); + } else if(member.isCustom){ + openQuickView('creatureCustomView', member); + } else { + openQuickView('creatureView', { + data: creatureData, + conditions: member.conditions, + eliteWeak: member.eliteWeak, + }); + } + }); + + // HP // + $(`#${input_memberCurrentHP}`).on('keypress', function (e) { + if (e.which == 13) { + $(`#${input_memberCurrentHP}`).blur(); + } + }); + $(`#${input_memberCurrentHP}`).blur(function () { + let newHP; + try { + newHP = parseInt(math.evaluate($(this).val())); + if (newHP > 9999) { newHP = 9999; } + if (newHP < 0) { newHP = 0; } + if (isNaN(newHP)) { newHP = 0; } + } catch (err) { + newHP = 0; + } + + // + + if(member.isCharacter){ + if (newHP > member.characterData.calculatedStat.maxHP) { newHP = member.characterData.calculatedStat.maxHP; } + if(member.characterData.character.currentHealth !== newHP){ + socket.emit(`requestCharacterUpdate-Health`, member.characterData.charID, newHP); + member.characterData.character.currentHealth = newHP; + refreshQuickView(); + } + } + + let currentIsZero = (member.currentHP == 0); + + member.currentHP = newHP; + $(this).val(member.currentHP); + + if(!member.isCharacter){ + if(currentIsZero && newHP > 0){ + removeCondition(member, 'Dying'); + } else if(newHP == 0){ + addCondition(member, 'Dying', 1); + } + } + + }); + $(`#${input_memberCurrentHP}`).click(function (event) { + event.stopImmediatePropagation(); + }); + + // Comments // + $(`#${btn_memberViewComments}`).click(function () { + if ($(`#${container_memberComments}`).hasClass("is-hidden")) { + $(`#${container_memberComments}`).removeClass('is-hidden'); + $(`#${btn_memberViewComments} :first-child`).attr('data-prefix', 'fas'); + $(`#${btn_memberViewComments} :first-child`).removeClass('far'); + $(`#${btn_memberViewComments} :first-child`).addClass('fas'); + member.commentsOpen = true; + } else { + $(`#${container_memberComments}`).addClass('is-hidden'); + $(`#${btn_memberViewComments} :first-child`).attr('data-prefix', 'far'); + $(`#${btn_memberViewComments} :first-child`).removeClass('fas'); + $(`#${btn_memberViewComments} :first-child`).addClass('far'); + member.commentsOpen = false; + } + }); + if(member.commentsOpen){ + $(`#${btn_memberViewComments}`).click(); + } + + $(`#${input_memberComments}`).change(function () { + member.comments = $(this).val(); + }); + + // Delete // + $(`#${btn_memberDelete}`).click(function () { + removeMember(encounter, member); + }); + + // Conditions // + if(member.isCharacter){ + + populateConditions(member.characterData, container_memberConditions, true); + + } else { + + for (let condition of getAppliedConditions(member.conditions)) { + let conditionDisplayName = capitalizeWords(condition.name); + if (condition.value != null) { conditionDisplayName += ` ${condition.value}`; } + + let btn_memberConditionView = `member-btn-condition-view-${i}-${condition.name.replace(/\W/g, '_')}`; + let btn_memberConditionDelete = `member-btn-condition-delete-${i}-${condition.name.replace(/\W/g, '_')}`; + + if(condition.parentSource) { + $(`#${container_memberConditions}`).append(` +
                  +

                  + +

                  +
                  + `); + } else { + $(`#${container_memberConditions}`).append(` +
                  +

                  + +

                  +

                  + +

                  +
                  + `); + } + + $(`#${btn_memberConditionView}`).click(function () { + openConditionsModal(member, condition); + }); + + $(`#${btn_memberConditionDelete}`).click(function () { + removeCondition(member, condition.name); + }); + + } + + } + + $(`#${btn_memberAddCondition}`).click(function () { + openSelectConditionsModal(member); + }); + + } + +} + +function reloadBalanceResults() { + + $(`#encounter-balance-bar`).removeClass(`is-link`); + $(`#encounter-balance-bar`).removeClass(`is-primary`); + $(`#encounter-balance-bar`).removeClass(`is-success`); + $(`#encounter-balance-bar`).removeClass(`is-orange`); + $(`#encounter-balance-bar`).removeClass(`is-danger`); + $(`#encounter-balance-display`).text(``); + + let encounter = allEncounters[currentEncounterIndex]; + + if (encounter == null) { return; } + + if(showBalanceResults(encounter)){ + let results = getBalanceResults(encounter); + + $(`#encounter-balance-display`).text(`${results.difficulty} (${results.xp} xp)`); + + switch (results.difficulty) { + case 'Trivial': $(`#encounter-balance-bar`).addClass(`is-link`); break; + case 'Low': $(`#encounter-balance-bar`).addClass(`is-primary`); break; + case 'Moderate': $(`#encounter-balance-bar`).addClass(`is-success`); break; + case 'Severe': $(`#encounter-balance-bar`).addClass(`is-orange`); break; + case 'Extreme': $(`#encounter-balance-bar`).addClass(`is-danger`); break; + case 'IMPOSSIBLE': $(`#encounter-balance-bar`).addClass(`is-danger`); break; + default: break; + } + } + +} + +function loadData() { + let savedData = localStorage.getItem(`wg_encounters`); + if (savedData != null) { + try { + savedData = JSON.parse(savedData); + currentEncounterIndex = savedData.currentEncounterIndex; + allEncounters = savedData.allEncounters; + } catch (error) { + console.warn(`Saved data is corrupted, deleting...`); + localStorage.removeItem(`wg_encounters`); + } + } +} +function saveData() { + localStorage.setItem(`wg_encounters`, JSON.stringify({ + allEncounters, + currentEncounterIndex, + })); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/encounter_builder/roll-initiative.js b/client/vue-src/legacy-js/gm_tools/encounter_builder/roll-initiative.js new file mode 100644 index 00000000..2872e616 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/encounter_builder/roll-initiative.js @@ -0,0 +1,162 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + $('#rollInitiativeModalBackground').click(function(){ + closeRollInitiativeModal(); + }); + $('#rollInitiativeModalCloseButton').click(function(){ + closeRollInitiativeModal(); + }); + + $('#rollInitiativeBtn').click(function () { + let encounter = allEncounters[currentEncounterIndex]; + if(encounter == null) { return; } + for (let i = 0; i < encounter.members.length; i++) { + let value = $(`#init-member-roll-input-${i}`).val(); + if(value != `chooseDefault`){ + + const randomD20 = Math.floor(Math.random()*Math.floor(20))+1; + const bonus = parseInt(value); + + encounter.members[i].init = randomD20+bonus; + + } + } + reloadEncounterMembers(); + closeRollInitiativeModal(); + }); + +}); + + +function openRollInitiativeModal() { + + $('#rollInitiativeModalContent').html(''); + + let encounter = allEncounters[currentEncounterIndex]; + if(encounter == null) { return; } + + for (let i = 0; i < encounter.members.length; i++) { + const member = encounter.members[i]; + + let memberRollInput = 'init-member-roll-input-'+i; + + let selectOptionsHTML = ` + + `; + + let rollStruct = null; + if(member.isCharacter){ + rollStruct = { + perceptionBonus: member.characterData.calculatedStat.totalPerception, + skills: [], + }; + for(let skill of member.characterData.calculatedStat.totalSkills){ + rollStruct.skills.push({ + name: skill.Name, + bonus: skill.Bonus, + }); + } + } else { + let creature = g_creaturesMap.get(member.creatureID); + if(creature != null){ + rollStruct = { + perceptionBonus: creature.perceptionBonus, + skills: [], + }; + try { + rollStruct.skills = JSON.parse(creature.skillsJSON); + } catch (error) {} + } else if(member.isCustom && member.comments?.length > 0) { + + rollStruct = { + perceptionBonus: null, + skills: [], + }; + + let percepMatch = member.comments.match(/(\n|^)(\W*)perception(\W+)((\+|\-)(\d+))/mi); + if(percepMatch != null){ + rollStruct.perceptionBonus = parseInt(percepMatch[4]); + } + + let match = member.comments.match(/(\n|^)(\W*)skills(\W+)(.+)(\n|$)/mi); + if(match != null){ + let skills = match[4].split(','); + for(let skill of skills){ + let skillMatch = skill.match(/(.+) ((\+|\-)(\d+))/mi); + if(skillMatch != null){ + rollStruct.skills.push({ + name: capitalizeWords(skillMatch[1].trim()), + bonus: parseInt(skillMatch[2]), + }); + } + } + } + + } + } + + if(rollStruct != null){ + selectOptionsHTML += ``; + + let adjustment = 0; + if(member.eliteWeak == 'elite'){ + adjustment = 2; + } + if(member.eliteWeak == 'weak'){ + adjustment = -2; + } + + if(rollStruct.perceptionBonus != null){ + let selected = (member.init === 0) ? 'selected' : ''; + selectOptionsHTML += ``; + } + + for(let skill of rollStruct.skills){ + selectOptionsHTML += ``; + } + } + + let memberName = member.name; + if(memberName.trim() == ``){ memberName = `Unnamed Entry`; } + $('#rollInitiativeModalContent').append(` +
                  +
                  +
                  +
                  +

                  ${memberName}

                  +
                  +
                  +
                  + +
                  +
                  +
                  +
                  +
                  + `); + + } + + if(encounter.members.length == 0){ + $('#rollInitiativeModalContent').html(` +

                  This encounter has no combatant.

                  + `); + } + + $('#rollInitiativeModalDefault').addClass('is-active'); + $('html').addClass('is-clipped'); + +} + +function closeRollInitiativeModal() { + + $('#rollInitiativeModalDefault').removeClass('is-active'); + $('html').removeClass('is-clipped'); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/shop_generator/generation.js b/client/vue-src/legacy-js/gm_tools/shop_generator/generation.js new file mode 100644 index 00000000..804b1c96 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/shop_generator/generation.js @@ -0,0 +1,527 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_inv_size = 25; +let g_price_markup = 0; + +const g_formula_prices = new Map([ + ['0', 50], + ['1', 100], + ['2', 200], + ['3', 300], + ['4', 500], + ['5', 800], + ['6', 1300], + ['7', 1800], + ['8', 2500], + ['9', 3500], + ['10', 5000], + ['11', 7000], + ['12', 10000], + ['13', 15000], + ['14', 22500], + ['15', 32500], + ['16', 50000], + ['17', 75000], + ['18', 120000], + ['19', 200000], + ['20', 350000], +]); + +function generateItems(){ + + $('#container-generated-inventory').html(''); + $('#section-generated-inventory').removeClass('is-hidden'); + + let mainItemMap = new Map(g_itemMap); + + /// Remove all items that aren't in the the enabled books or homebrew + + for(const [itemID, itemData] of mainItemMap.entries()){ + + if(itemData.Item.homebrewID != null){ + if(!g_enabled_homebrew.includes(itemData.Item.homebrewID+'')){ + mainItemMap.delete(itemID); + } else { + // Include homebrew. The source is always CRB so it doesn't matter. Homebrew can't be archived or hidden so that doesn't matter either. + } + } else if(!g_enabled_books.includes(itemData.Item.contentSrc)){ + mainItemMap.delete(itemID); + } else { + if(itemData.Item.isArchived == 1 || itemData.Item.hidden == 1){ + mainItemMap.delete(itemID); + } + } + } + + /// Get item map for each profile, store that in a map + + let profileToItemMap = new Map(); + + for(const [profileID, profileData] of g_shop.profiles.entries()){ + + let pItemMap = new Map(mainItemMap); + + /// Remove all items outside of level range + + for(const [itemID, itemData] of pItemMap.entries()){ + if(itemData.Item.level > profileData.level_max || itemData.Item.level < profileData.level_min){ + pItemMap.delete(itemID); + } + } + + /// Remove all items of a certain rarity if is 0% + + let zeroPercentRarityArray = []; + if(profileData.rarities.get('common') == 0){ zeroPercentRarityArray.push('COMMON'); } + if(profileData.rarities.get('uncommon') == 0){ zeroPercentRarityArray.push('UNCOMMON'); } + if(profileData.rarities.get('rare') == 0){ zeroPercentRarityArray.push('RARE'); } + if(profileData.rarities.get('unique') == 0){ zeroPercentRarityArray.push('UNIQUE'); } + + for(const [itemID, itemData] of pItemMap.entries()){ + if(zeroPercentRarityArray.includes(itemData.Item.rarity)){ + pItemMap.delete(itemID); + } + } + + /// Remove all items of a certain type if 'other' is 0% + + if(profileData.traits.size > 0){ + let otherWeight = profileData.traits.get('other'); + if(otherWeight == 0){ + + let traitsArray = Array.from(profileData.traits.keys()); + for(const [itemID, itemData] of pItemMap.entries()){ + + // Check item shares trait with the traits in profileData.traits or not + const intersection = itemData.TagArray.filter(tag => traitsArray.includes(tag.id+'')); + if(intersection.length <= 0){ + pItemMap.delete(itemID); + } + + } + + } + } + + if(profileData.categories.size > 0){ + let otherWeight = profileData.categories.get('other'); + if(otherWeight == 0){ + + let categoriesArray = Array.from(profileData.categories.keys()); + for(const [itemID, itemData] of pItemMap.entries()){ + + if(!categoriesArray.includes(itemData.Item.itemType)){ + pItemMap.delete(itemID); + } + + } + + } + } + + if(profileData.weapon_groups.size > 0){ + let otherWeight = profileData.weapon_groups.get('other'); + if(otherWeight == 0){ + + let weaponGroupsArray = Array.from(profileData.weapon_groups.keys()); + for(const [itemID, itemData] of pItemMap.entries()){ + + if(itemData.WeaponData != null){ + + if(itemData.WeaponData.isRanged == 1 && !weaponGroupsArray.includes(itemData.WeaponData.rangedWeaponType)){ + pItemMap.delete(itemID); + } + if(itemData.WeaponData.isMelee == 1 && !weaponGroupsArray.includes(itemData.WeaponData.meleeWeaponType)){ + pItemMap.delete(itemID); + } + + } + + } + + } + } + + + profileToItemMap.set(profileID, pItemMap); + + } + + + + + /// Generate Items + let generatedItems = new Map(); + + let attemptedItemGens = 0; + /* Generate until has items equal to inv size OR attempted to generate over 10*inv size times */ + while (generatedItems.size < g_inv_size && attemptedItemGens <= g_inv_size*10) { + attemptedItemGens++; + + /// Pick a profile + + let totalProfileWeight = 0; + for(const [profileID, profileData] of g_shop.profiles.entries()){ + totalProfileWeight += profileData.weight; + } + + let profileRand = Math.floor(Math.random() * totalProfileWeight) + 1; + let randProfileID = null; + + let totalProfileDetectWeight = 0; + for(const [profileID, profileData] of g_shop.profiles.entries()){ + totalProfileDetectWeight += profileData.weight; + if(totalProfileDetectWeight >= profileRand){ + randProfileID = profileID; + break; + } + } + + const profileData = g_shop.profiles.get(randProfileID); + let pItemMap = new Map(profileToItemMap.get(randProfileID)); + + /// Pick a Trait + let totalTraitWeight = 0; + for(const [traitID, traitWeight] of profileData.traits.entries()){ + totalTraitWeight += traitWeight; + } + + let traitRand = Math.floor(Math.random() * totalTraitWeight) + 1; + let randTraitID = null; + + let totalTraitDetectWeight = 0; + for(const [traitID, traitWeight] of profileData.traits.entries()){ + totalTraitDetectWeight += traitWeight; + if(totalTraitDetectWeight >= traitRand){ + randTraitID = traitID; + break; + } + } + + /// Filter itemMap by trait + if(randTraitID != null){ + if(randTraitID == 'other'){ + // Delete all items that share a trait with profileData.traits + + let traitsArray = Array.from(profileData.traits.keys()); + for(const [itemID, itemData] of pItemMap.entries()){ + + // Check item shares trait with the traits in profileData.traits + const intersection = itemData.TagArray.filter(tag => traitsArray.includes(tag.id+'')); + if(intersection.length > 0){ + pItemMap.delete(itemID); + } + + } + + } else { + // Delete all items that don't have randTraitID trait + + for(const [itemID, itemData] of pItemMap.entries()){ + + // Attempt to find trait within the item that has randTraitID + const foundTrait = itemData.TagArray.filter(tag => tag.id == randTraitID); + if(foundTrait.length <= 0){ + pItemMap.delete(itemID); + } + + } + + } + } + + if(pItemMap.size <= 0){ + continue; + } + + + /// Pick a Category + let totalCategoryWeight = 0; + for(const [categoryID, categoryWeight] of profileData.categories.entries()){ + totalCategoryWeight += categoryWeight; + } + + let categoryRand = Math.floor(Math.random() * totalCategoryWeight) + 1; + let randCategoryID = null; + + let totalCategoryDetectWeight = 0; + for(const [categoryID, categoryWeight] of profileData.categories.entries()){ + totalCategoryDetectWeight += categoryWeight; + if(totalCategoryDetectWeight >= categoryRand){ + randCategoryID = categoryID; + break; + } + } + + /// Filter itemMap by category + if(randCategoryID != null){ + if(randCategoryID == 'other'){ + // Delete all items that share a category with profileData.categories + + let categoriesArray = Array.from(profileData.categories.keys()); + for(const [itemID, itemData] of pItemMap.entries()){ + + // Check item shares category with the categories in profileData.categories + if(categoriesArray.includes(itemData.Item.itemType)){ + pItemMap.delete(itemID); + } + + } + + } else { + // Delete all items that don't have randCategoryID category + + for(const [itemID, itemData] of pItemMap.entries()){ + + if(itemData.Item.itemType != randCategoryID){ + pItemMap.delete(itemID); + } + + } + + } + } + + if(pItemMap.size <= 0){ + continue; + } + + + + /// Pick a Weapon Group + let totalWeaponGroupWeight = 0; + for(const [weaponGroupID, weaponGroupWeight] of profileData.weapon_groups.entries()){ + totalWeaponGroupWeight += weaponGroupWeight; + } + + let weaponGroupRand = Math.floor(Math.random() * totalWeaponGroupWeight) + 1; + let randWeaponGroupID = null; + + let totalWeaponGroupDetectWeight = 0; + for(const [weaponGroupID, weaponGroupWeight] of profileData.weapon_groups.entries()){ + totalWeaponGroupDetectWeight += weaponGroupWeight; + if(totalWeaponGroupDetectWeight >= weaponGroupRand){ + randWeaponGroupID = weaponGroupID; + break; + } + } + + /// Filter itemMap by weapon group + if(randWeaponGroupID != null){ + if(randWeaponGroupID == 'other'){ + // Delete all items that share a weapon group with profileData.weapon_groups + + let weaponGroupsArray = Array.from(profileData.weapon_groups.keys()); + for(const [itemID, itemData] of pItemMap.entries()){ + + if(itemData.WeaponData != null){ + + if(itemData.WeaponData.isRanged == 1 && weaponGroupsArray.includes(itemData.WeaponData.rangedWeaponType)){ + pItemMap.delete(itemID); + } + if(itemData.WeaponData.isMelee == 1 && weaponGroupsArray.includes(itemData.WeaponData.meleeWeaponType)){ + pItemMap.delete(itemID); + } + + } + + } + + } else { + // Delete all items that don't have randWeaponGroupID weapon group + + for(const [itemID, itemData] of pItemMap.entries()){ + + if(itemData.WeaponData != null){ + + if(itemData.WeaponData.isRanged == 1 && itemData.WeaponData.rangedWeaponType != randWeaponGroupID){ + pItemMap.delete(itemID); + } + if(itemData.WeaponData.isMelee == 1 && itemData.WeaponData.meleeWeaponType != randWeaponGroupID){ + pItemMap.delete(itemID); + } + + } + + } + + } + } + + if(pItemMap.size <= 0){ + continue; + } + + + /// Pick a Rarity + let totalRarityWeight = 0; + for(const [rarityID, rarityWeight] of profileData.rarities.entries()){ + totalRarityWeight += rarityWeight; + } + + let rarityRand = Math.floor(Math.random() * totalRarityWeight) + 1; + let randRarityID = null; + + let totalRarityDetectWeight = 0; + for(const [rarityID, rarityWeight] of profileData.rarities.entries()){ + totalRarityDetectWeight += rarityWeight; + if(totalRarityDetectWeight >= rarityRand){ + randRarityID = rarityID; + break; + } + } + + /// Filter itemMap by rarity + if(randRarityID != null){ + for(const [itemID, itemData] of pItemMap.entries()){ + + if(itemData.Item.rarity != randRarityID.toUpperCase()){ + pItemMap.delete(itemID); + } + + } + } + + if(pItemMap.size <= 0){ + continue; + } + + /// Remove all already selected items from pItemMap + for(const [itemID, itemData] of generatedItems.entries()){ + pItemMap.delete(itemID); + } + + if(pItemMap.size <= 0){ + continue; + } + + /// Pick random item from remaining list + let indexRand = Math.floor(Math.random() * pItemMap.size); + let randItem = cloneObj(Array.from(pItemMap.values())[indexRand]); + + /// Determine quantity + + let randQuantity = null; + if(randItem.Item.hasQuantity == 1){ + randQuantity = Math.floor(Math.random() * (profileData.quantity.consumable_max - profileData.quantity.consumable_min + 1) ) + profileData.quantity.consumable_min; + } else { + randQuantity = Math.floor(Math.random() * (profileData.quantity.permanent_max - profileData.quantity.permanent_min + 1) ) + profileData.quantity.permanent_min; + } + + let rarityAdjustment = (profileData.quantity.rarity_adjustment / 100); + + if(randItem.Item.rarity == 'UNCOMMON'){ + randQuantity = Math.floor(randQuantity*(1-(0.75*rarityAdjustment))); + } else if(randItem.Item.rarity == 'RARE'){ + randQuantity = Math.floor(randQuantity*(1-(0.95*rarityAdjustment))); + } + if(randQuantity == 0 || randItem.Item.rarity == 'UNIQUE'){ + randQuantity = 1; + } + + randItem.Item.shop_quantity = randQuantity; + + /// Check if is formula + + let randItemID = null; + if(randItem.Item.rarity != 'UNIQUE' && Math.floor(Math.random()*101) <= profileData.formula_chance){ + randItemID = randItem.Item.id+'_formula'; + } else { + randItemID = randItem.Item.id+''; + } + + /// Apply price markup + + if(randItemID.endsWith('_formula') && randItem.Item.level < 21){ + // Use formula price instead + randItem.Item.price = g_formula_prices.get(randItem.Item.level+''); + } + + randItem.Item.price = randItem.Item.price + Math.floor(randItem.Item.price*(g_price_markup/100)); + + /// Add item + + generatedItems.set(randItemID, randItem); + + } + + + // Sort by formula, level, then name + generatedItems = new Map([...generatedItems.entries()].sort( + function(a, b) { + if (a[1].Item.level === b[1].Item.level) { + // Name is only important when levels are the same + return a[1].Item.name > b[1].Item.name ? 1 : -1; + } + return a[1].Item.level - b[1].Item.level; + }) + ); + + for(const [itemID, itemData] of generatedItems.entries()){ + + const itemEntryID = 'generated-inventory-'+itemID; + + if(itemID.endsWith('_formula')){ + itemData.Item.name = 'Formula: '+itemData.Item.name; + } + + let itemPrice = getConvertedPriceForSize(itemData.Item.size, itemData.Item.price); + itemPrice = getCoinToString(itemPrice); + if(itemData.Item.quantity > 1){ + itemPrice += ' for '+itemData.Item.quantity; + } + if(itemID.endsWith('_formula') && itemData.Item.rarity != 'COMMON'){ + itemPrice += '*'; // Formula price varies if not common + } + + $('#container-generated-inventory').append(` +
                  +
                  + ${itemData.Item.shop_quantity*itemData.Item.quantity} × +
                  +
                  + ${itemData.Item.name} +
                  +
                  + ${itemPrice} +
                  +
                  + ${itemData.Item.level} +
                  +
                  + ${convertRarityToHTML(itemData.Item.rarity)} +
                  +
                  + `); + + $('#'+itemEntryID).click(function(){ + openQuickView('itemView', { + ItemDataStruct : itemData, + }); + }); + + $('#'+itemEntryID).mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+itemEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + } + + // If didn't generate any items, display message + if(generatedItems.size <= 0){ + $('#container-generated-inventory').append(` +
                  +
                  + No items found. Try enabling some more books. +
                  +
                  + `); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/shop_generator/item-profiles.js b/client/vue-src/legacy-js/gm_tools/shop_generator/item-profiles.js new file mode 100644 index 00000000..98b0a162 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/shop_generator/item-profiles.js @@ -0,0 +1,807 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_categories = [ + 'ADJUSTMENT', + 'ARTIFACT', + 'AMMUNITION', + 'ARMOR', + 'BELT', + 'BOMB', + 'BOOK', + 'BOOTS', + 'BRACERS', + 'CATALYST', + 'CIRCLET', + 'CLOAK', + 'COMPANION', + 'CURRENCY', + 'DRUG', + 'ELIXIR', + 'EYEPIECE', + 'FULU', + 'GADGET', + 'GIFT', + 'GLOVES', + 'GRIMOIRE', + 'HAT', + 'INGREDIENT', + 'INSTRUMENT', + 'KIT', + 'MASK', + 'NECKLACE', + 'OIL', + 'POISON', + 'POTION', + 'RING', + 'ROD', + 'RUNE', + 'SCROLL', + 'SHIELD', + 'SIEGE', + 'SPELLHEART', + 'STAFF', + 'STORAGE', + 'STRUCTURE', + 'TALISMAN', + 'TATTOO', + 'TOOL', + 'WAND', + 'WEAPON', + 'OTHER', +]; + +let g_weaponGroups = [ + 'AXE', + 'BRAWLING', + 'CLUB', + 'FLAIL', + 'HAMMER', + 'KNIFE', + 'PICK', + 'POLEARM', + 'SHIELD', + 'SPEAR', + 'SWORD', + + 'BOW', + 'CROSSBOW', + 'DART', + 'FIREARM', + 'SLING', + 'BOMB', +]; + +function loadItemProfiles() { + + $('#section-item-profiles').html(''); + + placeChart($('#profiles-chart'), 0, 'chart', false); + placeChart($('#projected-levels-chart'), 0, 'levels', false); + + $('#add-item-profile-btn').off(); + $('#add-item-profile-btn').click(function(event, populatedEntry, input_profileID){ + if(populatedEntry == null) { populatedEntry = false; } + + let addItemProfile = function(){ + const profileSeedID = (populatedEntry) ? input_profileID : Date.now(); + + const profileID = profileSeedID+''; + const itemProfileID = 'item-profile-'+profileSeedID; + + // Make copy of item profile from layout + let newItemProfile = $('#item-profile-layout').clone(); + newItemProfile.attr('id', itemProfileID); + newItemProfile.removeClass('is-hidden'); + newItemProfile.removeClass('isLayout'); + newItemProfile.appendTo('#section-item-profiles'); + + if(!populatedEntry){ + // Add new profile to g_shop + g_shop.profiles.set(profileID, { + name: 'New Item Profile', + weight: 50, + level_min: 0, + level_max: 10, + traits: new Map(), + categories: new Map(), + weapon_groups: new Map(), + rarities: new Map([ + ['common', 81], + ['uncommon', 15], + ['rare', 3], + ['unique', 1], + ]), + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 50, + }, + formula_chance: 0, + }); + + // Update Profiles & Projected Levels Chart + generateProfilesChart(); + generateProjectedLevelsChart(); + } + + // Minimize Profile + let cardContent = $('#'+itemProfileID).find(".card-content"); + $('#'+itemProfileID).find(".card-header").click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + // Delete Profile + $('#'+itemProfileID).find(".card-header-icon").click(function(event){ + event.stopImmediatePropagation(); + new ConfirmMessage('Delete “'+g_shop.profiles.get(profileID).name+'”', '

                  Are you sure you want to delete this item profile?

                  ', 'Delete', 'modal-delete-item-profile-'+profileID, 'modal-delete-item-profile-btn-'+profileID); + $('#modal-delete-item-profile-btn-'+profileID).click(function() { + g_shop.profiles.delete(profileID); + $('#'+itemProfileID).remove(); + generateProfilesChart(); + generateProjectedLevelsChart(); + }); + }); + + // Edit Profile Name + $('#'+itemProfileID).find('.profile-name').on('input', function(){ + g_shop.profiles.get(profileID).name = $(this).val(); + $('#'+itemProfileID).find('.card-header-name').text($(this).val()); + }); + $('#'+itemProfileID).find('.profile-name').blur(function(){ + generateProfilesChart(); + generateProjectedLevelsChart(); + }); + + + // Adjust Profile Weight + $('#'+itemProfileID).find('.profile-weight').ionRangeSlider(); + $('#'+itemProfileID).find('.profile-weight').change(function() { + g_shop.profiles.get(profileID).weight = parseInt($(this).val()); + $('#'+itemProfileID).find('.card-header-weight').text(`(${$(this).val()}%)`); + generateProfilesChart(); + generateProjectedLevelsChart(); + }); + + // Adjust Level Range + $('#'+itemProfileID).find('.profile-level-range').ionRangeSlider(); + $('#'+itemProfileID).find('.profile-level-range').change(function() { + g_shop.profiles.get(profileID).level_min = parseInt($(this).data('from')); + g_shop.profiles.get(profileID).level_max = parseInt($(this).data('to')); + generateProjectedLevelsChart(); + }); + + // Traits, Categories, and Weapon Groups + generateFilterWeights(itemProfileID, profileID, 'traits'); + generateFilterWeights(itemProfileID, profileID, 'categories'); + generateFilterWeights(itemProfileID, profileID, 'weapon_groups'); + + // Rarities + $('#'+itemProfileID).find('.common-weight').ionRangeSlider(); + $('#'+itemProfileID).find('.common-weight').change(function () { + g_shop.profiles.get(profileID).rarities.set('common', parseInt($(this).val())); + generateChart(profileID, 'rarities', + ['rgba(173, 173, 173, 0.2)', 'rgba(34, 160, 112, 0.2)', 'rgba(48, 80, 166, 0.2)', 'rgba(119, 41, 153, 0.2)'], + ['rgba(173, 173, 173, 1)', 'rgba(34, 160, 112, 1)', 'rgba(48, 80, 166, 1)', 'rgba(119, 41, 153, 1)']); + }); + + $('#'+itemProfileID).find('.uncommon-weight').ionRangeSlider(); + $('#'+itemProfileID).find('.uncommon-weight').change(function () { + g_shop.profiles.get(profileID).rarities.set('uncommon', parseInt($(this).val())); + generateChart(profileID, 'rarities', + ['rgba(173, 173, 173, 0.2)', 'rgba(34, 160, 112, 0.2)', 'rgba(48, 80, 166, 0.2)', 'rgba(119, 41, 153, 0.2)'], + ['rgba(173, 173, 173, 1)', 'rgba(34, 160, 112, 1)', 'rgba(48, 80, 166, 1)', 'rgba(119, 41, 153, 1)']); + }); + + $('#'+itemProfileID).find('.rare-weight').ionRangeSlider(); + $('#'+itemProfileID).find('.rare-weight').change(function () { + g_shop.profiles.get(profileID).rarities.set('rare', parseInt($(this).val())); + generateChart(profileID, 'rarities', + ['rgba(173, 173, 173, 0.2)', 'rgba(34, 160, 112, 0.2)', 'rgba(48, 80, 166, 0.2)', 'rgba(119, 41, 153, 0.2)'], + ['rgba(173, 173, 173, 1)', 'rgba(34, 160, 112, 1)', 'rgba(48, 80, 166, 1)', 'rgba(119, 41, 153, 1)']); + }); + + $('#'+itemProfileID).find('.unique-weight').ionRangeSlider(); + $('#'+itemProfileID).find('.unique-weight').change(function () { + g_shop.profiles.get(profileID).rarities.set('unique', parseInt($(this).val())); + generateChart(profileID, 'rarities', + ['rgba(173, 173, 173, 0.2)', 'rgba(34, 160, 112, 0.2)', 'rgba(48, 80, 166, 0.2)', 'rgba(119, 41, 153, 0.2)'], + ['rgba(173, 173, 173, 1)', 'rgba(34, 160, 112, 1)', 'rgba(48, 80, 166, 1)', 'rgba(119, 41, 153, 1)']); + }); + + placeChart($('#'+itemProfileID).find('.profile-chart-rarities'), profileID, 'rarities', false); + generateChart(profileID, 'rarities', + ['rgba(173, 173, 173, 0.2)', 'rgba(34, 160, 112, 0.2)', 'rgba(48, 80, 166, 0.2)', 'rgba(119, 41, 153, 0.2)'], + ['rgba(173, 173, 173, 1)', 'rgba(34, 160, 112, 1)', 'rgba(48, 80, 166, 1)', 'rgba(119, 41, 153, 1)']); + + + // Quantity + $('#'+itemProfileID).find('.profile-qty-permanent-items').ionRangeSlider(); + $('#'+itemProfileID).find('.profile-qty-permanent-items').change(function() { + g_shop.profiles.get(profileID).quantity.permanent_min = parseInt($(this).data('from')); + g_shop.profiles.get(profileID).quantity.permanent_max = parseInt($(this).data('to')); + }); + + $('#'+itemProfileID).find('.profile-qty-consumable-items').ionRangeSlider(); + $('#'+itemProfileID).find('.profile-qty-consumable-items').change(function() { + g_shop.profiles.get(profileID).quantity.consumable_min = parseInt($(this).data('from')); + g_shop.profiles.get(profileID).quantity.consumable_max = parseInt($(this).data('to')); + }); + + $('#'+itemProfileID).find('.profile-qty-rarity-adjustment').ionRangeSlider(); + $('#'+itemProfileID).find('.profile-qty-rarity-adjustment').change(function() { + g_shop.profiles.get(profileID).quantity.rarity_adjustment = parseInt($(this).val()); + }); + + // Formula + $('#'+itemProfileID).find('.profile-formula-chance').ionRangeSlider(); + $('#'+itemProfileID).find('.profile-formula-chance').change(function() { + g_shop.profiles.get(profileID).formula_chance = parseInt($(this).val()); + }); + + }; + + if(populatedEntry){ + addItemProfile(); + } else { + startSpinnerSubLoader(); + setTimeout(() => { + addItemProfile(); + stopSpinnerSubLoader(); + }, 50);// After 0.05 second + } + + }); + + + // Populate profile entry for each profile + for(const [profileID, profileData] of g_shop.profiles.entries()){ + $('#add-item-profile-btn').trigger('click', [true, profileID]); + } + for(const [profileID, profileData] of g_shop.profiles.entries()){ + const itemProfileID = 'item-profile-'+profileID; + + // Profile Weight + $('#'+itemProfileID).find('.profile-weight').data('ionRangeSlider').update({ + from: profileData.weight, + }); + + // Profile Name + $('#'+itemProfileID).find('.profile-name').val(profileData.name); + $('#'+itemProfileID).find('.profile-name').trigger('input'); + + populateFromItemProfile(profileID, profileData); + + // Make profile minimized + $('#'+itemProfileID).find(".card-header").trigger('click'); + + } + + + // Profiles Chart & Projected Levels Chart + if(g_shop.profiles.size > 0){ + generateProfilesChart(); + generateProjectedLevelsChart(); + } else { + $('#profile-chart-0-chart').addClass('is-hidden'); + $('#profile-chart-0-levels').addClass('is-hidden'); + } + +} + +function populateFromItemProfile(profileID, profileData){ + const itemProfileID = 'item-profile-'+profileID; + + // Level Range + $('#'+itemProfileID).find('.profile-level-range').data('ionRangeSlider').update({ + from: profileData.level_min, + to: profileData.level_max, + }); + + // Traits + for(const [typeID, typeWeight] of profileData.traits.entries()){ + $('#'+itemProfileID).find('.profile-traits').find(`option[value=${typeID}]`).attr('selected','selected'); + } + $('#'+itemProfileID).find('.profile-traits').trigger("change"); + $('#'+itemProfileID).find('.profile-traits').trigger("chosen:updated"); + + for(const [typeID, typeWeight] of profileData.traits.entries()){ + $('#'+itemProfileID).find(`.traits-weight-${typeID}`).data('ionRangeSlider').update({ + from: typeWeight, + }); + } + generateChart(profileID, 'traits'); + + // Categories + for(const [typeID, typeWeight] of profileData.categories.entries()){ + $('#'+itemProfileID).find('.profile-categories').find(`option[value=${typeID}]`).attr('selected','selected'); + } + $('#'+itemProfileID).find('.profile-categories').trigger("change"); + $('#'+itemProfileID).find('.profile-categories').trigger("chosen:updated"); + + for(const [typeID, typeWeight] of profileData.categories.entries()){ + $('#'+itemProfileID).find(`.categories-weight-${typeID}`).data('ionRangeSlider').update({ + from: typeWeight, + }); + } + generateChart(profileID, 'categories'); + + // Weapon Groups + for(const [typeID, typeWeight] of profileData.weapon_groups.entries()){ + $('#'+itemProfileID).find('.profile-weapon_groups').find(`option[value=${typeID}]`).attr('selected','selected'); + } + $('#'+itemProfileID).find('.profile-weapon_groups').trigger("change"); + $('#'+itemProfileID).find('.profile-weapon_groups').trigger("chosen:updated"); + + for(const [typeID, typeWeight] of profileData.weapon_groups.entries()){ + $('#'+itemProfileID).find(`.weapon_groups-weight-${typeID}`).data('ionRangeSlider').update({ + from: typeWeight, + }); + } + generateChart(profileID, 'weapon_groups'); + + // Rarities + $('#'+itemProfileID).find('.common-weight').data('ionRangeSlider').update({ + from: profileData.rarities.get('common'), + }); + $('#'+itemProfileID).find('.uncommon-weight').data('ionRangeSlider').update({ + from: profileData.rarities.get('uncommon'), + }); + $('#'+itemProfileID).find('.rare-weight').data('ionRangeSlider').update({ + from: profileData.rarities.get('rare'), + }); + $('#'+itemProfileID).find('.unique-weight').data('ionRangeSlider').update({ + from: profileData.rarities.get('unique'), + }); + + // Quantity + $('#'+itemProfileID).find('.profile-qty-permanent-items').data('ionRangeSlider').update({ + from: profileData.quantity.permanent_min, + to: profileData.quantity.permanent_max, + }); + $('#'+itemProfileID).find('.profile-qty-consumable-items').data('ionRangeSlider').update({ + from: profileData.quantity.consumable_min, + to: profileData.quantity.consumable_max, + }); + $('#'+itemProfileID).find('.profile-qty-rarity-adjustment').data('ionRangeSlider').update({ + from: profileData.quantity.rarity_adjustment, + }); + + // Formulas + $('#'+itemProfileID).find('.profile-formula-chance').data('ionRangeSlider').update({ + from: profileData.formula_chance, + }); + +} + + +function generateFilterWeights(itemProfileID, profileID, type){ + + const typeSelection = $('#'+itemProfileID).find('.profile-'+type); + + // Populate multi-selectors with options + if(type == 'traits'){ + for(const trait of g_allTags){ + if(trait.isHidden == 1 || trait.isArchived == 1) { continue; } + typeSelection.append(``); + } + } else if(type == 'categories'){ + for(const category of g_categories){ + typeSelection.append(``); + } + } else if(type == 'weapon_groups'){ + for(const weaponGroup of g_weaponGroups){ + typeSelection.append(``); + } + } + + typeSelection.chosen({width: "300px"}); + + // On adding new option from selector, + typeSelection.chosen().change(function(){ + + const typeWeights = $('#'+itemProfileID).find('.profile-weights-'+type); + typeWeights.html(''); + + const selectedOptions = $(this).find('option:selected').toArray().map(option => option.value); + + // Regenerate weight adjusters + let newTypes = new Map(); + for(const typeID of selectedOptions){ + let typeWeight = g_shop.profiles.get(profileID)[type].get(typeID); + if(typeWeight == null){ typeWeight = 50; } + newTypes.set(typeID, typeWeight); + } + + if(selectedOptions.length > 0){ + // Add 'other' if has 1 or more options selected + let otherTypeWeight = g_shop.profiles.get(profileID)[type].get('other'); + if(otherTypeWeight == null){ otherTypeWeight = 50; } + newTypes.set('other', otherTypeWeight); + + // If any options selected, reveal canvas + $('#profile-chart-'+profileID+'-'+type).removeClass('is-hidden'); + } else { + // If no options selected, hide canvas + $('#profile-chart-'+profileID+'-'+type).addClass('is-hidden'); + } + + g_shop.profiles.get(profileID)[type] = newTypes; + + for(const [typeID, typeWeight] of g_shop.profiles.get(profileID)[type].entries()){ + + let typeStruct = null; + + if(typeID == 'other'){ + typeStruct = { name: 'Other '+capitalizeWords(type.replace(/_/g,' ')) }; + } else { + if(type == 'traits'){ + typeStruct = g_allTags.find(trait => { + return trait.id == typeID; + }); + } else { + typeStruct = { name: capitalizeWords(typeID) }; + } + } + + typeWeights.append(` +
                  +

                  ${(typeStruct != null) ? typeStruct.name : 'Error: Unknown Type'}

                  + +
                  + `); + $('#'+itemProfileID).find(`.${type}-weight-${typeID}`).ionRangeSlider(); + $('#'+itemProfileID).find(`.${type}-weight-${typeID}`).change(function () { + g_shop.profiles.get(profileID)[type].set(typeID, parseInt($(this).val())); + + generateChart(profileID, type); + + }); + + } + + generateChart(profileID, type); + + }); + + placeChart($('#'+itemProfileID).find('.profile-chart-'+type), profileID, type); + +} + + +function placeChart(chartParent, profileID, type, hidden=true){ + chartParent.html(` + Your browser does not support the canvas element. + `); +} + +// Profile Chart +function generateChart(profileID, type, bgColor=[ + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 99, 132, 0.2)', + 'rgba(255, 206, 86, 0.2)', + 'rgba(75, 192, 192, 0.2)', + 'rgba(153, 102, 255, 0.2)', + 'rgba(255, 159, 64, 0.2)', + 'rgba(27, 133, 62, 0.2)', + 'rgba(201, 67, 193, 0.2)', + 'rgba(48, 191, 188, 0.2)', + 'rgba(80, 48, 191, 0.2)', + 'rgba(201, 73, 29, 0.2)', + 'rgba(122, 201, 29, 0.2)', + ], borderColor=[ + 'rgba(54, 162, 235, 1)', + 'rgba(255, 99, 132, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)', + 'rgba(27, 133, 62, 1)', + 'rgba(201, 67, 193, 1)', + 'rgba(48, 191, 188, 1)', + 'rgba(80, 48, 191, 1)', + 'rgba(201, 73, 29, 1)', + 'rgba(122, 201, 29, 1)', + ]){ + + let chartID = 'profile-chart-'+profileID+'-'+type; + let chartParent = $('#'+chartID).parent(); + let chartIsHidden = $('#'+chartID).hasClass('is-hidden'); + $('#'+chartID).remove(); + placeChart(chartParent, profileID, type, chartIsHidden); + + let dataLabels = []; + let dataValues = []; + + for(const [typeID, typeWeight] of g_shop.profiles.get(profileID)[type].entries()){ + + let typeStruct = null; + + if(typeID == 'other'){ + typeStruct = { name: 'Other '+capitalizeWords(type.replace(/_/g,' ')) }; + } else { + if(type == 'traits'){ + typeStruct = g_allTags.find(trait => { + return trait.id == typeID; + }); + } else { + typeStruct = { name: capitalizeWords(typeID) }; + } + } + + if(typeStruct != null){ + dataLabels.push(typeStruct.name); + dataValues.push(typeWeight); + } + + } + + + const ctx = document.getElementById(chartID); + const chart = new Chart(ctx, { + type: 'doughnut', + data: { + labels: dataLabels, + datasets: [{ + label: capitalizeWord(type)+' Generation Ratio', + data: dataValues, + parsing: false, + backgroundColor: bgColor, + borderColor: borderColor, + borderWidth: 1, + hoverOffset: 0, + }] + }, + options: { + animation: false, + tension: false, + showLine: false, + stepped: 0, + borderDash: [], + plugins: { + legend: { + onClick: () => {}, + } + } + } + }); + + +} + +// Shop Charts +function generateProjectedLevelsChart(){ + + let chartID = 'profile-chart-0-levels'; + let chartParent = $('#'+chartID).parent(); + $('#'+chartID).remove(); + + let chartIsHidden = false; + if(g_shop.profiles.size <= 0){ + chartIsHidden = true; + } + + placeChart(chartParent, 0, 'levels', chartIsHidden); + + // If chart is hidden, hide column as well + if(chartIsHidden){ + $('#'+chartID).parent().parent().parent().addClass('is-hidden'); + } else { + $('#'+chartID).parent().parent().parent().removeClass('is-hidden'); + } + + + let dataLabels = []; + let dataSets = []; + + for(let n = 0; n <= 30; n++){ + dataLabels.push(n+''); + } + + const backgroundColors = [ + 'rgba(54, 162, 235, 0.4)', + 'rgba(255, 99, 132, 0.4)', + 'rgba(255, 206, 86, 0.4)', + 'rgba(75, 192, 192, 0.4)', + 'rgba(153, 102, 255, 0.4)', + 'rgba(255, 159, 64, 0.4)', + 'rgba(27, 133, 62, 0.4)', + 'rgba(201, 67, 193, 0.4)', + 'rgba(48, 191, 188, 0.4)', + 'rgba(80, 48, 191, 0.4)', + 'rgba(201, 73, 29, 0.4)', + 'rgba(122, 201, 29, 0.4)', + ]; + + const getValueFromArrayByProfile = function(profileID, array){ + let profileIndex = Array.from(g_shop.profiles.keys()).indexOf(profileID); + let arrayIndex = profileIndex % array.length; + return array[arrayIndex]; + }; + + const getDataForLevelRange = function(min_level, max_level, chance){ + let dataArray = []; + for(let n = 0; n <= 30; n++){ + if(n >= min_level && n <= max_level){ + dataArray.push(chance); + } else { + dataArray.push(0); + } + } + return dataArray; + }; + + let totalProfileWeight = 0; + for(const [profileID, profileData] of g_shop.profiles.entries()){ + totalProfileWeight += profileData.weight; + } + + for(const [profileID, profileData] of g_shop.profiles.entries()){ + dataSets.push({ + label: profileData.name, + data: getDataForLevelRange(profileData.level_min, profileData.level_max, profileData.weight/totalProfileWeight), + backgroundColor: getValueFromArrayByProfile(profileID, backgroundColors), + fill: true, + stepped: true, + spanGaps: true, + }); + } + + const ctx = document.getElementById(chartID); + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: dataLabels, + datasets: dataSets, + }, + options: { + responsive: true, + animation: false, + tension: false, + borderDash: [], + elements: { + point: { + radius: 0, + } + }, + plugins: { + title: { + display: true, + text: 'Projected Item Levels' + }, + tooltip: { + enabled: false, + }, + legend: { + onClick: () => {}, + }, + }, + interaction: { + mode: 'index', + intersect: false, + }, + scales: { + x: { + display: true, + title: { + display: true, + text: 'Level' + } + }, + y: { + display: true, + title: { + display: true, + text: 'Chance' + } + } + } + } + }); + +} + +function generateProfilesChart(){ + + let chartID = 'profile-chart-0-chart'; + let chartParent = $('#'+chartID).parent(); + $('#'+chartID).remove(); + + let chartIsHidden = false; + if(g_shop.profiles.size <= 0){ + chartIsHidden = true; + } + + placeChart(chartParent, 0, 'chart', chartIsHidden); + + // If chart is hidden, hide column as well + if(chartIsHidden){ + $('#'+chartID).parent().parent().parent().addClass('is-hidden'); + } else { + $('#'+chartID).parent().parent().parent().removeClass('is-hidden'); + } + + + let dataLabels = []; + let dataValues = []; + + for(const [profileID, profileData] of g_shop.profiles.entries()){ + dataLabels.push(profileData.name); + dataValues.push(profileData.weight); + } + + const ctx = document.getElementById(chartID); + const chart = new Chart(ctx, { + type: 'doughnut', + data: { + labels: dataLabels, + datasets: [{ + label: 'Item Profile Generation Ratio', + data: dataValues, + parsing: false, + backgroundColor: [ + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 99, 132, 0.2)', + 'rgba(255, 206, 86, 0.2)', + 'rgba(75, 192, 192, 0.2)', + 'rgba(153, 102, 255, 0.2)', + 'rgba(255, 159, 64, 0.2)', + 'rgba(27, 133, 62, 0.2)', + 'rgba(201, 67, 193, 0.2)', + 'rgba(48, 191, 188, 0.2)', + 'rgba(80, 48, 191, 0.2)', + 'rgba(201, 73, 29, 0.2)', + 'rgba(122, 201, 29, 0.2)', + ], + borderColor: [ + 'rgba(54, 162, 235, 1)', + 'rgba(255, 99, 132, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)', + 'rgba(27, 133, 62, 1)', + 'rgba(201, 67, 193, 1)', + 'rgba(48, 191, 188, 1)', + 'rgba(80, 48, 191, 1)', + 'rgba(201, 73, 29, 1)', + 'rgba(122, 201, 29, 1)', + ], + borderWidth: 1, + hoverOffset: 0, + }] + }, + options: { + animation: false, + tension: false, + showLine: false, + stepped: 0, + borderDash: [], + layout: { + }, + plugins: { + title: { + display: true, + text: 'Projected Profile Spread' + }, + legend: { + onClick: () => {}, + position: 'top', + } + } + } + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/shop_generator/presets.js b/client/vue-src/legacy-js/gm_tools/shop_generator/presets.js new file mode 100644 index 00000000..88725c90 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/shop_generator/presets.js @@ -0,0 +1,4542 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_shopPresets = new Map(); + + +// General Store +g_shopPresets.set(-110, { name: 'General Stores'}); +g_shopPresets.set(35, { + name: 'General Store (village, lvl 2)', + profiles: { + '1644531459012': { + name: 'General Store', + weight: 50, + level_min: 0, + level_max: 2, + traits: { + '41': 5, + '399': 5, + other: 72, + }, + categories: { + ARMOR: 5, + CURRENCY: 0, + INGREDIENT: 1, + KIT: 8, + STORAGE: 13, + WEAPON: 5, + other: 100, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 50, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(36, { + name: 'General Store (town, lvl 4)', + profiles: { + '1644531459012': { + name: 'General Store', + weight: 50, + level_min: 0, + level_max: 4, + traits: { + '41': 5, + '399': 5, + other: 72, + }, + categories: { + ARMOR: 5, + CURRENCY: 0, + INGREDIENT: 1, + KIT: 8, + STORAGE: 13, + WEAPON: 5, + other: 100, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 50, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(37, { + name: 'General Store (city, lvl 7)', + profiles: { + '1644531459012': { + name: 'General Store', + weight: 50, + level_min: 0, + level_max: 7, + traits: { + '41': 5, + '399': 5, + other: 72, + }, + categories: { + ARMOR: 5, + CURRENCY: 0, + INGREDIENT: 1, + KIT: 8, + STORAGE: 13, + WEAPON: 5, + other: 100, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 50, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(38, { + name: 'General Store (metropolis, lvl 10)', + profiles: { + '1644531459012': { + name: 'General Store', + weight: 50, + level_min: 0, + level_max: 10, + traits: { + '41': 5, + '399': 5, + other: 72, + }, + categories: { + ARMOR: 5, + CURRENCY: 0, + INGREDIENT: 1, + KIT: 8, + STORAGE: 13, + WEAPON: 5, + other: 100, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 50, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(39, { + name: 'General Store (metropolis, lvl 13)', + profiles: { + '1644531459012': { + name: 'General Store', + weight: 50, + level_min: 0, + level_max: 13, + traits: { + '41': 5, + '399': 5, + other: 72, + }, + categories: { + ARMOR: 5, + CURRENCY: 0, + INGREDIENT: 1, + KIT: 8, + STORAGE: 13, + WEAPON: 5, + other: 100, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 50, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(40, { + name: 'General Store (metropolis, lvl 16)', + profiles: { + '1644531459012': { + name: 'General Store', + weight: 50, + level_min: 0, + level_max: 16, + traits: { + '41': 5, + '399': 5, + other: 72, + }, + categories: { + ARMOR: 5, + CURRENCY: 0, + INGREDIENT: 1, + KIT: 8, + STORAGE: 13, + WEAPON: 5, + other: 100, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 50, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(41, { + name: 'General Store (metropolis, lvl 20)', + profiles: { + '1644531459012': { + name: 'General Store', + weight: 50, + level_min: 0, + level_max: 20, + traits: { + '41': 5, + '399': 5, + other: 72, + }, + categories: { + ARMOR: 5, + CURRENCY: 0, + INGREDIENT: 1, + KIT: 8, + STORAGE: 13, + WEAPON: 5, + other: 100, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 50, + }, + formula_chance: 15, + }, + }, +}); + + +// Magic Shop +g_shopPresets.set(-106, { name: 'Magic Shops'}); +g_shopPresets.set(22, { + name: 'Magic Shop (village, lvl 2)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 1, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 31, + level_min: 2, + level_max: 2, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(23, { + name: 'Magic Shop (town, lvl 4)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 2, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 2, + consumable_max: 14, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 31, + level_min: 3, + level_max: 4, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(24, { + name: 'Magic Shop (city, lvl 7)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 3, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 6, + consumable_max: 25, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 31, + level_min: 4, + level_max: 7, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(25, { + name: 'Magic Shop (metropolis, lvl 10)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 3, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 6, + consumable_min: 8, + consumable_max: 40, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486096631': { + name: 'Mid-Level Items', + weight: 36, + level_min: 4, + level_max: 7, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 4, + consumable_max: 20, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 20, + level_min: 8, + level_max: 10, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(26, { + name: 'Magic Shop (metropolis, lvl 13)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 4, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 2, + permanent_max: 8, + consumable_min: 10, + consumable_max: 50, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486096631': { + name: 'Mid-Level Items', + weight: 36, + level_min: 5, + level_max: 9, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 2, + permanent_max: 5, + consumable_min: 6, + consumable_max: 20, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 20, + level_min: 10, + level_max: 13, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(27, { + name: 'Magic Shop (metropolis, lvl 16)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 5, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 2, + permanent_max: 8, + consumable_min: 12, + consumable_max: 60, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486096631': { + name: 'Mid-Level Items', + weight: 36, + level_min: 6, + level_max: 11, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 6, + consumable_min: 8, + consumable_max: 30, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 20, + level_min: 12, + level_max: 16, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 12, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(28, { + name: 'Magic Shop (metropolis, lvl 20)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 7, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 2, + permanent_max: 10, + consumable_min: 15, + consumable_max: 70, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486096631': { + name: 'Mid-Level Items', + weight: 36, + level_min: 8, + level_max: 14, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 6, + consumable_min: 10, + consumable_max: 35, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 20, + level_min: 15, + level_max: 20, + traits: { + '2': 5, + '41': 50, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 2, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 15, + rarity_adjustment: 80, + }, + formula_chance: 15, + }, + }, +}); + +// Alchemy Shop +g_shopPresets.set(-100, { name: 'Alchemy Shops'}); +g_shopPresets.set(1, { + name: 'Alchemy Shop (village, lvl 2)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 1, + traits: { + '399': 100, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 60, + uncommon: 30, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486095688': { + name: 'Tools', + weight: 18, + level_min: 0, + level_max: 2, + traits: { + '399': 50, + other: 0, + }, + categories: { + TOOL: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 4, + rarity_adjustment: 100, + }, + formula_chance: 20, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 33, + level_min: 2, + level_max: 2, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 3, + rarity_adjustment: 100, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(2, { + name: 'Alchemy Shop (town, lvl 4)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 2, + traits: { + '399': 100, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 60, + uncommon: 30, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 2, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486095688': { + name: 'Tools', + weight: 18, + level_min: 0, + level_max: 4, + traits: { + '399': 50, + other: 0, + }, + categories: { + TOOL: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 5, + rarity_adjustment: 100, + }, + formula_chance: 20, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 33, + level_min: 3, + level_max: 4, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 4, + rarity_adjustment: 100, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(3, { + name: 'Alchemy Shop (city, lvl 7)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 4, + traits: { + '399': 100, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 60, + uncommon: 30, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 5, + consumable_max: 20, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486095688': { + name: 'Tools', + weight: 18, + level_min: 0, + level_max: 7, + traits: { + '399': 50, + other: 0, + }, + categories: { + TOOL: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 20, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 33, + level_min: 5, + level_max: 7, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 100, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(4, { + name: 'Alchemy Shop (metropolis, lvl 10)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 3, + traits: { + '399': 100, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 60, + uncommon: 30, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 5, + consumable_max: 30, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486095688': { + name: 'Tools', + weight: 18, + level_min: 0, + level_max: 10, + traits: { + '399': 50, + other: 0, + }, + categories: { + TOOL: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 20, + rarity_adjustment: 100, + }, + formula_chance: 20, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 4, + level_max: 7, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 5, + consumable_max: 15, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 8, + level_max: 10, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 100, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(5, { + name: 'Alchemy Shop (metropolis, lvl 13)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 4, + traits: { + '399': 100, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 60, + uncommon: 30, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 5, + consumable_max: 40, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486095688': { + name: 'Tools', + weight: 18, + level_min: 0, + level_max: 13, + traits: { + '399': 50, + other: 0, + }, + categories: { + TOOL: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 20, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 5, + level_max: 9, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 5, + consumable_max: 20, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 10, + level_max: 13, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 100, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(6, { + name: 'Alchemy Shop (metropolis, lvl 16)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 5, + traits: { + '399': 100, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 60, + uncommon: 30, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 10, + consumable_max: 50, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486095688': { + name: 'Tools', + weight: 18, + level_min: 0, + level_max: 16, + traits: { + '399': 50, + other: 0, + }, + categories: { + TOOL: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 20, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 6, + level_max: 12, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 5, + consumable_max: 25, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 13, + level_max: 16, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 100, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(7, { + name: 'Alchemy Shop (metropolis, lvl 20)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 7, + traits: { + '399': 100, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 60, + uncommon: 30, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 15, + consumable_max: 70, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486095688': { + name: 'Tools', + weight: 18, + level_min: 0, + level_max: 20, + traits: { + '399': 50, + other: 0, + }, + categories: { + TOOL: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 20, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 8, + level_max: 14, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 10, + consumable_max: 35, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 15, + level_max: 20, + traits: { + '399': 50, + other: 0, + }, + categories: { + BOMB: 50, + ELIXIR: 50, + POISON: 50, + OTHER: 21, + other: 0, + }, + weapon_groups: { + BOMB: 50, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 15, + rarity_adjustment: 100, + }, + formula_chance: 50, + }, + }, +}); + +// Ammunition Shop +g_shopPresets.set(-111, { name: 'Ammunition Shops'}); +g_shopPresets.set(50, { + name: 'Ammunition Shop (village, lvl 2)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 1, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 2, + consumable_max: 8, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 36, + level_min: 2, + level_max: 2, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 4, + rarity_adjustment: 100, + }, + formula_chance: 35, + }, + '1644710934127': { + name: 'Ammo Weapons', + weight: 15, + level_min: 0, + level_max: 2, + traits: { + '41': 10, + other: 50, + }, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + BOW: 50, + CROSSBOW: 50, + DART: 26, + FIREARM: 50, + SLING: 24, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(51, { + name: 'Ammunition Shop (town, lvl 4)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 4, + consumable_max: 15, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 36, + level_min: 3, + level_max: 4, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 100, + }, + formula_chance: 35, + }, + '1644710934127': { + name: 'Ammo Weapons', + weight: 15, + level_min: 0, + level_max: 4, + traits: { + '41': 10, + other: 50, + }, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + BOW: 50, + CROSSBOW: 50, + DART: 26, + FIREARM: 50, + SLING: 24, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(52, { + name: 'Ammunition Shop (city, lvl 7)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 4, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 6, + consumable_max: 25, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 36, + level_min: 5, + level_max: 7, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 12, + rarity_adjustment: 100, + }, + formula_chance: 35, + }, + '1644710934127': { + name: 'Ammo Weapons', + weight: 15, + level_min: 0, + level_max: 7, + traits: { + '41': 10, + other: 50, + }, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + BOW: 50, + CROSSBOW: 50, + DART: 26, + FIREARM: 50, + SLING: 24, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(53, { + name: 'Ammunition Shop (metropolis, lvl 10)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 3, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 10, + consumable_max: 40, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 4, + level_max: 7, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 6, + consumable_max: 24, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 8, + level_max: 10, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 12, + rarity_adjustment: 100, + }, + formula_chance: 35, + }, + '1644710934127': { + name: 'Ammo Weapons', + weight: 15, + level_min: 0, + level_max: 10, + traits: { + '41': 10, + other: 50, + }, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + BOW: 50, + CROSSBOW: 50, + DART: 26, + FIREARM: 50, + SLING: 24, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(54, { + name: 'Ammunition Shop (metropolis, lvl 13)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 4, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 15, + consumable_max: 50, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 5, + level_max: 9, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 8, + consumable_max: 27, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 10, + level_max: 13, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 12, + rarity_adjustment: 100, + }, + formula_chance: 35, + }, + '1644710934127': { + name: 'Ammo Weapons', + weight: 15, + level_min: 0, + level_max: 13, + traits: { + '41': 10, + other: 50, + }, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + BOW: 50, + CROSSBOW: 50, + DART: 26, + FIREARM: 50, + SLING: 24, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(55, { + name: 'Ammunition Shop (metropolis, lvl 16)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 5, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 15, + consumable_max: 60, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 6, + level_max: 11, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 10, + consumable_max: 30, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 12, + level_max: 16, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 13, + rarity_adjustment: 100, + }, + formula_chance: 35, + }, + '1644710934127': { + name: 'Ammo Weapons', + weight: 15, + level_min: 0, + level_max: 16, + traits: { + '41': 10, + other: 50, + }, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + BOW: 50, + CROSSBOW: 50, + DART: 26, + FIREARM: 50, + SLING: 24, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(56, { + name: 'Ammunition Shop (metropolis, lvl 20)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 7, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 15, + consumable_max: 70, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 8, + level_max: 14, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 10, + consumable_max: 35, + rarity_adjustment: 100, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 15, + level_max: 20, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 15, + rarity_adjustment: 100, + }, + formula_chance: 35, + }, + '1644710934127': { + name: 'Ammo Weapons', + weight: 15, + level_min: 0, + level_max: 20, + traits: { + '41': 10, + other: 50, + }, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + BOW: 50, + CROSSBOW: 50, + DART: 26, + FIREARM: 50, + SLING: 24, + other: 0, + }, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +// Gadget Shop +g_shopPresets.set(-101, { name: 'Gadget Shops'}); +g_shopPresets.set(8, { + name: 'Gadget Shop (village, lvl 2)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 40, + level_min: 0, + level_max: 1, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 21, + level_min: 2, + level_max: 2, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 2, + rarity_adjustment: 0, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(9, { + name: 'Gadget Shop (town, lvl 4)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 40, + level_min: 0, + level_max: 2, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 3, + consumable_max: 15, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 3, + level_max: 4, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 0, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(10, { + name: 'Gadget Shop (city, lvl 7)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 40, + level_min: 0, + level_max: 3, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 6, + consumable_max: 25, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 4, + level_max: 7, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 0, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(11, { + name: 'Gadget Shop (metropolis, lvl 10)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 3, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 8, + consumable_max: 30, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 4, + level_max: 7, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 5, + consumable_max: 20, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 8, + level_max: 10, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 0, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(12, { + name: 'Gadget Shop (metropolis, lvl 13)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 4, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 12, + consumable_max: 40, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 5, + level_max: 9, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 5, + consumable_max: 25, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 10, + level_max: 13, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 0, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(13, { + name: 'Gadget Shop (metropolis, lvl 16)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 5, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 15, + consumable_max: 50, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 6, + level_max: 11, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 10, + consumable_max: 30, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 12, + level_max: 16, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 12, + rarity_adjustment: 0, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(14, { + name: 'Gadget Shop (metropolis, lvl 20)', + profiles: { + '1644486093903': { + name: 'Low-Level Consumables', + weight: 60, + level_min: 0, + level_max: 7, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 15, + consumable_max: 70, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486096631': { + name: 'Mid-Level Consumables', + weight: 36, + level_min: 8, + level_max: 14, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 10, + consumable_max: 35, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Consumables', + weight: 20, + level_min: 15, + level_max: 20, + traits: { + '2626': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 60, + uncommon: 49, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 15, + rarity_adjustment: 0, + }, + formula_chance: 50, + }, + }, +}); + +g_shopPresets.set(-102, { name: 'Common Shops'}); + +// Armor Shop +g_shopPresets.set(17, { + name: 'Armor Shop (lvl 2+)', + profiles: { + '1644522550562': { + name: 'Armor', + weight: 50, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + ARMOR: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + '1644522592983': { + name: 'Miscellaneous', + weight: 5, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + ADJUSTMENT: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + '1644522740364': { + name: 'Shields', + weight: 19, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + SHIELD: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +// Blacksmith +g_shopPresets.set(16, { + name: 'Blacksmith (lvl 2+)', + profiles: { + '1644486093903': { + name: 'Weapons', + weight: 40, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + AXE: 62, + FLAIL: 44, + HAMMER: 56, + KNIFE: 74, + PICK: 38, + POLEARM: 54, + SPEAR: 32, + SWORD: 89, + other: 0, + }, + rarities: { + common: 88, + uncommon: 11, + rare: 3, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 0, + }, + formula_chance: 0, + }, + '1644520896725': { + name: 'Miscellaneous', + weight: 4, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + ADJUSTMENT: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +// Gunsmith +g_shopPresets.set(15, { + name: 'Gunsmith (lvl 2+)', + profiles: { + '1644486093903': { + name: 'Ammunition', + weight: 40, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + AMMUNITION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 37, + uncommon: 84, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 4, + consumable_max: 15, + rarity_adjustment: 0, + }, + formula_chance: 15, + }, + '1644486097846': { + name: 'Firearms', + weight: 66, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + WEAPON: 50, + other: 0, + }, + weapon_groups: { + CROSSBOW: 25, + FIREARM: 75, + other: 0, + }, + rarities: { + common: 37, + uncommon: 84, + rare: 12, + unique: 0, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 0, + }, + formula_chance: 5, + }, + '1644519785592': { + name: 'Miscellaneous', + weight: 5, + level_min: 0, + level_max: 2, + traits: { + '3076': 50, + other: 0, + }, + categories: {}, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 9, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(-109, { name: 'Miscellaneous'}); + +// Jeweller +g_shopPresets.set(46, { + name: 'Jeweller (town, lvl 4)', + profiles: { + '1644523135230': { + name: 'Low-Level Jewellery', + weight: 100, + level_min: 0, + level_max: 2, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + CIRCLET: 35, + EYEPIECE: 35, + NECKLACE: 50, + RING: 50, + SPELLHEART: 35, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + '1644523784432': { + name: 'High-Level Jewellery', + weight: 50, + level_min: 3, + level_max: 4, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + CIRCLET: 35, + EYEPIECE: 35, + NECKLACE: 50, + RING: 50, + SPELLHEART: 35, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(47, { + name: 'Jeweller (city, lvl 7)', + profiles: { + '1644523135230': { + name: 'Low-Level Jewellery', + weight: 100, + level_min: 0, + level_max: 4, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + CIRCLET: 35, + EYEPIECE: 35, + NECKLACE: 50, + RING: 50, + SPELLHEART: 35, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + '1644523784432': { + name: 'High-Level Jewellery', + weight: 50, + level_min: 5, + level_max: 7, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + CIRCLET: 35, + EYEPIECE: 35, + NECKLACE: 50, + RING: 50, + SPELLHEART: 35, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(48, { + name: 'Jeweller (metropolis, lvl 13)', + profiles: { + '1644523135230': { + name: 'Low-Level Jewellery', + weight: 100, + level_min: 0, + level_max: 7, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + CIRCLET: 35, + EYEPIECE: 35, + NECKLACE: 50, + RING: 50, + SPELLHEART: 35, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 2, + permanent_max: 6, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + '1644523784432': { + name: 'High-Level Jewellery', + weight: 50, + level_min: 8, + level_max: 13, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + CIRCLET: 35, + EYEPIECE: 35, + NECKLACE: 50, + RING: 50, + SPELLHEART: 35, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(49, { + name: 'Jeweller (metropolis, lvl 20)', + profiles: { + '1644523135230': { + name: 'Low-Level Jewellery', + weight: 100, + level_min: 0, + level_max: 10, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + CIRCLET: 35, + EYEPIECE: 35, + NECKLACE: 50, + RING: 50, + SPELLHEART: 35, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 2, + permanent_max: 6, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + '1644523784432': { + name: 'High-Level Jewellery', + weight: 50, + level_min: 11, + level_max: 20, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + CIRCLET: 35, + EYEPIECE: 35, + NECKLACE: 50, + RING: 50, + SPELLHEART: 35, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + }, +}); + +// Lost Goods +g_shopPresets.set(32, { + name: 'Lost Goods (town, lvl 4)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 2, + traits: {}, + categories: { + OTHER: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 11, + uncommon: 65, + rare: 17, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 20, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 31, + level_min: 3, + level_max: 4, + traits: {}, + categories: { + OTHER: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 11, + uncommon: 65, + rare: 17, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 30, + }, + }, +}); + +g_shopPresets.set(33, { + name: 'Lost Goods (metropolis, lvl 10)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 3, + traits: {}, + categories: { + OTHER: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 11, + uncommon: 65, + rare: 17, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 20, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 22, + level_min: 8, + level_max: 10, + traits: {}, + categories: { + OTHER: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 11, + uncommon: 65, + rare: 17, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644530677434': { + name: 'Mid-Level Items', + weight: 38, + level_min: 4, + level_max: 7, + traits: {}, + categories: { + OTHER: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 11, + uncommon: 65, + rare: 17, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 30, + }, + }, +}); + +g_shopPresets.set(34, { + name: 'Lost Goods (metropolis, lvl 20)', + profiles: { + '1644486093903': { + name: 'Low-Level Items', + weight: 60, + level_min: 0, + level_max: 7, + traits: {}, + categories: { + OTHER: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 11, + uncommon: 65, + rare: 17, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 20, + }, + '1644486097846': { + name: 'High-Level Items', + weight: 22, + level_min: 15, + level_max: 20, + traits: {}, + categories: { + OTHER: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 11, + uncommon: 65, + rare: 17, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644530677434': { + name: 'Mid-Level Items', + weight: 38, + level_min: 8, + level_max: 14, + traits: {}, + categories: { + OTHER: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 11, + uncommon: 65, + rare: 17, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 0, + }, + formula_chance: 30, + }, + }, +}); + +// Magical Tailor +g_shopPresets.set(18, { + name: 'Magical Tailor (town, lvl 4)', + profiles: { + '1644523135230': { + name: 'Clothing', + weight: 50, + level_min: 1, + level_max: 4, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + BOOTS: 15, + CLOAK: 50, + GLOVES: 15, + BELT: 15, + HAT: 38, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 2, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(19, { + name: 'Magical Tailor (city, lvl 7)', + profiles: { + '1644523135230': { + name: 'Clothing', + weight: 50, + level_min: 1, + level_max: 7, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + BOOTS: 15, + CLOAK: 50, + GLOVES: 15, + BELT: 15, + HAT: 38, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 50, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(20, { + name: 'Magical Tailor (metropolis, lvl 13)', + profiles: { + '1644523135230': { + name: 'Low-Level Clothing', + weight: 100, + level_min: 1, + level_max: 7, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + BOOTS: 15, + CLOAK: 50, + GLOVES: 15, + BELT: 15, + HAT: 38, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 4, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + '1644523784432': { + name: 'High-Level Clothing', + weight: 50, + level_min: 8, + level_max: 13, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + BOOTS: 15, + CLOAK: 50, + GLOVES: 15, + HAT: 38, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + }, +}); + +g_shopPresets.set(21, { + name: 'Magical Tailor (metropolis, lvl 20)', + profiles: { + '1644523135230': { + name: 'Low-Level Clothing', + weight: 100, + level_min: 1, + level_max: 10, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + BOOTS: 15, + CLOAK: 50, + GLOVES: 15, + BELT: 15, + HAT: 38, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 2, + permanent_max: 6, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + '1644523784432': { + name: 'High-Level Clothing', + weight: 50, + level_min: 11, + level_max: 20, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + BOOTS: 15, + CLOAK: 50, + GLOVES: 15, + HAT: 38, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 1, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 3, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 100, + }, + formula_chance: 0, + }, + }, +}); + +// Potion Shop +g_shopPresets.set(42, { + name: 'Potion Shop (town, lvl 4)', + profiles: { + '1644523135230': { + name: 'Low-Level Items', + weight: 100, + level_min: 0, + level_max: 2, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + OIL: 20, + POTION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 8, + rarity_adjustment: 100, + }, + formula_chance: 15, + }, + '1644523784432': { + name: 'High-Level Items', + weight: 50, + level_min: 3, + level_max: 4, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + OIL: 20, + POTION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 4, + rarity_adjustment: 100, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(43, { + name: 'Potion Shop (city, lvl 7)', + profiles: { + '1644523135230': { + name: 'Low-Level Items', + weight: 100, + level_min: 0, + level_max: 4, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + OIL: 20, + POTION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 4, + consumable_max: 20, + rarity_adjustment: 100, + }, + formula_chance: 15, + }, + '1644523784432': { + name: 'High-Level Items', + weight: 50, + level_min: 5, + level_max: 7, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + OIL: 20, + POTION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 6, + rarity_adjustment: 100, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(44, { + name: 'Potion Shop (metropolis, lvl 13)', + profiles: { + '1644523135230': { + name: 'Low-Level Items', + weight: 100, + level_min: 0, + level_max: 7, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + OIL: 20, + POTION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 6, + consumable_max: 35, + rarity_adjustment: 100, + }, + formula_chance: 15, + }, + '1644523784432': { + name: 'High-Level Items', + weight: 50, + level_min: 8, + level_max: 13, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + ELIXIR: 2, + OIL: 20, + POTION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 12, + rarity_adjustment: 100, + }, + formula_chance: 15, + }, + }, +}); + +g_shopPresets.set(45, { + name: 'Potion Shop (metropolis, lvl 20)', + profiles: { + '1644523135230': { + name: 'Low-Level Items', + weight: 100, + level_min: 0, + level_max: 10, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + OIL: 20, + POTION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 10, + consumable_max: 50, + rarity_adjustment: 100, + }, + formula_chance: 15, + }, + '1644523784432': { + name: 'High-Level Items', + weight: 50, + level_min: 11, + level_max: 20, + traits: { + '2': 5, + '41': 48, + '265': 5, + '304': 5, + '500': 5, + other: 0, + }, + categories: { + ELIXIR: 2, + OIL: 20, + POTION: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 3, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 15, + rarity_adjustment: 100, + }, + formula_chance: 15, + }, + }, +}); + +// Raw Materials +g_shopPresets.set(29, { + name: 'Raw Materials (metropolis, lvl 16)', + profiles: { + '1644486093903': { + name: 'Precious Materials', + weight: 50, + level_min: 0, + level_max: 16, + traits: { + '508': 50, + other: 0, + }, + categories: { + INGREDIENT: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 0, + }, + quantity: { + permanent_min: 6, + permanent_max: 16, + consumable_min: 1, + consumable_max: 10, + rarity_adjustment: 65, + }, + formula_chance: 0, + }, + }, +}); + +// Tattoo Parlor +g_shopPresets.set(30, { + name: 'Tattoo Parlor (city, lvl 7)', + profiles: { + '1644486093903': { + name: 'Low-Level Tattoos', + weight: 60, + level_min: 0, + level_max: 3, + traits: {}, + categories: { + TATTOO: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Tattoos', + weight: 31, + level_min: 4, + level_max: 7, + traits: {}, + categories: { + TATTOO: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 0, + }, + formula_chance: 35, + }, + }, +}); + +g_shopPresets.set(31, { + name: 'Tattoo Parlor (metropolis, lvl 20)', + profiles: { + '1644486093903': { + name: 'Low-Level Tattoos', + weight: 60, + level_min: 0, + level_max: 10, + traits: {}, + categories: { + TATTOO: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 0, + }, + formula_chance: 25, + }, + '1644486097846': { + name: 'High-Level Tattoos', + weight: 31, + level_min: 11, + level_max: 20, + traits: {}, + categories: { + TATTOO: 50, + other: 0, + }, + weapon_groups: {}, + rarities: { + common: 81, + uncommon: 15, + rare: 5, + unique: 1, + }, + quantity: { + permanent_min: 1, + permanent_max: 1, + consumable_min: 1, + consumable_max: 1, + rarity_adjustment: 0, + }, + formula_chance: 35, + }, + }, +}); + +/* + +g_shopPresets.set(57, ); + +g_shopPresets.set(58, ); + +g_shopPresets.set(59, ); + +g_shopPresets.set(60, ); + +g_shopPresets.set(61, ); + +g_shopPresets.set(62, ); +*/ + +// g_shopPresets.set(-112, { name: ''}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/shop_generator/shop.js b/client/vue-src/legacy-js/gm_tools/shop_generator/shop.js new file mode 100644 index 00000000..dbeb6b00 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/shop_generator/shop.js @@ -0,0 +1,165 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + + +let socket = io(); + +$(function () { + + startSpinnerLoader(); + socket.emit("requestShopGeneratorDetails"); + +}); + +let g_itemMap = null; +let g_allTags = null; +let g_isSupporter = null; + +let g_all_books = null; +let g_all_homebrew = null; + +let g_all_names_books = null; +let g_all_names_homebrew = null; + +let g_enabled_books = null; +let g_enabled_homebrew = null; + +socket.on("returnShopGeneratorDetails", function(itemObj, traits, isSupporter, sourcesStruct, homebrewStruct){ + + g_itemMap = objToMap(itemObj); + g_allTags = traits; + g_isSupporter = isSupporter; + + g_all_books = JSON.parse(sourcesStruct.enabledSources); + g_all_names_books = sourcesStruct.sourceNames; + + g_all_homebrew = JSON.parse(homebrewStruct.enabledHomebrew); + g_all_homebrew.shift(); // Remove first element: null + g_all_names_homebrew = homebrewStruct.homebrewNames; + g_all_names_homebrew.shift(); // Remove first element: 'None' + + g_enabled_books = ['CRB','ADV-PLAYER-GUIDE','GM-GUIDE','GUNS-AND-GEARS','SECRETS-OF-MAGIC']; + g_enabled_homebrew = []; + + openPageChoose(); + + stopSpinnerLoader(); +}); + + + +let g_shop_preset = null; +let g_shop = null; + +function setShop(presetID){ + + g_shop_preset = cloneObj(g_shopPresets.get(parseInt(presetID))); + g_shop = cloneObj(g_shopPresets.get(parseInt(presetID))); + + g_shop.profiles = objToMap(g_shop.profiles); + + for(let [profileID, profileData] of g_shop.profiles.entries()){ + profileData.traits = objToMap(profileData.traits); + profileData.categories = objToMap(profileData.categories); + profileData.weapon_groups = objToMap(profileData.weapon_groups); + profileData.rarities = objToMap(profileData.rarities); + } + +} + +function deleteShop(){ + + g_shop_preset = null; + g_shop = null; + +} + + +function getVanillaizedShop(){ + + let newShop = cloneObj(g_shop); + newShop.profiles = cloneObj(mapToObj(g_shop.profiles)); + + for (const profileID in newShop.profiles) { + let profileData = newShop.profiles[profileID]; + + const normalProfileData = g_shop.profiles.get(profileID); + profileData.traits = mapToObj(normalProfileData.traits); + profileData.categories = mapToObj(normalProfileData.categories); + profileData.weapon_groups = mapToObj(normalProfileData.weapon_groups); + profileData.rarities = mapToObj(normalProfileData.rarities); + + } + + return cloneObj(newShop); + +} + +function isShopEdited(){ + return JSON.stringify(getVanillaizedShop()) != JSON.stringify(g_shop_preset); +} + + +function shopInitImport(){ + + const fileInput = document.querySelector('#input-import-shop'); + fileInput.onchange = () => { + if (fileInput.files.length > 0) { + + let file = fileInput.files[0]; + let fileReader = new FileReader(); + + // Closure to capture the file information. + fileReader.onload = (function(capturedFile) { + return function(e) { + if(capturedFile.name.endsWith('.guideshop')) { + try { + let exportData = JSON.parse(e.target.result); + + // Same as setShop() // + g_shop_preset = cloneObj(exportData); + g_shop = cloneObj(exportData); + + g_shop.profiles = objToMap(g_shop.profiles); + + for(let [profileID, profileData] of g_shop.profiles.entries()){ + profileData.traits = objToMap(profileData.traits); + profileData.categories = objToMap(profileData.categories); + profileData.weapon_groups = objToMap(profileData.weapon_groups); + profileData.rarities = objToMap(profileData.rarities); + } + + openPageGenerate(); + + } catch (err) { + console.error(err); + console.warn('Failed to import "'+capturedFile.name+'"'); + } + } + }; + })(file); + + fileReader.readAsText(file); + } + }; + +} + +function shopExport(){ + + let exportDataJSON = JSON.stringify(getVanillaizedShop()); + let fileName = g_shop.name.replaceAll(/[\\\/:"*?<>|.]+/g, '').replaceAll(' ', '_')+'.guideshop'; + + let element = document.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(exportDataJSON)); + element.setAttribute('download', fileName); + + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/shop_generator/ui-handler.js b/client/vue-src/legacy-js/gm_tools/shop_generator/ui-handler.js new file mode 100644 index 00000000..1409ccf3 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/shop_generator/ui-handler.js @@ -0,0 +1,189 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openPageChoose(){ + + $('#section-generated-inventory').addClass('is-hidden'); + + $('#section-shop-customize').addClass('is-hidden'); + $('#section-shop-generate').addClass('is-hidden'); + $('#section-shop-choose').removeClass('is-hidden'); + + + $('#shop-gen-back-btn').off(); + $('#shop-gen-back-btn').click(function() { + window.location.href = '/gm-tools'; + }); + + + // Shop Presets + $('#shop-type').chosen('destroy'); + let shopTypeHTML = ''; + let shopTypeInGroup = false; + for(const [presetID, shopPreset] of g_shopPresets){ + if(presetID > 0){ + // Is normal option + shopTypeHTML += ``; + } else { + // Is group beginning + if(shopTypeInGroup){ + // End and start new group + shopTypeHTML += ``; + } else { + // Start new group + shopTypeInGroup = true; + shopTypeHTML += ``; + } + } + } + if(shopTypeInGroup){ + shopTypeHTML += ``; + shopTypeInGroup = false; + } + $('#shop-type').html(shopTypeHTML); + + $('#shop-type').off(); + $('#shop-type').chosen(); + $('#shop-type').chosen().change(function(){ + let presetID = $(this).val(); + if(presetID != 'chooseDefault'){ + + setShop(presetID); + + openPageGenerate(); + } + }); + + $('.chosen-container .chosen-results').addClass('use-custom-scrollbar'); + + if(g_isSupporter){ + shopInitImport(); + } + +} + +function openPageGenerate(){ + + $('#section-generated-inventory').addClass('is-hidden'); + + $('#section-shop-choose').addClass('is-hidden'); + $('#section-shop-customize').addClass('is-hidden'); + $('#section-shop-generate').removeClass('is-hidden'); + + $('#shop-name').text(g_shop.name); + + $('#exit-shop-btn').off(); + $('#exit-shop-btn').click(function(){ + + if(isShopEdited()){ + new ConfirmMessage('Lose Shop Changes', '

                  Exiting this shop will undo any changes you\'ve made to it. To save your changes, you can export this shop.

                  Are you sure you want to continue?

                  ', 'Exit Shop', 'modal-exit-shop', 'modal-exit-shop-btn'); + $('#modal-exit-shop-btn').click(function() { + deleteShop(); + openPageChoose(); + }); + } else { + deleteShop(); + openPageChoose(); + } + + }); + + if(g_isSupporter){ + $('#customize-shop-btn').off(); + $('#customize-shop-btn').click(function(){ + openPageCustomize(); + }); + + $('#export-shop-btn').off(); + $('#export-shop-btn').click(function() { + shopExport(); + }); + } + + // Books + $('#input-books').html(''); + for(const bookCodeName of g_all_books){ + $('#input-books').append(``); + } + for(const bookCodeName of g_enabled_books){ + $('#input-books').find(`option[value=${bookCodeName}]`).attr('selected','selected'); + } + + $('#input-books').off(); + $('#input-books').chosen(); + $('#input-books').chosen().change(function(){ + g_enabled_books = $(this).find('option:selected').toArray().map(option => option.value); + }); + + // Homebrew Bundles + if(g_isSupporter){ + $('#input-homebrew').html(''); + for(const homebrewID of g_all_homebrew){ + $('#input-homebrew').append(``); + } + for(const homebrewID of g_enabled_homebrew){ + $('#input-homebrew').find(`option[value=${homebrewID}]`).attr('selected','selected'); + } + + $('#input-homebrew').off(); + $('#input-homebrew').chosen(); + $('#input-homebrew').chosen().change(function(){ + g_enabled_homebrew = $(this).find('option:selected').toArray().map(option => option.value); + }); + } + + + $('.chosen-container .chosen-results').addClass('use-custom-scrollbar'); + $('.chosen-container .chosen-choices').addClass('use-custom-scrollbar'); + + + $('#inventory-size').off(); + $('#inventory-size').ionRangeSlider(); + $('#inventory-size').change(function() { + g_inv_size = parseInt($(this).val()); + }); + + $('#price-markup').off(); + $('#price-markup').ionRangeSlider(); + $('#price-markup').change(function() { + g_price_markup = parseInt($(this).val()); + }); + + $('#generate-shop-btn').off(); + $('#generate-shop-btn').click(function() { + generateItems(); + }); + +} + +function openPageCustomize(){ + + startSpinnerSubLoader(); + + setTimeout(() => { + + $('#section-generated-inventory').addClass('is-hidden'); + + $('#section-shop-choose').addClass('is-hidden'); + $('#section-shop-generate').addClass('is-hidden'); + $('#section-shop-customize').removeClass('is-hidden'); + + loadItemProfiles(); + + $('#customize-back-btn').off(); + $('#customize-back-btn').click(function(){ + openPageGenerate(); + }); + + $('#customize-shop-name').val(g_shop.name); + $('#customize-shop-name').off(); + $('#customize-shop-name').change(function(){ + g_shop.name = $(this).val(); + }); + + stopSpinnerSubLoader(); + + }, 50);// After 0.05 second + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/gm_tools/ui-handler.js b/client/vue-src/legacy-js/gm_tools/ui-handler.js new file mode 100644 index 00000000..bf3ec688 --- /dev/null +++ b/client/vue-src/legacy-js/gm_tools/ui-handler.js @@ -0,0 +1,24 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + $('.card-active').mouseenter(function(){ + $(this).addClass('card-content-hover'); + }); + $('.card-active').mouseleave(function(){ + $(this).removeClass('card-content-hover'); + }); + + $('#card-encounter-builder').click(function() { + window.location.href = '/gm-tools/encounter-builder'; + }); + $('#card-shop-generator').click(function() { + window.location.href = '/gm-tools/shop-generator'; + }); + $('#card-campaigns').click(function() { + window.location.href = '/gm-tools/campaigns'; + }); + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/home-page.js b/client/vue-src/legacy-js/home-page.js new file mode 100644 index 00000000..f0901587 --- /dev/null +++ b/client/vue-src/legacy-js/home-page.js @@ -0,0 +1,168 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $(".banner_w3lspvt-1").fadeTo(1000 , 1); + + + + $('#backReportBtn').click(function() { + $('.modal').addClass('is-active'); + $('html').addClass('is-clipped'); + }); + $('.modal-card-close').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + }); + $('.modal-background').click(function() { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + }); + + $('#report-confirmation-btn').click(function() { + let backgroundID = $("#backReportBtn").attr("name"); + let email = $("#inputEmail").val(); + let message = $("#reportMessage").val(); + if(message != "" && email != "") { + $("#inputEmail").removeClass("is-danger"); + $("#reportMessage").removeClass("is-danger"); + socket.emit("requestBackgroundReport", + backgroundID, + email, + message); + } else { + if(message == "") { + $("#reportMessage").addClass("is-danger"); + } else { + $("#reportMessage").removeClass("is-danger"); + } + if(email == "") { + $("#inputEmail").addClass("is-danger"); + } else { + $("#inputEmail").removeClass("is-danger"); + } + } + }); + + // Switch main containers when in mobile + if(isMobileView()){ + $('#home-desktop-layout').addClass('is-hidden'); + $('#home-mobile-layout').removeClass('is-hidden'); + } + + // Load Top Builds + socket.emit("requestTopPublishedBuilds", 10); + + // Load Top Homebrew + socket.emit("requestTopPublishedHomebrewBundles", 10); + +}); + +socket.on("returnBackgroundReport", function() { + window.location.href = '/'; +}); + + + +socket.on("returnTopPublishedBuilds", function(builds) { + $('#top-builds-loader').addClass('is-hidden'); + + if(builds.size <= 0){ + $('#top-builds-list').html('

                  No results found!

                  '); + } else { + for(const build of builds){ + let entryID = 'build-entry-'+build.id; + let rating = build.characters.length; + let ratingColor = ''; + + if(rating > 0){ + ratingColor = 'has-text-success'; + } else if (rating < 0) { + ratingColor = 'has-text-danger'; + } else { + ratingColor = 'has-text-warning'; + } + + let buildName = build.name; + + $('#top-builds-list').append(` +
                  +
                  +

                  ${buildName}

                  + ${rating} +

                  ${build.authorName}

                  +
                  +
                  + `); + + $('#'+entryID).click(function(){ + window.location.href = '/builds/?view_id='+build.id; + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + } + +}); + + +socket.on("returnTopPublishedHomebrewBundles", function(hBundles) { + $('#top-homebrew-loader').addClass('is-hidden'); + + if(hBundles.size <= 0){ + $('#top-homebrew-list').html('

                  No results found!

                  '); + } else { + for(const homebrewBundle of hBundles){ + let entryID = 'bundle-entry-'+homebrewBundle.id; + let rating = homebrewBundle.userHomebrewBundles.length; + let ratingColor = ''; + + if(rating > 0){ + ratingColor = 'has-text-success'; + } else if (rating < 0) { + ratingColor = 'has-text-danger'; + } else { + ratingColor = 'has-text-warning'; + } + + let bundleName = homebrewBundle.name; + if(homebrewBundle.hasKeys === 1){ + bundleName += ''; + } + + $('#top-homebrew-list').append(` +
                  +
                  +

                  ${bundleName}

                  + ${rating} +

                  ${homebrewBundle.authorName}

                  +
                  +
                  + `); + + $('#'+entryID).click(function(){ + window.location.href = '/homebrew/?view_id='+homebrewBundle.id; + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + } + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/ancestry/builder-ancestry.js b/client/vue-src/legacy-js/homebrew/builder/ancestry/builder-ancestry.js new file mode 100644 index 00000000..969b1c36 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/ancestry/builder-ancestry.js @@ -0,0 +1,198 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $("#inputLangs").chosen(); + $("#inputBonusLangs").chosen(); + + let heritageCount = 0; + $("#addHeritageButton").click(function(){ + heritageCount++; + + let heritageID = "heritage"+heritageCount; + + let newHeritage = $("#heritageLayout").clone(); + newHeritage.attr('id', heritageID); + newHeritage.removeClass('is-hidden'); + newHeritage.appendTo("#heritageContent"); + + let cardHeader = $("#"+heritageID).find(".card-header"); + let cardContent = $("#"+heritageID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+heritageID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+heritageID).remove(); + }); + + let inputHeritageName = $("#"+heritageID).find(".inputHeritageName"); + inputHeritageName.change(function(){ + $("#"+heritageID).find(".card-header-title").html('Heritage - '+inputHeritageName.val()); + }); + + }); + + + let featCount = 0; + $("#addFeatButton").click(function(){ + featCount++; + + let featID = "feat"+featCount; + + let newFeat = $("#featLayout").clone(); + newFeat.attr('id', featID); + newFeat.removeClass('is-hidden'); + newFeat.appendTo("#featContent"); + + let cardHeader = $("#"+featID).find(".card-header"); + let cardContent = $("#"+featID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+featID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+featID).remove(); + }); + + let inputFeatName = $("#"+featID).find(".inputFeatName"); + inputFeatName.change(function(){ + $("#"+featID).find(".card-header-title").html('Ancestry Feat - '+inputFeatName.val()); + }); + + $("#"+featID).find(".inputFeatTags").chosen(); + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishAncestry(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishAncestry(isUpdate){ + + let ancestryName = $("#inputName").val(); + let ancestryRarity = $("#inputRarity").val(); + let ancestryHitPoints = $("#inputHitPoints").val(); + let ancestrySize = $("#inputSize").val(); + let ancestrySpeed = $("#inputSpeed").val(); + let ancestryVisionSenseID = $("#inputVisionSense").val(); + let ancestryAdditionalSenseID = $("#inputAdditionalSense").val(); + let ancestryPhysicalFeatureOneID = $("#inputPhysicalFeatureOne").val(); + let ancestryPhysicalFeatureTwoID = $("#inputPhysicalFeatureTwo").val(); + let ancestryDescription = $("#inputDescription").val(); + let ancestryImageURL = $("#inputImageURL").val(); + let ancestryBoostsArray = $("#inputBoosts").val(); + let ancestryFlawsArray = $("#inputFlaws").val(); + let ancestryLangsArray = $("#inputLangs").val(); + let ancestryBonusLangsArray = $("#inputBonusLangs").val(); + + let ancestryHeritagesArray = []; + $(".ancestryHeritage").each(function(){ + if($(this).is(":visible")) { + let heritageName = $(this).find(".inputHeritageName").val(); + let heritageDesc = $(this).find(".inputHeritageDesc").val(); + let heritageCode = $(this).find(".inputHeritageCode").val(); + ancestryHeritagesArray.push({ + name: heritageName, + description: heritageDesc, + code: heritageCode + }); + } + }); + + let ancestryFeatsArray = []; + $(".ancestryFeat").each(function(){ + if($(this).is(":visible")) { + let featName = $(this).find(".inputFeatName").val(); + let featLevel = $(this).find(".inputFeatLevel").val(); + let featActions = $(this).find(".inputFeatActions").val(); + let featRarity = $(this).find(".inputFeatRarity").val(); + let featTagsArray = $(this).find(".inputFeatTags").val(); + let featPrereq = $(this).find(".inputFeatPrereq").val(); + let featReq = $(this).find(".inputFeatReq").val(); + let featFreq = $(this).find(".inputFeatFreq").val(); + let featCost = $(this).find(".inputFeatCost").val(); + let featTrigger = $(this).find(".inputFeatTrigger").val(); + let featDesc = $(this).find(".inputFeatDesc").val(); + let featSpecial = $(this).find(".inputFeatSpecial").val(); + let featSelectMultiple = ($(this).find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + let featCode = $(this).find(".inputFeatCode").val(); + ancestryFeatsArray.push({ + name: featName, + actions: featActions, + level: featLevel, + rarity: featRarity, + prerequisites: featPrereq, + frequency: featFreq, + cost: featCost, + trigger: featTrigger, + requirements: featReq, + description: featDesc, + special: featSpecial, + canSelectMultiple: featSelectMultiple, + code: featCode, + featTagsArray + }); + } + }); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let ancestryID = $('#builder-container').attr('data-ancestry-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateAncestry"; + } else { + requestPacket = "requestHomebrewAddAncestry"; + } + + socket.emit(requestPacket, g_homebrewID, { + ancestryID, + ancestryName, + ancestryRarity, + ancestryHitPoints, + ancestrySize, + ancestrySpeed, + ancestryVisionSenseID, + ancestryAdditionalSenseID, + ancestryPhysicalFeatureOneID, + ancestryPhysicalFeatureTwoID, + ancestryDescription, + ancestryImageURL, + ancestryBoostsArray, + ancestryFlawsArray, + ancestryLangsArray, + ancestryBonusLangsArray, + ancestryHeritagesArray, + ancestryFeatsArray, + }); + +} + +socket.on("returnHomebrewCompleteAncestry", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/ancestry/editor-ancestry.js b/client/vue-src/legacy-js/homebrew/builder/ancestry/editor-ancestry.js new file mode 100644 index 00000000..2031afa2 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/ancestry/editor-ancestry.js @@ -0,0 +1,158 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewAncestryDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewAncestryDetails", function(ancestryObject, featsObject){ + + let ancestryMap = objToMap(ancestryObject); + let featMap = objToMap(featsObject); + + let ancestry = ancestryMap.get($('#builder-container').attr('data-ancestry-id')); + + if(ancestry == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputName").val(ancestry.Ancestry.name); + $("#inputRarity").val(ancestry.Ancestry.rarity); + $("#inputHitPoints").val(ancestry.Ancestry.hitPoints); + $("#inputSize").val(ancestry.Ancestry.size); + $("#inputSpeed").val(ancestry.Ancestry.speed); + $("#inputVisionSense").val(ancestry.Ancestry.visionSenseID); + $("#inputAdditionalSense").val(ancestry.Ancestry.additionalSenseID); + $("#inputPhysicalFeatureOne").val(ancestry.Ancestry.physicalFeatureOneID); + $("#inputPhysicalFeatureTwo").val(ancestry.Ancestry.physicalFeatureTwoID); + $("#inputDescription").val(ancestry.Ancestry.description); + $("#inputImageURL").val(ancestry.Ancestry.artworkURL); + + // Ancestry Boosts and Flaws + let firstFreeSelected = false; + for(let boost of ancestry.Boosts){ + if(boost == 'Anything'){ + if(firstFreeSelected){ + $('#boostOptionAnything2').attr('selected','selected'); + } else { + $('#boostOptionAnything1').attr('selected','selected'); + firstFreeSelected = true; + } + } else { + $('#inputBoosts option[value="'+boost+'"]').attr('selected','selected'); + } + } + for(let flaw of ancestry.Flaws){ + $('#inputFlaws option[value="'+flaw+'"]').attr('selected','selected'); + } + + // Ancestry Langs + for(let lang of ancestry.Languages){ + $('#inputLangs option[name="'+lang.name+'"]').attr('selected','selected'); + } + $('#inputLangs').trigger("chosen:updated"); + for(let bonusLang of ancestry.BonusLanguages){ + $('#inputBonusLangs option[name="'+bonusLang.name+'"]').attr('selected','selected'); + } + $('#inputBonusLangs').trigger("chosen:updated"); + + // Ancestry Heritages + let filteredAncestryHeritages = []; + for(let heritage of ancestry.Heritages){ + if(heritage.indivAncestryName == null){ + filteredAncestryHeritages.push(heritage); + } + } + + for(let heritage of filteredAncestryHeritages){ + $("#addHeritageButton").trigger("click"); + } + + let ancestryHeritageCount = 0; + $(".ancestryHeritage").each(function(){ + if($(this).is(":visible")) { + let heritage = filteredAncestryHeritages[ancestryHeritageCount]; + ancestryHeritageCount++; + + let heritageName = heritage.name.replace(" "+ancestry.Ancestry.name,""); + $(this).find(".inputHeritageName").val(heritageName); + $(this).find(".inputHeritageDesc").val(heritage.description); + $(this).find(".inputHeritageCode").val(heritage.code); + + // Minimize Heritage + $(this).find(".card-header").trigger("click"); + // Trigger Heritage Name and Tags + $(this).find(".inputHeritageName").trigger("change"); + } + }); + + + // Ancestry Feats + let ancestryFeats = []; + for(const [key, value] of featMap.entries()){ + let ancestryTag = value.Tags.find(tag => { + return tag.id === ancestry.Tag.id; + }); + if(ancestryTag != null && value.Feat.genericType == null){ + $("#addFeatButton").trigger("click"); + ancestryFeats.push(value); + } + } + + ancestryFeats = ancestryFeats.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + let ancestryFeatCount = 0; + $(".ancestryFeat").each(function(){ + if($(this).is(":visible")) { + let feat = ancestryFeats[ancestryFeatCount]; + ancestryFeatCount++; + + $(this).find(".inputFeatName").val(feat.Feat.name); + $(this).find(".inputFeatLevel").val(feat.Feat.level); + $(this).find(".inputFeatActions").val(feat.Feat.actions); + $(this).find(".inputFeatRarity").val(feat.Feat.rarity); + $(this).find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $(this).find(".inputFeatReq").val(feat.Feat.requirements); + $(this).find(".inputFeatFreq").val(feat.Feat.frequency); + $(this).find(".inputFeatCost").val(feat.Feat.cost); + $(this).find(".inputFeatTrigger").val(feat.Feat.trigger); + $(this).find(".inputFeatDesc").val(feat.Feat.description); + $(this).find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $(this).find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $(this).find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != ancestry.Tag.id) { + $(this).find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + // Minimize Feat + $(this).find(".card-header").trigger("click"); + // Trigger Feat Name and Tags + $(this).find(".inputFeatName").trigger("change"); + $(this).find(".inputFeatTags").trigger("chosen:updated"); + } + }); + + + $("#updateButton").click(function(){ + $(this).unbind(); + finishAncestry(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/archetype/builder-archetype.js b/client/vue-src/legacy-js/homebrew/builder/archetype/builder-archetype.js new file mode 100644 index 00000000..fcf5b6a2 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/archetype/builder-archetype.js @@ -0,0 +1,154 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let cardDedicationHeader = $('#dedicationFeat').find(".card-header"); + let cardDedicationContent = $('#dedicationFeat').find(".card-content"); + cardDedicationHeader.click(function(){ + if(cardDedicationContent.is(":visible")) { + cardDedicationContent.addClass('is-hidden'); + } else { + cardDedicationContent.removeClass('is-hidden'); + } + }); + + $('#dedicationFeat').find(".inputFeatTags").chosen(); + + let featCount = 0; + $("#addFeatButton").click(function(){ + featCount++; + + let featID = "feat"+featCount; + + let newFeat = $("#featLayout").clone(); + newFeat.attr('id', featID); + newFeat.removeClass('is-hidden'); + newFeat.appendTo("#featContent"); + + let cardHeader = $("#"+featID).find(".card-header"); + let cardContent = $("#"+featID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+featID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+featID).remove(); + }); + + let inputFeatName = $("#"+featID).find(".inputFeatName"); + inputFeatName.change(function(){ + $("#"+featID).find(".card-header-title").html('Archetype Feat - '+inputFeatName.val()); + }); + + $("#"+featID).find(".inputFeatTags").chosen(); + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishArchetype(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishArchetype(isUpdate){ + + let archetypeName = $("#inputName").val(); + + let archetypeIsMulticlass = ($("#inputIsMulticlass:checked").val() == '1') ? 1 : 0; + + let archetypeDescription = $("#inputDescription").val(); + + let archetypeFeatsArray = []; + $(".archetypeFeat").each(function(){ + if($(this).is(":visible")) { + let featName = $(this).find(".inputFeatName").val(); + let featLevel = $(this).find(".inputFeatLevel").val(); + let featActions = $(this).find(".inputFeatActions").val(); + let featRarity = $(this).find(".inputFeatRarity").val(); + let featTagsArray = $(this).find(".inputFeatTags").val(); + let featPrereq = $(this).find(".inputFeatPrereq").val(); + let featReq = $(this).find(".inputFeatReq").val(); + let featFreq = $(this).find(".inputFeatFreq").val(); + let featCost = $(this).find(".inputFeatCost").val(); + let featTrigger = $(this).find(".inputFeatTrigger").val(); + let featDesc = $(this).find(".inputFeatDesc").val(); + let featSpecial = $(this).find(".inputFeatSpecial").val(); + let featSelectMultiple = ($(this).find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + let featCode = $(this).find(".inputFeatCode").val(); + archetypeFeatsArray.push({ + name: featName, + actions: featActions, + level: featLevel, + rarity: featRarity, + prerequisites: featPrereq, + frequency: featFreq, + cost: featCost, + trigger: featTrigger, + requirements: featReq, + description: featDesc, + special: featSpecial, + canSelectMultiple: featSelectMultiple, + code: featCode, + featTagsArray + }); + } + }); + + + let archetypeDedicationFeat = { + level : $('#dedicationFeat').find(".inputFeatLevel").val(), + actions : $('#dedicationFeat').find(".inputFeatActions").val(), + rarity : $('#dedicationFeat').find(".inputFeatRarity").val(), + featTagsArray : $('#dedicationFeat').find(".inputFeatTags").val(), + prerequisites: $('#dedicationFeat').find(".inputFeatPrereq").val(), + requirements : $('#dedicationFeat').find(".inputFeatReq").val(), + frequency : $('#dedicationFeat').find(".inputFeatFreq").val(), + cost : $('#dedicationFeat').find(".inputFeatCost").val(), + trigger : $('#dedicationFeat').find(".inputFeatTrigger").val(), + description : $('#dedicationFeat').find(".inputFeatDesc").val(), + special : $('#dedicationFeat').find(".inputFeatSpecial").val(), + canSelectMultiple : ($('#dedicationFeat').find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0, + code : $('#dedicationFeat').find(".inputFeatCode").val(), + }; + + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let archetypeID = $('#builder-container').attr('data-archetype-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateArchetype"; + } else { + requestPacket = "requestHomebrewAddArchetype"; + } + + socket.emit(requestPacket, g_homebrewID, { + archetypeID, + archetypeName, + archetypeIsMulticlass, + archetypeDescription, + archetypeDedicationFeat, + archetypeFeatsArray + }); + +} + +socket.on("returnHomebrewCompleteArchetype", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/archetype/editor-archetype.js b/client/vue-src/legacy-js/homebrew/builder/archetype/editor-archetype.js new file mode 100644 index 00000000..7c50a57e --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/archetype/editor-archetype.js @@ -0,0 +1,131 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewArchetypeDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewArchetypeDetails", function(archetypeArray, featsObject){ + + let featMap = objToMap(featsObject); + + let archetypeID = $('#builder-container').attr('data-archetype-id'); + let archetype = archetypeArray.find(archetype => { + return archetype.id == archetypeID; + }); + + if(archetype == null){ + window.location.href = '/homebrew'; + return; + } + + let dedicationFeat = null; + + $("#inputName").val(archetype.name); + + let multiclassCheckBoxState = (archetype.isMulticlass == 1) ? true : false; + $("#inputIsMulticlass").prop('checked', multiclassCheckBoxState); + + $("#inputDescription").val(archetype.description); + + + // Archetype Feats // + let archetypeFeats = []; + for(const [key, value] of featMap.entries()){ + let archetypeTag = value.Tags.find(tag => { + return tag.id === archetype.tagID; + }); + if(archetypeTag != null){ + $("#addFeatButton").trigger("click"); + archetypeFeats.push(value); + } + + if(value.Feat.id === archetype.dedicationFeatID) { + dedicationFeat = value; + } + } + + archetypeFeats = archetypeFeats.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + let archetypeFeatCount = 0; + $(".archetypeFeat").each(function(){ + if($(this).is(":visible")) { + let feat = archetypeFeats[archetypeFeatCount]; + archetypeFeatCount++; + + $(this).find(".inputFeatName").val(feat.Feat.name); + $(this).find(".inputFeatLevel").val(feat.Feat.level); + $(this).find(".inputFeatActions").val(feat.Feat.actions); + $(this).find(".inputFeatRarity").val(feat.Feat.rarity); + $(this).find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $(this).find(".inputFeatReq").val(feat.Feat.requirements); + $(this).find(".inputFeatFreq").val(feat.Feat.frequency); + $(this).find(".inputFeatCost").val(feat.Feat.cost); + $(this).find(".inputFeatTrigger").val(feat.Feat.trigger); + $(this).find(".inputFeatDesc").val(feat.Feat.description); + $(this).find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $(this).find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $(this).find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != archetype.tagID) { + $(this).find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + // Minimize Feat + $(this).find(".card-header").trigger("click"); + // Trigger Feat Name and Tags + $(this).find(".inputFeatName").trigger("change"); + $(this).find(".inputFeatTags").trigger("chosen:updated"); + } + }); + + + if(dedicationFeat != null){ + let feat = dedicationFeat; + + $('#dedicationFeat').find(".inputFeatLevel").val(feat.Feat.level); + $('#dedicationFeat').find(".inputFeatActions").val(feat.Feat.actions); + $('#dedicationFeat').find(".inputFeatRarity").val(feat.Feat.rarity); + $('#dedicationFeat').find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $('#dedicationFeat').find(".inputFeatReq").val(feat.Feat.requirements); + $('#dedicationFeat').find(".inputFeatFreq").val(feat.Feat.frequency); + $('#dedicationFeat').find(".inputFeatCost").val(feat.Feat.cost); + $('#dedicationFeat').find(".inputFeatTrigger").val(feat.Feat.trigger); + $('#dedicationFeat').find(".inputFeatDesc").val(feat.Feat.description); + $('#dedicationFeat').find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $('#dedicationFeat').find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $('#dedicationFeat').find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != archetype.tagID) { + $('#dedicationFeat').find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + $('#dedicationFeat').find(".inputFeatTags").trigger("chosen:updated"); + + } + + + $("#updateButton").click(function(){ + $(this).unbind(); + finishArchetype(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/background/builder-background.js b/client/vue-src/legacy-js/homebrew/builder/background/builder-background.js new file mode 100644 index 00000000..8eac99e1 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/background/builder-background.js @@ -0,0 +1,57 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $("#createButton").click(function(){ + $(this).unbind(); + finishBackground(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishBackground(isUpdate){ + + let backgroundName = $("#inputName").val(); + let backgroundRarity = $("#inputRarity").val(); + let backgroundDescription = $("#inputDescription").val(); + let backgroundBoostsArray = $("#inputBoosts").val(); + let backgroundCode = $("#inputCode").val(); + + let backgroundBoosts = ''; + for(let backgroundBoost of backgroundBoostsArray) { + backgroundBoosts += backgroundBoost+','; + } + backgroundBoosts = backgroundBoosts.slice(0, -1); // Trim off that last ',' + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let backgroundID = $('#builder-container').attr('data-background-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateBackground"; + } else { + requestPacket = "requestHomebrewAddBackground"; + } + + socket.emit(requestPacket, g_homebrewID, { + backgroundID, + backgroundName, + backgroundRarity, + backgroundDescription, + backgroundBoosts, + backgroundCode, + }); + +} + +socket.on("returnHomebrewCompleteBackground", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/background/editor-background.js b/client/vue-src/legacy-js/homebrew/builder/background/editor-background.js new file mode 100644 index 00000000..f6b4172c --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/background/editor-background.js @@ -0,0 +1,42 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewBackgroundDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewBackgroundDetails", function(backgrounds){ + + let backgroundID = $('#builder-container').attr('data-background-id'); + let background = backgrounds.find(background => { + return background.id == backgroundID; + }); + + if(background == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputName").val(background.name); + $("#inputRarity").val(background.rarity); + $("#inputDescription").val(background.description); + $("#inputCode").val(background.code); + + // Background Boost + if(background.boostOne != null){ + let boostArray = background.boostOne.split(','); + for(let boost of boostArray){ + $('#inputBoosts option[value="'+boost+'"]').attr('selected','selected'); + } + } + + $("#updateButton").click(function(){ + $(this).unbind(); + finishBackground(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/builder-templating.js b/client/vue-src/legacy-js/homebrew/builder/builder-templating.js new file mode 100644 index 00000000..646d0a78 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/builder-templating.js @@ -0,0 +1,196 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// HARDCODED Names - IDs // +const TEMPLATE_MAP_ANCESTRY = [ + { Name: 'Elf', ID: 178 }, + { Name: 'Goblin', ID: 180 }, + { Name: 'Human', ID: 176 }, + { Name: 'Kobold', ID: 175 }, + { Name: 'Shoony', ID: 155 }, +]; + +const TEMPLATE_MAP_ARCHETYPE = [ + { Name: 'Assassin', ID: 92 }, + { Name: 'Blessed One', ID: 67 }, + { Name: 'Druid', ID: 29 }, + { Name: 'Poisoner', ID: 99 }, + { Name: 'Rogue', ID: 36 }, +]; + +const TEMPLATE_MAP_BACKGROUND = [ + { Name: 'Amnesiac', ID: 86 }, + { Name: 'Blessed', ID: 89 }, + { Name: 'Nomad', ID: 74 }, + { Name: 'Scholar', ID: 75 }, + { Name: 'Tinker', ID: 23 }, +]; + +const TEMPLATE_MAP_CLASS = [ + { Name: 'Alchemist', ID: 265 }, + { Name: 'Champion', ID: 225 }, + { Name: 'Fighter', ID: 270 }, + { Name: 'Oracle', ID: 279 }, + { Name: 'Wizard', ID: 260 }, +]; + +const TEMPLATE_MAP_CLASS_FEATURE = [ + { Name: 'Eldritch Trickster', ID: 13612 }, + { Name: 'Mastermind', ID: 13613 }, + { Name: 'Nymph', ID: 13615 }, + { Name: 'Tyrant (Lawful Evil)', ID: 13606 }, + { Name: 'Warden Spells', ID: 13610 }, +]; + +const TEMPLATE_MAP_FEAT = [ + { Name: 'Ancestral Paragon', ID: 9 }, + { Name: 'Bon Mot', ID: 8853 }, + { Name: 'Draconic Arrogance', ID: 9119 }, + { Name: 'Energy Emanation', ID: 10341 }, + { Name: 'Scare to Death', ID: 2207 }, +]; + +const TEMPLATE_MAP_HERITAGE = [ + { Name: 'Ancient Elf', ID: 753 }, + { Name: 'Elemental Heart Dwarf', ID: 763 }, + { Name: 'Jinxed Halfling', ID: 764 }, + { Name: 'Tailed Goblin', ID: 758 }, + { Name: 'Vivacious Gnome', ID: 760 }, +]; + +const TEMPLATE_MAP_UNI_HERITAGE = [ + { Name: 'Aasimar', ID: 9 }, + { Name: 'Changeling', ID: 15 }, + { Name: 'Dhampir', ID: 8 }, + { Name: 'Duskwalker', ID: 14 }, + { Name: 'Half-Elf', ID: 4 }, +]; + +const TEMPLATE_MAP_ITEM = [ + { Name: 'Adventurer\'s Pack', ID: 632 }, + { Name: 'Bag of Holding II', ID: 566 }, + { Name: 'Bottled Lightning (greater)', ID: 346 }, + { Name: 'Chain Shirt', ID: 1143 }, + { Name: 'Holy Avenger', ID: 1326 }, +]; + +const TEMPLATE_MAP_LANGUAGE = [ + { Name: 'Abyssal', ID: 12 }, + { Name: 'Celestial', ID: 16 }, + { Name: 'Common', ID: 1 }, + { Name: 'Shadowtongue', ID: 21 }, + { Name: 'Tengu', ID: 28 }, +]; + +const TEMPLATE_MAP_SPELL = [ + { Name: 'Armor of Bones', ID: 761 }, + { Name: 'Beastmaster Trance', ID: 872 }, + { Name: 'Heal', ID: 845 }, + { Name: 'Object Reading', ID: 859 }, + { Name: 'Wyvern Sting', ID: 967 }, +]; + +const TEMPLATE_MAP_TRAIT = [ + { Name: 'Alchemical', ID: 399 }, + { Name: 'Fatal', ID: 567 }, + { Name: 'Gnome - Item', ID: 638 }, + { Name: 'Linguistic', ID: 37 }, + { Name: 'Possession', ID: 368 }, +]; + +const TEMPLATE_MAP_TOGGLEABLE = [ + { Name: 'Panache', ID: 2 }, + { Name: 'Rage', ID: 1 }, +]; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +function initNewContentTemplating() { + + $('#scratch-template-modal-background,#scratch-template-modal-close').click(function() { + $('#scratch-template-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#scratch-template-modal').attr('data-content-type', ''); + }); + $('#choose-template-modal-background,#choose-template-modal-close').click(function() { + $('#choose-template-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#choose-template-modal-body').html(''); + }); + + $('#scratch-template-modal-template-btn').click(function() { + $('#scratch-template-modal').removeClass('is-active'); + $('#choose-template-modal-body').html(''); + $('html').addClass('is-clipped'); + const CONTENT_TYPE = $('#scratch-template-modal').attr('data-content-type'); + + let TEMPLATES = null; + switch(CONTENT_TYPE){ + case 'CLASS': TEMPLATES = TEMPLATE_MAP_CLASS; break; + case 'ANCESTRY': TEMPLATES = TEMPLATE_MAP_ANCESTRY; break; + case 'ARCHETYPE': TEMPLATES = TEMPLATE_MAP_ARCHETYPE; break; + case 'BACKGROUND': TEMPLATES = TEMPLATE_MAP_BACKGROUND; break; + case 'CLASS-FEATURE': TEMPLATES = TEMPLATE_MAP_CLASS_FEATURE; break; + case 'FEAT-ACTIVITY': TEMPLATES = TEMPLATE_MAP_FEAT; break; + case 'HERITAGE': TEMPLATES = TEMPLATE_MAP_HERITAGE; break; + case 'UNI-HERITAGE': TEMPLATES = TEMPLATE_MAP_UNI_HERITAGE; break; + case 'ITEM': TEMPLATES = TEMPLATE_MAP_ITEM; break; + case 'LANGUAGE': TEMPLATES = TEMPLATE_MAP_LANGUAGE; break; + case 'SPELL': TEMPLATES = TEMPLATE_MAP_SPELL; break; + case 'TRAIT': TEMPLATES = TEMPLATE_MAP_TRAIT; break; + case 'TOGGLEABLE': TEMPLATES = TEMPLATE_MAP_TOGGLEABLE; break; + default: break; + } + + for(const TEMPLATE of TEMPLATES){ + let templateEntryBtn = 'entry-content-template-btn-'+TEMPLATE.ID;// IDs shouldn't collide + $('#choose-template-modal-body').append('

                  '+TEMPLATE.Name+'

                  '); + $('#'+templateEntryBtn).click(function() { + window.location.href = '/homebrew/edit/'+CONTENT_TYPE.toLowerCase()+'/?id='+g_activeBundle.id+'&content_id='+TEMPLATE.ID; + }); + } + $('#choose-template-modal-body').append('
                  '); + $('#entry-content-template-btn-by-id').click(function() { + let templateID = $('#entry-content-template-by-id-input').val(); + if(templateID != ''){ + window.location.href = '/homebrew/edit/'+CONTENT_TYPE.toLowerCase()+'/?id='+g_activeBundle.id+'&content_id='+templateID; + } + }); + + $('#choose-template-modal').addClass('is-active'); + }); + + $('#scratch-template-modal-scratch-btn').click(function() { + $('#scratch-template-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + const CONTENT_TYPE = $('#scratch-template-modal').attr('data-content-type'); + + switch(CONTENT_TYPE){ + case 'CLASS': window.location.href = '/homebrew/create/class/?id='+g_activeBundle.id; break; + case 'ANCESTRY': window.location.href = '/homebrew/create/ancestry/?id='+g_activeBundle.id; break; + case 'ARCHETYPE': window.location.href = '/homebrew/create/archetype/?id='+g_activeBundle.id; break; + case 'BACKGROUND': window.location.href = '/homebrew/create/background/?id='+g_activeBundle.id; break; + case 'CLASS-FEATURE': window.location.href = '/homebrew/create/class-feature/?id='+g_activeBundle.id; break; + case 'FEAT-ACTIVITY': window.location.href = '/homebrew/create/feat-activity/?id='+g_activeBundle.id; break; + case 'HERITAGE': window.location.href = '/homebrew/create/heritage/?id='+g_activeBundle.id; break; + case 'UNI-HERITAGE': window.location.href = '/homebrew/create/uni-heritage/?id='+g_activeBundle.id; break; + case 'ITEM': window.location.href = '/homebrew/create/item/?id='+g_activeBundle.id; break; + case 'LANGUAGE': window.location.href = '/homebrew/create/language/?id='+g_activeBundle.id; break; + case 'SPELL': window.location.href = '/homebrew/create/spell/?id='+g_activeBundle.id; break; + case 'TRAIT': window.location.href = '/homebrew/create/trait/?id='+g_activeBundle.id; break; + case 'TOGGLEABLE': window.location.href = '/homebrew/create/toggleable/?id='+g_activeBundle.id; break; + default: break; + } + + }); + +} + +function createNewBundleContent(CONTENT_TYPE){ + + $('#scratch-template-modal').attr('data-content-type', CONTENT_TYPE); + $('#scratch-template-modal').addClass('is-active'); + $('html').addClass('is-clipped'); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/bundle-editor.js b/client/vue-src/legacy-js/homebrew/builder/bundle-editor.js new file mode 100644 index 00000000..bf1c9c6e --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/bundle-editor.js @@ -0,0 +1,692 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openBundleEditor(homebrewBundle) { + g_activeBundle = homebrewBundle; + window.history.pushState('homebrew', '', '/homebrew/?edit_id=' + g_activeBundle.id);// Update URL + socket.emit('requestBundleContents', 'EDIT', homebrewBundle.id); + startSpinnerSubLoader(); +} + +socket.on("returnBundleContents", function (REQUEST_TYPE, userHasBundle, userOwnsBundle, skillObject, allTags, classes, ancestries, archetypes, backgrounds, classFeatures, feats, heritages, uniheritages, items, spells, languages, toggleables) { + if (REQUEST_TYPE !== 'EDIT') { return; } + + //Temp + let animalCompanions = []; + let familiars = []; + + textProcess_warningOnUnknown = true; + g_skillMap = (skillObject != null) ? objToMap(skillObject) : null; + g_allTags = allTags; + g_allLanguages = languages; + + let featMap = new Map(); + for (let feat of feats) { + let tags = []; + // Find tags by id + for (let featTag of feat.featTags) { + let tag = allTags.find(tag => { + return tag.id === featTag.tagID; + }); + if (tag != null) { tags.push(tag); } + } + // Find tag for genTypeName + if (feat.genTypeName != null) { + let tag = allTags.find(tag => { + if (tag.isArchived == 0) { return tag.name === feat.genTypeName; } else { return false; } + }); + if (tag != null) { tags.push(tag); } + } + featMap.set(feat.id + '', { Feat: feat, Tags: tags }); + } + g_featMap = featMap; + + let itemMap = new Map(); + for (let itemStruct of items) { + let tags = []; + // Find tags by id + for (let itemTag of itemStruct.Item.taggedItems) { + let tag = allTags.find(tag => { + return tag.id === itemTag.tagID; + }); + if (tag != null) { tags.push(tag); } + } + itemStruct.TagArray = tags; + itemMap.set(itemStruct.Item.id + '', itemStruct); + } + g_itemMap = itemMap; + + let spellMap = new Map(); + for (let spell of spells) { + let tags = []; + // Find tags by id + for (let spellTag of spell.taggedSpells) { + let tag = allTags.find(tag => { + return tag.id === spellTag.tagID; + }); + if (tag != null) { tags.push(tag); } + } + spellMap.set(spell.id + '', { Spell: spell, Tags: tags }); + } + g_spellMap = spellMap; + + stopSpinnerSubLoader(); + $('#tabContent').html(''); + $('#tabContent').load("/templates/homebrew/display-edit-bundle.html"); + $.ajax({ + type: "GET", + url: "/templates/homebrew/display-edit-bundle.html", + success: function (text) { + initNewContentTemplating(); + + $('#bundleName').html(g_activeBundle.name); + $('#bundleDescription').val(g_activeBundle.description); + $('#bundleContactInfo').val(g_activeBundle.contactInfo); + + $("#bundleDescription").blur(function () { + if (g_activeBundle.description != $(this).val()) { + $('#bundleDescription').parent().addClass("is-loading"); + socket.emit("requestBundleUpdate", + g_activeBundle.id, + { + Description: $(this).val() + } + ); + } + }); + + $("#bundleContactInfo").blur(function () { + if (g_activeBundle.contactInfo != $(this).val()) { + $('#bundleContactInfo').parent().addClass("is-loading"); + socket.emit("requestBundleUpdate", + g_activeBundle.id, + { + ContactInfo: $(this).val() + } + ); + } + }); + + $('#bundleRenameBtn').click(function () { + $('#bundleName').html('
                  '); + $('#bundleRenameBtn').addClass('is-hidden'); + $('#bundleRenameInput').focus(); + + $('#bundleRenameInput').blur(function () { + let newName = $('#bundleRenameInput').val(); + if (newName == null || newName == '') { return; } + $(this).unbind(); + $('#bundleName').html(newName); + $('#bundleRenameBtn').removeClass('is-hidden'); + socket.emit("requestBundleUpdate", + g_activeBundle.id, + { + Name: newName, + } + ); + }); + + }); + + $("#bundleContactInfo").blur(function () { + if (g_activeBundle.contactInfo != $(this).val()) { + $('#bundleContactInfo').parent().addClass("is-loading"); + socket.emit("requestBundleUpdate", + g_activeBundle.id, + { + ContactInfo: $(this).val() + } + ); + } + }); + + $("#bundleRequireKeySwitch").change(function () { + socket.emit("requestBundleUpdate", + g_activeBundle.id, + { + HasKeys: (this.checked) ? 1 : 0, + } + ); + }); + $("#bundleRequireKeySwitch").prop('checked', (g_activeBundle.hasKeys === 1)); + + /// + + $('#backToUserContentBtn').click(function () { + openUserContent(); + }); + + /// + + $('#bundlePublishBtn').click(function () { + $('#publish-modal').addClass('is-active'); + $('html').addClass('is-clipped'); + }); + + $('#publish-modal-background,#publish-modal-close').click(function () { + $('#publish-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + }); + $('#publish-modal-btn').click(function () { + socket.emit("requestBundlePublish", g_activeBundle.id); + $('#publish-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + }); + + /// + + $('#createClassBtn').click(function () { + createNewBundleContent('CLASS'); + }); + + if (classes.length > 0) { + $('#bundleContainerClasses').html(''); + for (const cClass of classes) { + let viewClassID = 'entry-view-class-' + cClass.id; + let editClassID = 'entry-edit-class-' + cClass.id; + let deleteClassID = 'entry-delete-class-' + cClass.id; + $('#bundleContainerClasses').append('

                  ' + cClass.name + '

                  '); + $('#' + viewClassID).click(function () { + new DisplayClass('tabContent', cClass.id, featMap, g_activeBundle.id); + }); + $('#' + editClassID).click(function () { + window.location.href = '/homebrew/edit/class/?id=' + g_activeBundle.id + '&content_id=' + cClass.id; + }); + $('#' + deleteClassID).click(function () { + new ConfirmMessage('Delete “' + cClass.name + '”', '

                  Are you sure you want to delete this class?

                  ', 'Delete', 'modal-delete-content-class-' + cClass.id, 'modal-delete-content-class-btn-' + cClass.id); + $('#modal-delete-content-class-btn-' + cClass.id).click(function () { + socket.emit('requestHomebrewRemoveClass', g_activeBundle.id, cClass.id); + }); + }); + } + } + + /// + + $('#createAncestryBtn').click(function () { + createNewBundleContent('ANCESTRY'); + }); + + if (ancestries.length > 0) { + $('#bundleContainerAncestries').html(''); + for (const ancestry of ancestries) { + let viewAncestryID = 'entry-view-ancestry-' + ancestry.id; + let editAncestryID = 'entry-edit-ancestry-' + ancestry.id; + let deleteAncestryID = 'entry-delete-ancestry-' + ancestry.id; + $('#bundleContainerAncestries').append('

                  ' + ancestry.name + '

                  '); + $('#' + viewAncestryID).click(function () { + new DisplayAncestry('tabContent', ancestry.id, featMap, g_activeBundle.id); + }); + $('#' + editAncestryID).click(function () { + window.location.href = '/homebrew/edit/ancestry/?id=' + g_activeBundle.id + '&content_id=' + ancestry.id; + }); + $('#' + deleteAncestryID).click(function () { + new ConfirmMessage('Delete “' + ancestry.name + '”', '

                  Are you sure you want to delete this ancestry?

                  ', 'Delete', 'modal-delete-content-ancestry-' + ancestry.id, 'modal-delete-content-ancestry-btn-' + ancestry.id); + $('#modal-delete-content-ancestry-btn-' + ancestry.id).click(function () { + socket.emit('requestHomebrewRemoveAncestry', g_activeBundle.id, ancestry.id); + }); + }); + } + } + + /// + + $('#createAnimalCompanionBtn').click(function () { + createNewBundleContent('ANIMAL-COMPANION'); + }); + + if (animalCompanions.length > 0) { + $('#bundleContainerAnimalCompanions').html(''); + for (const animalCompanion of animalCompanions) { + let viewAnimalCompanionID = 'entry-view-animal-companion-' + animalCompanion.id; + let editAnimalCompanionID = 'entry-edit-animal-companion-' + animalCompanion.id; + let deleteAnimalCompanionID = 'entry-delete-animal-companion-' + animalCompanion.id; + $('#bundleContainerAncestries').append('

                  ' + animalCompanion.name + '

                  '); + $('#' + viewAnimalCompanionID).click(function () { + new DisplayAnimalCompanion('tabContent', animalCompanion.id, featMap, g_activeBundle.id); + }); + $('#' + editAnimalCompanionID).click(function () { + window.location.href = '/homebrew/edit/animal-companion/?id=' + g_activeBundle.id + '&content_id=' + animalCompanion.id; + }); + $('#' + deleteAnimalCompanionID).click(function () { + new ConfirmMessage('Delete “' + animalCompanion.name + '”', '

                  Are you sure you want to delete this animal companion?

                  ', 'Delete', 'modal-delete-content-animal-companion-' + animalCompanion.id, 'modal-delete-content-animal-companion-btn-' + animalCompanion.id); + $('#modal-delete-content-animal-companion-btn-' + animalCompanion.id).click(function () { + socket.emit('requestHomebrewRemoveAnimalCompanion', g_activeBundle.id, animalCompanion.id); + }); + }); + } + } + + /// + + $('#createArchetypeBtn').click(function () { + createNewBundleContent('ARCHETYPE'); + }); + + if (archetypes.length > 0) { + $('#bundleContainerArchetypes').html(''); + for (const archetype of archetypes) { + let viewArchetypeID = 'entry-view-archetype-' + archetype.id; + let editArchetypeID = 'entry-edit-archetype-' + archetype.id; + let deleteArchetypeID = 'entry-delete-archetype-' + archetype.id; + $('#bundleContainerArchetypes').append('

                  ' + archetype.name + '

                  '); + $('#' + viewArchetypeID).click(function () { + new DisplayArchetype('tabContent', archetype.id, featMap, g_activeBundle.id); + }); + $('#' + editArchetypeID).click(function () { + window.location.href = '/homebrew/edit/archetype/?id=' + g_activeBundle.id + '&content_id=' + archetype.id; + }); + $('#' + deleteArchetypeID).click(function () { + new ConfirmMessage('Delete “' + archetype.name + '”', '

                  Are you sure you want to delete this archetype?

                  ', 'Delete', 'modal-delete-content-archetype-' + archetype.id, 'modal-delete-content-archetype-btn-' + archetype.id); + $('#modal-delete-content-archetype-btn-' + archetype.id).click(function () { + socket.emit('requestHomebrewRemoveArchetype', g_activeBundle.id, archetype.id); + }); + }); + } + } + + //// + + $('#createBackgroundBtn').click(function () { + createNewBundleContent('BACKGROUND'); + }); + + if (backgrounds.length > 0) { + $('#bundleContainerBackgrounds').html(''); + for (const background of backgrounds) { + let viewBackgroundID = 'entry-view-background-' + background.id; + let editBackgroundID = 'entry-edit-background-' + background.id; + let deleteBackgroundID = 'entry-delete-background-' + background.id; + $('#bundleContainerBackgrounds').append('

                  ' + background.name + '

                  '); + $('#' + viewBackgroundID).click(function () { + new DisplayBackground('tabContent', background.id, g_activeBundle.id); + }); + $('#' + editBackgroundID).click(function () { + window.location.href = '/homebrew/edit/background/?id=' + g_activeBundle.id + '&content_id=' + background.id; + }); + $('#' + deleteBackgroundID).click(function () { + new ConfirmMessage('Delete “' + background.name + '”', '

                  Are you sure you want to delete this background?

                  ', 'Delete', 'modal-delete-content-background-' + background.id, 'modal-delete-content-background-btn-' + background.id); + $('#modal-delete-content-background-btn-' + background.id).click(function () { + socket.emit('requestHomebrewRemoveBackground', g_activeBundle.id, background.id); + }); + }); + } + } + + //// + + $('#createClassFeatureBtn').click(function () { + createNewBundleContent('CLASS-FEATURE'); + }); + + if (classFeatures.length > 0) { + let foundContent = false; + $('#bundleContainerClassFeatures').html(''); + for (const classFeature of classFeatures) { + if (classFeature.indivClassName == null || classFeature.selectOptionFor != null) { continue; } else { foundContent = true; } + + let viewClassFeatureID = 'entry-view-class-feature-' + classFeature.id; + let editClassFeatureID = 'entry-edit-class-feature-' + classFeature.id; + let deleteClassFeatureID = 'entry-delete-class-feature-' + classFeature.id; + $('#bundleContainerClassFeatures').append('

                  ' + classFeature.name + '

                  '); + $('#' + viewClassFeatureID).click(function () { + let classText = (classFeature.indivClassName != null) ? '~ Class:: ' + classFeature.indivClassName + '\n' : ''; + let classAbilText = (classFeature.indivClassAbilName != null) ? '~ Option For:: ' + classFeature.indivClassAbilName + '\n' : ''; + let description = classText + classAbilText + '----\n' + classFeature.description; + openQuickView('abilityView', { + Ability: { + name: classFeature.name, + description: description, + level: classFeature.level, + contentSrc: classFeature.contentSrc, + homebrewID: classFeature.homebrewID, + code: classFeature.code, + } + }); + }); + $('#' + editClassFeatureID).click(function () { + window.location.href = '/homebrew/edit/class-feature/?id=' + g_activeBundle.id + '&content_id=' + classFeature.id; + }); + $('#' + deleteClassFeatureID).click(function () { + new ConfirmMessage('Delete “' + classFeature.name + '”', '

                  Are you sure you want to delete this class feature?

                  ', 'Delete', 'modal-delete-content-class-feature-' + classFeature.id, 'modal-delete-content-class-feature-btn-' + classFeature.id); + $('#modal-delete-content-class-feature-btn-' + classFeature.id).click(function () { + socket.emit('requestHomebrewRemoveClassFeature', g_activeBundle.id, classFeature.id); + }); + }); + } + + if (!foundContent) { + $('#bundleContainerClassFeatures').html('

                  None

                  '); + } + } + + //// + + $('#createFeatBtn').click(function () { + createNewBundleContent('FEAT-ACTIVITY'); + }); + + if (feats.length > 0) { + let foundContent = false; + $('#bundleContainerFeats').html(''); + for (const feat of feats) { + if (feat.genericType == null) { continue; } else { foundContent = true; } + + let viewFeatID = 'entry-view-feat-activity-' + feat.id; + let editFeatID = 'entry-edit-feat-activity-' + feat.id; + let deleteFeatID = 'entry-delete-feat-activity-' + feat.id; + $('#bundleContainerFeats').append('

                  ' + feat.name + '

                  '); + $('#' + viewFeatID).click(function () { + let featStruct = featMap.get(feat.id + ''); + openQuickView('featView', { + Feat: featStruct.Feat, + Tags: featStruct.Tags + }); + }); + $('#' + editFeatID).click(function () { + window.location.href = '/homebrew/edit/feat-activity/?id=' + g_activeBundle.id + '&content_id=' + feat.id; + }); + $('#' + deleteFeatID).click(function () { + new ConfirmMessage('Delete “' + feat.name + '”', '

                  Are you sure you want to delete this feat / activity?

                  ', 'Delete', 'modal-delete-content-feat-' + feat.id, 'modal-delete-content-feat-btn-' + feat.id); + $('#modal-delete-content-feat-btn-' + feat.id).click(function () { + socket.emit('requestHomebrewRemoveFeat', g_activeBundle.id, feat.id); + }); + }); + } + + if (!foundContent) { + $('#bundleContainerFeats').html('

                  None

                  '); + } + } + + //// + + $('#createHeritageBtn').click(function () { + createNewBundleContent('HERITAGE'); + }); + + if (heritages.length > 0) { + let foundContent = false; + $('#bundleContainerHeritages').html(''); + for (const heritage of heritages) { + if (heritage.indivAncestryName == null) { continue; } else { foundContent = true; } + + let viewHeritageID = 'entry-view-heritage-' + heritage.id; + let editHeritageID = 'entry-edit-heritage-' + heritage.id; + let deleteHeritageID = 'entry-delete-heritage-' + heritage.id; + $('#bundleContainerHeritages').append('

                  ' + heritage.name + '

                  '); + $('#' + viewHeritageID).click(function () { + let ancestryText = (heritage.indivAncestryName != null) ? '~ Ancestry:: ' + heritage.indivAncestryName + '\n' : ''; + let rarityText = (heritage.rarity != null) ? '~ Rarity:: ' + capitalizeWord(heritage.rarity) + '\n' : ''; + let description = ancestryText + rarityText + '----\n' + heritage.description; + openQuickView('abilityView', { + Ability: { + name: heritage.name, + description: description, + level: 0, + contentSrc: heritage.contentSrc, + homebrewID: heritage.homebrewID, + code: heritage.code, + } + }); + }); + $('#' + editHeritageID).click(function () { + window.location.href = '/homebrew/edit/heritage/?id=' + g_activeBundle.id + '&content_id=' + heritage.id; + }); + $('#' + deleteHeritageID).click(function () { + new ConfirmMessage('Delete “' + heritage.name + '”', '

                  Are you sure you want to delete this heritage?

                  ', 'Delete', 'modal-delete-content-heritage-' + heritage.id, 'modal-delete-content-heritage-btn-' + heritage.id); + $('#modal-delete-content-heritage-btn-' + heritage.id).click(function () { + socket.emit('requestHomebrewRemoveHeritage', g_activeBundle.id, heritage.id); + }); + }); + } + + if (!foundContent) { + $('#bundleContainerHeritages').html('

                  None

                  '); + } + } + + //// + + $('#createUniHeritageBtn').click(function () { + createNewBundleContent('UNI-HERITAGE'); + }); + + if (uniheritages.length > 0) { + $('#bundleContainerUniHeritages').html(''); + for (const uniheritage of uniheritages) { + let viewUniHeritageID = 'entry-view-uni-heritage-' + uniheritage.id; + let editUniHeritageID = 'entry-edit-uni-heritage-' + uniheritage.id; + let deleteUniHeritageID = 'entry-delete-uni-heritage-' + uniheritage.id; + $('#bundleContainerUniHeritages').append('

                  ' + uniheritage.name + '

                  '); + $('#' + viewUniHeritageID).click(function () { + new DisplayUniHeritage('tabContent', uniheritage.id, featMap, g_activeBundle.id); + }); + $('#' + editUniHeritageID).click(function () { + window.location.href = '/homebrew/edit/uni-heritage/?id=' + g_activeBundle.id + '&content_id=' + uniheritage.id; + }); + $('#' + deleteUniHeritageID).click(function () { + new ConfirmMessage('Delete “' + uniheritage.name + '”', '

                  Are you sure you want to delete this versatile heritage?

                  ', 'Delete', 'modal-delete-content-uni-heritage-' + uniheritage.id, 'modal-delete-content-uni-heritage-btn-' + uniheritage.id); + $('#modal-delete-content-uni-heritage-btn-' + uniheritage.id).click(function () { + socket.emit('requestHomebrewRemoveUniHeritage', g_activeBundle.id, uniheritage.id); + }); + }); + } + } + + //// + + $('#createItemBtn').click(function () { + createNewBundleContent('ITEM'); + }); + + if (items.length > 0) { + $('#bundleContainerItems').html(''); + for (const itemStruct of items) { + let viewItemID = 'entry-view-item-' + itemStruct.Item.id; + let editItemID = 'entry-edit-item-' + itemStruct.Item.id; + let deleteItemID = 'entry-delete-item-' + itemStruct.Item.id; + $('#bundleContainerItems').append('

                  ' + itemStruct.Item.name + '

                  '); + $('#' + viewItemID).click(function () { + let fullItemStruct = itemMap.get(itemStruct.Item.id + ''); + openQuickView('itemView', { + ItemDataStruct: fullItemStruct + }); + }); + $('#' + editItemID).click(function () { + window.location.href = '/homebrew/edit/item/?id=' + g_activeBundle.id + '&content_id=' + itemStruct.Item.id; + }); + $('#' + deleteItemID).click(function () { + new ConfirmMessage('Delete “' + itemStruct.Item.name + '”', '

                  Are you sure you want to delete this item?

                  ', 'Delete', 'modal-delete-content-item-' + itemStruct.Item.id, 'modal-delete-content-item-btn-' + itemStruct.Item.id); + $('#modal-delete-content-item-btn-' + itemStruct.Item.id).click(function () { + socket.emit('requestHomebrewRemoveItem', g_activeBundle.id, itemStruct.Item.id); + }); + }); + } + } + + //// + + $('#createLanguageBtn').click(function () { + createNewBundleContent('LANGUAGE'); + }); + + if (languages.length > 0) { + $('#bundleContainerLanguages').html(''); + for (const language of languages) { + let viewLanguageID = 'entry-view-language-' + language.id; + let editLanguageID = 'entry-edit-language-' + language.id; + let deleteLanguageID = 'entry-delete-language-' + language.id; + $('#bundleContainerLanguages').append('

                  ' + language.name + '

                  '); + $('#' + viewLanguageID).click(function () { + openQuickView('languageView', { + Language: language + }); + }); + $('#' + editLanguageID).click(function () { + window.location.href = '/homebrew/edit/language/?id=' + g_activeBundle.id + '&content_id=' + language.id; + }); + $('#' + deleteLanguageID).click(function () { + new ConfirmMessage('Delete “' + language.name + '”', '

                  Are you sure you want to delete this language?

                  ', 'Delete', 'modal-delete-content-language-' + language.id, 'modal-delete-content-language-btn-' + language.id); + $('#modal-delete-content-language-btn-' + language.id).click(function () { + socket.emit('requestHomebrewRemoveLanguage', g_activeBundle.id, language.id); + }); + }); + } + } + + //// + + $('#createSpellBtn').click(function () { + createNewBundleContent('SPELL'); + }); + + if (spells.length > 0) { + $('#bundleContainerSpells').html(''); + for (const spell of spells) { + let viewSpellID = 'entry-view-spell-' + spell.id; + let editSpellID = 'entry-edit-spell-' + spell.id; + let deleteSpellID = 'entry-delete-spell-' + spell.id; + $('#bundleContainerSpells').append('

                  ' + spell.name + '

                  '); + $('#' + viewSpellID).click(function () { + let spellStruct = spellMap.get(spell.id + ''); + openQuickView('spellView', { + SpellDataStruct: spellStruct, + }); + }); + $('#' + editSpellID).click(function () { + window.location.href = '/homebrew/edit/spell/?id=' + g_activeBundle.id + '&content_id=' + spell.id; + }); + $('#' + deleteSpellID).click(function () { + new ConfirmMessage('Delete “' + spell.name + '”', '

                  Are you sure you want to delete this spell?

                  ', 'Delete', 'modal-delete-content-spell-' + spell.id, 'modal-delete-content-spell-btn-' + spell.id); + $('#modal-delete-content-spell-btn-' + spell.id).click(function () { + socket.emit('requestHomebrewRemoveSpell', g_activeBundle.id, spell.id); + }); + }); + } + } + + //// + + $('#createTraitBtn').click(function () { + createNewBundleContent('TRAIT'); + }); + + if (allTags.length > 0) { + let foundContent = false; + $('#bundleContainerTraits').html(''); + for (const trait of allTags) { + if (trait.homebrewID == null || trait.isHidden == 1) { continue; } else { foundContent = true; } + + let viewTraitID = 'entry-view-trait-' + trait.id; + let editTraitID = 'entry-edit-trait-' + trait.id; + let deleteTraitID = 'entry-delete-trait-' + trait.id; + $('#bundleContainerTraits').append('

                  ' + trait.name + '

                  '); + $('#' + viewTraitID).click(function () { + openQuickView('tagView', { + TagName: trait.name, + InputTag: trait, + }); + }); + $('#' + editTraitID).click(function () { + window.location.href = '/homebrew/edit/trait/?id=' + g_activeBundle.id + '&content_id=' + trait.id; + }); + $('#' + deleteTraitID).click(function () { + new ConfirmMessage('Delete “' + trait.name + '”', '

                  Are you sure you want to delete this trait?

                  ', 'Delete', 'modal-delete-content-trait-' + trait.id, 'modal-delete-content-trait-btn-' + trait.id); + $('#modal-delete-content-trait-btn-' + trait.id).click(function () { + socket.emit('requestHomebrewRemoveTrait', g_activeBundle.id, trait.id); + }); + }); + } + + if (!foundContent) { + $('#bundleContainerTraits').html('

                  None

                  '); + } + } + + //// + + $('#createToggleableBtn').click(function () { + createNewBundleContent('TOGGLEABLE'); + }); + + if (toggleables.length > 0) { + $('#bundleContainerToggleables').html(''); + for (const toggleable of toggleables) { + let viewToggleableID = 'entry-view-toggleable-' + toggleable.id; + let editToggleableID = 'entry-edit-toggleable-' + toggleable.id; + let deleteToggleableID = 'entry-delete-toggleable-' + toggleable.id; + $('#bundleContainerToggleables').append('

                  ' + toggleable.name + '

                  '); + $('#' + viewToggleableID).click(function () { + openQuickView('abilityView', { + Ability: { + name: toggleable.name, + description: toggleable.description, + level: 0, + contentSrc: toggleable.contentSrc, + homebrewID: toggleable.homebrewID, + code: toggleable.code, + } + }); + }); + $('#' + editToggleableID).click(function () { + window.location.href = '/homebrew/edit/toggleable/?id=' + g_activeBundle.id + '&content_id=' + toggleable.id; + }); + $('#' + deleteToggleableID).click(function () { + new ConfirmMessage('Delete “' + toggleable.name + '”', '

                  Are you sure you want to delete this toggleable?

                  ', 'Delete', 'modal-delete-content-toggleable-' + toggleable.id, 'modal-delete-content-toggleable-btn-' + toggleable.id); + $('#modal-delete-content-toggleable-btn-' + toggleable.id).click(function () { + socket.emit('requestHomebrewRemoveToggleable', g_activeBundle.id, toggleable.id); + }); + }); + } + } + + //// + + $('#inputBundleCode').val(g_activeBundle.code); + + $('#inputBundleCode').blur(function () { + if (g_activeBundle.code != $(this).val()) { + $('#inputBundleCode').parent().addClass("is-loading"); + socket.emit("requestBundleUpdate", + g_activeBundle.id, + { + Code: $(this).val() + } + ); + } + }); + + } + }); +}); + +socket.on("returnBundleCreate", function (homebrewBundle) { + if (homebrewBundle != null) { + openBundleEditor(homebrewBundle); + } +}); + +socket.on("returnBundleUpdate", function (homebrewBundle) { + if (homebrewBundle != null) { + g_activeBundle = homebrewBundle; + $('#bundleName').html(g_activeBundle.name); + $('#bundleRenameBtn').removeClass('is-hidden'); + $('#bundleDescription').parent().removeClass("is-loading"); + $('#bundleDescription').val(g_activeBundle.description); + $('#bundleContactInfo').parent().removeClass("is-loading"); + $('#bundleContactInfo').val(g_activeBundle.contactInfo); + $('#inputBundleCode').parent().removeClass("is-loading"); + $('#inputBundleCode').val(g_activeBundle.code); + $('#bundleRequireKeySwitch').blur(); + } +}); + +socket.on("returnHomebrewRemoveContent", function () { + openBundleEditor(g_activeBundle); +}); + +socket.on("returnBundlePublish", function (isPublished) { + openUserContent(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/cClass/builder-class.js b/client/vue-src/legacy-js/homebrew/builder/cClass/builder-class.js new file mode 100644 index 00000000..b2d33a25 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/cClass/builder-class.js @@ -0,0 +1,325 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $("#inputWeaponsTrained").chosen(); + $("#inputWeaponsExpert").chosen(); + + $("#inputArmorTrained").chosen(); + $("#inputArmorExpert").chosen(); + + + $("#inputKeyAbility").change(function(){ + if($(this).val() === 'OR') { + $("#abilityStoreOptionsSection").removeClass('is-hidden'); + } else { + $("#abilityStoreOptionsSection").addClass('is-hidden'); + } + }); + + + let classAbilityCount = 0; + $("#addClassFeatureButton").click(function(){ + classAbilityCount++; + + let classAbilityID = "classAbility"+classAbilityCount; + + let newClassAbility = $("#classFeatureLayout").clone(); + newClassAbility.attr('id', classAbilityID); + newClassAbility.removeClass('is-hidden'); + newClassAbility.removeClass('isLayout'); + newClassAbility.appendTo("#classFeatureContent"); + + let cardHeader = $("#"+classAbilityID).find(".card-header"); + let cardContent = $("#"+classAbilityID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+classAbilityID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+classAbilityID).remove(); + }); + + let inputClassFeatureName = $("#"+classAbilityID).find(".inputClassFeatureName:first"); + inputClassFeatureName.change(function(){ + let cFeatureLevel = $("#"+classAbilityID).find(".inputClassFeatureLevel:first").val(); + $("#"+classAbilityID).find(".card-header-title:first").html('Ability - '+inputClassFeatureName.val()+' (Level '+cFeatureLevel+')'); + }); + + let inputClassFeatureLevel = $("#"+classAbilityID).find(".inputClassFeatureLevel:first"); + inputClassFeatureLevel.change(function(){ + let cFeatureName = $("#"+classAbilityID).find(".inputClassFeatureName:first").val(); + $("#"+classAbilityID).find(".card-header-title:first").html('Ability - '+cFeatureName+' (Level '+inputClassFeatureLevel.val()+')'); + }); + + // When 'Is Selector' checkbox is changed + let inputClassFeatureIsSelector = $("#"+classAbilityID).find(".inputClassFeatureIsSelector"); + inputClassFeatureIsSelector.change(function(){ + + if ($(this).is(":checked")) { + + let classFeatureSelectionOptions = $("#"+classAbilityID).find(".classFeatureSelectionOptions"); + classFeatureSelectionOptions.removeClass('is-hidden'); + + let classFeatureOptionsContent = $("#"+classAbilityID).find(".classFeatureOptionsContent"); + let classFeatureAddOptionButton = $("#"+classAbilityID).find(".classFeatureAddOptionButton"); + let classAbilityOptionsCount = 0; + classFeatureAddOptionButton.click(function(){ + classAbilityOptionsCount++; + + let classAbilityOptionID = classAbilityID+"Option"+classAbilityOptionsCount; + + let newClassAbilityOption = $("#classFeatureLayout").clone(); + newClassAbilityOption.attr('id', classAbilityOptionID); + newClassAbilityOption.removeClass('is-hidden'); + newClassAbilityOption.removeClass('isLayout'); + newClassAbilityOption.removeClass('classFeature'); + newClassAbilityOption.addClass('classFeatureOption'); + newClassAbilityOption.find(".classFeatureLevelSection").remove(); + newClassAbilityOption.find(".classFeatureDisplayInSheetSection").remove(); + newClassAbilityOption.find(".classFeatureIsSelectorSection").remove(); + newClassAbilityOption.find(".classFeatureSelectionOptions").remove(); + newClassAbilityOption.find(".card-header-title").html('Option'); + newClassAbilityOption.appendTo(classFeatureOptionsContent); + + let cardHeader = $("#"+classAbilityOptionID).find(".card-header"); + let cardContent = $("#"+classAbilityOptionID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+classAbilityOptionID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+classAbilityOptionID).remove(); + }); + + }); + + } else { + + let classFeatureSelectionOptions = $("#"+classAbilityID).find(".classFeatureSelectionOptions"); + classFeatureSelectionOptions.addClass('is-hidden'); + + } + + }); + + }); + + + let featCount = 0; + $("#addFeatButton").click(function(){ + featCount++; + + let featID = "feat"+featCount; + + let newFeat = $("#featLayout").clone(); + newFeat.attr('id', featID); + newFeat.removeClass('is-hidden'); + newFeat.appendTo("#featContent"); + + let cardHeader = $("#"+featID).find(".card-header"); + let cardContent = $("#"+featID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+featID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+featID).remove(); + }); + + let inputFeatName = $("#"+featID).find(".inputFeatName"); + inputFeatName.change(function(){ + $("#"+featID).find(".card-header-title").html('Class Feat - '+inputFeatName.val()); + }); + + $("#"+featID).find(".inputFeatTags").chosen(); + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishClass(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishClass(isUpdate){ + + let className = $("#inputName").val(); + let classHitPoints = $("#inputHitPoints").val(); + + let classKeyAbility = $("#inputKeyAbility").val(); + if(classKeyAbility === 'OR'){ + classKeyAbility = $("#inputKeyAbilityOptionOne").val()+' or '+$("#inputKeyAbilityOptionTwo").val(); + } + + let classPerception = $("#inputPerception").val(); + let classSkills = $("#inputSkills").val(); + let classSkillsMore = $("#inputSkillsMore").val(); + let classFortitude = $("#inputFortitude").val(); + let classReflex = $("#inputReflex").val(); + let classWill = $("#inputWill").val(); + + let classClassDC = $("#inputClassDC").val(); + + let classWeaponsTrainedArray = $("#inputWeaponsTrained").val(); + let classWeaponsExpertArray = $("#inputWeaponsExpert").val(); + let classWeapons = ''; + + for(let classWeaponsTrained of classWeaponsTrainedArray) { + classWeapons += 'T:::'+classWeaponsTrained+',,, '; + } + for(let classWeaponsExpert of classWeaponsExpertArray) { + classWeapons += 'E:::'+classWeaponsExpert+',,, '; + } + classWeapons = classWeapons.slice(0, -4); // Trim off that last ',,, ' + + + let classArmorTrainedArray = $("#inputArmorTrained").val(); + let classArmorExpertArray = $("#inputArmorExpert").val(); + let classArmor = ''; + + for(let classArmorTrained of classArmorTrainedArray) { + classArmor += 'T:::'+classArmorTrained+',,, '; + } + for(let classArmorExpert of classArmorExpertArray) { + classArmor += 'E:::'+classArmorExpert+',,, '; + } + classArmor = classArmor.slice(0, -4); // Trim off that last ',,, ' + + let classDescription = $("#inputDescription").val(); + let classImageURL = $("#inputImageURL").val(); + + + let classAbilitiesArray = []; + $(".classFeature").each(function(){ + if(!$(this).hasClass("isLayout")) { + let classFeatureName = $(this).find(".inputClassFeatureName").val(); + let classFeatureLevel = $(this).find(".inputClassFeatureLevel").val(); + let classFeatureDesc = $(this).find(".inputClassFeatureDesc").val(); + let classFeatureCode = $(this).find(".inputClassFeatureCode").val(); + let classFeatureDisplayInSheet = ($(this).find(".inputClassFeatureDisplayInSheet:checked").val() == '1') ? 1 : 0; + + let classFeatureOptions = []; + if($(this).find(".inputClassFeatureIsSelector").is(":checked")) { + if(!$(this).find(".classFeatureSelectionOptions").hasClass("isLayout")){ + $(this).find(".classFeatureOption").each(function(){ + classFeatureOptions.push({ + name: $(this).find(".inputClassFeatureName").val(), + description: $(this).find(".inputClassFeatureDesc").val(), + code: $(this).find(".inputClassFeatureCode").val(), + }); + }); + } + } + + classAbilitiesArray.push({ + name: classFeatureName, + level: classFeatureLevel, + description: classFeatureDesc, + code: classFeatureCode, + displayInSheet: classFeatureDisplayInSheet, + options: classFeatureOptions, + }); + } + }); + + let classFeatsArray = []; + $(".classFeat").each(function(){ + if($(this).is(":visible")) { + let featName = $(this).find(".inputFeatName").val(); + let featLevel = $(this).find(".inputFeatLevel").val(); + let featActions = $(this).find(".inputFeatActions").val(); + let featRarity = $(this).find(".inputFeatRarity").val(); + let featTagsArray = $(this).find(".inputFeatTags").val(); + let featPrereq = $(this).find(".inputFeatPrereq").val(); + let featReq = $(this).find(".inputFeatReq").val(); + let featFreq = $(this).find(".inputFeatFreq").val(); + let featCost = $(this).find(".inputFeatCost").val(); + let featTrigger = $(this).find(".inputFeatTrigger").val(); + let featDesc = $(this).find(".inputFeatDesc").val(); + let featSpecial = $(this).find(".inputFeatSpecial").val(); + let featSelectMultiple = ($(this).find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + let featCode = $(this).find(".inputFeatCode").val(); + classFeatsArray.push({ + name: featName, + actions: featActions, + level: featLevel, + rarity: featRarity, + prerequisites: featPrereq, + frequency: featFreq, + cost: featCost, + trigger: featTrigger, + requirements: featReq, + description: featDesc, + special: featSpecial, + canSelectMultiple: featSelectMultiple, + code: featCode, + featTagsArray + }); + } + }); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let classID = $('#builder-container').attr('data-class-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateClass"; + } else { + requestPacket = "requestHomebrewAddClass"; + } + + + socket.emit(requestPacket, g_homebrewID, { + classID, + className, + classHitPoints, + classKeyAbility, + classPerception, + classSkills, + classSkillsMore, + classFortitude, + classReflex, + classWill, + classClassDC, + classWeapons, + classArmor, + classDescription, + classImageURL, + classAbilitiesArray, + classFeatsArray + }); + +} + +socket.on("returnHomebrewCompleteClass", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/cClass/editor-class.js b/client/vue-src/legacy-js/homebrew/builder/cClass/editor-class.js new file mode 100644 index 00000000..30ef90e8 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/cClass/editor-class.js @@ -0,0 +1,206 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewClassDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewClassDetails", function(classObject, featsObject){ + + let classMap = objToMap(classObject); + let featMap = objToMap(featsObject); + + let cClass = classMap.get($('#builder-container').attr('data-class-id')); + + if(cClass == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputName").val(cClass.Class.name); + $("#inputHitPoints").val(cClass.Class.hitPoints); + + let classKeyAbility = cClass.Class.keyAbility; + if(classKeyAbility === null){ + $("#inputKeyAbility").val(''); + } else if(classKeyAbility.includes(' or ')){ + $("#inputKeyAbility").val('OR'); + let keyAbilData = classKeyAbility.split(' or '); + $("#inputKeyAbilityOptionOne").val(keyAbilData[0]); + $("#inputKeyAbilityOptionTwo").val(keyAbilData[1]); + $("#inputKeyAbility").trigger("change"); + } else { + $("#inputKeyAbility").val(classKeyAbility); + } + + $("#inputPerception").val(cClass.Class.tPerception); + $("#inputSkills").val(cClass.Class.tSkills); + $("#inputSkillsMore").val(cClass.Class.tSkillsMore); + $("#inputFortitude").val(cClass.Class.tFortitude); + $("#inputReflex").val(cClass.Class.tReflex); + $("#inputWill").val(cClass.Class.tWill); + $("#inputClassDC").val(cClass.Class.tClassDC); + $("#inputDescription").val(cClass.Class.description); + $("#inputImageURL").val(cClass.Class.artworkURL); + + if(cClass.Class.tWeapons != null){ + let classWeaponsArray = cClass.Class.tWeapons.split(',,, '); + for(let classWeapon of classWeaponsArray) { + let weapData = classWeapon.split(':::'); + if(weapData[0] === 'T'){ + $('#inputWeaponsTrained option[value="'+weapData[1]+'"]').attr('selected','selected'); + } else if(weapData[0] === 'E'){ + $('#inputWeaponsExpert option[value="'+weapData[1]+'"]').attr('selected','selected'); + } + } + $('#inputWeaponsTrained').trigger("chosen:updated"); + $('#inputWeaponsExpert').trigger("chosen:updated"); + } + + if(cClass.Class.tArmor != null){ + let classArmorArray = cClass.Class.tArmor.split(',,, '); + for(let classArmor of classArmorArray) { + let armorData = classArmor.split(':::'); + if(armorData[0] === 'T'){ + $('#inputArmorTrained option[value="'+armorData[1]+'"]').attr('selected','selected'); + } else if(armorData[0] === 'E'){ + $('#inputArmorExpert option[value="'+armorData[1]+'"]').attr('selected','selected'); + } + } + $('#inputArmorTrained').trigger("chosen:updated"); + $('#inputArmorExpert').trigger("chosen:updated"); + } + + // Class Abilities // + let filteredClassAbils = []; + for(let classAbil of cClass.Abilities){ + if(classAbil.indivClassName == null){ + filteredClassAbils.push(classAbil); + } + } + + for(let classAbil of filteredClassAbils){ + if(classAbil.selectType != 'SELECT_OPTION') { + $("#addClassFeatureButton").trigger("click"); + } + } + + let classAbilCount = 0; + $(".classFeature").each(function(){ + if(!$(this).hasClass("isLayout")) { + let classAbil = filteredClassAbils[classAbilCount]; + classAbilCount++; + while (classAbil.selectType === 'SELECT_OPTION') { + classAbil = filteredClassAbils[classAbilCount]; + classAbilCount++; + } + + $(this).find(".inputClassFeatureName").val(classAbil.name); + $(this).find(".inputClassFeatureLevel").val(classAbil.level); + $(this).find(".inputClassFeatureDesc").val(classAbil.description); + $(this).find(".inputClassFeatureCode").val(classAbil.code); + let displayInSheet = (classAbil.displayInSheet == 1) ? true : false; + $(this).find(".inputClassFeatureDisplayInSheet").prop('checked', displayInSheet); + + // Minimize Class Ability + $(this).find(".card-header").trigger("click"); + // Trigger Class Ability Name and Tags + $(this).find(".inputClassFeatureName").trigger("change"); + + if(classAbil.selectType === 'SELECTOR'){ + $(this).find(".inputClassFeatureIsSelector").prop('checked', true); + $(this).find(".inputClassFeatureIsSelector").trigger("change"); + + let classAbilOptionsArray = []; + for(let classAbilOption of filteredClassAbils){ + if(classAbilOption.selectType === 'SELECT_OPTION' && classAbilOption.selectOptionFor === classAbil.id){ + classAbilOptionsArray.push(classAbilOption); + $(this).find(".classFeatureAddOptionButton").trigger("click"); + } + } + + let classAbilOptionCount = 0; + $(this).find(".classFeatureOption").each(function(){ + let classAbilOption = classAbilOptionsArray[classAbilOptionCount]; + classAbilOptionCount++; + + $(this).find(".inputClassFeatureName").val(classAbilOption.name); + $(this).find(".inputClassFeatureDesc").val(classAbilOption.description); + $(this).find(".inputClassFeatureCode").val(classAbilOption.code); + + }); + + } + + } + }); + + + // Class Feats // + let classFeats = []; + for(const [key, value] of featMap.entries()){ + let classTag = value.Tags.find(tag => { + return tag.id === cClass.Class.tagID; + }); + if(classTag != null && value.Feat.genericType == null){ + $("#addFeatButton").trigger("click"); + classFeats.push(value); + } + } + + classFeats = classFeats.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + let classFeatCount = 0; + $(".classFeat").each(function(){ + if($(this).is(":visible")) { + let feat = classFeats[classFeatCount]; + classFeatCount++; + + $(this).find(".inputFeatName").val(feat.Feat.name); + $(this).find(".inputFeatLevel").val(feat.Feat.level); + $(this).find(".inputFeatActions").val(feat.Feat.actions); + $(this).find(".inputFeatRarity").val(feat.Feat.rarity); + $(this).find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $(this).find(".inputFeatReq").val(feat.Feat.requirements); + $(this).find(".inputFeatFreq").val(feat.Feat.frequency); + $(this).find(".inputFeatCost").val(feat.Feat.cost); + $(this).find(".inputFeatTrigger").val(feat.Feat.trigger); + $(this).find(".inputFeatDesc").val(feat.Feat.description); + $(this).find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $(this).find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $(this).find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != cClass.Class.tagID) { + $(this).find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + // Minimize Feat + $(this).find(".card-header").trigger("click"); + // Trigger Feat Name and Tags + $(this).find(".inputFeatName").trigger("change"); + $(this).find(".inputFeatTags").trigger("chosen:updated"); + } + }); + + + $("#updateButton").click(function(){ + $(this).unbind(); + finishClass(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/class-feature/builder-class-feature.js b/client/vue-src/legacy-js/homebrew/builder/class-feature/builder-class-feature.js new file mode 100644 index 00000000..56050b85 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/class-feature/builder-class-feature.js @@ -0,0 +1,225 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + socket.emit("requestHomebrewClassDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewClassDetails", function(classObject, featsObject){ + + let classMap = objToMap(classObject); + classMap = new Map([...classMap.entries()].sort( + function(a, b) { + return a[1].Class.name > b[1].Class.name ? 1 : -1; + }) + ); + + $('#inputClassFor').html(''); + for(const [classID, classData] of classMap.entries()){ + if(classData.Class.isArchived == 0){ + $('#inputClassFor').append(''); + } + } + + + $('#inputClassFor').change(function(){ + $('#inputClassFeatureFor').html(''); + for(const [classID, classData] of classMap.entries()){ + if($(this).val() == classData.Class.name){ + for(let ability of classData.Abilities){ + if(ability.isArchived == 0 && ability.selectType == 'SELECTOR'){ + $('#inputClassFeatureFor').append(''); + } + } + break; + } + } + }); + $('#inputClassFor').trigger("change"); + + let newClassAbility = $("#classFeatureLayout").clone(); + newClassAbility.attr('id', "classAbility0"); + newClassAbility.removeClass('is-hidden'); + newClassAbility.removeClass('isLayout'); + newClassAbility.find('.card-header').addClass('is-hidden'); + newClassAbility.appendTo("#classFeatureContent"); + + + $('#inputBuilderType').change(function(){ + if($(this).val() == 'FEATURE'){ + $('#sectionClassFeatureFor').addClass('is-hidden'); + $('#classAbility0').find(".classFeatureLevelSection").removeClass('is-hidden'); + $('#classAbility0').find(".classFeatureDisplayInSheetSection").removeClass('is-hidden'); + $('#classAbility0').find(".classFeatureIsSelectorSection").removeClass('is-hidden'); + if($("#classAbility0").find(".inputClassFeatureIsSelector").is(":checked")){ + $('#classAbility0').find(".classFeatureSelectionOptions").removeClass('is-hidden'); + } + } else if($(this).val() == 'FEATURE-OPTION'){ + $('#sectionClassFeatureFor').removeClass('is-hidden'); + $('#classAbility0').find(".classFeatureLevelSection").addClass('is-hidden'); + $('#classAbility0').find(".classFeatureDisplayInSheetSection").addClass('is-hidden'); + $('#classAbility0').find(".classFeatureIsSelectorSection").addClass('is-hidden'); + $('#classAbility0').find(".classFeatureSelectionOptions").addClass('is-hidden'); + } + }); + $('#inputBuilderType').trigger("change"); + + + // When 'Is Selector' checkbox is changed + let inputClassFeatureIsSelector = $("#classAbility0").find(".inputClassFeatureIsSelector"); + inputClassFeatureIsSelector.change(function(){ + + if ($(this).is(":checked")) { + + let classFeatureSelectionOptions = $("#classAbility0").find(".classFeatureSelectionOptions"); + classFeatureSelectionOptions.removeClass('is-hidden'); + + let classFeatureOptionsContent = $("#classAbility0").find(".classFeatureOptionsContent"); + let classFeatureAddOptionButton = $("#classAbility0").find(".classFeatureAddOptionButton"); + let classAbilityOptionsCount = 0; + classFeatureAddOptionButton.click(function(){ + classAbilityOptionsCount++; + + let classAbilityOptionID = "classAbility0Option"+classAbilityOptionsCount; + + let newClassAbilityOption = $("#classFeatureLayout").clone(); + newClassAbilityOption.attr('id', classAbilityOptionID); + newClassAbilityOption.removeClass('is-hidden'); + newClassAbilityOption.removeClass('isLayout'); + newClassAbilityOption.removeClass('classFeature'); + newClassAbilityOption.addClass('classFeatureOption'); + newClassAbilityOption.find(".classFeatureLevelSection").remove(); + newClassAbilityOption.find(".classFeatureDisplayInSheetSection").remove(); + newClassAbilityOption.find(".classFeatureIsSelectorSection").remove(); + newClassAbilityOption.find(".classFeatureSelectionOptions").remove(); + newClassAbilityOption.find(".card-header-title").html('Option'); + newClassAbilityOption.appendTo(classFeatureOptionsContent); + + let cardHeader = $("#"+classAbilityOptionID).find(".card-header"); + let cardContent = $("#"+classAbilityOptionID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+classAbilityOptionID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+classAbilityOptionID).remove(); + }); + + }); + + } else { + + let classFeatureSelectionOptions = $("#classAbility0").find(".classFeatureSelectionOptions"); + classFeatureSelectionOptions.addClass('is-hidden'); + + } + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishClassFeature(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishClassFeature(isUpdate){ + + let classFeatureClassName = $("#inputClassFor").val(); + let classFeatureClassAbilName = null; + if($("#inputClassFeatureFor").is(":visible")) { + classFeatureClassAbilName = $("#inputClassFeatureFor").val(); + } + + let classFeatureData = null; + + if($('#inputBuilderType').val() == 'FEATURE') { + + $(".classFeature").each(function(){ + if(!$(this).hasClass("isLayout")) { + let classFeatureName = $(this).find(".inputClassFeatureName").val(); + let classFeatureLevel = $(this).find(".inputClassFeatureLevel").val(); + let classFeatureDesc = $(this).find(".inputClassFeatureDesc").val(); + let classFeatureCode = $(this).find(".inputClassFeatureCode").val(); + let classFeatureDisplayInSheet = ($(this).find(".inputClassFeatureDisplayInSheet:checked").val() == '1') ? 1 : 0; + + let classFeatureOptions = []; + if($(this).find(".inputClassFeatureIsSelector").is(":checked")) { + if(!$(this).find(".classFeatureSelectionOptions").hasClass("isLayout")){ + $(this).find(".classFeatureOption").each(function(){ + classFeatureOptions.push({ + name: $(this).find(".inputClassFeatureName").val(), + description: $(this).find(".inputClassFeatureDesc").val(), + code: $(this).find(".inputClassFeatureCode").val(), + }); + }); + } + } + + classFeatureData = { + name: classFeatureName, + level: classFeatureLevel, + description: classFeatureDesc, + code: classFeatureCode, + displayInSheet: classFeatureDisplayInSheet, + options: classFeatureOptions, + }; + } + }); + + } else if($('#inputBuilderType').val() == 'FEATURE-OPTION') { + + $(".classFeature").each(function(){ + if(!$(this).hasClass("isLayout")) { + let classFeatureName = $(this).find(".inputClassFeatureName").val(); + let classFeatureDesc = $(this).find(".inputClassFeatureDesc").val(); + let classFeatureCode = $(this).find(".inputClassFeatureCode").val(); + + classFeatureData = { + name: classFeatureName, + description: classFeatureDesc, + code: classFeatureCode, + }; + } + }); + + } + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let classFeatureID = $('#builder-container').attr('data-class-feature-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateClassFeature"; + } else { + requestPacket = "requestHomebrewAddClassFeature"; + } + + socket.emit(requestPacket, g_homebrewID, { + classFeatureID, + classFeatureData, + classFeatureClassName, + classFeatureClassAbilName + }); + +} + +socket.on("returnHomebrewCompleteClassFeature", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/class-feature/editor-class-feature.js b/client/vue-src/legacy-js/homebrew/builder/class-feature/editor-class-feature.js new file mode 100644 index 00000000..08768093 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/class-feature/editor-class-feature.js @@ -0,0 +1,88 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnHomebrewClassDetails", function(classObject, featsObject){ + + let classMap = objToMap(classObject); + + let classFeatureID = $('#builder-container').attr('data-class-feature-id'); + + let cClass = null; + let classFeature = null; + for(const [classID, classData] of classMap.entries()){ + for(let ability of classData.Abilities){ + if(ability.id == classFeatureID){ + classFeature = ability; + cClass = classData; + break; + } + } + } + + if(classFeature == null){ + window.location.href = '/homebrew'; + return; + } + + $('#inputClassFor').val(classFeature.indivClassName); + + $('#inputClassFor').trigger("change"); + + if(classFeature.indivClassAbilName != null){ + $('#inputBuilderType').val('FEATURE-OPTION'); + $('#inputBuilderType').trigger("change"); + $('#inputClassFeatureFor').val(classFeature.indivClassAbilName); + } else { + $('#inputBuilderType').trigger("change"); + } + + $("#classAbility0").find(".inputClassFeatureName").val(classFeature.name); + if(classFeature.level == null) {classFeature.level = 1;} + $("#classAbility0").find(".inputClassFeatureLevel").val(classFeature.level); + $("#classAbility0").find(".inputClassFeatureDesc").val(classFeature.description); + $("#classAbility0").find(".inputClassFeatureCode").val(classFeature.code); + let displayInSheet = (classFeature.displayInSheet == 1) ? true : false; + $("#classAbility0").find(".inputClassFeatureDisplayInSheet").prop('checked', displayInSheet); + + // Minimize Class Ability + $("#classAbility0").find(".card-header").trigger("click"); + // Trigger Class Ability Name and Tags + $("#classAbility0").find(".inputClassFeatureName").trigger("change"); + + if(classFeature.selectType === 'SELECTOR'){ + $("#classAbility0").find(".inputClassFeatureIsSelector").prop('checked', true); + $("#classAbility0").find(".inputClassFeatureIsSelector").trigger("change"); + + let classAbilOptionsArray = []; + for(let classAbilOption of cClass.Abilities){ + if(classAbilOption.selectType === 'SELECT_OPTION' && classAbilOption.selectOptionFor === classFeature.id){ + classAbilOptionsArray.push(classAbilOption); + $("#classAbility0").find(".classFeatureAddOptionButton").trigger("click"); + } + } + + let classAbilOptionCount = 0; + $("#classAbility0").find(".classFeatureOption").each(function(){ + let classAbilOption = classAbilOptionsArray[classAbilOptionCount]; + classAbilOptionCount++; + + $(this).find(".inputClassFeatureName").val(classAbilOption.name); + $(this).find(".inputClassFeatureDesc").val(classAbilOption.description); + $(this).find(".inputClassFeatureCode").val(classAbilOption.code); + + }); + + } + + $("#updateButton").click(function(){ + $(this).unbind(); + finishClassFeature(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/creature/builder-creature.js b/client/vue-src/legacy-js/homebrew/builder/creature/builder-creature.js new file mode 100644 index 00000000..b7a5c840 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/creature/builder-creature.js @@ -0,0 +1,207 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + socket.emit("requestHomebrewCreatureDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewCreatureDetails", function (creatureArray) { + + + let skillCount = 0; + $("#addSkillButton").click(function () { + skillCount++; + + let skillID = "skill" + skillCount; + let newSkill = $("#skillLayout").clone(); + newSkill.attr('id', skillID); + newSkill.removeClass('is-hidden'); + newSkill.appendTo("#skillContent"); + + let cardHeader = $("#" + skillID).find(".card-header"); + let cardContent = $("#" + skillID).find(".card-content"); + + cardHeader.click(function () { + if (cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#" + skillID).find(".card-header-icon"); + cardHeaderIcon.click(function () { + $("#" + skillID).remove(); + }); + + let inputSkillName = $("#" + skillID).find(".inputSkillName"); + inputSkillName.change(function () { + $("#" + skillID).find(".card-header-title").html('Skill - ' + inputSkillName.val()); + }); + + }); + + let itemCount = 0; + $("#addItemButton").click(function () { + itemCount++; + + let itemID = "item" + itemCount; + let newItem = $("#itemLayout").clone(); + newItem.attr('id', itemID); + newItem.removeClass('is-hidden'); + newItem.appendTo("#itemContent"); + + let cardHeader = $("#" + itemID).find(".card-header"); + let cardContent = $("#" + itemID).find(".card-content"); + + cardHeader.click(function () { + if (cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#" + itemID).find(".card-header-icon"); + cardHeaderIcon.click(function () { + $("#" + itemID).remove(); + }); + + let inputItemName = $("#" + itemID).find(".inputItemDisplayName"); + inputItemName.change(function () { + $("#" + itemID).find(".card-header-title").html('Item - ' + inputItemName.val()); + }); + + }); + + + + + $("#createButton").click(function () { + $(this).unbind(); + finishCreature(false); + }); + + if ($("#createButton").length) {// If button exists + stopSpinnerLoader(); + } +}); + +function finishCreature(isUpdate) { + + let name = $("#inputName").val(); + let level = $("#inputLevel").val(); + let rarity = $("#inputRarity").val(); + let alignment = $("#inputAlignment").val(); + let size = $("#inputSize").val(); + let tagsArray = $("#inputTags").val(); + let familyType = $("#inputFamilyType").val(); + let perceptionBonus = $("#inputPerceptionBonus").val(); + let senses = $("#inputSenses").val(); + let langsArray = $("#inputLanguages").val(); + let languagesCustom = $("#inputLanguagesCustom").val(); + + let skillsArray = []; + $(".creatureSkill").each(function () { + if ($(this).is(":visible")) { + let skillName = $(this).find(".inputSkillName").val(); + let skillBonus = $(this).find(".inputSkillBonus").val(); + skillsArray.push({ + name: skillName, + bonus: skillBonus, + }); + } + }); + + let itemsArray = []; + $(".creatureItem").each(function () { + if ($(this).is(":visible")) { + let itemDisplayName = $(this).find(".inputItemDisplayName").val(); + let itemQuantity = $(this).find(".inputItemQuantity").val(); + itemsArray.push({ + displayName: itemDisplayName, + quantity: itemQuantity, + name: null, + doIndex: false, + shieldStats: null, + }); + } + }); + + let strMod = $("#inputStrMod").val(); + let dexMod = $("#inputDexMod").val(); + let conMod = $("#inputConMod").val(); + let intMod = $("#inputIntMod").val(); + let wisMod = $("#inputWisMod").val(); + let chaMod = $("#inputChaMod").val(); + + let acValue = $("#inputACValue").val(); + let fortValue = $("#inputFortValue").val(); + let reflexValue = $("#inputReflexValue").val(); + let willValue = $("#inputWillValue").val(); + let allSavesCustom = $("#inputAllSavesCustom").val(); + + let hpMax = $("#inputHPMax").val(); + let hpDetails = $("#inputHPDetails").val(); + + let speed = $("#inputSpeed").val(); + + let description = $("#inputDescription").val(); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let creatureID = $('#builder-container').attr('data-creature-id'); + if (isUpdate) { + requestPacket = "requestHomebrewUpdateCreature"; + } else { + requestPacket = "requestHomebrewAddCreature"; + } + + socket.emit(requestPacket, g_homebrewID, { + creatureID, + name, + level, + rarity, + alignment, + size, + tagsArray, + familyType, + perceptionBonus, + senses, + langsArray, + languagesCustom, + + skillsArray, + itemsArray, + + strMod, + dexMod, + conMod, + intMod, + wisMod, + chaMod, + + acValue, + fortValue, + reflexValue, + willValue, + allSavesCustom, + + hpMax, + hpDetails, + speed, + description, + }); + +} + +socket.on("returnHomebrewCompleteCreature", function () { + window.location.href = '/homebrew/?edit_id=' + g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/creature/editor-creature.js b/client/vue-src/legacy-js/homebrew/builder/creature/editor-creature.js new file mode 100644 index 00000000..0e809032 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/creature/editor-creature.js @@ -0,0 +1,34 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnHomebrewHeritageDetails", function(heritageArray, ancestryArray){ + + let heritageID = $('#builder-container').attr('data-heritage-id'); + let heritage = heritageArray.find(heritage => { + return heritage.id == heritageID; + }); + + if(heritage == null){ + window.location.href = '/homebrew'; + return; + } + + let heritageName = heritage.name.replace(" "+heritage.indivAncestryName,""); + $('#inputName').val(heritageName); + $('#inputRarity').val(heritage.rarity); + $('#inputDesc').val(heritage.description); + $('#inputCode').val(heritage.code); + $('#inputHeritageFor').val(heritage.indivAncestryName); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishHeritage(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/feat-action/builder-feat-action.js b/client/vue-src/legacy-js/homebrew/builder/feat-action/builder-feat-action.js new file mode 100644 index 00000000..6bbfa081 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/feat-action/builder-feat-action.js @@ -0,0 +1,242 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let g_homebrewID = null; + +let g_classMap = null; +let g_ancestryMap = null; +let g_uniHeritageArray = null; +let g_archetypeArray = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $("#inputFeatTags").chosen(); + + socket.emit("requestHomebrewFeatDetailsPlus", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewFeatDetailsPlus", function(featsObject, classObject, ancestryObject, uniHeritageArray, archetypeArray){ + + g_classMap = objToMap(classObject); + g_classMap = new Map([...g_classMap.entries()].sort( + function(a, b) { + return a[1].Class.name > b[1].Class.name ? 1 : -1; + }) + ); + + g_ancestryMap = objToMap(ancestryObject); + g_ancestryMap = new Map([...g_ancestryMap.entries()].sort( + function(a, b) { + return a[1].Ancestry.name > b[1].Ancestry.name ? 1 : -1; + }) + ); + + g_uniHeritageArray = uniHeritageArray; + + g_archetypeArray = archetypeArray; + + + $('#inputClassOptions').html(''); + for(const [classID, classData] of g_classMap.entries()){ + if(classData.Class.isArchived === 0){ + $('#inputClassOptions').append(''); + } + } + + $('#inputArchetypeOptions').html(''); + for(const archetype of g_archetypeArray){ + if(archetype.isArchived === 0){ + $('#inputArchetypeOptions').append(''); + } + } + + $('#inputAncestryOptions').html(''); + for(const [ancestryID, ancestryData] of g_ancestryMap.entries()){ + if(ancestryData.Ancestry.isArchived === 0){ + $('#inputAncestryOptions').append(''); + } + } + $('#inputAncestryOptions').append(''); + for(const uniHeritage of g_uniHeritageArray){ + if(uniHeritage.isArchived === 0){ + $('#inputAncestryOptions').append(''); + } + } + + let builderTypeSelection = $("#inputBuilderType"); + builderTypeSelection.change(function(){ + let builderType = $(this).val(); + if(builderType == "GENERAL-FEAT"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "SKILL-FEAT"){ + $("#sectionSkill").removeClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "CLASS-FEAT"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").removeClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "ANCESTRY-FEAT"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").removeClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "ARCHETYPE-FEAT"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").removeClass('is-hidden'); + $("#sectionSelectMultiple").removeClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").removeClass('is-hidden'); + } else if(builderType == "BASIC-ACTION"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").addClass('is-hidden'); + $("#sectionSelectMultiple").addClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "SKILL-ACTION"){ + $("#sectionSkill").removeClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").addClass('is-hidden'); + $("#sectionSelectMultiple").addClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "CREATURE-ACTION"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").addClass('is-hidden'); + $("#sectionSelectMultiple").addClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } else if(builderType == "COMPANION-ACTION"){ + $("#sectionSkill").addClass('is-hidden'); + $("#sectionMinProf").addClass('is-hidden'); + $("#sectionLevel").addClass('is-hidden'); + $("#sectionSelectMultiple").addClass('is-hidden'); + $("#sectionClassOptions").addClass('is-hidden'); + $("#sectionAncestryOptions").addClass('is-hidden'); + $("#sectionArchetypeOptions").addClass('is-hidden'); + } + }); + builderTypeSelection.trigger("change"); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishFeat(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishFeat(isUpdate){ + + let builderType = $("#inputBuilderType").val(); + let featName = $("#inputFeatName").val(); + let featLevel = ($("#inputFeatLevel").is(":visible")) ? $("#inputFeatLevel").val() : null; + let featMinProf = ($("#inputFeatMinProf").is(":visible")) ? $("#inputFeatMinProf").val() : null; + let featSkillID = ($("#inputFeatSkill").is(":visible")) ? $("#inputFeatSkill").val() : null; + let featActions = $("#inputFeatActions").val(); + let featRarity = $("#inputFeatRarity").val(); + let featTagsArray = $("#inputFeatTags").val(); + let featPrereq = $("#inputFeatPrereq").val(); + let featReq = $("#inputFeatReq").val(); + let featFreq = $("#inputFeatFreq").val(); + let featCost = $("#inputFeatCost").val(); + let featTrigger = $("#inputFeatTrigger").val(); + let featDesc = $("#inputFeatDesc").val(); + let featSpecial = $("#inputFeatSpecial").val(); + let featSelectMultiple = null; + if($("#inputFeatSelectMultiple").is(":visible")) { + featSelectMultiple = ($("#inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + } + let featCode = $("#inputFeatCode").val(); + + let featGenTypeName = null; + if($("#inputClassOptions").is(":visible")) { + let classID = $('#inputClassOptions').val(); + let classData = g_classMap.get(classID+""); + if(classData != null){ + featGenTypeName = classData.Class.name; + } + } else if($("#inputAncestryOptions").is(":visible")) { + let ancestryID = $('#inputAncestryOptions').val(); + if(isNaN(ancestryID)){ + featGenTypeName = ancestryID; // Must be UniHeritage Name + } else { + let ancestryData = g_ancestryMap.get(ancestryID+""); + if(ancestryData != null){ + featGenTypeName = ancestryData.Ancestry.name; + } + } + } else if($("#inputArchetypeOptions").is(":visible")) { + featGenTypeName = $('#inputArchetypeOptions').val()+' Archetype'; + } + + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let featID = $('#builder-container').attr('data-feat-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateFeat"; + } else { + requestPacket = "requestHomebrewAddFeat"; + } + + + socket.emit(requestPacket, g_homebrewID, { + featID, + builderType, + featName, + featLevel, + featMinProf, + featSkillID, + featActions, + featRarity, + featTagsArray, + featPrereq, + featReq, + featFreq, + featCost, + featTrigger, + featDesc, + featSpecial, + featSelectMultiple, + featCode, + featGenTypeName, + }); + +} + +socket.on("returnHomebrewCompleteFeat", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/feat-action/editor-feat-action.js b/client/vue-src/legacy-js/homebrew/builder/feat-action/editor-feat-action.js new file mode 100644 index 00000000..85b5c334 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/feat-action/editor-feat-action.js @@ -0,0 +1,159 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnHomebrewFeatDetailsPlus", function(featsObject, classObject, ancestryObject, uniHeritageArray){ + + let featMap = objToMap(featsObject); + g_classMap = objToMap(classObject); + g_ancestryMap = objToMap(ancestryObject); + g_uniHeritageArray = uniHeritageArray; + + let feat = featMap.get($('#builder-container').attr('data-feat-id')); + + if(feat == null){ + window.location.href = '/homebrew'; + return; + } + + if(feat.Feat.genericType == null) { + determineGenericType(feat); + } + feat.Feat.genericType = feat.Feat.genericType.replace(/_/g, '-'); + $("#inputBuilderType").val(feat.Feat.genericType); + $("#inputFeatName").val(feat.Feat.name); + $("#inputFeatLevel").val(feat.Feat.level); + let minProf = (feat.Feat.minProf != null) ? feat.Feat.minProf : $("#inputFeatMinProf option:first").val(); + $("#inputFeatMinProf").val(minProf); + let skillID = (feat.Feat.skillID != null) ? feat.Feat.skillID : $("#inputFeatSkill option:first").val(); + $("#inputFeatSkill").val(skillID); + $("#inputFeatActions").val(feat.Feat.actions); + $("#inputFeatRarity").val(feat.Feat.rarity); + $("#inputFeatPrereq").val(feat.Feat.prerequisites); + $("#inputFeatReq").val(feat.Feat.requirements); + $("#inputFeatFreq").val(feat.Feat.frequency); + $("#inputFeatCost").val(feat.Feat.cost); + $("#inputFeatTrigger").val(feat.Feat.trigger); + $("#inputFeatDesc").val(feat.Feat.description); + $("#inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $("#inputFeatSelectMultiple").prop('checked', checkBoxState); + $("#inputFeatCode").val(feat.Feat.code); + + const GENERAL_TAG_ID = 8; // Hardcoded General and Skill Tag IDs + const SKILL_TAG_ID = 9; + for(let featTag of feat.Tags){ + if(featTag.id != GENERAL_TAG_ID && featTag.id != SKILL_TAG_ID){ + $("#inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + $("#inputFeatTags").trigger("chosen:updated"); + $("#inputBuilderType").trigger("change"); + + + if(feat.Feat.genericType === 'CLASS-FEAT'){ + let classID = getClassIDFromFeat(feat); + if(classID != null){ + $('#inputClassOptions').val(classID); + } + } else if(feat.Feat.genericType === 'ANCESTRY-FEAT'){ + let ancestryID = getAncestryIDFromFeat(feat); + if(ancestryID != null){ + $('#inputAncestryOptions').val(ancestryID); + } + } else if(feat.Feat.genericType === 'ARCHETYPE-FEAT'){ + let archetypeID = getArchetypeIDFromFeat(feat); + if(archetypeID != null){ + $('#inputArchetypeOptions').val(archetypeID); + } + } + + $("#updateButton").click(function(){ + $(this).unbind(); + finishFeat(true); + }); + + stopSpinnerLoader(); +}); + +function getClassIDFromFeat(feat){ + for(const [classID, classData] of g_classMap.entries()){ + if(classData.Class.isArchived === 0 && classData.Class.name === feat.Feat.genTypeName){ + return classID; + } + } + return null; +} + +function getAncestryIDFromFeat(feat){ + for(const [ancestryID, ancestryData] of g_ancestryMap.entries()){ + if(ancestryData.Ancestry.isArchived === 0 && ancestryData.Ancestry.name === feat.Feat.genTypeName){ + return ancestryID; + } + } + for(const uniHeritage of g_uniHeritageArray){ + if(uniHeritage.isArchived === 0 && uniHeritage.name === feat.Feat.genTypeName){ + return uniHeritage.name; + } + } + return null; +} + +function getArchetypeIDFromFeat(feat){ + for(const archetype of g_archetypeArray){ + if(archetype.isArchived === 0 && archetype.name === feat.Feat.genTypeName){ + return archetype.name; + } + } + return null; +} + + +function determineGenericType(feat){ + if(feat.Feat.genericType != null) { return; } + + for(let tag of feat.Tags){ + + for(const [ancestryID, ancestryData] of g_ancestryMap.entries()){ + if(ancestryData.Ancestry.tagID == tag.id){ + feat.Feat.genericType = 'ANCESTRY-FEAT'; + feat.Feat.genTypeName = ancestryData.Ancestry.name; + return; + } + } + + for(const uniHeritage of g_uniHeritageArray){ + if(uniHeritage.tagID == tag.id){ + feat.Feat.genericType = 'ANCESTRY-FEAT'; + feat.Feat.genTypeName = uniHeritage.name; + return; + } + } + + for(const [classID, classData] of g_classMap.entries()){ + if(classData.Class.tagID == tag.id){ + feat.Feat.genericType = 'CLASS-FEAT'; + feat.Feat.genTypeName = classData.Class.name; + return; + } + } + + for(const archetype of g_archetypeArray){ + if(archetype.tagID == tag.id){ + feat.Feat.genericType = 'ARCHETYPE-FEAT'; + feat.Feat.genTypeName = archetype.name; + return; + } + } + + } + + feat.Feat.genericType = ''; + feat.Feat.genTypeName = ''; + console.error('Failed to find a genericType for feat!'); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/heritage/builder-heritage.js b/client/vue-src/legacy-js/homebrew/builder/heritage/builder-heritage.js new file mode 100644 index 00000000..c5b46507 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/heritage/builder-heritage.js @@ -0,0 +1,63 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + socket.emit("requestHomebrewHeritageDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewHeritageDetails", function(heritageArray, ancestryArray){ + + for(let ancestry of ancestryArray){ + if(ancestry.isArchived == 0){ + $('#inputHeritageFor').append(''); + } + } + + $("#createButton").click(function(){ + $(this).unbind(); + finishHeritage(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishHeritage(isUpdate){ + + let name = $("#inputName").val(); + let rarity = $("#inputRarity").val(); + let description = $("#inputDesc").val(); + let code = $("#inputCode").val(); + let indivAncestryName = $("#inputHeritageFor").val(); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let heritageID = $('#builder-container').attr('data-heritage-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateHeritage"; + } else { + requestPacket = "requestHomebrewAddHeritage"; + } + + socket.emit(requestPacket, g_homebrewID, { + heritageID, + name: name+' '+indivAncestryName, + rarity, + description, + code, + indivAncestryName + }); + +} + +socket.on("returnHomebrewCompleteHeritage", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/heritage/editor-heritage.js b/client/vue-src/legacy-js/homebrew/builder/heritage/editor-heritage.js new file mode 100644 index 00000000..0e809032 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/heritage/editor-heritage.js @@ -0,0 +1,34 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnHomebrewHeritageDetails", function(heritageArray, ancestryArray){ + + let heritageID = $('#builder-container').attr('data-heritage-id'); + let heritage = heritageArray.find(heritage => { + return heritage.id == heritageID; + }); + + if(heritage == null){ + window.location.href = '/homebrew'; + return; + } + + let heritageName = heritage.name.replace(" "+heritage.indivAncestryName,""); + $('#inputName').val(heritageName); + $('#inputRarity').val(heritage.rarity); + $('#inputDesc').val(heritage.description); + $('#inputCode').val(heritage.code); + $('#inputHeritageFor').val(heritage.indivAncestryName); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishHeritage(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/item/builder-item.js b/client/vue-src/legacy-js/homebrew/builder/item/builder-item.js new file mode 100644 index 00000000..024bdfae --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/item/builder-item.js @@ -0,0 +1,373 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; +let g_itemMap = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // ~ Item Materials ~ // + $("#inputMaterial").append(''); + for(const [materialName, materialStruct] of g_materialsMap.entries()){ + $("#inputMaterial").append(''); + } + // ~ ~~~~~~~~~~~~~~ ~ // + + $("#inputTags").chosen(); + + socket.emit("requestHomebrewItemDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewItemDetails", function(itemObject){ + + g_itemMap = objToMap(itemObject); + g_itemMap = new Map([...g_itemMap.entries()].sort( + function(a, b) { + if (a[1].Item.level === b[1].Item.level) { + // Name is only important when levels are the same + return a[1].Item.name > b[1].Item.name ? 1 : -1; + } + return a[1].Item.level - b[1].Item.level; + }) + ); + + + let builderTypeSelection = $("#inputBuilderType"); + builderTypeSelection.change(function(){ + let builderType = $(this).val(); + $("#inputItemCopyOfOther").off('change'); + if(builderType == "GENERAL"){ + $("#inputItemCopyOfOther").html(''); + $("#sectionItemCopyOfOther").addClass('is-hidden'); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").removeClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").removeClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("OTHER"); + } else if(builderType == "STORAGE"){ + $("#inputItemCopyOfOther").html(''); + $("#sectionItemCopyOfOther").addClass('is-hidden'); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").removeClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").removeClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").addClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("STORAGE"); + } else if(builderType == "WEAPON"){ + let copyOfOtherItemHTML = ''; + for(const [itemID, itemDataStruct] of g_itemMap.entries()){ + if(itemDataStruct.WeaponData != null && itemDataStruct.Item.hidden === 0 && itemDataStruct.WeaponData.profName === itemDataStruct.Item.name){ + copyOfOtherItemHTML += ''; + } + } + $("#inputItemCopyOfOther").html(copyOfOtherItemHTML); + $("#sectionItemCopyOfOther").removeClass('is-hidden'); + $("#inputItemCopyOfOther").change(function(){ + if($(this).val() != ''){ + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionHealth").addClass('is-hidden'); + } + }); + + $("#sectionWeapon").removeClass('is-hidden'); + $("#sectionWeaponMelee").removeClass('is-hidden'); + $("#sectionWeaponRanged").removeClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").removeClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").removeClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("WEAPON"); + } else if(builderType == "ARMOR"){ + let copyOfOtherItemHTML = ''; + for(const [itemID, itemDataStruct] of g_itemMap.entries()){ + if(itemDataStruct.ArmorData != null && itemDataStruct.Item.hidden === 0 && itemDataStruct.ArmorData.profName === itemDataStruct.Item.name){ + copyOfOtherItemHTML += ''; + } + } + $("#inputItemCopyOfOther").html(copyOfOtherItemHTML); + $("#sectionItemCopyOfOther").removeClass('is-hidden'); + $("#inputItemCopyOfOther").change(function(){ + if($(this).val() != ''){ + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + $("#sectionHealth").addClass('is-hidden'); + } + }); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").removeClass('is-hidden'); + $("#sectionArmorPenalties").removeClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").addClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").addClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("ARMOR"); + } else if(builderType == "SHIELD"){ + let copyOfOtherItemHTML = ''; + for(const [itemID, itemDataStruct] of g_itemMap.entries()){ + if(itemDataStruct.ShieldData != null && itemDataStruct.Item.hidden === 0 && itemDataStruct.ShieldData.profName === itemDataStruct.Item.name){ + copyOfOtherItemHTML += ''; + } + } + $("#inputItemCopyOfOther").html(copyOfOtherItemHTML); + $("#sectionItemCopyOfOther").removeClass('is-hidden'); + $("#inputItemCopyOfOther").change(function(){ + if($(this).val() != ''){ + $("#sectionShield").addClass('is-hidden'); + } + }); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").removeClass('is-hidden'); + $("#sectionRunestone").addClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").removeClass('is-hidden'); + $("#sectionSize").removeClass('is-hidden'); + $("#sectionMaterial").removeClass('is-hidden'); + $("#sectionHands").addClass('is-hidden'); + $("#sectionIsShoddy").removeClass('is-hidden'); + $("#sectionQuantity").addClass('is-hidden'); + $("#sectionHealth").removeClass('is-hidden'); + $("#inputCategory").val("SHIELD"); + } else if(builderType == "RUNE"){ + $("#inputItemCopyOfOther").html(''); + $("#sectionItemCopyOfOther").addClass('is-hidden'); + + $("#sectionWeapon").addClass('is-hidden'); + $("#sectionWeaponMelee").addClass('is-hidden'); + $("#sectionWeaponRanged").addClass('is-hidden'); + $("#sectionStorage").addClass('is-hidden'); + $("#sectionShield").addClass('is-hidden'); + $("#sectionRunestone").removeClass('is-hidden'); + $("#sectionArmor").addClass('is-hidden'); + $("#sectionArmorPenalties").addClass('is-hidden'); + + $("#sectionBulk").addClass('is-hidden'); + $("#sectionSize").addClass('is-hidden'); + $("#sectionMaterial").addClass('is-hidden'); + $("#sectionHands").addClass('is-hidden'); + $("#sectionIsShoddy").addClass('is-hidden'); + $("#sectionQuantity").addClass('is-hidden'); + $("#sectionHealth").addClass('is-hidden'); + $("#inputCategory").val("RUNE"); + } + }); + builderTypeSelection.trigger("change"); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishItem(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishItem(isUpdate){ + + let builderType = $("#inputBuilderType").val(); + let itemName = $("#inputName").val(); + let itemPrice = $("#inputPrice").val(); + let itemLevel = $("#inputLevel").val(); + let itemCategory = $("#inputCategory").val(); + let itemRarity = $("#inputRarity").val(); + let itemTagsArray = $("#inputTags").val(); + let itemUsage = $("#inputUsage").val(); + let itemDesc = $("#inputDesc").val(); + let itemCraftReq = $("#inputCraftReq").val(); + let itemCode = $("#inputCode").val(); + + let itemBulk = null; + if($("#sectionBulk").is(":visible")) { + itemBulk = $("#inputBulk").val(); + } + let itemSize = null; + if($("#sectionSize").is(":visible")) { + itemSize = $("#inputSize").val(); + } + let itemMaterial = null; + if($("#sectionMaterial").is(":visible")) { + itemMaterial = $("#inputMaterial").val(); + } + let itemHands = null; + if($("#sectionHands").is(":visible")) { + itemHands = $("#inputHands").val(); + } + + let itemIsShoddy = null; + if($("#sectionIsShoddy").is(":visible")) { + itemIsShoddy = ($("#inputIsShoddy:checked").val() == '1') ? 1 : 0; + } + let itemHasQuantity, itemQuantity = null; + if($("#sectionQuantity").is(":visible")) { + itemHasQuantity = ($("#inputHasQuantity:checked").val() == '1') ? 1 : 0; + itemQuantity = $("#inputQuantity").val(); + } + + let itemHitPoints, itemBrokenThreshold, itemHardness = null; + if($("#sectionHealth").is(":visible")) { + itemHitPoints = $("#inputHitPoints").val(); + itemBrokenThreshold = $("#inputBrokenThreshold").val(); + itemHardness = $("#inputHardness").val(); + } + + let itemWeaponData = null; + if($("#sectionWeapon").is(":visible")) { + itemWeaponData = { + dieType: $("#inputDieType").val(), + damageType: $("#inputDamageType").val(), + weaponCategory: $("#inputWeaponCategory").val(), + isMelee: ($("#inputIsMelee:checked").val() == '1') ? 1 : 0, + meleeWeaponType: $("#inputMeleeWeaponType").val(), + isRanged: ($("#inputIsRanged:checked").val() == '1') ? 1 : 0, + rangedWeaponType: $("#inputRangedWeaponType").val(), + range: $("#inputRange").val(), + reload: $("#inputReload").val() + }; + } + + let itemStorageData = null; + if($("#sectionStorage").is(":visible")) { + itemStorageData = { + maxBulkStorage: $("#inputMaxBulkStorage").val(), + bulkIgnored: $("#inputBulkIgnored").val(), + ignoreSelfBulkIfWearing: ($("#inputIgnoreSelfBulkIfWearing:checked").val() == '1') ? 1 : 0 + }; + } + + let itemShieldData = null; + if($("#sectionShield").is(":visible")) { + itemShieldData = { + acBonus: $("#inputShieldACBonus").val(), + speedPenalty: $("#inputShieldSpeedPenalty").val() + }; + } + + let itemRuneData = null; + if($("#sectionRunestone").is(":visible")) { + itemRuneData = { + runeType: $("#inputRuneType").val(), + etchedType: $("#inputEtchedType").val() + }; + } + + let itemArmorData = null; + if($("#sectionArmor").is(":visible")) { + itemArmorData = { + acBonus: $("#inputArmorACBonus").val(), + dexCap: $("#inputArmorDexCap").val(), + type: $("#inputArmorType").val(), + category: $("#inputArmorCategory").val(), + checkPenalty: $("#inputArmorCheckPenalty").val(), + speedPenalty: $("#inputArmorSpeedPenalty").val(), + minStrength: $("#inputArmorMinStrength").val() + }; + } + + let itemCopyOfOther = null; + let copyOtherID = $("#inputItemCopyOfOther").val(); + if(copyOtherID != null && copyOtherID != ''){ + itemCopyOfOther = g_itemMap.get(copyOtherID); + } + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let itemID = $('#builder-container').attr('data-item-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateItem"; + } else { + requestPacket = "requestHomebrewAddItem"; + } + + socket.emit(requestPacket, g_homebrewID, { + itemID, + builderType, + itemCopyOfOther, + itemName, + itemPrice, + itemLevel, + itemCategory, + itemRarity, + itemTagsArray, + itemUsage, + itemDesc, + itemCraftReq, + itemCode, + itemBulk, + itemSize, + itemMaterial, + itemHands, + itemIsShoddy, + itemHasQuantity, + itemQuantity, + itemHitPoints, + itemBrokenThreshold, + itemHardness, + itemWeaponData, + itemArmorData, + itemShieldData, + itemStorageData, + itemRuneData + }); + +} + +socket.on("returnHomebrewCompleteItem", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/item/editor-item.js b/client/vue-src/legacy-js/homebrew/builder/item/editor-item.js new file mode 100644 index 00000000..f01e66b5 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/item/editor-item.js @@ -0,0 +1,180 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + +}); + +socket.on("returnHomebrewItemDetails", function(itemObject){ + + let itemMap = objToMap(itemObject); + let item = itemMap.get($('#builder-container').attr('data-item-id')); + + if(item == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputBuilderType").val(item.Item.itemStructType); + $("#inputName").val(item.Item.name); + $("#inputPrice").val(item.Item.price); + $("#inputLevel").val(item.Item.level); + $("#inputRarity").val(item.Item.rarity); + $("#inputUsage").val(item.Item.usage); + $("#inputDesc").val(item.Item.description); + $("#inputCraftReq").val(item.Item.craftRequirements); + $("#inputCode").val(item.Item.code); + + $("#inputBulk").val(item.Item.bulk); + $("#inputSize").val(item.Item.size); + $("#inputMaterial").val(item.Item.materialType); + $("#inputHands").val(item.Item.hands); + let isShoddy = (item.Item.isShoddy == 1) ? true : false; + $("#inputIsShoddy").prop('checked', isShoddy); + let hasQuantity = (item.Item.hasQuantity == 1) ? true : false; + $("#inputHasQuantity").prop('checked', hasQuantity); + $("#inputQuantity").val(item.Item.quantity); + $("#inputHitPoints").val(item.Item.hitPoints); + $("#inputBrokenThreshold").val(item.Item.brokenThreshold); + $("#inputHardness").val(item.Item.hardness); + + if(item.WeaponData != null){ + if(item.WeaponData.profName == item.Item.name || item.WeaponData.profName == 'Alchemical Bombs'){ + $("#inputDieType").val(item.WeaponData.dieType); + $("#inputDamageType").val(item.WeaponData.damageType); + $("#inputWeaponCategory").val(item.WeaponData.category); + let isMelee = (item.WeaponData.isMelee == 1) ? true : false; + $("#inputIsMelee").prop('checked', isMelee); + $("#inputMeleeWeaponType").val(item.WeaponData.meleeWeaponType); + let isRanged = (item.WeaponData.isRanged == 1) ? true : false; + $("#inputIsRanged").prop('checked', isRanged); + $("#inputRangedWeaponType").val(item.WeaponData.rangedWeaponType); + $("#inputRange").val(item.WeaponData.rangedRange); + $("#inputReload").val(item.WeaponData.rangedReload); + } + } + + if(item.ArmorData != null){ + if(item.ArmorData.profName == item.Item.name){ + $("#inputArmorACBonus").val(item.ArmorData.acBonus); + $("#inputArmorDexCap").val(item.ArmorData.dexCap); + $("#inputArmorType").val(item.ArmorData.armorType); + $("#inputArmorCategory").val(item.ArmorData.category); + $("#inputArmorCheckPenalty").val(item.ArmorData.checkPenalty); + $("#inputArmorSpeedPenalty").val(item.ArmorData.speedPenalty); + $("#inputArmorMinStrength").val(item.ArmorData.minStrength); + } + } + + if(item.ShieldData != null){ + if(item.ShieldData.profName == item.Item.name){ + $("#inputShieldACBonus").val(item.ShieldData.acBonus); + $("#inputShieldSpeedPenalty").val(item.ShieldData.speedPenalty); + } + } + + if(item.StorageData != null){ + $("#inputMaxBulkStorage").val(item.StorageData.maxBulkStorage); + $("#inputBulkIgnored").val(item.StorageData.bulkIgnored); + let ignoreSelfBulkIfWearing = (item.StorageData.ignoreSelfBulkIfWearing == 1) ? true : false; + $("#inputIgnoreSelfBulkIfWearing").prop('checked', ignoreSelfBulkIfWearing); + } + + if(item.RuneData != null){ + let runeType = (item.RuneData.isFundamental == 1) ? 'FUNDAMENTAL' : 'PROPERTY'; + $("#inputRuneType").val(runeType); + $("#inputEtchedType").val(item.RuneData.etchedType); + + // Remove these to prevent a continued stacking + let itemName = item.Item.name.replace(' Runestone',''); + let itemPrice = item.Item.price - 300; + $("#inputName").val(itemName); + $("#inputPrice").val(itemPrice); + } + + $("#inputBuilderType").trigger("change"); + $("#inputCategory").val(item.Item.itemType); + + if(item.WeaponData != null && item.WeaponData.profName != item.Item.name){ + let copyItemID = null; + for(const [itemID, itemDataStruct] of itemMap.entries()){ + if(itemDataStruct.Item.hidden == 0){ + if(itemDataStruct.Item.name === item.WeaponData.profName){ + copyItemID = itemID; + item.TagArray = tagArrayDifference(item.TagArray, itemDataStruct.TagArray); + break; + } + } + } + if(copyItemID != null){ + $("#inputItemCopyOfOther").val(copyItemID); + $("#inputItemCopyOfOther").trigger("change"); + } + } + + if(item.ArmorData != null && item.ArmorData.profName != item.Item.name){ + let copyItemID = null; + for(const [itemID, itemDataStruct] of itemMap.entries()){ + if(itemDataStruct.Item.hidden == 0){ + if(itemDataStruct.Item.name === item.ArmorData.profName){ + copyItemID = itemID; + item.TagArray = tagArrayDifference(item.TagArray, itemDataStruct.TagArray); + break; + } + } + } + if(copyItemID != null){ + $("#inputItemCopyOfOther").val(copyItemID); + $("#inputItemCopyOfOther").trigger("change"); + } + } + + if(item.ShieldData != null && item.ShieldData.profName != item.Item.name){ + let copyItemID = null; + for(const [itemID, itemDataStruct] of itemMap.entries()){ + if(itemDataStruct.Item.hidden == 0){ + if(itemDataStruct.Item.name === item.ShieldData.profName){ + copyItemID = itemID; + item.TagArray = tagArrayDifference(item.TagArray, itemDataStruct.TagArray); + break; + } + } + } + if(copyItemID != null){ + $("#inputItemCopyOfOther").val(copyItemID); + $("#inputItemCopyOfOther").trigger("change"); + } + } + + for(let tag of item.TagArray){ + $("#inputTags").find('option[value='+tag.id+']').attr('selected','selected'); + } + $("#inputTags").trigger("chosen:updated"); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishItem(true); + }); + + stopSpinnerLoader(); +}); + +function tagArrayDifference(arr1, arr2) { + let newArr1 = []; + for(let tag of arr1){ + newArr1.push(tag.id); + } + let newArr2 = []; + for(let tag of arr2){ + newArr2.push(tag.id); + } + let diffArr = newArr1 + .filter(x => !newArr2.includes(x)) + .concat(newArr2.filter(x => !newArr1.includes(x))); + let finalDiffArr = []; + for(let tagID of diffArr){ + finalDiffArr.push({id: tagID}); + } + return finalDiffArr; + } \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/language/builder-language.js b/client/vue-src/legacy-js/homebrew/builder/language/builder-language.js new file mode 100644 index 00000000..90c2c996 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/language/builder-language.js @@ -0,0 +1,49 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $("#createButton").click(function(){ + $(this).unbind(); + finishLanguage(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishLanguage(isUpdate){ + + let languageName = $("#inputName").val(); + let languageSpeakers = $("#inputSpeakers").val(); + let languageScript = $("#inputScript").val(); + let languageDescription = $("#inputDescription").val(); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let languageID = $('#builder-container').attr('data-language-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateLanguage"; + } else { + requestPacket = "requestHomebrewAddLanguage"; + } + + socket.emit(requestPacket, g_homebrewID, { + languageID, + languageName, + languageSpeakers, + languageScript, + languageDescription, + }); + +} + +socket.on("returnHomebrewCompleteLanguage", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/language/editor-language.js b/client/vue-src/legacy-js/homebrew/builder/language/editor-language.js new file mode 100644 index 00000000..c0a84d01 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/language/editor-language.js @@ -0,0 +1,34 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewLanguageDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewLanguageDetails", function(languages){ + + let languageID = $('#builder-container').attr('data-language-id'); + let language = languages.find(language => { + return language.id == languageID; + }); + + if(language == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputName").val(language.name); + $("#inputSpeakers").val(language.speakers); + $("#inputScript").val(language.script); + $("#inputDescription").val(language.description); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishLanguage(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/spell/builder-spell.js b/client/vue-src/legacy-js/homebrew/builder/spell/builder-spell.js new file mode 100644 index 00000000..6145d57b --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/spell/builder-spell.js @@ -0,0 +1,93 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $("#inputTags").chosen(); + + $("#createButton").click(function(){ + $(this).unbind(); + finishSpell(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishSpell(isUpdate){ + + let spellName = $("#inputName").val(); + let spellIsFocus = ($("#inputIsFocusSpell:checked").val() == '1') ? 1 : 0; + let spellLevel = $("#inputLevel").val(); + let spellRarity = $("#inputRarity").val(); + let spellTraditions = $("#inputTraditions").val(); + let spellCasting = $("#inputCasting").val(); + let spellComponents = $("#inputCastingComponents").val(); + let spellCost = $("#inputCost").val(); + let spellTrigger = $("#inputTrigger").val(); + let spellRequirements = $("#inputRequirements").val(); + let spellTagsArray = $("#inputTags").val(); + let spellRange = $("#inputRange").val(); + let spellArea = $("#inputArea").val(); + let spellTargets = $("#inputTargets").val(); + let spellSavingThrow = $("#inputSavingThrow").val(); + let spellDuration = $("#inputDuration").val(); + let spellDesc = $("#inputDesc").val(); + let spellHeightenedOneVal = $("#inputHeightenedOneVal").val(); + let spellHeightenedOneText = $("#inputHeightenedOneText").val(); + let spellHeightenedTwoVal = $("#inputHeightenedTwoVal").val(); + let spellHeightenedTwoText = $("#inputHeightenedTwoText").val(); + let spellHeightenedThreeVal = $("#inputHeightenedThreeVal").val(); + let spellHeightenedThreeText = $("#inputHeightenedThreeText").val(); + let spellHeightenedFourVal = $("#inputHeightenedFourVal").val(); + let spellHeightenedFourText = $("#inputHeightenedFourText").val(); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let spellID = $('#builder-container').attr('data-spell-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateSpell"; + } else { + requestPacket = "requestHomebrewAddSpell"; + } + + socket.emit(requestPacket, g_homebrewID, { + spellID, + spellName, + spellIsFocus, + spellLevel, + spellRarity, + spellTraditions, + spellCasting, + spellComponents, + spellCost, + spellTrigger, + spellRequirements, + spellTagsArray, + spellRange, + spellArea, + spellTargets, + spellSavingThrow, + spellDuration, + spellDesc, + spellHeightenedOneVal, + spellHeightenedOneText, + spellHeightenedTwoVal, + spellHeightenedTwoText, + spellHeightenedThreeVal, + spellHeightenedThreeText, + spellHeightenedFourVal, + spellHeightenedFourText, + }); + +} + +socket.on("returnHomebrewCompleteSpell", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/spell/editor-spell.js b/client/vue-src/legacy-js/homebrew/builder/spell/editor-spell.js new file mode 100644 index 00000000..47c2fc0b --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/spell/editor-spell.js @@ -0,0 +1,71 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewSpellDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewSpellDetails", function(spellObject){ + + let spellMap = objToMap(spellObject); + let spell = spellMap.get($('#builder-container').attr('data-spell-id')); + + if(spell == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputName").val(spell.Spell.name); + $("#inputLevel").val(spell.Spell.level); + $("#inputCasting").val(spell.Spell.cast); + $("#inputCost").val(spell.Spell.cost); + $("#inputTrigger").val(spell.Spell.trigger); + $("#inputRequirements").val(spell.Spell.requirements); + $("#inputRange").val(spell.Spell.range); + $("#inputArea").val(spell.Spell.area); + $("#inputTargets").val(spell.Spell.targets); + $("#inputSavingThrow").val(spell.Spell.savingThrow); + $("#inputDuration").val(spell.Spell.duration); + $("#inputRarity").val(spell.Spell.rarity); + $("#inputDesc").val(spell.Spell.description); + $("#inputHeightenedOneVal").val(spell.Spell.heightenedOneVal); + $("#inputHeightenedOneText").val(spell.Spell.heightenedOneText); + $("#inputHeightenedTwoVal").val(spell.Spell.heightenedTwoVal); + $("#inputHeightenedTwoText").val(spell.Spell.heightenedTwoText); + $("#inputHeightenedThreeVal").val(spell.Spell.heightenedThreeVal); + $("#inputHeightenedThreeText").val(spell.Spell.heightenedThreeText); + $("#inputHeightenedFourVal").val(spell.Spell.heightenedFourVal); + $("#inputHeightenedFourText").val(spell.Spell.heightenedFourText); + + let isFocusSpell = (spell.Spell.isFocusSpell == 1) ? true : false; + $("#inputIsFocusSpell").prop('checked', isFocusSpell); + + if(spell.Spell.traditions != null){ + let traditionsArray = JSON.parse(spell.Spell.traditions); + for(let tradition of traditionsArray){ + $("#inputTraditions").find('option[value='+tradition+']').attr('selected','selected'); + } + } + + if(spell.Spell.castingComponents != null){ + let componentsArray = JSON.parse(spell.Spell.castingComponents); + for(let component of componentsArray){ + $("#inputCastingComponents").find('option[value='+component+']').attr('selected','selected'); + } + } + + for(let tag of spell.Tags){ + $("#inputTags").find('option[value='+tag.id+']').attr('selected','selected'); + } + $("#inputTags").trigger("chosen:updated"); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishSpell(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/toggleable/builder-toggleable.js b/client/vue-src/legacy-js/homebrew/builder/toggleable/builder-toggleable.js new file mode 100644 index 00000000..a98e91f8 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/toggleable/builder-toggleable.js @@ -0,0 +1,47 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $("#createButton").click(function(){ + $(this).unbind(); + finishToggleable(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishToggleable(isUpdate){ + + let toggleableName = $("#inputName").val(); + let toggleableDescription = $("#inputDescription").val(); + let toggleableCode = $("#inputCode").val(); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let toggleableID = $('#builder-container').attr('data-toggleable-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateToggleable"; + } else { + requestPacket = "requestHomebrewAddToggleable"; + } + + socket.emit(requestPacket, g_homebrewID, { + toggleableID, + toggleableName, + toggleableDescription, + toggleableCode, + }); + +} + +socket.on("returnHomebrewCompleteToggleable", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/toggleable/editor-toggleable.js b/client/vue-src/legacy-js/homebrew/builder/toggleable/editor-toggleable.js new file mode 100644 index 00000000..6e3d2d2d --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/toggleable/editor-toggleable.js @@ -0,0 +1,33 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewToggleableDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewToggleableDetails", function(toggleables){ + + let toggleableID = $('#builder-container').attr('data-toggleable-id'); + let toggleable = toggleables.find(toggleable => { + return toggleable.id == toggleableID; + }); + + if(toggleable == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputName").val(toggleable.name); + $("#inputDescription").val(toggleable.description); + $("#inputCode").val(toggleable.code); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishToggleable(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/trait/builder-trait.js b/client/vue-src/legacy-js/homebrew/builder/trait/builder-trait.js new file mode 100644 index 00000000..b69f9a8c --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/trait/builder-trait.js @@ -0,0 +1,45 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $("#createButton").click(function(){ + $(this).unbind(); + finishTrait(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishTrait(isUpdate){ + + let traitName = $("#inputName").val(); + let traitDescription = $("#inputDescription").val(); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let traitID = $('#builder-container').attr('data-trait-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateTrait"; + } else { + requestPacket = "requestHomebrewAddTrait"; + } + + socket.emit(requestPacket, g_homebrewID, { + traitID, + traitName, + traitDescription, + }); + +} + +socket.on("returnHomebrewCompleteTrait", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/trait/editor-trait.js b/client/vue-src/legacy-js/homebrew/builder/trait/editor-trait.js new file mode 100644 index 00000000..3fc3a28f --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/trait/editor-trait.js @@ -0,0 +1,32 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewTraitDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewTraitDetails", function(traits){ + + let traitID = $('#builder-container').attr('data-trait-id'); + let trait = traits.find(trait => { + return trait.id == traitID; + }); + + if(trait == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputName").val(trait.name); + $("#inputDescription").val(trait.description); + + $("#updateButton").click(function(){ + $(this).unbind(); + finishTrait(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/uni-heritage/builder-uni-heritage.js b/client/vue-src/legacy-js/homebrew/builder/uni-heritage/builder-uni-heritage.js new file mode 100644 index 00000000..59c48106 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/uni-heritage/builder-uni-heritage.js @@ -0,0 +1,125 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let g_homebrewID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let featCount = 0; + $("#addFeatButton").click(function(){ + featCount++; + + let featID = "feat"+featCount; + + let newFeat = $("#featLayout").clone(); + newFeat.attr('id', featID); + newFeat.removeClass('is-hidden'); + newFeat.appendTo("#featContent"); + + let cardHeader = $("#"+featID).find(".card-header"); + let cardContent = $("#"+featID).find(".card-content"); + + cardHeader.click(function(){ + if(cardContent.is(":visible")) { + cardContent.addClass('is-hidden'); + } else { + cardContent.removeClass('is-hidden'); + } + }); + + let cardHeaderIcon = $("#"+featID).find(".card-header-icon"); + cardHeaderIcon.click(function(){ + $("#"+featID).remove(); + }); + + let inputFeatName = $("#"+featID).find(".inputFeatName"); + inputFeatName.change(function(){ + $("#"+featID).find(".card-header-title").html('Heritage Feat - '+inputFeatName.val()); + }); + + $("#"+featID).find(".inputFeatTags").chosen(); + + }); + + + $("#createButton").click(function(){ + $(this).unbind(); + finishUniHeritage(false); + }); + + if($("#createButton").length){// If button exists + stopSpinnerLoader(); + } +}); + +function finishUniHeritage(isUpdate){ + + let heritageName = $("#inputName").val(); + let heritageRarity = $("#inputRarity").val(); + let heritageDescription = $("#inputDescription").val(); + let heritageImageURL = $("#inputImageURL").val(); + let heritageCode = $("#inputCode").val(); + + let heritageFeatsArray = []; + $(".heritageFeat").each(function(){ + if($(this).is(":visible")) { + let featName = $(this).find(".inputFeatName").val(); + let featLevel = $(this).find(".inputFeatLevel").val(); + let featActions = $(this).find(".inputFeatActions").val(); + let featRarity = $(this).find(".inputFeatRarity").val(); + let featTagsArray = $(this).find(".inputFeatTags").val(); + let featPrereq = $(this).find(".inputFeatPrereq").val(); + let featReq = $(this).find(".inputFeatReq").val(); + let featFreq = $(this).find(".inputFeatFreq").val(); + let featCost = $(this).find(".inputFeatCost").val(); + let featTrigger = $(this).find(".inputFeatTrigger").val(); + let featDesc = $(this).find(".inputFeatDesc").val(); + let featSpecial = $(this).find(".inputFeatSpecial").val(); + let featSelectMultiple = ($(this).find(".inputFeatSelectMultiple:checked").val() == '1') ? 1 : 0; + let featCode = $(this).find(".inputFeatCode").val(); + heritageFeatsArray.push({ + name: featName, + actions: featActions, + level: featLevel, + rarity: featRarity, + prerequisites: featPrereq, + frequency: featFreq, + cost: featCost, + trigger: featTrigger, + requirements: featReq, + description: featDesc, + special: featSpecial, + canSelectMultiple: featSelectMultiple, + code: featCode, + featTagsArray + }); + } + }); + + let requestPacket = null; + g_homebrewID = $('#builder-container').attr('data-bundle-id'); + let uniHeritageID = $('#builder-container').attr('data-uni-heritage-id'); + if(isUpdate){ + requestPacket = "requestHomebrewUpdateUniHeritage"; + } else { + requestPacket = "requestHomebrewAddUniHeritage"; + } + + socket.emit(requestPacket, g_homebrewID, { + uniHeritageID, + heritageName, + heritageRarity, + heritageDescription, + heritageImageURL, + heritageCode, + heritageFeatsArray, + }); + +} + +socket.on("returnHomebrewCompleteUniHeritage", function() { + window.location.href = '/homebrew/?edit_id='+g_homebrewID; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/builder/uni-heritage/editor-uni-heritage.js b/client/vue-src/legacy-js/homebrew/builder/uni-heritage/editor-uni-heritage.js new file mode 100644 index 00000000..6875dfef --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/builder/uni-heritage/editor-uni-heritage.js @@ -0,0 +1,95 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + socket.emit("requestHomebrewUniHeritageDetails", $('#builder-container').attr('data-bundle-id')); + +}); + +socket.on("returnHomebrewUniHeritageDetails", function(uniHeritageArray, featsObject){ + + let featMap = objToMap(featsObject); + + let uniHeritageID = $('#builder-container').attr('data-uni-heritage-id'); + let uniHeritage = uniHeritageArray.find(uniHeritage => { + return uniHeritage.id == uniHeritageID; + }); + + if(uniHeritage == null){ + window.location.href = '/homebrew'; + return; + } + + $("#inputName").val(uniHeritage.name); + $("#inputRarity").val(uniHeritage.rarity); + $("#inputDescription").val(uniHeritage.description); + $("#inputImageURL").val(uniHeritage.artworkURL); + $("#inputCode").val(uniHeritage.code); + + // Heritage Feats + let heritageFeats = []; + for(const [key, value] of featMap.entries()){ + let heritageTag = value.Tags.find(tag => { + return tag.id === uniHeritage.tagID; + }); + if(heritageTag != null){ + $("#addFeatButton").trigger("click"); + heritageFeats.push(value); + } + } + + heritageFeats = heritageFeats.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + let heritageFeatCount = 0; + $(".heritageFeat").each(function(){ + if($(this).is(":visible")) { + let feat = heritageFeats[heritageFeatCount]; + heritageFeatCount++; + + $(this).find(".inputFeatName").val(feat.Feat.name); + $(this).find(".inputFeatLevel").val(feat.Feat.level); + $(this).find(".inputFeatActions").val(feat.Feat.actions); + $(this).find(".inputFeatRarity").val(feat.Feat.rarity); + $(this).find(".inputFeatPrereq").val(feat.Feat.prerequisites); + $(this).find(".inputFeatReq").val(feat.Feat.requirements); + $(this).find(".inputFeatFreq").val(feat.Feat.frequency); + $(this).find(".inputFeatCost").val(feat.Feat.cost); + $(this).find(".inputFeatTrigger").val(feat.Feat.trigger); + $(this).find(".inputFeatDesc").val(feat.Feat.description); + $(this).find(".inputFeatSpecial").val(feat.Feat.special); + let checkBoxState = (feat.Feat.canSelectMultiple == 1) ? true : false; + $(this).find(".inputFeatSelectMultiple").prop('checked', checkBoxState); + $(this).find(".inputFeatCode").val(feat.Feat.code); + + for(let featTag of feat.Tags){ + if(featTag.id != uniHeritage.tagID) { + $(this).find(".inputFeatTags").find('option[value='+featTag.id+']').attr('selected','selected'); + } + } + + // Minimize Feat + $(this).find(".card-header").trigger("click"); + // Trigger Feat Name and Tags + $(this).find(".inputFeatName").trigger("change"); + $(this).find(".inputFeatTags").trigger("chosen:updated"); + } + }); + + + $("#updateButton").click(function(){ + $(this).unbind(); + finishUniHeritage(true); + }); + + stopSpinnerLoader(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/bundle-browse.js b/client/vue-src/legacy-js/homebrew/bundle-browse.js new file mode 100644 index 00000000..5ccb9a53 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/bundle-browse.js @@ -0,0 +1,198 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openBundleBrowse(){ + window.history.pushState('homebrew', '', '/homebrew/?sub_tab=browse');// Update URL + socket.emit('requestPublishedHomebrewBundles'); + //startSpinnerSubLoader(); +} + +socket.on("returnPublishedHomebrewBundles", function(homebrewBundles){ + + homebrewBundles = homebrewBundles.sort( + function(a, b) { + let aRating = a.userHomebrewBundles.length; + let bRating = b.userHomebrewBundles.length; + if (aRating === bRating) { + // Name is only important when ratings are the same + return a.name > b.name ? 1 : -1; + } + return bRating - aRating; + } + ); + + stopSpinnerSubLoader(); + $('#tabContent').html(''); + $('#tabContent').addClass('is-hidden'); + $('#tabContent').load("/templates/homebrew/display-browse.html"); + $.ajax({ type: "GET", + url: "/templates/homebrew/display-browse.html", + success : function(text) + { + + $("#filterNameInput").blur(function(){ + if($('#filterNameInput').val() != ''){ + $('#filterNameInput').addClass('is-info'); + } else { + $('#filterNameInput').removeClass('is-info'); + } + }); + $("#filterDescInput").blur(function(){ + if($('#filterDescInput').val() != ''){ + $('#filterDescInput').addClass('is-info'); + } else { + $('#filterDescInput').removeClass('is-info'); + } + });$("#filterAuthorInput").blur(function(){ + if($('#filterAuthorInput').val() != ''){ + $('#filterAuthorInput').addClass('is-info'); + } else { + $('#filterAuthorInput').removeClass('is-info'); + } + }); + $("#filterRatingInput").blur(function(){ + if($('#filterRatingInput').val() != ''){ + $('#filterRatingInput').addClass('is-info'); + } else { + $('#filterRatingInput').removeClass('is-info'); + } + }); + $("#filterKeyRequiredInput").blur(function(){ + if($('#filterKeyRequiredInput').val() != 'ANY'){ + $('#filterKeyRequiredInput').parent().addClass('is-info'); + } else { + $('#filterKeyRequiredInput').parent().removeClass('is-info'); + } + }); + + // Search Filtering // + $('#updateFilterButton').click(function(){ + filterBundleSearch(homebrewBundles); + }); + $(document).on('keypress',function(e) { + if(e.which == 13) { + filterBundleSearch(homebrewBundles); + } + }); + filterBundleSearch(homebrewBundles); + + $('#tabContent').removeClass('is-hidden'); + + } + }); +}); + +function filterBundleSearch(homebrewBundles){ + + let nameFilter = $('#filterNameInput').val(); + let descFilter = $('#filterDescInput').val(); + let authorFilter = $('#filterAuthorInput').val(); + let ratingRelationFilter = $('#filterRatingRelationInput').val(); + let ratingFilter = $('#filterRatingInput').val(); + let keyRequiredFilter = $('#filterKeyRequiredInput').val(); + + homebrewBundles = new Set(homebrewBundles); + + if(nameFilter != null && nameFilter != ''){ + console.log('Filtering by Name...'); + let parts = nameFilter.toUpperCase().split(' '); + for(const homebrewBundle of homebrewBundles){ + if(!textContainsWords(homebrewBundle.name, parts)){ + homebrewBundles.delete(homebrewBundle); + } + } + } + + if(descFilter != null && descFilter != ''){ + console.log('Filtering by Description...'); + let parts = descFilter.toUpperCase().split(' '); + for(const homebrewBundle of homebrewBundles){ + if(!textContainsWords(homebrewBundle.description, parts)){ + homebrewBundles.delete(homebrewBundle); + } + } + } + + if(authorFilter != null && authorFilter != ''){ + console.log('Filtering by Author...'); + let parts = authorFilter.toUpperCase().split(' '); + for(const homebrewBundle of homebrewBundles){ + if(!textContainsWords(homebrewBundle.authorName, parts)){ + homebrewBundles.delete(homebrewBundle); + } + } + } + + if(ratingFilter != null && ratingFilter != ''){ + console.log('Filtering by Rating...'); + let rating = parseInt(ratingFilter); + for(const homebrewBundle of homebrewBundles){ + let bundleRating = homebrewBundle.userHomebrewBundles.length; + switch(ratingRelationFilter) { + case 'EQUAL': if(bundleRating === rating) {} else {homebrewBundles.delete(homebrewBundle);} break; + case 'LESS': if(bundleRating < rating) {} else {homebrewBundles.delete(homebrewBundle);} break; + case 'GREATER': if(bundleRating > rating) {} else {homebrewBundles.delete(homebrewBundle);} break; + case 'LESS-EQUAL': if(bundleRating <= rating) {} else {homebrewBundles.delete(homebrewBundle);} break; + case 'GREATER-EQUAL': if(bundleRating >= rating) {} else {homebrewBundles.delete(homebrewBundle);} break; + case 'NOT-EQUAL': if(bundleRating !== rating) {} else {homebrewBundles.delete(homebrewBundle);} break; + default: break; + } + } + } + + if(keyRequiredFilter != null && keyRequiredFilter != 'ANY'){ + console.log('Filtering by Key Required...'); + for(const homebrewBundle of homebrewBundles){ + if(homebrewBundle.hasKeys != keyRequiredFilter){ + homebrewBundles.delete(homebrewBundle); + } + } + } + + displayBundleResults(homebrewBundles); +} + +function displayBundleResults(homebrewBundles){ + $('#browsingList').html(''); + + if(homebrewBundles.size <= 0){ + $('#browsingList').html('

                  No results found!

                  '); + $('#searchResultCountContainer').html('

                  (0 results found)

                  '); + return; + } + + for(const homebrewBundle of homebrewBundles){ + let entryID = 'bundle-entry-'+homebrewBundle.id; + let rating = homebrewBundle.userHomebrewBundles.length; + let ratingColor = ''; + + if(rating > 0){ + ratingColor = 'has-text-success'; + } else if (rating < 0) { + ratingColor = 'has-text-danger'; + } else { + ratingColor = 'has-text-warning'; + } + + let bundleName = homebrewBundle.name; + if(homebrewBundle.hasKeys === 1){ + bundleName += ''; + } + + $('#browsingList').append('
                  '+bundleName+'
                  '+homebrewBundle.authorName+'
                  '+rating+'
                  '); + + $('#'+entryID).click(function(){ + openBundleView(homebrewBundle); + }); + + $('#'+entryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+entryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/bundle-manage-keys.js b/client/vue-src/legacy-js/homebrew/bundle-manage-keys.js new file mode 100644 index 00000000..49b69a29 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/bundle-manage-keys.js @@ -0,0 +1,57 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('#manage-keys-modal-background,#manage-keys-modal-close').click(function() { + $('#manage-keys-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#manage-keys-modal-body').html(''); + }); + +}); + +socket.on("returnBundleKeys", function(bundleKeys){ + $('#manage-keys-modal-body').html(''); + + $('#manage-keys-modal-body').append('
                  '); + + $('#manage-keys-generate-btn').click(function() { + socket.emit("requestBundleAddKeys", g_activeBundle.id, $('#manage-keys-key-amount-selector').val(), (($('#manage-keys-key-type-selector').val() == 1) ? true : false)); + }); + + $('#manage-keys-modal-body').append('
                  '); + $('#manage-keys-modal-body').append('

                  '+bundleKey.keyCode+'

                  '+useText+'

                  '); + + $('#'+keyEntryDeleteBtn).click(function() { + socket.emit("requestBundleRemoveKey", g_activeBundle.id, bundleKey.keyCode); + }); + + keyCount++; + } + if(keyCount == 0){ + $('#manage-keys-modal-key-container').append('

                  Bundle has no keys!

                  '); + } + + $('#manage-keys-modal').addClass('is-active'); + +}); + +socket.on("returnBundleRemoveKey", function(){ + socket.emit('requestBundleKeys', g_activeBundle.id); +}); + +socket.on("returnBundleAddKeys", function(){ + socket.emit('requestBundleKeys', g_activeBundle.id); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/bundle-view.js b/client/vue-src/legacy-js/homebrew/bundle-view.js new file mode 100644 index 00000000..48f6333a --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/bundle-view.js @@ -0,0 +1,458 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openBundleView(homebrewBundle){ + g_activeBundle = homebrewBundle; + window.history.pushState('homebrew', '', '/homebrew/?view_id='+g_activeBundle.id);// Update URL + socket.emit('requestBundleContents', 'VIEW', homebrewBundle.id); + startSpinnerSubLoader(); +} + +socket.on("returnBundleContents", function(REQUEST_TYPE, userHasBundle, userOwnsBundle, skillObject, allTags, classes, ancestries, archetypes, backgrounds, classFeatures, feats, heritages, uniheritages, items, spells, languages, toggleables){ + if(REQUEST_TYPE !== 'VIEW' && REQUEST_TYPE !== 'REQUIRE-KEY') {return;} + + textProcess_warningOnUnknown = true; + g_skillMap = (skillObject != null) ? objToMap(skillObject) : null; + g_allTags = allTags; + g_allLanguages = languages; + + let featMap = new Map(); + for(let feat of feats){ + let tags = []; + // Find tags by id + for(let featTag of feat.featTags){ + let tag = allTags.find(tag => { + return tag.id === featTag.tagID; + }); + if(tag != null) {tags.push(tag);} + } + // Find tag for genTypeName + if(feat.genTypeName != null){ + let tag = allTags.find(tag => { + if(tag.isArchived == 0){ return tag.name === feat.genTypeName; } else { return false; } + }); + if(tag != null) {tags.push(tag);} + } + featMap.set(feat.id+'', {Feat : feat, Tags : tags}); + } + g_featMap = featMap; + + let itemMap = new Map(); + for(let itemStruct of items){ + let tags = []; + // Find tags by id + for(let itemTag of itemStruct.Item.taggedItems){ + let tag = allTags.find(tag => { + return tag.id === itemTag.tagID; + }); + if(tag != null) {tags.push(tag);} + } + itemStruct.TagArray = tags; + itemMap.set(itemStruct.Item.id+'', itemStruct); + } + g_itemMap = itemMap; + + let spellMap = new Map(); + for(let spell of spells){ + let tags = []; + // Find tags by id + for(let spellTag of spell.taggedSpells){ + let tag = allTags.find(tag => { + return tag.id === spellTag.tagID; + }); + if(tag != null) {tags.push(tag);} + } + spellMap.set(spell.id+'', {Spell : spell, Tags : tags}); + } + g_spellMap = spellMap; + + + let displayContainerID = 'bundle-container-'+g_activeBundle.id; + $('#tabContent').parent().append(''); + $('#tabContent').addClass('is-hidden'); + stopSpinnerSubLoader(); + + $('#'+displayContainerID).load("/templates/homebrew/display-view-bundle.html"); + $.ajax({ type: "GET", + url: "/templates/homebrew/display-view-bundle.html", + success : function(text) + { + + $('#bundle-back-btn').click(function() { + $('#'+displayContainerID).remove(); + $('#tabContent').removeClass('is-hidden'); + if($('#tabContent').is(':empty')){ $('#browseTab').trigger("click"); } + }); + $('.category-tabs li').click(function() { + $('#'+displayContainerID).remove(); + }); + + let bundleName = g_activeBundle.name; + if(g_activeBundle.hasKeys === 1){ + bundleName += ''; + } + $('#bundleName').html(bundleName); + $('#bundleDescription').html(processText(g_activeBundle.description, false, false, 'MEDIUM', false)); + + let contactInfoStr = (g_activeBundle.contactInfo != '') ? ', '+g_activeBundle.contactInfo : ''; + $('#bundleContactInfo').html(' '+g_activeBundle.authorName+' #'+g_activeBundle.userID+''+contactInfoStr); + + /// + + if(userHasBundle){ + $('#bundleCollectionRemoveBtn').removeClass('is-hidden'); + } else { + $('#bundleCollectionAddBtn').removeClass('is-hidden'); + } + + // Hide add button if user isn't logged in + if($('#homebrew-container').attr('data-user-id') == '') { + $('#bundleCollectionAddBtn').addClass('is-hidden'); + } + + // Add Button // + $('#bundleCollectionAddBtn').click(function() { + if(g_activeBundle.hasKeys === 1){ + $('#add-locked-bundle-key-input').removeClass('is-danger'); + $('#add-locked-bundle-modal').addClass('is-active'); + $('html').addClass('is-clipped'); + } else { + socket.emit('requestBundleChangeCollection', g_activeBundle.id, true); + } + }); + + $('#add-locked-bundle-add-btn').click(function() { + let keyInput = $('#add-locked-bundle-key-input').val(); + if(keyInput != ''){ + socket.emit('requestBundleChangeCollection', g_activeBundle.id, true, keyInput); + } + }); + $('#add-locked-bundle-modal-background,#add-locked-bundle-modal-close').click(function() { + $('#add-locked-bundle-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + }); + + // Remove Button // + $('#bundleCollectionRemoveBtn').click(function() { + new ConfirmMessage('Remove from Collection', 'Are you sure you want to remove this bundle from your collection? Any content your characters are using from the bundle will be removed.', 'Remove', 'modal-remove-view-collection-bundle-'+g_activeBundle.id, 'modal-remove-view-collection-bundle-btn-'+g_activeBundle.id); + $('#modal-remove-view-collection-bundle-btn-'+g_activeBundle.id).click(function() { + socket.emit('requestBundleChangeCollection', g_activeBundle.id, false); + }); + }); + + /// + + socket.off("returnBundleChangeCollection"); + socket.on("returnBundleChangeCollection", function(toAdd, isSuccess){ + startSpinnerSubLoader(); + $('#'+displayContainerID).remove(); + socket.emit('requestBundleContents', 'VIEW', g_activeBundle.id); + /*if(isSuccess){ + $('#add-locked-bundle-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#add-locked-bundle-key-input').val(''); + if(toAdd) { + $('#bundleCollectionAddBtn').addClass('is-hidden'); + $('#bundleCollectionRemoveBtn').removeClass('is-hidden'); + } else { + $('#bundleCollectionAddBtn').removeClass('is-hidden'); + $('#bundleCollectionRemoveBtn').addClass('is-hidden'); + } + } else { + if($('#add-locked-bundle-modal').hasClass('is-active')) { + $('#add-locked-bundle-key-input').addClass('is-danger'); + } + }*/ + }); + + /// + + if(userOwnsBundle && g_activeBundle.hasKeys === 1){ + $('#bundleKeyManagementBtn').removeClass('is-hidden'); + } + + $('#bundleKeyManagementBtn').click(function() { + socket.emit('requestBundleKeys', g_activeBundle.id); + }); + + /// + + if (REQUEST_TYPE === 'REQUIRE-KEY'){ + + $('#view-require-key-container').removeClass('is-hidden'); + $('#view-locked-bundle-view-btn').click(function() { + let keyInput = $('#view-locked-bundle-key-input').val(); + if(keyInput != ''){ + startSpinnerSubLoader(); + $('#'+displayContainerID).remove(); + socket.emit('requestBundleContents', 'VIEW', g_activeBundle.id, keyInput); + } + }); + + } + + /// + + if(classes.length > 0){ + $('#bundleSectionClasses').removeClass('is-hidden'); + $('#bundleContainerClasses').html(''); + for(const cClass of classes){ + let viewClassID = 'entry-view-class-'+cClass.id; + $('#bundleContainerClasses').append('

                  '+cClass.name+'

                  '); + $('#'+viewClassID).click(function() { + new DisplayClass(displayContainerID, cClass.id, featMap, g_activeBundle.id); + }); + } + } + + /// + + if(ancestries.length > 0){ + $('#bundleSectionAncestries').removeClass('is-hidden'); + $('#bundleContainerAncestries').html(''); + for(const ancestry of ancestries){ + let viewAncestryID = 'entry-view-ancestry-'+ancestry.id; + $('#bundleContainerAncestries').append('

                  '+ancestry.name+'

                  '); + $('#'+viewAncestryID).click(function() { + new DisplayAncestry(displayContainerID, ancestry.id, featMap, g_activeBundle.id); + }); + } + } + + /// + + if(archetypes.length > 0){ + $('#bundleSectionArchetypes').removeClass('is-hidden'); + $('#bundleContainerArchetypes').html(''); + for(const archetype of archetypes){ + let viewArchetypeID = 'entry-view-archetype-'+archetype.id; + $('#bundleContainerArchetypes').append('

                  '+archetype.name+'

                  '); + $('#'+viewArchetypeID).click(function() { + new DisplayArchetype(displayContainerID, archetype.id, featMap, g_activeBundle.id); + }); + } + } + + //// + + if(backgrounds.length > 0){ + $('#bundleSectionBackgrounds').removeClass('is-hidden'); + $('#bundleContainerBackgrounds').html(''); + for(const background of backgrounds){ + let viewBackgroundID = 'entry-view-background-'+background.id; + $('#bundleContainerBackgrounds').append('

                  '+background.name+'

                  '); + $('#'+viewBackgroundID).click(function() { + new DisplayBackground(displayContainerID, background.id, g_activeBundle.id); + }); + } + } + + //// + + if(classFeatures.length > 0){ + let foundContent = false; + $('#bundleSectionClassFeatures').removeClass('is-hidden'); + $('#bundleContainerClassFeatures').html(''); + for(const classFeature of classFeatures){ + if(classFeature.indivClassName == null || classFeature.selectOptionFor != null) {continue;} else {foundContent = true;} + + let viewClassFeatureID = 'entry-view-class-feature-'+classFeature.id; + $('#bundleContainerClassFeatures').append('

                  '+classFeature.name+'

                  '); + $('#'+viewClassFeatureID).click(function() { + let classText = (classFeature.indivClassName != null) ? '~ Class:: '+classFeature.indivClassName+'\n' : ''; + let classAbilText = (classFeature.indivClassAbilName != null) ? '~ Option For:: '+classFeature.indivClassAbilName+'\n' : ''; + let description = classText+classAbilText+'----\n'+classFeature.description; + openQuickView('abilityView', { + Ability : { + name: classFeature.name, + description: description, + level: classFeature.level, + contentSrc: classFeature.contentSrc, + homebrewID: classFeature.homebrewID, + code: classFeature.code, + } + }); + }); + } + + if(!foundContent) { + $('#bundleSectionClassFeatures').addClass('is-hidden'); + } + } + + //// + + if(feats.length > 0){ + let foundContent = false; + $('#bundleSectionFeats').removeClass('is-hidden'); + $('#bundleContainerFeats').html(''); + for(const feat of feats){ + if(feat.genericType == null) {continue;} else {foundContent = true;} + + let viewFeatID = 'entry-view-feat-activity-'+feat.id; + $('#bundleContainerFeats').append('

                  '+feat.name+'

                  '); + $('#'+viewFeatID).click(function() { + let featStruct = featMap.get(feat.id+''); + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags + }); + }); + } + + if(!foundContent) { + $('#bundleSectionFeats').addClass('is-hidden'); + } + } + + //// + + if(heritages.length > 0){ + let foundContent = false; + $('#bundleSectionHeritages').removeClass('is-hidden'); + $('#bundleContainerHeritages').html(''); + for(const heritage of heritages){ + if(heritage.indivAncestryName == null) {continue;} else {foundContent = true;} + + let viewHeritageID = 'entry-view-heritage-'+heritage.id; + $('#bundleContainerHeritages').append('

                  '+heritage.name+'

                  '); + $('#'+viewHeritageID).click(function() { + let ancestryText = (heritage.indivAncestryName != null) ? '~ Ancestry:: '+heritage.indivAncestryName+'\n' : ''; + let rarityText = (heritage.rarity != null) ? '~ Rarity:: '+capitalizeWord(heritage.rarity)+'\n' : ''; + let description = ancestryText+rarityText+'----\n'+heritage.description; + openQuickView('abilityView', { + Ability : { + name: heritage.name, + description: description, + level: 0, + contentSrc: heritage.contentSrc, + homebrewID: heritage.homebrewID, + code: heritage.code, + } + }); + }); + } + + if(!foundContent) { + $('#bundleSectionHeritages').addClass('is-hidden'); + } + } + + //// + + if(uniheritages.length > 0){ + $('#bundleSectionUniHeritages').removeClass('is-hidden'); + $('#bundleContainerUniHeritages').html(''); + for(const uniheritage of uniheritages){ + let viewUniHeritageID = 'entry-view-uni-heritage-'+uniheritage.id; + $('#bundleContainerUniHeritages').append('

                  '+uniheritage.name+'

                  '); + $('#'+viewUniHeritageID).click(function() { + new DisplayUniHeritage(displayContainerID, uniheritage.id, featMap, g_activeBundle.id); + }); + } + } + + //// + + if(items.length > 0){ + $('#bundleSectionItems').removeClass('is-hidden'); + $('#bundleContainerItems').html(''); + for(const itemStruct of items){ + let viewItemID = 'entry-view-item-'+itemStruct.Item.id; + $('#bundleContainerItems').append('

                  '+itemStruct.Item.name+'

                  '); + $('#'+viewItemID).click(function() { + let fullItemStruct = itemMap.get(itemStruct.Item.id+''); + openQuickView('itemView', { + ItemDataStruct : fullItemStruct + }); + }); + } + } + + //// + + if(languages.length > 0){ + $('#bundleSectionLanguages').removeClass('is-hidden'); + $('#bundleContainerLanguages').html(''); + for(const language of languages){ + let viewLanguageID = 'entry-view-language-'+language.id; + $('#bundleContainerLanguages').append('

                  '+language.name+'

                  '); + $('#'+viewLanguageID).click(function() { + openQuickView('languageView', { + Language : language + }); + }); + } + } + + //// + + if(spells.length > 0){ + $('#bundleSectionSpells').removeClass('is-hidden'); + $('#bundleContainerSpells').html(''); + for(const spell of spells){ + let viewSpellID = 'entry-view-spell-'+spell.id; + $('#bundleContainerSpells').append('

                  '+spell.name+'

                  '); + $('#'+viewSpellID).click(function() { + let spellStruct = spellMap.get(spell.id+''); + openQuickView('spellView', { + SpellDataStruct: spellStruct, + }); + }); + } + } + + //// + + if(allTags.length > 0){ + let foundContent = false; + $('#bundleSectionTraits').removeClass('is-hidden'); + $('#bundleContainerTraits').html(''); + for(const trait of allTags){ + if(trait.homebrewID == null || trait.isHidden == 1) {continue;} else {foundContent = true;} + + let viewTraitID = 'entry-view-trait-'+trait.id; + $('#bundleContainerTraits').append('

                  '+trait.name+'

                  '); + $('#'+viewTraitID).click(function() { + openQuickView('tagView', { + TagName : trait.name, + InputTag : trait, + }); + }); + } + + if(!foundContent) { + $('#bundleSectionTraits').addClass('is-hidden'); + } + } + + //// + + if(toggleables.length > 0){ + $('#bundleSectionToggleables').removeClass('is-hidden'); + $('#bundleContainerToggleables').html(''); + for(const toggleable of toggleables){ + let viewToggleableID = 'entry-view-toggleable-'+toggleable.id; + $('#bundleContainerToggleables').append('

                  '+toggleable.name+'

                  '); + $('#'+viewToggleableID).click(function() { + openQuickView('abilityView', { + Ability : { + name: toggleable.name, + description: toggleable.description, + level: 0, + contentSrc: toggleable.contentSrc, + homebrewID: toggleable.homebrewID, + code: toggleable.code, + } + }); + }); + } + } + + //// + + $('#'+displayContainerID).removeClass('is-hidden'); + } + }); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/general-homebrew.js b/client/vue-src/legacy-js/homebrew/general-homebrew.js new file mode 100644 index 00000000..75bd4c5d --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/general-homebrew.js @@ -0,0 +1,85 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let g_activeBundle = null; + +let g_featMap = null; +let g_itemMap = null; +let g_spellMap = null; +let g_allLanguages = null; +let g_allConditions = null; +let g_allTags = null; +let g_skillMap = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('.category-tabs li a').click(function() { + $('#browseTab').parent().removeClass("is-active"); + $('#userCollectionTab').parent().removeClass("is-active"); + $('#userContentTab').parent().removeClass("is-active"); + $(this).parent().addClass("is-active"); + }); + + $('#browseTab').click(function() { + openBundleBrowse(); + }); + + $('#userCollectionTab').click(function() { + openUserCollection(); + }); + + $('#userContentTab').click(function() { + openUserContent(); + }); + + + let editHomebrewID = $('#homebrew-container').attr('data-edit-homebrew-id'); + let viewHomebrewID = $('#homebrew-container').attr('data-view-homebrew-id'); + let homebrewTabName = $('#homebrew-container').attr('data-direct-to-tab').toUpperCase(); + + if(editHomebrewID != '' || viewHomebrewID != '' || homebrewTabName != '') { + if(editHomebrewID != ''){ + $('#userContentTab').parent().addClass('is-active'); + socket.emit('requestHomebrewBundle', 'EDIT', editHomebrewID); + } else if(viewHomebrewID != ''){ + $('#browseTab').parent().addClass('is-active'); + socket.emit('requestHomebrewBundle', 'VIEW', viewHomebrewID); + } else if(homebrewTabName != ''){ + switch(homebrewTabName) { + case 'BROWSE': $('#browseTab').trigger("click"); break; + case 'COLLECTION': $('#userCollectionTab').trigger("click"); break; + case 'CONTENT': $('#userContentTab').trigger("click"); break; + default: break; + } + } + } else { + $('#browseTab').trigger("click"); + } + +}); + +socket.on("returnHomebrewBundle", function(REQUEST_TYPE, homebrewBundle){ + if(homebrewBundle != null){ + if(REQUEST_TYPE === 'EDIT') { + $('#userContentTab').parent().addClass("is-active"); + openBundleEditor(homebrewBundle); + } else if(REQUEST_TYPE === 'VIEW') { + $('#browseTab').parent().addClass("is-active"); + openBundleView(homebrewBundle); + } + } +}); + +// Utils // +/* +function getHomebrewContentSrc(homebrewID){ + if(g_activeBundle != null && g_activeBundle.id == homebrewID){ + return g_activeBundle.name; + } else { + return null; + } +}*/ \ No newline at end of file diff --git a/client/vue-src/legacy-js/homebrew/user-collection.js b/client/vue-src/legacy-js/homebrew/user-collection.js new file mode 100644 index 00000000..11229729 --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/user-collection.js @@ -0,0 +1,67 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + + +function openUserCollection(){ + window.history.pushState('homebrew', '', '/homebrew/?sub_tab=collection');// Update URL + socket.emit('requestCollectedHomebrewBundles'); + //startSpinnerSubLoader(); +} + +socket.on("returnCollectedHomebrewBundles", function(hBundles){ + stopSpinnerSubLoader(); + $('#tabContent').html(''); + $('#tabContent').addClass('is-hidden'); + $('#tabContent').load("/templates/homebrew/display-user-collection.html"); + $.ajax({ type: "GET", + url: "/templates/homebrew/display-user-collection.html", + success : function(text) + { + + let foundBundle = false; + for (const hBundle of hBundles) { + if(!foundBundle){ + foundBundle = true; + } else { + $('#bundlesContainer').append('
                  '); + } + + let homebrewBundle = hBundle.homebrewBundle; + + let bundleViewID = 'bundle-'+homebrewBundle.id+'-view'; + let bundleRemoveID = 'bundle-'+homebrewBundle.id+'-remove'; + + let bundleName = homebrewBundle.name; + if(homebrewBundle.isPublished === 0){ + bundleName += ''; + } + + $('#bundlesContainer').append('
                  '+bundleName+'
                  '); + + $('#'+bundleViewID).click(function() { + openBundleView(homebrewBundle); + }); + + $('#'+bundleRemoveID).click(function() { + new ConfirmMessage('Remove from Collection', 'Are you sure you want to remove this bundle from your collection? Any content your characters are using from the bundle will be removed.', 'Remove', 'modal-remove-collection-bundle-'+homebrewBundle.id, 'modal-remove-collection-bundle-btn-'+homebrewBundle.id); + $('#modal-remove-collection-bundle-btn-'+homebrewBundle.id).click(function() { + socket.on("returnBundleChangeCollection", function(toAdd, isSuccess){ + socket.off('returnBundleChangeCollection'); + openUserCollection(); + }); + socket.emit('requestBundleChangeCollection', homebrewBundle.id, false); + }); + }); + + } + + if(!foundBundle){ + $('#bundlesContainer').html('

                  Your collection is empty. Go browse and find some homebrew to use with your characters!

                  '); + } + + $('#tabContent').removeClass('is-hidden'); + } + }); +}); + diff --git a/client/vue-src/legacy-js/homebrew/user-content.js b/client/vue-src/legacy-js/homebrew/user-content.js new file mode 100644 index 00000000..cd2530af --- /dev/null +++ b/client/vue-src/legacy-js/homebrew/user-content.js @@ -0,0 +1,147 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_homebrewBundles = null; + +function openUserContent(){ + window.history.pushState('homebrew', '', '/homebrew/?sub_tab=content');// Update URL + socket.emit('requestHomebrewBundles'); + //startSpinnerSubLoader(); +} + +socket.on("returnHomebrewBundles", function(homebrewBundles, canMakeHomebrew){ + g_homebrewBundles = homebrewBundles; + + stopSpinnerSubLoader(); + $('#tabContent').html(''); + $('#tabContent').addClass('is-hidden'); + $('#tabContent').load("/templates/homebrew/display-user-content.html"); + $.ajax({ type: "GET", + url: "/templates/homebrew/display-user-content.html", + success : function(text) + { + + if(canMakeHomebrew){ + $('#createBundleBtn').click(function() { + socket.emit('requestBundleCreate'); + }); + } else { + $('#createBundleBtn').attr('disabled','disabled'); + $('#createBundleBtn').parent().addClass('has-tooltip-left has-tooltip-multiline'); + $('#createBundleBtn').parent().attr('data-tooltip', 'Only Wanderer tier patrons and up can create their own homebrew content. You can support us and what we\'re doing on Patreon!'); + } + + let foundPublished = false; + let foundInProgess = false; + for (const homebrewBundle of homebrewBundles) { + if(homebrewBundle.isPublished == 1){ + foundPublished = true; + + let bundleViewID = 'bundle-'+homebrewBundle.id+'-view'; + let bundleManageKeysID = 'bundle-'+homebrewBundle.id+'-manage-keys'; + let bundleUpdateID = 'bundle-'+homebrewBundle.id+'-update'; + let bundleDeleteID = 'bundle-'+homebrewBundle.id+'-delete'; + + let bundleName = homebrewBundle.name; + let manageKeysHTML = ''; + if(homebrewBundle.hasKeys === 1){ + bundleName += ''; + manageKeysHTML = ''; + } + + $('#bundlesPublishedContainer').append('
                  '+bundleName+'
                  '+manageKeysHTML+'
                  '); + + // View Button // + $('#'+bundleViewID).click(function() { + openBundleView(homebrewBundle); + }); + + // Manage Keys Button // + if(homebrewBundle.hasKeys === 1){ + $('#'+bundleManageKeysID).click(function() { + g_activeBundle = homebrewBundle; + socket.emit('requestBundleKeys', g_activeBundle.id); + }); + } + + // Update Button // + if(canMakeHomebrew){ + $('#'+bundleUpdateID).click(function() { + g_activeBundle = homebrewBundle; + $('#bundle-update-published-modal').addClass('is-active'); + $('html').addClass('is-clipped'); + }); + } else { + $('#'+bundleUpdateID).attr('disabled','disabled'); + } + + // Delete Button // + $('#'+bundleDeleteID).click(function() { + new ConfirmMessage('Delete “'+homebrewBundle.name+'”', '

                  Are you sure you want to delete this?

                  There are '+homebrewBundle.userHomebrewBundles.length+' users still using the bundle.

                  ', 'Delete', 'modal-delete-in-progress-bundle-'+homebrewBundle.id, 'modal-delete-in-progress-bundle-btn-'+homebrewBundle.id); + $('#modal-delete-in-progress-bundle-btn-'+homebrewBundle.id).click(function() { + socket.emit('requestBundleDelete', homebrewBundle.id); + }); + }); + + } else { + foundInProgess = true; + + let bundleEditID = 'bundle-'+homebrewBundle.id+'-edit'; + let bundleDeleteID = 'bundle-'+homebrewBundle.id+'-delete'; + + let bundleName = homebrewBundle.name; + if(homebrewBundle.hasKeys === 1){ + bundleName += ''; + } + + $('#bundlesInProgessContainer').append('
                  '+bundleName+'
                  '); + + if(canMakeHomebrew){ + $('#'+bundleEditID).click(function() { + openBundleEditor(homebrewBundle); + }); + } else { + $('#'+bundleEditID).attr('disabled','disabled'); + } + + $('#'+bundleDeleteID).click(function() { + new ConfirmMessage('Delete “'+homebrewBundle.name+'”', '

                  Are you sure you want to delete this?

                  There are '+homebrewBundle.userHomebrewBundles.length+' users still using the bundle.

                  ', 'Delete', 'modal-delete-published-bundle-'+homebrewBundle.id, 'modal-delete-published-bundle-btn-'+homebrewBundle.id); + $('#modal-delete-published-bundle-btn-'+homebrewBundle.id).click(function() { + socket.emit('requestBundleDelete', homebrewBundle.id); + }); + }); + + } + } + + + $('#bundle-update-published-modal-btn').click(function() { + $('html').removeClass('is-clipped'); + socket.emit('requestBundleUpdatePublished', g_activeBundle.id); + }); + $('#bundle-update-published-modal-background,#bundle-update-published-modal-close').click(function() { + $('#bundle-update-published-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + g_activeBundle = null; + }); + + if(!foundPublished){ + $('#bundlesPublishedContainer').html('

                  None

                  '); + } + if(!foundInProgess){ + $('#bundlesInProgessContainer').html('

                  None

                  '); + } + + $('#tabContent').removeClass('is-hidden'); + } + }); +}); + +socket.on("returnBundleDelete", function(){ + openUserContent(); +}); + +socket.on("returnBundleUpdatePublished", function(){ + openUserContent(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/jQuery/chosen.jquery.min.js b/client/vue-src/legacy-js/jQuery/chosen.jquery.min.js new file mode 100644 index 00000000..4ad16475 --- /dev/null +++ b/client/vue-src/legacy-js/jQuery/chosen.jquery.min.js @@ -0,0 +1,3 @@ +/* Chosen v1.8.7 | (c) 2011-2018 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ + +(function(){var t,e,s,i,n=function(t,e){return function(){return t.apply(e,arguments)}},r=function(t,e){function s(){this.constructor=t}for(var i in e)o.call(e,i)&&(t[i]=e[i]);return s.prototype=e.prototype,t.prototype=new s,t.__super__=e.prototype,t},o={}.hasOwnProperty;(i=function(){function t(){this.options_index=0,this.parsed=[]}return t.prototype.add_node=function(t){return"OPTGROUP"===t.nodeName.toUpperCase()?this.add_group(t):this.add_option(t)},t.prototype.add_group=function(t){var e,s,i,n,r,o;for(e=this.parsed.length,this.parsed.push({array_index:e,group:!0,label:t.label,title:t.title?t.title:void 0,children:0,disabled:t.disabled,classes:t.className}),o=[],s=0,i=(r=t.childNodes).length;s"+this.escape_html(t.group_label)+""+t.html:t.html},t.prototype.mouse_enter=function(){return this.mouse_on_container=!0},t.prototype.mouse_leave=function(){return this.mouse_on_container=!1},t.prototype.input_focus=function(t){if(this.is_multiple){if(!this.active_field)return setTimeout(function(t){return function(){return t.container_mousedown()}}(this),50)}else if(!this.active_field)return this.activate_field()},t.prototype.input_blur=function(t){if(!this.mouse_on_container)return this.active_field=!1,setTimeout(function(t){return function(){return t.blur_test()}}(this),100)},t.prototype.label_click_handler=function(t){return this.is_multiple?this.container_mousedown(t):this.activate_field()},t.prototype.results_option_build=function(t){var e,s,i,n,r,o,h;for(e="",h=0,n=0,r=(o=this.results_data).length;n=this.max_shown_results));n++);return e},t.prototype.result_add_option=function(t){var e,s;return t.search_match&&this.include_option_in_results(t)?(e=[],t.disabled||t.selected&&this.is_multiple||e.push("active-result"),!t.disabled||t.selected&&this.is_multiple||e.push("disabled-result"),t.selected&&e.push("result-selected"),null!=t.group_array_index&&e.push("group-option"),""!==t.classes&&e.push(t.classes),s=document.createElement("li"),s.className=e.join(" "),t.style&&(s.style.cssText=t.style),s.setAttribute("data-option-array-index",t.array_index),s.innerHTML=t.highlighted_html||t.html,t.title&&(s.title=t.title),this.outerHTML(s)):""},t.prototype.result_add_group=function(t){var e,s;return(t.search_match||t.group_match)&&t.active_options>0?((e=[]).push("group-result"),t.classes&&e.push(t.classes),s=document.createElement("li"),s.className=e.join(" "),s.innerHTML=t.highlighted_html||this.escape_html(t.label),t.title&&(s.title=t.title),this.outerHTML(s)):""},t.prototype.results_update_field=function(){if(this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing)return this.winnow_results()},t.prototype.reset_single_select_options=function(){var t,e,s,i,n;for(n=[],t=0,e=(s=this.results_data).length;t"+this.escape_html(s)+""+this.escape_html(p)),null!=a&&(a.group_match=!0)):null!=r.group_array_index&&this.results_data[r.group_array_index].search_match&&(r.search_match=!0)));return this.result_clear_highlight(),_<1&&h.length?(this.update_results_content(""),this.no_results(h)):(this.update_results_content(this.results_option_build()),(null!=t?t.skip_highlight:void 0)?void 0:this.winnow_results_set_highlight())},t.prototype.get_search_regex=function(t){var e,s;return s=this.search_contains?t:"(^|\\s|\\b)"+t+"[^\\s]*",this.enable_split_word_search||this.search_contains||(s="^"+s),e=this.case_sensitive_search?"":"i",new RegExp(s,e)},t.prototype.search_string_match=function(t,e){var s;return s=e.exec(t),!this.search_contains&&(null!=s?s[1]:void 0)&&(s.index+=1),s},t.prototype.choices_count=function(){var t,e,s;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,t=0,e=(s=this.form_field.options).length;t0?this.keydown_backstroke():this.pending_backstroke||(this.result_clear_highlight(),this.results_search());break;case 13:t.preventDefault(),this.results_showing&&this.result_select(t);break;case 27:this.results_showing&&this.results_hide();break;case 9:case 16:case 17:case 18:case 38:case 40:case 91:break;default:this.results_search()}},t.prototype.clipboard_event_checker=function(t){if(!this.is_disabled)return setTimeout(function(t){return function(){return t.results_search()}}(this),50)},t.prototype.container_width=function(){return null!=this.options.width?this.options.width:this.form_field.offsetWidth+"px"},t.prototype.include_option_in_results=function(t){return!(this.is_multiple&&!this.display_selected_options&&t.selected)&&(!(!this.display_disabled_options&&t.disabled)&&!t.empty)},t.prototype.search_results_touchstart=function(t){return this.touch_started=!0,this.search_results_mouseover(t)},t.prototype.search_results_touchmove=function(t){return this.touch_started=!1,this.search_results_mouseout(t)},t.prototype.search_results_touchend=function(t){if(this.touch_started)return this.search_results_mouseup(t)},t.prototype.outerHTML=function(t){var e;return t.outerHTML?t.outerHTML:((e=document.createElement("div")).appendChild(t),e.innerHTML)},t.prototype.get_single_html=function(){return'\n '+this.default_text+'\n
                  \n
                  \n
                  \n \n
                    \n
                    '},t.prototype.get_multi_html=function(){return'
                      \n
                    • \n \n
                    • \n
                    \n
                    \n
                      \n
                      '},t.prototype.get_no_results_html=function(t){return'
                    • \n '+this.results_none_found+" "+this.escape_html(t)+"\n
                    • "},t.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:!(/iP(od|hone)/i.test(window.navigator.userAgent)||/IEMobile/i.test(window.navigator.userAgent)||/Windows Phone/i.test(window.navigator.userAgent)||/BlackBerry/i.test(window.navigator.userAgent)||/BB10/i.test(window.navigator.userAgent)||/Android.*Mobile/i.test(window.navigator.userAgent))},t.default_multiple_text="Select Some Options",t.default_single_text="Select an Option",t.default_no_result_text="No results match",t}(),(t=jQuery).fn.extend({chosen:function(i){return e.browser_is_supported()?this.each(function(e){var n,r;r=(n=t(this)).data("chosen"),"destroy"!==i?r instanceof s||n.data("chosen",new s(this,i)):r instanceof s&&r.destroy()}):this}}),s=function(s){function n(){return n.__super__.constructor.apply(this,arguments)}return r(n,e),n.prototype.setup=function(){return this.form_field_jq=t(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex},n.prototype.set_up_html=function(){var e,s;return(e=["chosen-container"]).push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&e.push(this.form_field.className),this.is_rtl&&e.push("chosen-rtl"),s={"class":e.join(" "),title:this.form_field.title},this.form_field.id.length&&(s.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=t("
                      ",s),this.container.width(this.container_width()),this.is_multiple?this.container.html(this.get_multi_html()):this.container.html(this.get_single_html()),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},n.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},n.prototype.register_observers=function(){return this.container.on("touchstart.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.container.on("touchend.chosen",function(t){return function(e){t.container_mouseup(e)}}(this)),this.container.on("mousedown.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.container.on("mouseup.chosen",function(t){return function(e){t.container_mouseup(e)}}(this)),this.container.on("mouseenter.chosen",function(t){return function(e){t.mouse_enter(e)}}(this)),this.container.on("mouseleave.chosen",function(t){return function(e){t.mouse_leave(e)}}(this)),this.search_results.on("mouseup.chosen",function(t){return function(e){t.search_results_mouseup(e)}}(this)),this.search_results.on("mouseover.chosen",function(t){return function(e){t.search_results_mouseover(e)}}(this)),this.search_results.on("mouseout.chosen",function(t){return function(e){t.search_results_mouseout(e)}}(this)),this.search_results.on("mousewheel.chosen DOMMouseScroll.chosen",function(t){return function(e){t.search_results_mousewheel(e)}}(this)),this.search_results.on("touchstart.chosen",function(t){return function(e){t.search_results_touchstart(e)}}(this)),this.search_results.on("touchmove.chosen",function(t){return function(e){t.search_results_touchmove(e)}}(this)),this.search_results.on("touchend.chosen",function(t){return function(e){t.search_results_touchend(e)}}(this)),this.form_field_jq.on("chosen:updated.chosen",function(t){return function(e){t.results_update_field(e)}}(this)),this.form_field_jq.on("chosen:activate.chosen",function(t){return function(e){t.activate_field(e)}}(this)),this.form_field_jq.on("chosen:open.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.form_field_jq.on("chosen:close.chosen",function(t){return function(e){t.close_field(e)}}(this)),this.search_field.on("blur.chosen",function(t){return function(e){t.input_blur(e)}}(this)),this.search_field.on("keyup.chosen",function(t){return function(e){t.keyup_checker(e)}}(this)),this.search_field.on("keydown.chosen",function(t){return function(e){t.keydown_checker(e)}}(this)),this.search_field.on("focus.chosen",function(t){return function(e){t.input_focus(e)}}(this)),this.search_field.on("cut.chosen",function(t){return function(e){t.clipboard_event_checker(e)}}(this)),this.search_field.on("paste.chosen",function(t){return function(e){t.clipboard_event_checker(e)}}(this)),this.is_multiple?this.search_choices.on("click.chosen",function(t){return function(e){t.choices_click(e)}}(this)):this.container.on("click.chosen",function(t){t.preventDefault()})},n.prototype.destroy=function(){return t(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),this.form_field_label.length>0&&this.form_field_label.off("click.chosen"),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},n.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field.disabled||this.form_field_jq.parents("fieldset").is(":disabled"),this.container.toggleClass("chosen-disabled",this.is_disabled),this.search_field[0].disabled=this.is_disabled,this.is_multiple||this.selected_item.off("focus.chosen",this.activate_field),this.is_disabled?this.close_field():this.is_multiple?void 0:this.selected_item.on("focus.chosen",this.activate_field)},n.prototype.container_mousedown=function(e){var s;if(!this.is_disabled)return!e||"mousedown"!==(s=e.type)&&"touchstart"!==s||this.results_showing||e.preventDefault(),null!=e&&t(e.target).hasClass("search-choice-close")?void 0:(this.active_field?this.is_multiple||!e||t(e.target)[0]!==this.selected_item[0]&&!t(e.target).parents("a.chosen-single").length||(e.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),t(this.container[0].ownerDocument).on("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},n.prototype.container_mouseup=function(t){if("ABBR"===t.target.nodeName&&!this.is_disabled)return this.results_reset(t)},n.prototype.search_results_mousewheel=function(t){var e;if(t.originalEvent&&(e=t.originalEvent.deltaY||-t.originalEvent.wheelDelta||t.originalEvent.detail),null!=e)return t.preventDefault(),"DOMMouseScroll"===t.type&&(e*=40),this.search_results.scrollTop(e+this.search_results.scrollTop())},n.prototype.blur_test=function(t){if(!this.active_field&&this.container.hasClass("chosen-container-active"))return this.close_field()},n.prototype.close_field=function(){return t(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale(),this.search_field.blur()},n.prototype.activate_field=function(){if(!this.is_disabled)return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},n.prototype.test_active_click=function(e){var s;return(s=t(e.target).closest(".chosen-container")).length&&this.container[0]===s[0]?this.active_field=!0:this.close_field()},n.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=i.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},n.prototype.result_do_highlight=function(t){var e,s,i,n,r;if(t.length){if(this.result_clear_highlight(),this.result_highlight=t,this.result_highlight.addClass("highlighted"),i=parseInt(this.search_results.css("maxHeight"),10),r=this.search_results.scrollTop(),n=i+r,s=this.result_highlight.position().top+this.search_results.scrollTop(),(e=s+this.result_highlight.outerHeight())>=n)return this.search_results.scrollTop(e-i>0?e-i:0);if(s0)return this.form_field_label.on("click.chosen",this.label_click_handler)},n.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},n.prototype.search_results_mouseup=function(e){var s;if((s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first()).length)return this.result_highlight=s,this.result_select(e),this.search_field.focus()},n.prototype.search_results_mouseover=function(e){var s;if(s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first())return this.result_do_highlight(s)},n.prototype.search_results_mouseout=function(e){if(t(e.target).hasClass("active-result")||t(e.target).parents(".active-result").first())return this.result_clear_highlight()},n.prototype.choice_build=function(e){var s,i;return s=t("
                    • ",{"class":"search-choice"}).html(""+this.choice_label(e)+""),e.disabled?s.addClass("search-choice-disabled"):((i=t("",{"class":"search-choice-close","data-option-array-index":e.array_index})).on("click.chosen",function(t){return function(e){return t.choice_destroy_link_click(e)}}(this)),s.append(i)),this.search_container.before(s)},n.prototype.choice_destroy_link_click=function(e){if(e.preventDefault(),e.stopPropagation(),!this.is_disabled)return this.choice_destroy(t(e.target))},n.prototype.choice_destroy=function(t){if(this.result_deselect(t[0].getAttribute("data-option-array-index")))return this.active_field?this.search_field.focus():this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.get_search_field_value().length<1&&this.results_hide(),t.parents("li").first().remove(),this.search_field_scale()},n.prototype.results_reset=function(){if(this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.trigger_form_field_change(),this.active_field)return this.results_hide()},n.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},n.prototype.result_select=function(t){var e,s;if(this.result_highlight)return e=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?e.removeClass("active-result"):this.reset_single_select_options(),e.addClass("result-selected"),s=this.results_data[e[0].getAttribute("data-option-array-index")],s.selected=!0,this.form_field.options[s.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(s):this.single_set_selected_text(this.choice_label(s)),this.is_multiple&&(!this.hide_results_on_select||t.metaKey||t.ctrlKey)?t.metaKey||t.ctrlKey?this.winnow_results({skip_highlight:!0}):(this.search_field.val(""),this.winnow_results()):(this.results_hide(),this.show_search_field_default()),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.trigger_form_field_change({selected:this.form_field.options[s.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,t.preventDefault(),this.search_field_scale())},n.prototype.single_set_selected_text=function(t){return null==t&&(t=this.default_text),t===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").html(t)},n.prototype.result_deselect=function(t){var e;return e=this.results_data[t],!this.form_field.options[e.options_index].disabled&&(e.selected=!1,this.form_field.options[e.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.trigger_form_field_change({deselected:this.form_field.options[e.options_index].value}),this.search_field_scale(),!0)},n.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect)return this.selected_item.find("abbr").length||this.selected_item.find("span").first().after(''),this.selected_item.addClass("chosen-single-with-deselect")},n.prototype.get_search_field_value=function(){return this.search_field.val()},n.prototype.get_search_text=function(){return t.trim(this.get_search_field_value())},n.prototype.escape_html=function(e){return t("
                      ").text(e).html()},n.prototype.winnow_results_set_highlight=function(){var t,e;if(e=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),null!=(t=e.length?e.first():this.search_results.find(".active-result").first()))return this.result_do_highlight(t)},n.prototype.no_results=function(t){var e;return e=this.get_no_results_html(t),this.search_results.append(e),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},n.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},n.prototype.keydown_arrow=function(){var t;return this.results_showing&&this.result_highlight?(t=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(t):void 0:this.results_show()},n.prototype.keyup_arrow=function(){var t;return this.results_showing||this.is_multiple?this.result_highlight?(t=this.result_highlight.prevAll("li.active-result")).length?this.result_do_highlight(t.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight()):void 0:this.results_show()},n.prototype.keydown_backstroke=function(){var t;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(t=this.search_container.siblings("li.search-choice").last()).length&&!t.hasClass("search-choice-disabled")?(this.pending_backstroke=t,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0},n.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},n.prototype.search_field_scale=function(){var e,s,i,n,r,o,h;if(this.is_multiple){for(r={position:"absolute",left:"-1000px",top:"-1000px",display:"none",whiteSpace:"pre"},s=0,i=(o=["fontSize","fontStyle","fontWeight","fontFamily","lineHeight","textTransform","letterSpacing"]).length;s").css(r)).text(this.get_search_field_value()),t("body").append(e),h=e.width()+25,e.remove(),this.container.is(":visible")&&(h=Math.min(this.container.outerWidth()-10,h)),this.search_field.width(h)}},n.prototype.trigger_form_field_change=function(t){return this.form_field_jq.trigger("input",t),this.form_field_jq.trigger("change",t)},n}()}).call(this); \ No newline at end of file diff --git a/client/vue-src/legacy-js/jQuery/jquery.ui.touch-punch.min.js b/client/vue-src/legacy-js/jQuery/jquery.ui.touch-punch.min.js new file mode 100644 index 00000000..31272ce6 --- /dev/null +++ b/client/vue-src/legacy-js/jQuery/jquery.ui.touch-punch.min.js @@ -0,0 +1,11 @@ +/*! + * jQuery UI Touch Punch 0.2.3 + * + * Copyright 2011–2014, Dave Furfero + * Dual licensed under the MIT or GPL Version 2 licenses. + * + * Depends: + * jquery.ui.widget.js + * jquery.ui.mouse.js + */ +!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); \ No newline at end of file diff --git a/client/vue-src/legacy-js/libraries/confirm_message/confirm-message.js b/client/vue-src/legacy-js/libraries/confirm_message/confirm-message.js new file mode 100644 index 00000000..87d3a0ae --- /dev/null +++ b/client/vue-src/legacy-js/libraries/confirm_message/confirm-message.js @@ -0,0 +1,32 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +class ConfirmMessage { + constructor(title, description, buttonName, modalID, deleteBtnID, btnColor='is-danger') { + this.title = title; + this.description = description; + this.modalID = modalID; + this.deleteBtnID = deleteBtnID; + $('#center-body').parent().append(''); + $('#'+modalID+'-card-close').click(function() { + $('#'+modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#'+modalID).remove(); + }); + $('#'+modalID+'-background').click(function() { + $('#'+modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#'+modalID).remove(); + }); + $('#'+deleteBtnID).click(function() { + $('#'+modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + window.setTimeout(()=>{ $('#'+modalID).remove(); }, 300); + }); + + // Open Modal + $('#'+modalID).addClass('is-active'); + $('html').addClass('is-clipped'); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/libraries/display_ancestry/display-ancestry.js b/client/vue-src/legacy-js/libraries/display_ancestry/display-ancestry.js new file mode 100644 index 00000000..54fd0a10 --- /dev/null +++ b/client/vue-src/legacy-js/libraries/display_ancestry/display-ancestry.js @@ -0,0 +1,217 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +class DisplayAncestry { + constructor(containerID, ancestryID, featMap, homebrewID=null, backButton=true) { + startSpinnerSubLoader(); + + featMap = new Map([...featMap.entries()].sort( + function(a, b) { + if (a[1].Feat.level === b[1].Feat.level) { + // Name is only important when levels are the same + return a[1].Feat.name > b[1].Feat.name ? 1 : -1; + } + return a[1].Feat.level - b[1].Feat.level; + }) + ); + + let ancestryDisplayContainerID = 'ancestry-container-'+ancestryID; + $('#'+containerID).parent().append(''); + $('#'+containerID).addClass('is-hidden'); + + socket.emit('requestGeneralAncestry', ancestryID, homebrewID); + socket.off('returnGeneralAncestry'); + socket.on("returnGeneralAncestry", function(ancestryStruct){ + $('#'+ancestryDisplayContainerID).load("/templates/display-ancestry.html"); + $.ajax({ type: "GET", + url: "/templates/display-ancestry.html", + success : function(text) + { + + if(backButton){ + $('#ancestry-back-btn').removeClass('is-hidden'); + $('#ancestry-back-btn').click(function() { + $('#'+ancestryDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + $('.category-tabs li').click(function() { + $('#'+ancestryDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + } + + $('#ancestry-name').html(ancestryStruct.ancestry.name); + $('#ancestry-description').html(processText(ancestryStruct.ancestry.description, false, false, 'MEDIUM', false)); + + showMoreCheck();// Check if description is too long, reveal show more instead + + if(ancestryStruct.ancestry.artworkURL != null){ + $('#ancestry-artwork-img').removeClass('is-hidden'); + $('#ancestry-artwork-img').attr('src', ancestryStruct.ancestry.artworkURL); + } else { + $('#ancestry-artwork-img').addClass('is-hidden'); + $('#ancestry-artwork-img').attr('src', ''); + } + + let sourceTextName = getContentSourceTextName(ancestryStruct.ancestry.contentSrc); + let sourceLink = getContentSourceLink(ancestryStruct.ancestry.contentSrc); + if(ancestryStruct.ancestry.homebrewID != null){ + sourceTextName = 'Bundle #'+ancestryStruct.ancestry.homebrewID; + sourceLink = '/homebrew/?view_id='+ancestryStruct.ancestry.homebrewID; + } + let sourceStr = ''+sourceTextName+', #'+ancestryStruct.ancestry.id+''; + + let ancestryRarity = convertRarityToHTML(ancestryStruct.ancestry.rarity); + if(ancestryRarity != ''){ sourceStr = ''+sourceStr+''; } + $('#ancestry-source').html(sourceStr+ancestryRarity); + + let boostsStr = ''; + for(let boost of ancestryStruct.boosts){ + if(boostsStr != ''){boostsStr += ', ';} + if(boost == 'Anything'){boost = 'Free';} + boostsStr += boost; + } + if(boostsStr == '') {boostsStr = 'None';} + $('#ancestry-boosts').html(boostsStr); + + let flawsStr = ''; + for(let flaw of ancestryStruct.flaws){ + if(flawsStr != ''){flawsStr += ', ';} + if(flaw == 'Anything'){flaw = 'Free';} + flawsStr += flaw; + } + if(flawsStr == '') {flawsStr = 'None';} + $('#ancestry-flaws').html(flawsStr); + + $('#ancestry-hitPoints').html(ancestryStruct.ancestry.hitPoints); + $('#ancestry-size').html(capitalizeWord(ancestryStruct.ancestry.size)); + $('#ancestry-speed').html(ancestryStruct.ancestry.speed+' ft'); + + let langStr = ''; + for(const lang of ancestryStruct.languages) { + langStr += lang.name+', '; + } + langStr = langStr.substring(0, langStr.length - 2); + $('#ancestry-languages').html(langStr); + + let bonusLangStr = ''; + ancestryStruct.bonus_languages = ancestryStruct.bonus_languages.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + for(const bonusLang of ancestryStruct.bonus_languages) { + bonusLangStr += bonusLang.name+', '; + } + $('#ancestry-languages-bonus').html('Additional languages...'); + + let sensesStr = ''; + if(ancestryStruct.vision_sense != null){ + sensesStr += ''+ancestryStruct.vision_sense.name+''; + if(ancestryStruct.additional_sense != null){ + sensesStr += ' and '; + } + } + if(ancestryStruct.additional_sense != null){ + sensesStr += ''+ancestryStruct.additional_sense.name+''; + } + $('#ancestry-senses').html(sensesStr); + + let phyFeatsStr = ''; + if(ancestryStruct.physical_feature_one != null){ + phyFeatsStr += ''+ancestryStruct.physical_feature_one.name+''; + if(ancestryStruct.physical_feature_two != null){ + phyFeatsStr += ' and '; + } + } + if(ancestryStruct.physical_feature_two != null){ + phyFeatsStr += ''+ancestryStruct.physical_feature_two.name+''; + } + if(phyFeatsStr == ''){phyFeatsStr = 'None';} + $('#ancestry-phyFeatures').html(phyFeatsStr); + + /// + + let firstHeritage = true; + for(let heritage of ancestryStruct.heritages) { + if(firstHeritage) {firstHeritage = false;} else {$('#ancestry-heritages').append('
                      ');} + + let sourceTextName = getContentSourceTextName(heritage.contentSrc); + if(heritage.homebrewID != null){ + sourceTextName = 'Bundle #'+heritage.homebrewID; + } + + $('#ancestry-heritages').append(` +
                      +
                      +

                      ${heritage.name}${convertRarityToHTML(heritage.rarity)}

                      + ${processText(heritage.description, false, null)} +
                      + + + ${sourceTextName} +
                      + `); + + + if(typeof g_isDeveloper !== 'undefined' && g_isDeveloper && heritage.code != null && heritage.code.trim() != '') { + $('#ancestry-heritages').append('

                      WSC Statements

                      '); + + let codeHTML = ''; + for(let codeStatement of heritage.code.split(/\n/)){ + codeHTML += '

                      '+codeStatement+'

                      '; + } + $('#ancestry-heritages').append('
                      '+codeHTML+'
                      '); + } + + } + + /// + + let ancestryFeatLevel = 0; + for(const [featID, featStruct] of featMap.entries()){ + let tag = featStruct.Tags.find(tag => { + return tag.id === ancestryStruct.ancestry.tagID; + }); + if(tag != null){ + if(featStruct.Feat.level <= 0) { continue; } + if(featStruct.Feat.level > ancestryFeatLevel){ + ancestryFeatLevel = featStruct.Feat.level; + $('#ancestry-feats').append('

                      Level '+ancestryFeatLevel+'

                      '); + } + + let sourceTextName = getContentSourceTextName(featStruct.Feat.contentSrc); + if(featStruct.Feat.homebrewID != null){ + sourceTextName = 'Bundle #'+featStruct.Feat.homebrewID; + } + + let featEntryID = 'ancestry-feat-'+featStruct.Feat.id; + $('#ancestry-feats').append('
                      '+featStruct.Feat.name+convertActionToHTML(featStruct.Feat.actions)+''+sourceTextName+'
                      '); + + $('#'+featEntryID).click(function(){ + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags + }); + }); + + $('#'+featEntryID).mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+featEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + } + } + + stopSpinnerSubLoader(); + $('#'+ancestryDisplayContainerID).removeClass('is-hidden'); + } + }); + }); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/libraries/display_archetype/display-archetype.js b/client/vue-src/legacy-js/libraries/display_archetype/display-archetype.js new file mode 100644 index 00000000..8ef368dc --- /dev/null +++ b/client/vue-src/legacy-js/libraries/display_archetype/display-archetype.js @@ -0,0 +1,129 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +class DisplayArchetype { + constructor(containerID, archetypeID, featMap, homebrewID=null, backButton=true) { + startSpinnerSubLoader(); + + featMap = new Map([...featMap.entries()].sort( + function(a, b) { + if (a[1].Feat.level === b[1].Feat.level) { + // Name is only important when levels are the same + return a[1].Feat.name > b[1].Feat.name ? 1 : -1; + } + return a[1].Feat.level - b[1].Feat.level; + }) + ); + + let archetypeDisplayContainerID = 'archetype-container-'+archetypeID; + $('#'+containerID).parent().append(''); + $('#'+containerID).addClass('is-hidden'); + + socket.emit('requestGeneralArchetype', archetypeID, homebrewID); + socket.off('returnGeneralArchetype'); + socket.on("returnGeneralArchetype", function(archetypeStruct){ + $('#'+archetypeDisplayContainerID).load("/templates/display-archetype.html"); + $.ajax({ type: "GET", + url: "/templates/display-archetype.html", + success : function(text) + { + stopSpinnerSubLoader(); + + if(backButton){ + $('#archetype-back-btn').removeClass('is-hidden'); + $('#archetype-back-btn').click(function() { + $('#'+archetypeDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + $('.category-tabs li').click(function() { + $('#'+archetypeDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + } + + $('#archetype-name').html(archetypeStruct.archetype.name); + $('#archetype-description').html(processText(archetypeStruct.archetype.description, false, null, 'MEDIUM', false)); + + let dedFeatStruct = featMap.get(archetypeStruct.archetype.dedicationFeatID+''); + + let sourceTextName = getContentSourceTextName(archetypeStruct.archetype.contentSrc); + let sourceLink = getContentSourceLink(archetypeStruct.archetype.contentSrc); + if(archetypeStruct.archetype.homebrewID != null){ + sourceTextName = 'Bundle #'+archetypeStruct.archetype.homebrewID; + sourceLink = '/homebrew/?view_id='+archetypeStruct.archetype.homebrewID; + } + let sourceStr = ''+sourceTextName+', #'+archetypeStruct.archetype.id+''; + + let archetypeRarity = convertRarityToHTML(dedFeatStruct.Feat.rarity); + if(archetypeRarity != ''){ sourceStr = ''+sourceStr+''; } + $('#archetype-source').html(sourceStr+archetypeRarity); + + /// + + $('#archetype-ded-feat-name').html(dedFeatStruct.Feat.name); + $('#archetype-ded-feat-level').html('Lvl '+dedFeatStruct.Feat.level); + + $('#archetype-ded-feat-container').click(function(){ + openQuickView('featView', { + Feat : dedFeatStruct.Feat, + Tags : dedFeatStruct.Tags + }); + }); + + $('#archetype-ded-feat-container').mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#archetype-ded-feat-container').mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + /// + + let archetypeFeatLevel = 0; + for(const [featID, featStruct] of featMap.entries()){ + let tag = featStruct.Tags.find(tag => { + return tag.id === archetypeStruct.archetype.tagID; + }); + if(tag != null || featStruct.Feat.genTypeName == archetypeStruct.archetype.name+' Archetype'){ + if(featStruct.Feat.level <= 0) { continue; } + if(featStruct.Feat.level > archetypeFeatLevel){ + archetypeFeatLevel = featStruct.Feat.level; + $('#archetype-feats').append('

                      Level '+archetypeFeatLevel+'

                      '); + } + + let sourceTextName = getContentSourceTextName(featStruct.Feat.contentSrc); + if(featStruct.Feat.homebrewID != null){ + sourceTextName = 'Bundle #'+featStruct.Feat.homebrewID; + } + + let featEntryID = 'archetype-feat-'+featStruct.Feat.id; + $('#archetype-feats').append('
                      '+featStruct.Feat.name+convertActionToHTML(featStruct.Feat.actions)+''+sourceTextName+'
                      '); + + $('#'+featEntryID).click(function(){ + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags + }); + }); + + $('#'+featEntryID).mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+featEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + } + } + + $('#'+archetypeDisplayContainerID).removeClass('is-hidden'); + } + }); + }); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/libraries/display_background/display-background.js b/client/vue-src/legacy-js/libraries/display_background/display-background.js new file mode 100644 index 00000000..fbea9b12 --- /dev/null +++ b/client/vue-src/legacy-js/libraries/display_background/display-background.js @@ -0,0 +1,86 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +class DisplayBackground { + constructor(containerID, backgroundID, homebrewID=null, backButton=true) { + startSpinnerSubLoader(); + + let backgroundDisplayContainerID = 'background-container-'+backgroundID; + $('#'+containerID).parent().append(''); + $('#'+containerID).addClass('is-hidden'); + + socket.emit('requestGeneralBackground', backgroundID, homebrewID); + socket.off('returnGeneralBackground'); + socket.on("returnGeneralBackground", function(backgroundStruct){ + $('#'+backgroundDisplayContainerID).load("/templates/display-background.html"); + $.ajax({ type: "GET", + url: "/templates/display-background.html", + success : function(text) + { + stopSpinnerSubLoader(); + + if(backButton){ + $('#background-back-btn').removeClass('is-hidden'); + $('#background-back-btn').click(function() { + $('#'+backgroundDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + $('.category-tabs li').click(function() { + $('#'+backgroundDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + } + + $('#background-name').html(backgroundStruct.background.name); + $('#background-description').html(processText(backgroundStruct.background.description, false, null, 'MEDIUM', false)); + + let sourceTextName = getContentSourceTextName(backgroundStruct.background.contentSrc); + let sourceLink = getContentSourceLink(backgroundStruct.background.contentSrc); + if(backgroundStruct.background.homebrewID != null){ + sourceTextName = 'Bundle #'+backgroundStruct.background.homebrewID; + sourceLink = '/homebrew/?view_id='+backgroundStruct.background.homebrewID; + } + let sourceStr = ''+sourceTextName+', #'+backgroundStruct.background.id+''; + + let backgroundRarity = convertRarityToHTML(backgroundStruct.background.rarity); + if(backgroundRarity != ''){ sourceStr = ''+sourceStr+''; } + $('#background-source').html(sourceStr+backgroundRarity); + + if(backgroundStruct.background.boostOne != null){ + let boostStr = ''; + let boostParts = backgroundStruct.background.boostOne.split(','); + for (let i = 0; i < boostParts.length; i++) { + if(i != 0) { + if(i == boostParts.length-1){ + boostStr += ' or '; + } else { + boostStr += ', '; + } + } + boostStr += lengthenAbilityType(boostParts[i]); + } + $('#background-boost-one').html(boostStr); + $('#background-boost-two').html('Free'); + } else { + $('#background-boost-one').parent().parent().parent().addClass('is-hidden'); + } + + if(typeof g_isDeveloper !== 'undefined' && g_isDeveloper && backgroundStruct.background.code != null && backgroundStruct.background.code.trim() != '') { + $('#background-code').html(''); + $('#background-code').append('
                      '); + $('#background-code').append('

                      WSC Statements

                      '); + + let codeHTML = ''; + for(let codeStatement of backgroundStruct.background.code.split(/\n/)){ + codeHTML += '

                      '+codeStatement+'

                      '; + } + $('#background-code').append('
                      '+codeHTML+'
                      '); + } + + $('#'+backgroundDisplayContainerID).removeClass('is-hidden'); + } + }); + }); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/libraries/display_campaign/display-campaign.js b/client/vue-src/legacy-js/libraries/display_campaign/display-campaign.js new file mode 100644 index 00000000..a3006791 --- /dev/null +++ b/client/vue-src/legacy-js/libraries/display_campaign/display-campaign.js @@ -0,0 +1,425 @@ +/* Copyright (C) 2022, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ +class DisplayCampaign { + constructor(containerID, campaignID, backButton = true, addToEncounterBtn = false) { + startSpinnerSubLoader(); + + let campaignDisplayContainerID = 'campaign-container-' + campaignID; + $('#' + containerID).parent().append(''); + $('#' + containerID).addClass('is-hidden'); + + socket.emit('requestCampaignDetails', campaignID); + socket.off('returnCampaignDetails'); + socket.on("returnCampaignDetails", function (campaignStruct, allConditions) { + $('#' + campaignDisplayContainerID).load("/templates/display-campaign.html"); + $.ajax({ + type: "GET", + url: "/templates/display-campaign.html", + success: function (text) { + stopSpinnerSubLoader(); + + g_allConditions = allConditions.sort( + function (a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + if (backButton) { + $('#campaign-back-btn').removeClass('is-hidden'); + $('#campaign-back-btn, .category-tabs li').click(function () { + $('#' + campaignDisplayContainerID).remove(); + $('#' + containerID).removeClass('is-hidden'); + window.history.pushState({}, null, '/gm-tools/campaigns'); + }); + } + + $('#campaign-name').html(campaignStruct.campaign.name); + + textProcess_warningOnUnknown = true; + $('#campaign-description').html(processText(campaignStruct.campaign.description, false, false, 'MEDIUM', false)); + textProcess_warningOnUnknown = false; + + if (campaignStruct.campaign.imageURL != null) { + $('#campaign-artwork-img').removeClass('is-hidden'); + $('#campaign-artwork-img').attr('src', campaignStruct.campaign.imageURL); + } else { + $('#campaign-artwork-img').addClass('is-hidden'); + $('#campaign-artwork-img').attr('src', ''); + } + + let sourceStr = '#' + campaignStruct.campaign.id + ''; + $('#campaign-source').html(sourceStr); + + $('#campaign-access-code').html(campaignStruct.campaign.accessID); + + /// + + campaignStruct.accessTokens = campaignStruct.accessTokens.sort( + function(a, b) { + return a.character.name > b.character.name ? 1 : -1; + } + ); + + for (const accessToken of campaignStruct.accessTokens) { + + $('#campaign-players').append(` +
                      + `); + + // If has no calculatedStats, give temp details + if (!accessToken.calculatedStat) { + accessToken.calculatedStat = { + fakeStats: true, + maxHP: 9999, + maxStamina: 9999, + maxResolve: 99, + totalPerception: 0, + }; + } + if (!accessToken.calculatedStat.generalInfo) { + accessToken.calculatedStat.generalInfo = { + className: 'Unknown', + heritageAncestryName: 'Unknown', + backgroundName: 'Unknown', + size: null, + traits: [], + }; + } else { + accessToken.calculatedStat.generalInfo = JSON.parse(accessToken.calculatedStat.generalInfo); + } + if (!accessToken.calculatedStat.conditions) { + accessToken.calculatedStat.conditions = []; + } else { + accessToken.calculatedStat.conditions = JSON.parse(accessToken.calculatedStat.conditions); + } + if (!accessToken.calculatedStat.totalSkills) { + accessToken.calculatedStat.totalSkills = []; + } else { + accessToken.calculatedStat.totalSkills = JSON.parse(accessToken.calculatedStat.totalSkills); + } + if (!accessToken.calculatedStat.totalSaves) { + accessToken.calculatedStat.totalSaves = []; + } else { + accessToken.calculatedStat.totalSaves = JSON.parse(accessToken.calculatedStat.totalSaves); + } + if (!accessToken.calculatedStat.totalAbilityScores) { + accessToken.calculatedStat.totalAbilityScores = []; + } else { + accessToken.calculatedStat.totalAbilityScores = JSON.parse(accessToken.calculatedStat.totalAbilityScores); + } + if (!accessToken.calculatedStat.weapons) { + accessToken.calculatedStat.weapons = []; + } else { + accessToken.calculatedStat.weapons = JSON.parse(accessToken.calculatedStat.weapons); + } + + generateCharacterEntry(accessToken, addToEncounterBtn); + + } + + // Display if no players are in campaign. + if(campaignStruct.accessTokens.length === 0){ + $('#campaign-players').html(` +
                      +
                      +

                      Your campaign has no players. Characters can use the access code to join this campaign!

                      +
                      +
                      + `); + } + + $('#' + campaignDisplayContainerID).removeClass('is-hidden'); + + + // Handle Character Updates // + + socket.on("sendCharacterUpdateToGM", function (charID, updates) { + + let accessToken = campaignStruct.accessTokens.find(accessToken => { + return charID == accessToken.charID; + }); + if (!accessToken) { return; } + + /* Data: (copy from remote-updates.js) + hp - { value } + temp-hp - { value } + exp - { value } + stamina - { value } + resolve - { value } + hero-points - { value } + calculated-stats - g_calculatedStats + char-info - charInfoJSON + roll-history - rollHistoryJSON + */ + + for (let update of updates) { + + if (update.type == 'hp') { + accessToken.character.currentHealth = update.data.value; + } else if (update.type == 'temp-hp') { + accessToken.character.tempHealth = update.data.value; + } else if (update.type == 'exp') { + accessToken.character.experience = update.data.value; + } else if (update.type == 'stamina') { + accessToken.character.currentStamina = update.data.value; + } else if (update.type == 'resolve') { + accessToken.character.currentResolve = update.data.value; + } else if (update.type == 'hero-points') { + accessToken.character.heroPoints = update.data.value; + } else if (update.type == 'calculated-stats') { + accessToken.calculatedStat = update.data; + } else if (update.type == 'char-info') { + accessToken.character.infoJSON = update.data; + } else if (update.type == 'roll-history') { + accessToken.character.rollHistoryJSON = update.data; + } + + } + + generateCharacterEntry(accessToken, addToEncounterBtn); + + /* Note: Don't insert accessToken as a parameter because doing so causes a bug + with jumping to a new character every update. + */ + refreshQuickView(); + + }); + + } + }); + }); + } +} + +function generateCharacterEntry(accessToken, addToEncounterBtn) { + + let input_characterCurrentHP = `character-input-hp-${accessToken.charID}`; + + let btn_characterAddCondition = `character-btn-condition-add-${accessToken.charID}`; + let btn_characterView = `character-btn-view-${accessToken.charID}`; + let btn_characterSheet = `character-btn-sheet-${accessToken.charID}`; + + let container_characterStartspace = `character-container-startspace-${accessToken.charID}`; + let container_characterHealth = `character-container-health-${accessToken.charID}`; + let container_characterEndspace = `character-container-endspace-${accessToken.charID}`; + + let container_characterConditions = `character-container-conditions-${accessToken.charID}`; + + $(`#campaign-player-entry-${accessToken.charID}`).html(` +
                      + +
                      +
                      +

                      ${accessToken.character.name}

                      +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      + + + +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + `); + + let btn_characterDelete = `character-btn-delete-${accessToken.charID}`; + let btn_characterAddToEncounter = `character-btn-add-to-encounter-${accessToken.charID}`; + + if(addToEncounterBtn){ + $(`#${container_characterStartspace}`).hide(); + $(`#campaign-listing-startspace`).hide(); + + let isOutlined = 'is-outlined'; + let btnText = 'Add to Encounter'; + + let existingMember = allEncounters[currentEncounterIndex].members.find(member => { + return member.isCharacter && member.characterData.charID == accessToken.charID; + }); + if(existingMember) { + isOutlined = ''; + btnText = 'Added'; + } + + $(`#${container_characterEndspace}`).html(` +
                      + +
                      + `); + } else { + $(`#${container_characterEndspace}`).html(` + + + + `); + } + + // Handle removing on smaller sizes + setTimeout(() => { + if ($(`#campaign-player-entry-${accessToken.charID}`).width() < 768) { + $(`#${container_characterHealth}`).hide(); + $(`#campaign-listing-health`).hide(); + } + }, 1); + + // View // + $(`#${btn_characterView}`).click(function () { + g_characterViewOpenedTab_rollHistory = false; + g_characterViewOpenedTab_charInfo = false; + openQuickView('characterView', accessToken); + }); + + // HP // + $(`#${input_characterCurrentHP}`).on('keypress', function (e) { + if (e.which == 13) { + $(`#${input_characterCurrentHP}`).blur(); + } + }); + $(`#${input_characterCurrentHP}`).blur(function () { + let newHP; + try { + newHP = parseInt(math.evaluate($(this).val())); + if (newHP > accessToken.calculatedStat.maxHP) { newHP = accessToken.calculatedStat.maxHP; } + if (newHP < 0) { newHP = 0; } + if (isNaN(newHP)) { newHP = 0; } + } catch (err) { + newHP = 0; + } + $(this).val(newHP); + socket.emit(`requestCharacterUpdate-Health`, accessToken.charID, newHP); + }); + $(`#${input_characterCurrentHP}`).click(function (event) { + event.stopImmediatePropagation(); + }); + + // Delete // + $(`#${btn_characterDelete}`).click(function () { + new ConfirmMessage('Remove Character', `Are you sure you want to remove "${accessToken.character.name}" from the campaign?`, 'Remove', 'modal-char-leave-campaign', 'modal-char-leave-campaign-btn'); + $('#modal-char-leave-campaign-btn').click(function () { + socket.emit("requestLeaveCampaign", accessToken.charID); + $(`#campaign-player-entry-${accessToken.charID}`).remove(); + }); + }); + + // Add to Encounter // + $(`#${btn_characterAddToEncounter}`).click(function () { + addCharacterToEncounter(accessToken); + + $(`#${btn_characterAddToEncounter}`).removeClass('is-outlined'); + $(`#${btn_characterAddToEncounter}-text`).text('Added'); + }); + + // Conditions // + populateConditions(accessToken, container_characterConditions, addToEncounterBtn); + + $(`#${btn_characterAddCondition}`).click(function () { + let member = (addToEncounterBtn) ? { isCharacter: true, characterData: accessToken } : accessToken; + openSelectConditionsModal(member); + }); + +} + +function populateConditions(accessToken, containerID, isEncounterBuilder) { + + $(`#${containerID}`).html(''); + + // Convert character conditions data to encounter conditions data format + let convertedConditions = []; + for (let condition of accessToken.calculatedStat.conditions) { + convertedConditions.push({ + name: condition.name, + value: condition.value, + parentSource: condition.sourceText, + }); + } + + for (let condition of getAppliedConditions(convertedConditions)) { + let conditionDisplayName = capitalizeWords(condition.name); + if (condition.value != null) { conditionDisplayName += ` ${condition.value}`; } + + let btn_characterConditionView = `character-btn-condition-view-${accessToken.charID}-${condition.name.replace(/\W/g, '_')}`; + let btn_characterConditionDelete = `character-btn-condition-delete-${accessToken.charID}-${condition.name.replace(/\W/g, '_')}`; + + if (condition.parentSource) { + $(`#${containerID}`).append(` +
                      +

                      + +

                      +
                      + `); + } else { + $(`#${containerID}`).append(` +
                      +

                      + +

                      +

                      + +

                      +
                      + `); + } + + $(`#${btn_characterConditionView}`).click(function () { + let member = (isEncounterBuilder) ? { isCharacter: true, characterData: accessToken } : accessToken; + openConditionsModal(member, condition); + }); + + $(`#${btn_characterConditionDelete}`).click(function () { + let member = (isEncounterBuilder) ? { isCharacter: true, characterData: accessToken } : accessToken; + removeCondition(member, condition.name); + }); + + } + +} diff --git a/client/vue-src/legacy-js/libraries/display_class/display-class.js b/client/vue-src/legacy-js/libraries/display_class/display-class.js new file mode 100644 index 00000000..6c0eb6b2 --- /dev/null +++ b/client/vue-src/legacy-js/libraries/display_class/display-class.js @@ -0,0 +1,242 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +class DisplayClass { + constructor(containerID, classID, featMap, homebrewID=null, backButton=true) { + startSpinnerSubLoader(); + + featMap = new Map([...featMap.entries()].sort( + function(a, b) { + if (a[1].Feat.level === b[1].Feat.level) { + // Name is only important when levels are the same + return a[1].Feat.name > b[1].Feat.name ? 1 : -1; + } + return a[1].Feat.level - b[1].Feat.level; + }) + ); + + let classDisplayContainerID = 'class-container-'+classID; + $('#'+containerID).parent().append(''); + $('#'+containerID).addClass('is-hidden'); + + socket.emit('requestGeneralClass', classID, homebrewID); + socket.off('returnGeneralClass'); + socket.on("returnGeneralClass", function(classStruct){ + $('#'+classDisplayContainerID).load("/templates/display-class.html"); + $.ajax({ type: "GET", + url: "/templates/display-class.html", + success : function(text) + { + + if(backButton){ + $('#class-back-btn').removeClass('is-hidden'); + $('#class-back-btn').click(function() { + $('#'+classDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + $('.category-tabs li').click(function() { + $('#'+classDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + } + + $('#class-name').html(classStruct.class.name); + + let sourceTextName = getContentSourceTextName(classStruct.class.contentSrc); + let sourceLink = getContentSourceLink(classStruct.class.contentSrc); + if(classStruct.class.homebrewID != null){ + sourceTextName = 'Bundle #'+classStruct.class.homebrewID; + sourceLink = '/homebrew/?view_id='+classStruct.class.homebrewID; + } + let sourceStr = ''+sourceTextName+', #'+classStruct.class.id+''; + + let classRarity = convertRarityToHTML(classStruct.class.rarity); + if(classRarity != ''){ sourceStr = ''+sourceStr+''; } + $('#class-source').html(sourceStr+classRarity); + + $('#class-description').html(processText(classStruct.class.description, false, false, 'MEDIUM', false)); + + showMoreCheck();// Check if description is too long, reveal show more instead + + if(classStruct.class.artworkURL != null){ + $('#class-artwork-img').removeClass('is-hidden'); + $('#class-artwork-img').attr('src', classStruct.class.artworkURL); + } else { + $('#class-artwork-img').addClass('is-hidden'); + $('#class-artwork-img').attr('src', ''); + } + + if(classStruct.class.keyAbility == 'OTHER') { + $('#class-key-ability').html('

                      Varies

                      '); + $('#class-key-ability-desc').html('At 1st level, your class gives you an ability boost - usually depending on one of your class features.'); + } else { + $('#class-key-ability').html('

                      '+classStruct.class.keyAbility+'

                      '); + $('#class-key-ability-desc').html('At 1st level, your class gives you an ability boost to '+classStruct.class.keyAbility+'.'); + } + + $('#class-hit-points').html('

                      '+classStruct.class.hitPoints+'

                      '); + + $('#class-perception').html(''+profToWord(classStruct.class.tPerception)+''); + $('#class-saving-throw-fort').html(''+profToWord(classStruct.class.tFortitude)+' in Fortitude'); + $('#class-saving-throws-reflex').html(''+profToWord(classStruct.class.tReflex)+' in Reflex'); + $('#class-saving-throws-will').html(''+profToWord(classStruct.class.tWill)+' in Will'); + + let tWeaponsArray = classStruct.class.tWeapons.split(',,, '); + for(const tWeapons of tWeaponsArray){ + let sections = tWeapons.split(':::'); + let weapTraining = sections[0]; + let weaponName = sections[1]; + if(weaponName.slice(-1) === 's'){ + // is plural + $('#class-attacks').append('

                      '+profToWord(weapTraining)+' in all '+weaponName+'

                      '); + } else { + // is singular + $('#class-attacks').append('

                      '+profToWord(weapTraining)+' in the '+weaponName+'

                      '); + } + } + if(classStruct.class.weaponsExtra != null) { + let weapLines = classStruct.class.weaponsExtra.split('\n'); + for(const weapLine of weapLines){ + let newWeapLine = weapLine; + newWeapLine = newWeapLine.replace('Untrained','Untrained'); + newWeapLine = newWeapLine.replace('Trained','Trained'); + newWeapLine = newWeapLine.replace('Expert','Expert'); + newWeapLine = newWeapLine.replace('Master','Master'); + newWeapLine = newWeapLine.replace('Legendary','Legendary'); + $('#class-attacks').append(`

                      ${newWeapLine}

                      `); + } + } + + if(classStruct.class.tSkills != null){ + $('#class-skills').html('Trained in '+classStruct.class.tSkills); + } + $('#class-skills-extra').html('Trained in a number of additional skills equal to '+classStruct.class.tSkillsMore+' plus your Intelligence modifier'); + + $('#class-class-dc').html(''+profToWord(classStruct.class.tClassDC)+''); + + let tArmorArray = classStruct.class.tArmor.split(',,, '); + for(const tArmor of tArmorArray){ + let sections = tArmor.split(':::'); + let armTraining = sections[0]; + let armName = sections[1]; + $('#class-defenses').append('

                      '+profToWord(armTraining)+' in all '+armName+'

                      '); + } + + /// + + $('#class-features-level-select').change(function(){ + $('#class-features').html(''); + let level = $(this).val(); + let firstEntry = true; + for(const classFeature of classStruct.class_features){ + if(classFeature.level != level || classFeature.selectType == 'SELECT_OPTION'){ continue; } + if(firstEntry) { firstEntry = false; } else { $('#class-features').append('
                      '); } + + let sourceTextName = getContentSourceTextName(classFeature.contentSrc); + if(classFeature.homebrewID != null){ + sourceTextName = 'Bundle #'+classFeature.homebrewID; + } + + $('#class-features').append(` +
                      +
                      +

                      ${classFeature.name}

                      + ${processText(classFeature.description, false, null)} +
                      + + + ${sourceTextName} +
                      + `); + + if(classFeature.selectType == 'SELECTOR'){ + $('#class-features').append('

                      Options

                      '+subClassFeature.name+'

                      WSC Statements

                      '); + + let codeHTML = ''; + for(let codeStatement of classFeature.code.split(/\n/)){ + codeHTML += '

                      '+codeStatement+'

                      '; + } + $('#class-features').append('
                      '+codeHTML+'
                      '); + } + + } + }); + $('#class-features-level-select').trigger('change'); + + /// + + let classFeatLevel = 0; + for(const [featID, featStruct] of featMap.entries()){ + let tag = featStruct.Tags.find(tag => { + return tag.id === classStruct.class.tagID; + }); + if(tag != null){ + if(featStruct.Feat.level <= 0) { continue; } + if(featStruct.Feat.level > classFeatLevel){ + classFeatLevel = featStruct.Feat.level; + $('#class-feats').append('

                      Level '+classFeatLevel+'

                      '); + } + + let sourceTextName = getContentSourceTextName(featStruct.Feat.contentSrc); + if(featStruct.Feat.homebrewID != null){ + sourceTextName = 'Bundle #'+featStruct.Feat.homebrewID; + } + + let featEntryID = 'class-feat-'+featStruct.Feat.id; + $('#class-feats').append('
                      '+featStruct.Feat.name+convertActionToHTML(featStruct.Feat.actions)+''+sourceTextName+'
                      '); + + $('#'+featEntryID).click(function(){ + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags + }); + }); + + $('#'+featEntryID).mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+featEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + } + } + + stopSpinnerSubLoader(); + $('#'+classDisplayContainerID).removeClass('is-hidden'); + } + }); + }); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/libraries/display_uni_heritage/display-uni-heritage.js b/client/vue-src/legacy-js/libraries/display_uni_heritage/display-uni-heritage.js new file mode 100644 index 00000000..d029db15 --- /dev/null +++ b/client/vue-src/legacy-js/libraries/display_uni_heritage/display-uni-heritage.js @@ -0,0 +1,126 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +class DisplayUniHeritage { + constructor(containerID, uniHeritageID, featMap, homebrewID=null, backButton=true) { + startSpinnerSubLoader(); + + featMap = new Map([...featMap.entries()].sort( + function(a, b) { + if (a[1].Feat.level === b[1].Feat.level) { + // Name is only important when levels are the same + return a[1].Feat.name > b[1].Feat.name ? 1 : -1; + } + return a[1].Feat.level - b[1].Feat.level; + }) + ); + + let uniHeritageDisplayContainerID = 'uni-heritage-container-'+uniHeritageID; + $('#'+containerID).parent().append(''); + $('#'+containerID).addClass('is-hidden'); + + socket.emit('requestGeneralUniHeritage', uniHeritageID, homebrewID); + socket.off('returnGeneralUniHeritage'); + socket.on("returnGeneralUniHeritage", function(uniHeritageStruct){ + $('#'+uniHeritageDisplayContainerID).load("/templates/display-uni-heritage.html"); + $.ajax({ type: "GET", + url: "/templates/display-uni-heritage.html", + success : function(text) + { + stopSpinnerSubLoader(); + + if(backButton){ + $('#uni-heritage-back-btn').removeClass('is-hidden'); + $('#uni-heritage-back-btn').click(function() { + $('#'+uniHeritageDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + $('.category-tabs li').click(function() { + $('#'+uniHeritageDisplayContainerID).remove(); + $('#'+containerID).removeClass('is-hidden'); + }); + } + + $('#uni-heritage-name').html(uniHeritageStruct.heritage.name); + $('#uni-heritage-description').html(processText(uniHeritageStruct.heritage.description, false, false, 'MEDIUM', false)); + + if(typeof g_isDeveloper !== 'undefined' && g_isDeveloper && uniHeritageStruct.heritage.code != null && uniHeritageStruct.heritage.code.trim() != '') { + $('#uni-heritage-code').html(''); + $('#uni-heritage-code').append('
                      '); + $('#uni-heritage-code').append('

                      WSC Statements

                      '); + + let codeHTML = ''; + for(let codeStatement of uniHeritageStruct.heritage.code.split(/\n/)){ + codeHTML += '

                      '+codeStatement+'

                      '; + } + $('#uni-heritage-code').append('
                      '+codeHTML+'
                      '); + } + + if(uniHeritageStruct.heritage.artworkURL != null){ + $('#uni-heritage-artwork-img').removeClass('is-hidden'); + $('#uni-heritage-artwork-img').attr('src', uniHeritageStruct.heritage.artworkURL); + } else { + $('#uni-heritage-artwork-img').addClass('is-hidden'); + $('#uni-heritage-artwork-img').attr('src', ''); + } + + let sourceTextName = getContentSourceTextName(uniHeritageStruct.heritage.contentSrc); + let sourceLink = getContentSourceLink(uniHeritageStruct.heritage.contentSrc); + if(uniHeritageStruct.heritage.homebrewID != null){ + sourceTextName = 'Bundle #'+uniHeritageStruct.heritage.homebrewID; + sourceLink = '/homebrew/?view_id='+uniHeritageStruct.heritage.homebrewID; + } + let sourceStr = ''+sourceTextName+', #'+uniHeritageStruct.heritage.id+''; + + let uniHeritageRarity = convertRarityToHTML(uniHeritageStruct.heritage.rarity); + if(uniHeritageRarity != ''){ sourceStr = ''+sourceStr+''; } + $('#uni-heritage-source').html(sourceStr+uniHeritageRarity); + + /// + + let uniHeritageFeatLevel = 0; + for(const [featID, featStruct] of featMap.entries()){ + let tag = featStruct.Tags.find(tag => { + return tag.id === uniHeritageStruct.heritage.tagID; + }); + if(tag != null){ + if(featStruct.Feat.level <= 0) { continue; } + if(featStruct.Feat.level > uniHeritageFeatLevel){ + uniHeritageFeatLevel = featStruct.Feat.level; + $('#uni-heritage-feats').append('

                      Level '+uniHeritageFeatLevel+'

                      '); + } + + let sourceTextName = getContentSourceTextName(featStruct.Feat.contentSrc); + if(featStruct.Feat.homebrewID != null){ + sourceTextName = 'Bundle #'+featStruct.Feat.homebrewID; + } + + let featEntryID = 'uni-heritage-feat-'+featStruct.Feat.id; + $('#uni-heritage-feats').append('
                      '+featStruct.Feat.name+convertActionToHTML(featStruct.Feat.actions)+''+sourceTextName+'
                      '); + + $('#'+featEntryID).click(function(){ + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags + }); + }); + + $('#'+featEntryID).mouseenter(function(){ + $(this).removeClass('has-bg-selectable'); + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+featEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $(this).addClass('has-bg-selectable'); + }); + + } + } + + $('#'+uniHeritageDisplayContainerID).removeClass('is-hidden'); + } + }); + }); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/libraries/form-entry-ui/form-entry-ui.js b/client/vue-src/legacy-js/libraries/form-entry-ui/form-entry-ui.js new file mode 100644 index 00000000..0ef34ebe --- /dev/null +++ b/client/vue-src/legacy-js/libraries/form-entry-ui/form-entry-ui.js @@ -0,0 +1,39 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + inputs: [ + { + type: "text" + } + ] +*/ +class FormEntryUI { + constructor(title, description, buttonName, modalID, deleteBtnID, btnColor='is-danger') { + this.title = title; + this.description = description; + this.modalID = modalID; + this.deleteBtnID = deleteBtnID; + $('#center-body').parent().append(''); + $('#'+modalID+'-card-close').click(function() { + $('#'+modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#'+modalID).remove(); + }); + $('#'+modalID+'-background').click(function() { + $('#'+modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#'+modalID).remove(); + }); + $('#'+deleteBtnID).click(function() { + $('#'+modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + window.setTimeout(()=>{ $('#'+modalID).remove(); }, 300); + }); + + // Open Modal + $('#'+modalID).addClass('is-active'); + $('html').addClass('is-clipped'); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/libraries/modal_selection/modal-selection.js b/client/vue-src/legacy-js/libraries/modal_selection/modal-selection.js new file mode 100644 index 00000000..062d5bb6 --- /dev/null +++ b/client/vue-src/legacy-js/libraries/modal_selection/modal-selection.js @@ -0,0 +1,144 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + selectionArray: [ + { + id, + name, + rarity + } + ] +*/ +class ModalSelection { + constructor(title, confirmBtnText, selectionArray, selectionType, modalID, confirmBtnID, featMap, character, confirmBtnColor='is-info') { + this.title = title; + this.featMap = featMap; + this.selectionArray = selectionArray; + this.selectionType = selectionType; + + let existingSelectionID; + if(selectionType == 'ancestry'){ + existingSelectionID = character.ancestryID; + } else if(selectionType == 'background'){ + existingSelectionID = character.backgroundID; + } else if(selectionType == 'class'){ + existingSelectionID = character.classID; + } else { + existingSelectionID = 'none'; + } + if(existingSelectionID == null){ + existingSelectionID = 'none'; + } + + let selectedOptionID = null; + + $('#center-body').parent().append(` + + `); + $('#'+modalID+'-card-close, #'+modalID+'-background').click(function() { + $('#'+modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#'+modalID).remove(); + }); + $('#'+confirmBtnID).click(function() { + $('#'+confirmBtnID).addClass('is-loading'); + window.setTimeout(()=>{ + $('#'+modalID).removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#'+modalID).remove(); + }, 300); + }); + + // Allow quickview to close by clicking on modal + $('#'+modalID).click(function(){ + if($('#quickviewDefault').hasClass('quickview-auto-close-protection')){ + $('#quickviewDefault').removeClass('quickview-auto-close-protection'); + } else { + closeQuickView(); + } + }); + + // Generate each listing entry + for(const selection of selectionArray){ + $(`#${modalID}-listings`).append(` +
                      +
                      +

                      ${selection.name}

                      + ${convertRarityToHTML(selection.rarity, true, 'is-tiny')} +
                      +
                      + `); + + $(`#${modalID}-listings-${selection.id}`).mouseenter(function(){ + $(`#${modalID}-listings-${selection.id}`).addClass('entry-hover-darker'); + }); + $(`#${modalID}-listings-${selection.id}`).mouseleave(function(){ + $(`#${modalID}-listings-${selection.id}`).removeClass('entry-hover-darker'); + }); + + // Select option, show preview + $(`#${modalID}-listings-${selection.id}`).click(function() { + + // Delete any generated display containers + $('.generated-display-container').each(function() { + $(this).remove(); + }); + + // Listing is darkened + $(`#${modalID}-listings > div.entry-selected-darker`).removeClass('entry-selected-darker'); + $(`#${modalID}-listings-${selection.id}`).addClass('entry-selected-darker'); + selectedOptionID = selection.id; + + if(selectedOptionID != existingSelectionID){ + $('#'+confirmBtnID).css('visibility', 'visible'); + } else { + $('#'+confirmBtnID).css('visibility', 'hidden'); + } + $('#'+confirmBtnID).attr('data-selectedOptionID', selectedOptionID); + + // Display preview + if(selection.id == 'none'){ + $(`#${modalID}-preview`).removeClass('is-hidden'); + } else if(selectionType == 'ancestry'){ + new DisplayAncestry(modalID+'-preview', selection.id, featMap, selection.homebrewID, false); + } else if(selectionType == 'background'){ + new DisplayBackground(modalID+'-preview', selection.id, selection.homebrewID, false); + } else if(selectionType == 'class'){ + new DisplayClass(modalID+'-preview', selection.id, featMap, selection.homebrewID, false); + } + }); + + } + $(`#${modalID}-listings-${existingSelectionID}`).trigger('click'); + + // Open Modal + $('#'+modalID).addClass('is-active'); + $('html').addClass('is-clipped'); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/loading_bar/loading-bar.js b/client/vue-src/legacy-js/loading_bar/loading-bar.js new file mode 100644 index 00000000..044334c6 --- /dev/null +++ b/client/vue-src/legacy-js/loading_bar/loading-bar.js @@ -0,0 +1,811 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o\n "; + }, + gradient: function(dir, dur){ + var colors, ret, len, gx, gy, x, y, i$, i, idx; + dir == null && (dir = 45); + dur == null && (dur = 1); + colors = slice$.call(arguments, 2); + ret = [this.head("0 0 100 100")]; + len = colors.length * 4 + 1; + dir = dir * Math.PI / 180; + gx = Math.pow(Math.cos(dir), 2); + gy = Math.sqrt(gx - Math.pow(gx, 2)); + if (dir > Math.PI * 0.25) { + gy = Math.pow(Math.sin(dir), 2); + gx = Math.sqrt(gy - Math.pow(gy, 2)); + } + x = gx * 100; + y = gy * 100; + ret.push(""); + for (i$ = 0; i$ < len; ++i$) { + i = i$; + idx = i * 100 / (len - 1); + ret.push(""); + } + ret.push("\n\n"); + return wrap(ret.join("")); + }, + stripe: function(c1, c2, dur){ + var ret, i; + c1 == null && (c1 = '#b4b4b4'); + c2 == null && (c2 = '#e6e6e6'); + dur == null && (dur = 1); + ret = [this.head("0 0 100 100")]; + ret = ret.concat([ + "", "", (function(){ + var i$, results$ = []; + for (i$ = 0; i$ < 13; ++i$) { + i = i$; + results$.push(("")); + } + return results$; + }()).join(""), "" + ].join("")); + return wrap(ret); + }, + bubble: function(c1, c2, count, dur, size, sw){ + var ret, i$, i, idx, x, r, d; + c1 == null && (c1 = '#39d'); + c2 == null && (c2 = '#9cf'); + count == null && (count = 15); + dur == null && (dur = 1); + size == null && (size = 6); + sw == null && (sw = 1); + ret = [this.head("0 0 200 200"), ""]; + for (i$ = 0; i$ < count; ++i$) { + i = i$; + idx = -(i / count) * dur; + x = Math.random() * 184 + 8; + r = (Math.random() * 0.7 + 0.3) * size; + d = dur * (1 + Math.random() * 0.5); + ret.push(["", "", "", "", "", ""].join("")); + } + return wrap(ret.join("") + ""); + } + }; + handler = { + queue: {}, + running: false, + main: function(timestamp){ + var keepon, removed, k, ref$, func, ret, this$ = this; + keepon = false; + removed = []; + for (k in ref$ = this.queue) { + func = ref$[k]; + ret = func(timestamp); + if (!ret) { + removed.push(func); + } + keepon = keepon || ret; + } + for (k in ref$ = this.queue) { + func = ref$[k]; + if (removed.indexOf(func) >= 0) { + delete this.queue[k]; + } + } + if (keepon) { + return requestAnimationFrame(function(it){ + return this$.main(it); + }); + } else { + return this.running = false; + } + }, + add: function(key, f){ + var this$ = this; + if (!this.queue[key]) { + this.queue[key] = f; + } + if (!this.running) { + this.running = true; + return requestAnimationFrame(function(it){ + return this$.main(it); + }); + } + } + }; + window.ldBar = ldBar = function(selector, option){ + var xmlns, root, cls, idPrefix, id, domTree, newNode, x$, config, attr, that, isStroke, parseRes, dom, svg, text, group, length, path0, path1, patimg, img, ret, size, this$ = this; + option == null && (option = {}); + xmlns = { + xlink: "http://www.w3.org/1999/xlink" + }; + root = toString$.call(selector).slice(8, -1) === 'String' ? document.querySelector(selector) : selector; + if (!root.ldBar) { + root.ldBar = this; + } else { + return root.ldBar; + } + cls = root.getAttribute('class') || ''; + if (!~cls.indexOf('ldBar')) { + root.setAttribute('class', cls + " ldBar"); + } + idPrefix = "ldBar-" + Math.random().toString(16).substring(2); + id = { + key: idPrefix, + clip: idPrefix + "-clip", + filter: idPrefix + "-filter", + pattern: idPrefix + "-pattern", + mask: idPrefix + "-mask", + maskPath: idPrefix + "-mask-path" + }; + domTree = function(n, o){ + var k, v; + n = newNode(n); + for (k in o) { + v = o[k]; + if (k !== 'attr') { + n.appendChild(domTree(k, v || {})); + } + } + n.attrs(o.attr || {}); + return n; + }; + newNode = function(n){ + return document.createElementNS("http://www.w3.org/2000/svg", n); + }; + x$ = document.body.__proto__.__proto__.__proto__; + x$.text = function(t){ + return this.appendChild(document.createTextNode(t)); + }; + x$.attrs = function(o){ + var k, v, ret, results$ = []; + for (k in o) { + v = o[k]; + ret = /([^:]+):([^:]+)/.exec(k); + if (!ret || !xmlns[ret[1]]) { + results$.push(this.setAttribute(k, v)); + } else { + results$.push(this.setAttributeNS(xmlns[ret[1]], k, v)); + } + } + return results$; + }; + x$.styles = function(o){ + var k, v, results$ = []; + for (k in o) { + v = o[k]; + results$.push(this.style[k] = v); + } + return results$; + }; + x$.append = function(n){ + var r; + return this.appendChild(r = document.createElementNS("http://www.w3.og/2000/svg", n)); + }; + x$.attr = function(n, v){ + if (v != null) { + return this.setAttribute(n, v); + } else { + return this.getAttribute(n); + } + }; + config = { + "type": 'stroke', + "img": '', + "path": 'M10 10L90 10M90 8M90 12', + "fill-dir": 'btt', + "fill": '#25b', + "fill-background": '#ddd', + "fill-background-extrude": 3, + "pattern-size": null, + "stroke-dir": 'normal', + "stroke": '#25b', + "stroke-width": '3', + "stroke-trail": '#ddd', + "stroke-trail-width": 0.5, + "duration": 1, + "easing": 'linear', + "value": 0, + "img-size": null, + "bbox": null, + "set-dim": true, + "aspect-ratio": "xMidYMid", + "transition-in": false, + "min": 0, + "max": 100, + "precision": 0, + "padding": undefined + }; + config["preset"] = root.attr("data-preset") || option["preset"]; + if (config.preset != null) { + import$(config, presets[config.preset]); + } + for (attr in config) { + if (that = that = root.attr("data-" + attr)) { + config[attr] = that; + } + } + import$(config, option); + if (config.img) { + config.path = null; + } + isStroke = config.type === 'stroke'; + parseRes = function(v){ + var parser, ret; + parser = /data:ldbar\/res,([^()]+)\(([^)]+)\)/; + ret = parser.exec(v); + if (!ret) { + return v; + } + return ret = make[ret[1]].apply(make, ret[2].split(',')); + }; + config.fill = parseRes(config.fill); + config.stroke = parseRes(config.stroke); + if (config["set-dim"] === 'false') { + config["set-dim"] = false; + } + dom = { + attr: { + "xmlns:xlink": 'http://www.w3.org/1999/xlink', + preserveAspectRatio: config["aspect-ratio"], + width: "100%", + height: "100%" + }, + defs: { + filter: { + attr: { + id: id.filter, + x: -1, + y: -1, + width: 3, + height: 3 + }, + feMorphology: { + attr: { + operator: +config["fill-background-extrude"] >= 0 ? 'dilate' : 'erode', + radius: Math.abs(+config["fill-background-extrude"]) + } + }, + feColorMatrix: { + attr: { + values: '0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0', + result: "cm" + } + } + }, + mask: { + attr: { + id: id.mask + }, + image: { + attr: { + "xlink:href": config.img, + filter: "url(#" + id.filter + ")", + x: 0, + y: 0, + width: 100, + height: 100, + preserveAspectRatio: config["aspect-ratio"] + } + } + }, + g: { + mask: { + attr: { + id: id.maskPath + }, + path: { + attr: { + d: config.path || "", + fill: '#fff', + stroke: '#fff', + filter: "url(#" + id.filter + ")" + } + } + } + }, + clipPath: { + attr: { + id: id.clip + }, + rect: { + attr: { + 'class': 'mask', + fill: '#000' + } + } + }, + pattern: { + attr: { + id: id.pattern, + patternUnits: 'userSpaceOnUse', + x: 0, + y: 0, + width: 300, + height: 300 + }, + image: { + attr: { + x: 0, + y: 0, + width: 300, + height: 300 + } + } + } + } + }; + svg = domTree('svg', dom); + text = document.createElement('div'); + text.setAttribute('class', 'ldBar-label'); + root.appendChild(svg); + root.appendChild(text); + group = [0, 0]; + length = 0; + this.fit = function(){ + var that, box, d, rect; + if (that = config["bbox"]) { + box = that.split(' ').map(function(it){ + return +it.trim(); + }); + box = { + x: box[0], + y: box[1], + width: box[2], + height: box[3] + }; + } else { + box = group[1].getBBox(); + } + if (!box || box.width === 0 || box.height === 0) { + box = { + x: 0, + y: 0, + width: 100, + height: 100 + }; + } + d = Math.max.apply(null, ['stroke-width', 'stroke-trail-width', 'fill-background-extrude'].map(function(it){ + return config[it]; + })) * 1.5; + if (config["padding"] != null) { + d = +config["padding"]; + } + svg.attrs({ + viewBox: [box.x - d, box.y - d, box.width + d * 2, box.height + d * 2].join(" ") + }); + if (config["set-dim"]) { + ['width', 'height'].map(function(it){ + if (!root.style[it] || this$.fit[it]) { + root.style[it] = (box[it] + d * 2) + "px"; + return this$.fit[it] = true; + } + }); + } + rect = group[0].querySelector('rect'); + if (rect) { + return rect.attrs({ + x: box.x - d, + y: box.y - d, + width: box.width + d * 2, + height: box.height + d * 2 + }); + } + }; + if (config.path) { + if (isStroke) { + group[0] = domTree('g', { + path: { + attr: { + d: config.path, + fill: 'none', + 'class': 'baseline' + } + } + }); + } else { + group[0] = domTree('g', { + rect: { + attr: { + x: 0, + y: 0, + width: 100, + height: 100, + mask: "url(#" + id.maskPath + ")", + fill: config["fill-background"], + 'class': 'frame' + } + } + }); + } + svg.appendChild(group[0]); + group[1] = domTree('g', { + path: { + attr: { + d: config.path, + 'class': isStroke ? 'mainline' : 'solid', + "clip-path": config.type === 'fill' ? "url(#" + id.clip + ")" : '' + } + } + }); + svg.appendChild(group[1]); + path0 = group[0].querySelector(isStroke ? 'path' : 'rect'); + path1 = group[1].querySelector('path'); + if (isStroke) { + path1.attrs({ + fill: 'none' + }); + } + patimg = svg.querySelector('pattern image'); + img = new Image(); + img.addEventListener('load', function(){ + var box, that; + box = (that = config["pattern-size"]) + ? { + width: +that, + height: +that + } + : img.width && img.height + ? { + width: img.width, + height: img.height + } + : { + width: 300, + height: 300 + }; + svg.querySelector('pattern').attrs({ + width: box.width, + height: box.height + }); + return patimg.attrs({ + width: box.width, + height: box.height + }); + }); + if (/.+\..+|^data:/.exec(!isStroke + ? config.fill + : config.stroke)) { + img.src = !isStroke + ? config.fill + : config.stroke; + patimg.attrs({ + "xlink:href": img.src + }); + } + if (isStroke) { + path0.attrs({ + stroke: config["stroke-trail"], + "stroke-width": config["stroke-trail-width"] + }); + path1.attrs({ + "stroke-width": config["stroke-width"], + stroke: /.+\..+|^data:/.exec(config.stroke) + ? "url(#" + id.pattern + ")" + : config.stroke + }); + } + if (config.fill && !isStroke) { + path1.attrs({ + fill: /.+\..+|^data:/.exec(config.fill) + ? "url(#" + id.pattern + ")" + : config.fill + }); + } + length = path1.getTotalLength(); + this.fit(); + this.inited = true; + } else if (config.img) { + if (config["img-size"]) { + ret = config["img-size"].split(','); + size = { + width: +ret[0], + height: +ret[1] + }; + } else { + size = { + width: 100, + height: 100 + }; + } + group[0] = domTree('g', { + rect: { + attr: { + x: 0, + y: 0, + width: 100, + height: 100, + mask: "url(#" + id.mask + ")", + fill: config["fill-background"] + } + } + }); + svg.querySelector('mask image').attrs({ + width: size.width, + height: size.height + }); + group[1] = domTree('g', { + image: { + attr: { + width: size.width, + height: size.height, + x: 0, + y: 0, + preserveAspectRatio: config["aspect-ratio"], + "clip-path": config.type === 'fill' ? "url(#" + id.clip + ")" : '', + "xlink:href": config.img, + 'class': 'solid' + } + } + }); + img = new Image(); + img.addEventListener('load', function(){ + var ret, size, v; + if (config["img-size"]) { + ret = config["img-size"].split(','); + size = { + width: +ret[0], + height: +ret[1] + }; + } else if (img.width && img.height) { + size = { + width: img.width, + height: img.height + }; + } else { + size = { + width: 100, + height: 100 + }; + } + svg.querySelector('mask image').attrs({ + width: size.width, + height: size.height + }); + group[1].querySelector('image').attrs({ + width: size.width, + height: size.height + }); + this$.fit(); + v = this$.value; + this$.value = undefined; + this$.set(v, true); + return this$.inited = true; + }); + img.src = config.img; + svg.appendChild(group[0]); + svg.appendChild(group[1]); + } + svg.attrs({ + width: '100%', + height: '100%' + }); + this.transition = { + value: { + src: 0, + des: 0 + }, + time: {}, + ease: function(t, b, c, d){ + t = t / (d * 0.5); + if (t < 1) { + return c * 0.5 * t * t + b; + } + t = t - 1; + return -c * 0.5 * (t * (t - 2) - 1) + b; + }, + handler: function(time, doTransition){ + var ref$, min, max, prec, dv, dt, dur, v, p, node, style, box, dir; + doTransition == null && (doTransition = true); + if (this.time.src == null) { + this.time.src = time; + } + ref$ = [config["min"], config["max"], 1 / config["precision"]], min = ref$[0], max = ref$[1], prec = ref$[2]; + ref$ = [this.value.des - this.value.src, (time - this.time.src) * 0.001, +config["duration"] || 1], dv = ref$[0], dt = ref$[1], dur = ref$[2]; + v = doTransition + ? this.ease(dt, this.value.src, dv, dur) + : this.value.des; + if (config.precision) { + v = Math.round(v * prec) / prec; + } else if (doTransition) { + v = Math.round(v); + } + v >= min || (v = min); + v <= max || (v = max); + text.textContent = v; + p = 100.0 * (v - min) / (max - min); + if (isStroke) { + node = path1; + style = { + "stroke-dasharray": config["stroke-dir"] === 'reverse' + ? "0 " + length * (100 - p) * 0.01 + " " + length * p * 0.01 + " 0" + : p * 0.01 * length + " " + ((100 - p) * 0.01 * length + 1) + }; + } else { + box = group[1].getBBox(); + dir = config["fill-dir"]; + style = dir === 'btt' || !dir + ? { + y: box.y + box.height * (100 - p) * 0.01, + height: box.height * p * 0.01, + x: box.x, + width: box.width + } + : dir === 'ttb' + ? { + y: box.y, + height: box.height * p * 0.01, + x: box.x, + width: box.width + } + : dir === 'ltr' + ? { + y: box.y, + height: box.height, + x: box.x, + width: box.width * p * 0.01 + } + : dir === 'rtl' ? { + y: box.y, + height: box.height, + x: box.x + box.width * (100 - p) * 0.01, + width: box.width * p * 0.01 + } : void 8; + node = svg.querySelector('rect'); + } + node.attrs(style); + if (dt >= dur) { + delete this.time.src; + return false; + } + return true; + }, + start: function(src, des, doTransition){ + var ref$, this$ = this; + ref$ = this.value; + ref$.src = src; + ref$.des = des; + !!(root.offsetWidth || root.offsetHeight || root.getClientRects().length); + if (!doTransition || !(root.offsetWidth || root.offsetHeight || root.getClientRects().length)) { + this.time.src = 0; + this.handler(1000, false); + return; + } + return handler.add(id.key, function(time){ + return this$.handler(time); + }); + } + }; + this.set = function(v, doTransition){ + var src, des; + doTransition == null && (doTransition = true); + src = this.value || 0; + if (v != null) { + this.value = v; + } else { + v = this.value; + } + des = this.value; + return this.transition.start(src, des, doTransition); + }; + this.set(+config.value || 0, config["transition-in"]) || false; + return this; + }; + return window.addEventListener('load', function(){ + var i$, ref$, len$, node, results$ = []; + for (i$ = 0, len$ = (ref$ = document.querySelectorAll('.ldBar')).length; i$ < len$; ++i$) { + node = ref$[i$]; + if (!node.ldBar) { + results$.push(node.ldBar = new ldBar(node)); + } + } + return results$; + }, false); +})(); +module.exports = ldBar; +function import$(obj, src){ + var own = {}.hasOwnProperty; + for (var key in src) if (own.call(src, key)) obj[key] = src[key]; + return obj; +} + +},{"./presets":2}],2:[function(require,module,exports){ +// Generated by LiveScript 1.3.1 +var presets, out$ = typeof exports != 'undefined' && exports || this; +out$.presets = presets = { + rainbow: { + "type": 'stroke', + "path": 'M10 10L90 10', + "stroke": 'data:ldbar/res,gradient(0,1,#a551df,#fd51ad,#ff7f82,#ffb874,#ffeb90)', + "bbox": "10 10 80 10" + }, + energy: { + "type": 'fill', + "path": 'M15 5L85 5A5 5 0 0 1 85 15L15 15A5 5 0 0 1 15 5', + "stroke": '#f00', + "fill": 'data:ldbar/res,gradient(45,2,#4e9,#8fb,#4e9)', + "fill-dir": "ltr", + "fill-background": '#444', + "fill-background-extrude": 1, + "bbox": "10 5 80 10" + }, + stripe: { + "type": 'fill', + "path": 'M15 5L85 5A5 5 0 0 1 85 15L15 15A5 5 0 0 1 15 5', + "stroke": '#f00', + "fill": 'data:ldbar/res,stripe(#25b,#58e,1)', + "fill-dir": "ltr", + "fill-background": '#ddd', + "fill-background-extrude": 1, + "bbox": "10 5 80 10" + }, + text: { + "type": 'fill', + "img": "data:image/svg+xml,LOADING", + "fill-background-extrude": 1.3, + "pattern-size": 100, + "fill-dir": "ltr", + "img-size": "70,20", + "bbox": "0 0 70 20" + }, + line: { + "type": 'stroke', + "path": 'M10 10L90 10', + "stroke": '#25b', + "stroke-width": 3, + "stroke-trail": '#ddd', + "stroke-trail-width": 1, + "bbox": "10 10 80 10" + }, + fan: { + "type": 'stroke', + "path": 'M10 90A40 40 0 0 1 90 90', + "fill-dir": 'btt', + "fill": '#25b', + "fill-background": '#ddd', + "fill-background-extrude": 3, + "stroke-dir": 'normal', + "stroke": '#25b', + "stroke-width": '3', + "stroke-trail": '#ddd', + "stroke-trail-width": 0.5, + "bbox": "10 50 80 40" + }, + circle: { + "type": 'stroke', + "path": 'M50 10A40 40 0 0 1 50 90A40 40 0 0 1 50 10', + "fill-dir": 'btt', + "fill": '#25b', + "fill-background": '#ddd', + "fill-background-extrude": 3, + "stroke-dir": 'normal', + "stroke": '#25b', + "stroke-width": '3', + "stroke-trail": '#ddd', + "stroke-trail-width": 0.5, + "bbox": "10 10 80 80" + }, + bubble: { + "type": 'fill', + "path": 'M50 10A40 40 0 0 1 50 90A40 40 0 0 1 50 10', + "fill-dir": 'btt', + "fill": 'data:ldbar/res,bubble(#39d,#cef)', + "pattern-size": "150", + "fill-background": '#ddd', + "fill-background-extrude": 2, + "stroke-dir": 'normal', + "stroke": '#25b', + "stroke-width": '3', + "stroke-trail": '#ddd', + "stroke-trail-width": 0.5, + "bbox": "10 10 80 80" + } +}; + +},{}]},{},[1]); diff --git a/client/vue-src/legacy-js/loading_bar/loadingHandler.js b/client/vue-src/legacy-js/loading_bar/loadingHandler.js new file mode 100644 index 00000000..8e46b29a --- /dev/null +++ b/client/vue-src/legacy-js/loading_bar/loadingHandler.js @@ -0,0 +1,141 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* Dice Loader */ +let g_diceLoaderPercentage = 0; + +function startDiceLoader(){ + $('.ldBar').removeClass('is-hidden'); + + $('.dice-pageloader').removeClass("fadeout"); + $('html').addClass('is-clipped'); + + $('.ldBar-message').text('Initializing Load'); + setDiceLoaderPercentage(5); + + socket.off("updateLoadProgess"); + socket.on("updateLoadProgess", function(data){ + updateDiceLoader(data.message, data.upVal); + }); + + simulateDiceLoading(); + +} + +function updateDiceLoader(message, upVal){ + $('.ldBar-message').text(message+'...'); + setDiceLoaderPercentage(g_diceLoaderPercentage+upVal); +} + +function setDiceLoaderPercentage(percentage){ + let bar = new ldBar('.ldBar'); + bar.set(percentage, true); + g_diceLoaderPercentage = percentage; +} + +function getDiceLoaderPercentage(){ + return g_diceLoaderPercentage; +} + +function stopDiceLoader(){ + updateDiceLoader('Finalizing', 100); + $('.dice-pageloader').addClass("fadeout"); + $('html').removeClass('is-clipped'); +} + + +/* Spinner Loader */ +function startSpinnerLoader(){ + $('.pageloader').removeClass('is-hidden'); +} + +function stopSpinnerLoader(){ + setTimeout(() => { + $('.pageloader').addClass('is-hidden'); + }, 500);// After 1/2 second +} + +/* Spinner Sub-Loader */ +function startSpinnerSubLoader(loaderClass=null){ + if(loaderClass != null){ + $('.'+loaderClass).removeClass('is-hidden'); + } else { + $('.subpageloader').removeClass('is-hidden'); + } +} + +function stopSpinnerSubLoader(loaderClass=null){ + setTimeout(() => { + if(loaderClass != null){ + $('.'+loaderClass).addClass('is-hidden'); + } else { + $('.subpageloader').addClass('is-hidden'); + } + }, 500);// After 1/2 second +} + + +/* ------ Fake - Increase Diceloader Percentage Overtime ------ */ +// With switching away from sockets for large loads, it makes getting realtime load progress updates far more difficult. As a result, the loading state will now have to be fake updates for the time being :( +function simulateDiceLoading(){ + + let randNum = function(min, max) { + return Math.random() * (max - min) + min; + }; + + updateDiceLoader('Opening Books', 2); + + setTimeout(function(){ + if(g_diceLoaderPercentage >= 100){ return; } + updateDiceLoader('Gathering Skills', 2); + + setTimeout(function(){ + if(g_diceLoaderPercentage >= 100){ return; } + updateDiceLoader('Indexing Traits', 5); + + setTimeout(function(){ + if(g_diceLoaderPercentage >= 100){ return; } + updateDiceLoader('Understanding Feats', 23); + + setTimeout(function(){ + if(g_diceLoaderPercentage >= 100){ return; } + updateDiceLoader('Bartering for Items', 20); + + setTimeout(function(){ + if(g_diceLoaderPercentage >= 100){ return; } + updateDiceLoader('Discovering Spells', 15); + + setTimeout(function(){ + if(g_diceLoaderPercentage >= 100){ return; } + updateDiceLoader('Determining Skills', 6); + + setTimeout(function(){ + if(g_diceLoaderPercentage >= 100){ return; } + updateDiceLoader('Finding Languages', 3); + + setTimeout(function(){ + if(g_diceLoaderPercentage >= 100){ return; } + updateDiceLoader('Finding Conditions', 14); + + setTimeout(function(){ + updateDiceLoader('Finalizing', 100); + }, 300*randNum(0.5, 2)); + + }, 300*randNum(0.5, 2)); + + }, 300*randNum(0.5, 2)); + + }, 800*randNum(0.5, 2)); + + }, 800*randNum(0.5, 2)); + + }, 1000*randNum(0.5, 2)); + + }, 800*randNum(0.5, 2)); + + }, 100*randNum(0.5, 2)); + + }, 500*randNum(0.5, 2)); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/mobile-view.js b/client/vue-src/legacy-js/mobile-view.js new file mode 100644 index 00000000..c62fec1b --- /dev/null +++ b/client/vue-src/legacy-js/mobile-view.js @@ -0,0 +1,52 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_mobile_menu_active = false; + +$(function () { + + $('.nav-menu-toggle').click(function(){ + g_mobile_menu_active = !g_mobile_menu_active; + updateMobileMenu(); + }); + + $(window).resize(function() { + if($('.nav-menu-toggle').is(':hidden')){ + g_mobile_menu_active = false; + updateMobileMenu(); + } + }); + +}); + +function updateMobileMenu() { + $('#mobile-nav-menu-container').html(''); + if(g_mobile_menu_active) { + $('.nav-menu-toggle').addClass('is-active'); + + $('#mobile-nav-menu-container').html('
                      '); + + $('.nav-menu > li').each(function() { + let aHTML = $(this).find('a').parent().html(); + if(aHTML.includes('/browse')) { + aHTML = 'Search '; + } + if(aHTML.includes('profile-header-icon')) { + + $('#mobile-nav-menu').append('
                      '); + $(this).find('li').each(function() { + let aSubHTML = $(this).find('a').parent().html(); + $('#mobile-nav-menu').append(aSubHTML); + }); + + } else { + $('#mobile-nav-menu').append(aHTML); + } + }); + + } else { + $('.nav-menu-toggle').removeClass('is-active'); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/prof/prof-manager.js b/client/vue-src/legacy-js/prof/prof-manager.js new file mode 100644 index 00000000..c1245e21 --- /dev/null +++ b/client/vue-src/legacy-js/prof/prof-manager.js @@ -0,0 +1,134 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getProfUserBonus(profBonus){ + let numBonus = parseInt(profBonus); + return (isNaN(numBonus) ? 0 : numBonus); +} + +function getFinalProf(profDataArray) { + if(profDataArray == null || profDataArray.length == 0) { return null; } + + let finalProfData = null; + + for(const profData of profDataArray){ + + let userAdded = false; + if(profData.sourceType === 'user-added') { + userAdded = true; + } + + if(profData.sourceType === 'user-set') { // Hardcoded User-Set Data + + let userBonus = getProfUserBonus(profData.Prof); + let profOverride = (userBonus == 0); + + if(finalProfData != null){ + + let bestProf = getBetterProf(finalProfData.BestProf, profData.Prof); + let numIncreases = finalProfData.NumIncreases+getUpAmt(profData.Prof); + if(finalProfData.UserProfOverride){ + bestProf = finalProfData.BestProf; + numIncreases = finalProfData.NumIncreases; + } + if(profOverride){ + bestProf = getBetterProf('U', profData.Prof); + numIncreases = getUpAmt(profData.Prof); + } + + let userBonus = getProfUserBonus(profData.Prof); + finalProfData = { + ProfName: profData.To, + BestProf : bestProf, + NumIncreases : numIncreases, + For : finalProfData.For, + UserBonus : ((finalProfData.UserBonus > userBonus) ? finalProfData.UserBonus : userBonus), + UserProfOverride : profOverride, + UserAdded : (userAdded || finalProfData.UserAdded), + }; + + } else { + + finalProfData = { + ProfName: profData.To, + BestProf : getBetterProf('U', profData.Prof), + NumIncreases : getUpAmt(profData.Prof), + For : profData.For, + UserBonus : userBonus, + UserProfOverride : profOverride, + UserAdded : userAdded, + }; + + } + + } else { + + if(finalProfData != null){ + + let bestProf = getBetterProf(finalProfData.BestProf, profData.Prof); + let numIncreases = finalProfData.NumIncreases+getUpAmt(profData.Prof); + if(finalProfData.UserProfOverride){ + bestProf = finalProfData.BestProf; + numIncreases = finalProfData.NumIncreases; + } + + let userBonus = getProfUserBonus(profData.Prof); + finalProfData = { + ProfName: profData.To, + BestProf : bestProf, + NumIncreases : numIncreases, + For : finalProfData.For, + UserBonus : ((finalProfData.UserBonus > userBonus) ? finalProfData.UserBonus : userBonus), + UserProfOverride : false, + UserAdded : (userAdded || finalProfData.UserAdded), + }; + + } else { + + finalProfData = { + ProfName: profData.To, + BestProf : getBetterProf('U', profData.Prof), + NumIncreases : getUpAmt(profData.Prof), + For : profData.For, + UserBonus : 0, + UserProfOverride : false, + UserAdded : userAdded, + }; + + } + + } + + } + + return { + Name : finalProfData.ProfName, + NumUps : profToNumUp(finalProfData.BestProf, true)+finalProfData.NumIncreases, + For : finalProfData.For, + UserBonus : finalProfData.UserBonus, + UserProfOverride : finalProfData.UserProfOverride, + UserAdded : finalProfData.UserAdded, + }; + +} + +function getUserSetData(profDataArray) { + if(profDataArray == null || profDataArray.length == 0) { return null; } + for(const profData of profDataArray){ + if(profData.sourceType === 'user-set' && isNaN(profData.Prof)) { + return profData; + } + } + return null; +} + +function getUserAddedData(profDataArray) { + if(profDataArray == null || profDataArray.length == 0) { return null; } + for(const profData of profDataArray){ + if(profData.sourceType === 'user-added') { + return profData; + } + } + return null; +} diff --git a/client/vue-src/legacy-js/profile-page.js b/client/vue-src/legacy-js/profile-page.js new file mode 100644 index 00000000..a1e709e4 --- /dev/null +++ b/client/vue-src/legacy-js/profile-page.js @@ -0,0 +1,81 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); + +let g_profileName = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + g_profileName= $('#profileName').attr('data-profile-name'); + + $('#profileNameBtn').click(function() { + $('#profileName').html('
                      '); + $('#profileNameBtn').addClass('is-hidden'); + $('#profileNameInput').focus(); + + // Press Enter Key + $('#profileNameInput').on('keypress',function(e){ + if(e.which == 13){ + $(this).blur(); + } + }); + + $('#profileNameInput').blur(function(){ + let newName = $('#profileNameInput').val(); + if(newName == null || newName == '') {return;} + $(this).unbind(); + $('#profileName').html(newName); + $('#profileNameBtn').removeClass('is-hidden'); + socket.emit("requestProfileNameChange", newName); + }); + + }); + + $('#developerModeBtn').change(function(){ + if ($(this).is(':checked')) { + $(this).removeClass('is-dark'); + $(this).addClass('is-info'); + $(this).blur(); + socket.emit("requestDeveloperStatusChange", true); + } else { + $(this).removeClass('is-info'); + $(this).addClass('is-dark'); + $(this).blur(); + socket.emit("requestDeveloperStatusChange", false); + } + }); + + $('#lightModeBtn').change(function(){ + if ($(this).is(':checked')) { + $(this).removeClass('is-dark'); + $(this).addClass('is-info'); + $(this).blur(); + socket.emit("requestThemeStatusChange", true); + } else { + $(this).removeClass('is-info'); + $(this).addClass('is-dark'); + $(this).blur(); + socket.emit("requestThemeStatusChange", false); + } + }); + +}); + +socket.on("returnProfileNameChange", function(newName){ + g_profileName = newName; +}); + +socket.on("returnDeveloperStatusChange", function(isDeveloper){ + if(isDeveloper){ + $('#developerStatusListing').removeClass('is-hidden'); + } else { + $('#developerStatusListing').addClass('is-hidden'); + } +}); + +socket.on("returnThemeStatusChange", function(lightMode){ + window.location.reload(true); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/require-signin.js b/client/vue-src/legacy-js/require-signin.js new file mode 100644 index 00000000..52eed908 --- /dev/null +++ b/client/vue-src/legacy-js/require-signin.js @@ -0,0 +1,18 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + setTimeout(() => { + + if(typeof socket === 'undefined'){ + socket = io(); + } + + socket.on("userNotLoggedIn", function(){ + // Hardcoded redirect + window.location.href = '/auth/login'; + }); + + }, 100); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/char-sheet.js b/client/vue-src/legacy-js/sheet/char-sheet.js new file mode 100644 index 00000000..cf8f3eab --- /dev/null +++ b/client/vue-src/legacy-js/sheet/char-sheet.js @@ -0,0 +1,3136 @@ +/* Copyright (C) 2020, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let socket = io(); +let isSheetInit = false; +let isViewOnly = false; + +/* Character Options */ +let gOption_hasAutoHeightenSpells; +let gOption_hasProfWithoutLevel; +let gOption_hasStamina; +let gOption_hasDiceRoller; +let gOption_hasAutoBonusProgression; +let gOption_hasGradualAbilityBoosts; +/* ~~~~~~~~~~~~~~~~~ */ + +/* Internal Sheet-State Options */ +let gState_hasFinesseMeleeUseDexDamage; +let gState_armoredStealth; +let gState_mightyBulwark; +let gState_unburdenedIron; +let gState_improvisedWeaponNoPenalty; +let gState_addLevelToUntrainedWeaponAttack; +let gState_addLevelToUntrainedSkill; +let gState_displayCompanionTab; +let gState_MAP = 'TIER_1'; +// TIER_1 = (5/10 or 4/8 agile) +// TIER_2 = (4/8 or 3/6 agile) +// TIER_3 = (3/6 or 2/4 agile) +// TIER_4 = (2/4 or 1/2 agile) +/* ~~~~~~~~~~~~~~~~~~~ */ + +let g_calculatedStats = null; + +let g_enabledSources = null; + +let g_character = null; +let g_classDetails = null; +let g_ancestry = null; +let g_heritage = null; +let g_background = null; +let g_charTagsArray = null; + +let g_campaignDetails = null; + +let g_classArchetype = null; + +let g_charSize = null; + +let g_allTags = null; + +let g_itemMap = null; +let g_invStruct = null; +let g_bulkAndCoinsStruct = null; +let g_openBagsSet = new Set(); + +let g_otherSpeeds = null; + +let g_conditionsMap = null; +let g_allConditions = null; + +let g_profMap = null; +let g_weaponProfMap = null; +let g_armorProfMap = null; + +let g_equippedArmorInvItemID = null; +let g_equippedShieldInvItemID = null; +let g_equippedArmorCategory = null; + +let g_abilMap = null; +let g_skillMap = null; +let g_senseArray = null; +let g_phyFeatArray = null; + +let g_langArray = null; +let g_allLanguages = null; + +let g_featMap = null; +let g_featChoiceArray = null; + +let g_extraClassAbilities = null; +let g_allClassAbilityOptions = null; + +let g_spellMap = null; +let g_spellSlotsMap = null; +let g_spellBookArray = null; +let g_innateSpellArray = null; + +let g_companionData = null; + +let g_resistAndVulners = null; + +let g_heritageEffects = null; + +let g_specializationStruct = null; +let g_weaponFamiliaritiesArray = null; + +let g_runeDataStruct = null; + +let g_notesFields = null; + +let currentInvests = null; +let maxInvests = null; + +let g_sheetStatesArray = null; + +let g_unselectedDataArray = null; + +let g_sheetTabSizeLock = false; + +let g_inventoryTabScroll = null; +let g_selectedTabID = 'inventoryTab'; +let g_selectedSubTabID = null; +let g_selectedSubTabLock = false; + +let g_selectedActionSubTabID = 'actionTabEncounter'; +let g_selectedAction_SkillOption = 'chooseDefault'; +let g_selectedAction_ActionOption = 'chooseDefault'; +let g_selectedAction_SearchText = ''; +let g_selectedAction_BasicEnabled = true; +let g_selectedAction_FeatsEnabled = true; +let g_selectedAction_ItemsEnabled = true; +let g_selectedAction_SkillsEnabled = true; + +let g_selectedSpellSubTabID = null; + +let g_selectedDetailsSubTabID = 'detailsTabFeats'; +let g_selectedDetailsOptionValue = 'All'; + +let g_preConditions_strScore = null; +let g_preConditions_dexScore = null; +let g_preConditions_conScore = null; +let g_preConditions_intScore = null; +let g_preConditions_wisScore = null; +let g_preConditions_chaScore = null; + +let g_showHealthPanel = true; // For Stamina GMG Variant + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + // If using Silk browser, attempt to go full screen + if (/\bSilk\b/.test(navigator.userAgent)) { + document.documentElement.requestFullscreen({ navigationUI: "hide" }); + } + + window.setTimeout(() => { + if(!isSheetInit){ + displayError('Sheet took too long to load. There may have been an issue when loading.'); + $('#sheet-container').addClass('is-hidden'); + stopDiceLoader(); + } + }, 90000); // 90 seconds + + // Remove Footer // + $('#wanderers-guide-footer').addClass('is-hidden'); + $('#main-container').addClass('is-paddingless'); + + + $.get('/mloads/char-sheet/?char_id='+getCharIDFromURL()).done(function(data){ + initCharSheet(data.charInfo, data.userPermissions, data.viewOnly); + }); + + startDiceLoader(); +}); + + +function initCharSheet(charInfo, userPermissions, viewOnly){ + console.log('~ Loaded Char Sheet Info ~'); + + isViewOnly = viewOnly; + + // View Only // + if(isViewOnly){ + if(userPermissions.support.supporter){ // Can copy and export characters on viewOnly + + $('#backToBuilderButton').addClass('is-hidden'); + $('#restButton').addClass('is-hidden'); + + $('#copyCharButton').removeClass('is-hidden'); + $('#exportCharButton').removeClass('is-hidden'); + + } else { + $('#backToBuilderButton').attr('disabled', true); + $('#restButton').attr('disabled', true); + } + } + + g_enabledSources = charInfo.EnabledSources; + + g_itemMap = objToMap(charInfo.ItemObject); + g_itemMap = new Map([...g_itemMap.entries()].sort( + function(a, b) { + if(a[1].Item.itemType == 'CURRENCY'){ + return 1; + } + + if (a[1].Item.level === b[1].Item.level) { + // Name is only important when levels are the same + return a[1].Item.name > b[1].Item.name ? 1 : -1; + } + return a[1].Item.level - b[1].Item.level; + }) + ); + + g_invStruct = charInfo.InvStruct; + + g_equippedArmorInvItemID = g_invStruct.Inventory.equippedArmorInvItemID; + g_equippedShieldInvItemID = g_invStruct.Inventory.equippedShieldInvItemID; + g_equippedArmorCategory = g_invStruct.Inventory.equippedArmorCategory; + + g_character = charInfo.Character; + + /* Character Options and Variants */ + gOption_hasAutoHeightenSpells = (g_character.optionAutoHeightenSpells === 1); + gOption_hasProfWithoutLevel = (g_character.variantProfWithoutLevel === 1); + gOption_hasStamina = (g_character.variantStamina === 1); + gOption_hasDiceRoller = (g_character.optionDiceRoller === 1); + gOption_hasIgnoreBulk = (g_character.optionIgnoreBulk === 1); + gOption_hasAutoBonusProgression = (g_character.variantAutoBonusProgression === 1); + gOption_hasGradualAbilityBoosts = (g_character.variantGradualAbilityBoosts === 1); + + + /* Class Archetype ID */ + if(charInfo.ChoiceStruct.ClassArchetypeID != null){ + g_classArchetype = charInfo.ClassArchetypeArray.find(classArchetype => { + return classArchetype.id == charInfo.ChoiceStruct.ClassArchetypeID; + }); + if(g_classArchetype != null){ + g_classArchetype.replacementCode = JSON.parse(g_classArchetype.replacementCodeJSON); + } + } + + g_campaignDetails = charInfo.CampaignDetails; + + g_otherSpeeds = charInfo.OtherSpeeds; + + g_conditionsMap = objToMap(charInfo.ConditionsObject); + g_allConditions = charInfo.AllConditions; + g_allConditions = g_allConditions.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + g_abilMap = objToMap(charInfo.AbilObject); + g_skillMap = objToMap(charInfo.SkillObject); + g_senseArray = charInfo.ChoiceStruct.SenseArray; + g_phyFeatArray = charInfo.ChoiceStruct.PhyFeatArray; + + g_langArray = charInfo.ChoiceStruct.LangArray; + g_langArray = g_langArray.sort( + function(a, b) { + if(a.value != null && b.value != null){ + return a.value.name > b.value.name ? 1 : -1; + } else { + return 1; + } + } + ); + g_allLanguages = charInfo.AllLanguages; + g_allLanguages = g_allLanguages.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + g_specializationStruct = charInfo.SpecializeStruct; + g_weaponFamiliaritiesArray = charInfo.WeaponFamiliarities; + + g_profMap = objToMap(charInfo.ChoiceStruct.ProfObject); + g_weaponProfMap = buildWeaponProfMap(); + g_armorProfMap = buildArmorProfMap(); + + g_runeDataStruct = generateRuneDataStruct(); + + g_featMap = objToMap(charInfo.FeatObject); + g_featMap = updateFeatMapWithMiscs(g_featMap); + + g_featChoiceArray = []; + for(const featChoice of charInfo.ChoiceStruct.FeatArray){ + if(featChoice.sourceLevel > g_character.level) { + console.warn(`Has feat selection at level higher than character level (lvl: ${featChoice.sourceLevel}, name: ${featChoice.value.name})!\nRemoving feat from g_featChoiceArray.`); + } else { + g_featChoiceArray.push(featChoice); + } + } + g_featChoiceArray = g_featChoiceArray.sort( + function(a, b) { + if(a.value == null || b.value == null){ + return b.value != null ? 1 : -1; + } + if (a.value.level === b.value.level) { + // Name is only important when levels are the same + return a.value.name > b.value.name ? 1 : -1; + } + return a.value.level - b.value.level; + } + ); + + g_extraClassAbilities = charInfo.ChoiceStruct.ExtraClassFeaturesArray; + g_allClassAbilityOptions = charInfo.AllClassFeatureOptions; + + g_spellMap = objToMap(charInfo.SpellObject); + g_spellMap = new Map([...g_spellMap.entries()].sort( + function(a, b) { + if (a[1].Spell.level === b[1].Spell.level) { + // Name is only important when levels are the same + return a[1].Spell.name > b[1].Spell.name ? 1 : -1; + } + return a[1].Spell.level - b[1].Spell.level; + }) + ); + + g_spellSlotsMap = objToMap(charInfo.SpellDataStruct.SpellSlotObject); + for(let [spellSRC, slotArray] of g_spellSlotsMap.entries()){ + slotArray = slotArray.sort( + function(a, b) { + return a.slotLevel - b.slotLevel; + } + ); + } + + g_spellBookArray = charInfo.SpellDataStruct.SpellBookArray; + + g_focusPointArray = charInfo.SpellDataStruct.FocusPointsArray; + g_focusSpellMap = objToMap(charInfo.SpellDataStruct.FocusSpellObject); + /*g_focusSpellMap = new Map([...g_focusSpellMap.entries()].sort( + function(a, b) { + let aStruct = g_spellMap.get(a[1].SpellID+""); + let bStruct = g_spellMap.get(b[1].SpellID+""); + if (aStruct.Spell.level === bStruct.Spell.level) { + // Name is only important when levels are the same + return aStruct.Spell.name > bStruct.Spell.name ? 1 : -1; + } + return aStruct.Spell.level - bStruct.Spell.level; + }) + );*/ + + g_innateSpellArray = charInfo.SpellDataStruct.InnateSpellArray; + g_innateSpellArray = g_innateSpellArray.sort( + function(a, b) { + return a.SpellLevel - b.SpellLevel; + } + ); + + g_allTags = charInfo.AllTags; + + g_classDetails = charInfo.ChoiceStruct.ClassDetails; + g_classDetails.AbilityChoices = charInfo.ChoiceStruct.ChoiceArray; + + g_ancestry = charInfo.Ancestry; + g_heritage = charInfo.Heritage; + g_background = charInfo.Background; + + g_charTagsArray = []; + for(let dataTag of charInfo.ChoiceStruct.CharTagsArray){ + g_charTagsArray.push(dataTag.value); + } + // If has ancestry and didn't have the trait from it, add it. (For builds mainly) + if(g_ancestry != null && g_ancestry.name != null){ + if(!g_charTagsArray.includes(g_ancestry.name)){ + g_charTagsArray.push(g_ancestry.name); + } + } + + g_charSize = g_ancestry.size; + + g_resistAndVulners = charInfo.ResistAndVulners; + + g_heritageEffects = charInfo.ChoiceStruct.HeritageEffectsArray; + + g_companionData = charInfo.CompanionData; + g_companionData.AllAnimalCompanions = g_companionData.AllAnimalCompanions.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + g_companionData.AllSpecificFamiliars = g_companionData.AllSpecificFamiliars.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + + g_notesFields = charInfo.NotesFields; + + g_unselectedDataArray = charInfo.UnselectedDataArray; + + g_sheetStatesArray = charInfo.SheetStatesArray; + initSheetStates(); + + // TODO; Update Legacy code - Could have bugs in using this + initExpressionProcessor({ + ChoiceStruct : charInfo.ChoiceStruct, + }); + + // Automatic Progression Bonus variant, if enabled... + if(gOption_hasAutoBonusProgression){ + g_classDetails = addAutoBonusProgressionVariant(g_classDetails); + } + + // Add support for Gradual Ability Boosts Variant if enabled... + if(gOption_hasGradualAbilityBoosts){ + g_classDetails = addGradualAbilityBoostsVariant(g_classDetails); + } + + // Run All SourceBook Code as Sheet Statements // + for(let enabledSource of g_enabledSources){ + + // Run Removal Statements first + processRemovalStatements(enabledSource.code, enabledSource.codeName, enabledSource.bundleID); + + processSheetCode(enabledSource.code, { + source: 'SourceBook', + sourceName: enabledSource.name, + }); + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + // Check & Remove Invalid Items + removeInvalidItemsFromInventory(); + + loadCharSheet(); + + initDiceRoller(); + + // Turn off page loading + stopDiceLoader(); + isSheetInit = true; +} + +function loadCharSheet(){ + + console.log('~ LOADING SHEET ~'); + + // Saving Scroll States // + g_inventoryTabScroll = $('#inventoryContent').scrollTop(); + + // Unbind All jQuery Events // + $('#character-sheet-section').find("*").off(); + + // Clear and Reload Error Messages + clearErrorMessages(); + reloadErrorMessages(); + + // Init Sheet-States // + gState_hasFinesseMeleeUseDexDamage = false; + gState_armoredStealth = false; + gState_mightyBulwark = false; + gState_unburdenedIron = false; + gState_improvisedWeaponNoPenalty = false; + gState_addLevelToUntrainedWeaponAttack = false; + gState_addLevelToUntrainedSkill = false; + gState_displayCompanionTab = false; + + // Init Calculated Stats + g_calculatedStats = { + maxHP: null, + maxStamina: null, + maxResolve: null, + totalClassDC: null, + totalSpeed: null, + totalAC: null, + totalPerception: null, + totalSkills: [], + totalSaves: [], + totalAbilityScores: [], + weapons: [], + conditions: [], + generalInfo: { + className: '', + heritageAncestryName: '', + backgroundName: '', + size: '', + traits: [], + }, + }; + + // Init StatsManager (set to new Map) // + initStats(); + // Init WeapModManager (set to new Map) // + initWeapModManager(); + + // ~~~~~~~~~~~~~~~~~~~~~~~ Adding Stats To Map ~~~~~~~~~~~~~~~~~~~~~~~ // + + initializeVariable(VARIABLE.LEVEL, VAR_TYPE.INTEGER, g_character.level); + + initializeVariable(VARIABLE.SCORE_STR, VAR_TYPE.ABILITY_SCORE, g_abilMap.get("STR")); + initializeVariable(VARIABLE.SCORE_DEX, VAR_TYPE.ABILITY_SCORE, g_abilMap.get("DEX")); + initializeVariable(VARIABLE.SCORE_CON, VAR_TYPE.ABILITY_SCORE, g_abilMap.get("CON")); + initializeVariable(VARIABLE.SCORE_INT, VAR_TYPE.ABILITY_SCORE, g_abilMap.get("INT")); + initializeVariable(VARIABLE.SCORE_WIS, VAR_TYPE.ABILITY_SCORE, g_abilMap.get("WIS")); + initializeVariable(VARIABLE.SCORE_CHA, VAR_TYPE.ABILITY_SCORE, g_abilMap.get("CHA")); + initializeVariable(VARIABLE.SCORE_NONE, VAR_TYPE.ABILITY_SCORE, 10); + + initializeVariable(VARIABLE.SPEED, VAR_TYPE.INTEGER, g_ancestry.speed); + for(const otherSpeed of g_otherSpeeds){ + initializeVariable('SPEED_'+otherSpeed.Type, VAR_TYPE.INTEGER, otherSpeed.Amount); + } + + let classDCData = getFinalProf(g_profMap.get("Class_DC")); + + // If classDCData is null, the character builder didn't save profs correctly, abort sheet load + if(classDCData == null){ + window.location.href = '/profile/characters/builder/?id='+getCharIDFromURL()+'&page=4'; + return; + } + + if(g_classDetails.KeyAbility != null){ + initializeVariableProf(VARIABLE.CLASS_DC, 'SCORE_'+g_classDetails.KeyAbility, classDCData.NumUps, g_profMap.get("Class_DC")); + } else { + initializeVariableProf(VARIABLE.CLASS_DC, VARIABLE.SCORE_NONE, classDCData.NumUps, g_profMap.get("Class_DC")); + } + addStat(VARIABLE.CLASS_DC, 'USER_BONUS', classDCData.UserBonus); + + let fortData = getFinalProf(g_profMap.get("Fortitude")); + initializeVariableProf(VARIABLE.SAVE_FORT, VARIABLE.SCORE_CON, fortData.NumUps, g_profMap.get("Fortitude")); + addStat(VARIABLE.SAVE_FORT, 'USER_BONUS', fortData.UserBonus); + + let reflexData = getFinalProf(g_profMap.get("Reflex")); + initializeVariableProf(VARIABLE.SAVE_REFLEX, VARIABLE.SCORE_DEX, reflexData.NumUps, g_profMap.get("Reflex")); + addStat(VARIABLE.SAVE_REFLEX, 'USER_BONUS', reflexData.UserBonus); + + let willData = getFinalProf(g_profMap.get("Will")); + initializeVariableProf(VARIABLE.SAVE_WILL, VARIABLE.SCORE_WIS, willData.NumUps, g_profMap.get("Will")); + addStat(VARIABLE.SAVE_WILL, 'USER_BONUS', willData.UserBonus); + + for(const [skillName, skillData] of g_skillMap.entries()){ + let profData = getFinalProf(g_profMap.get(skillName)); + let skillCodeName = skillName.replace(/\s/g,'_'); + if(profData != null){ + initializeVariableProf('SKILL_'+skillCodeName, 'SCORE_'+skillData.Skill.ability, profData.NumUps, g_profMap.get(skillName)); + addStat('SKILL_'+skillCodeName, 'USER_BONUS', profData.UserBonus); + } else { + initializeVariableProf('SKILL_'+skillCodeName, 'SCORE_'+skillData.Skill.ability, skillData.NumUps, null); + } + } + + let perceptionData = getFinalProf(g_profMap.get("Perception")); + initializeVariableProf(VARIABLE.PERCEPTION, VARIABLE.SCORE_WIS, perceptionData.NumUps, g_profMap.get("Perception")); + addStat(VARIABLE.PERCEPTION, 'USER_BONUS', perceptionData.UserBonus); + + // Spell Attacks and DCs + let arcaneSpellAttack = getFinalProf(g_profMap.get("ArcaneSpellAttacks")); + if(arcaneSpellAttack != null){ + initializeVariableProf(VARIABLE.ARCANE_SPELL_ATTACK, VARIABLE.SCORE_NONE, arcaneSpellAttack.NumUps, g_profMap.get("ArcaneSpellAttacks")); + addStat(VARIABLE.ARCANE_SPELL_ATTACK, 'USER_BONUS', arcaneSpellAttack.UserBonus); + } + let occultSpellAttack = getFinalProf(g_profMap.get("OccultSpellAttacks")); + if(occultSpellAttack != null){ + initializeVariableProf(VARIABLE.OCCULT_SPELL_ATTACK, VARIABLE.SCORE_NONE, occultSpellAttack.NumUps, g_profMap.get("OccultSpellAttacks")); + addStat(VARIABLE.OCCULT_SPELL_ATTACK, 'USER_BONUS', occultSpellAttack.UserBonus); + } + let primalSpellAttack = getFinalProf(g_profMap.get("PrimalSpellAttacks")); + if(primalSpellAttack != null){ + initializeVariableProf(VARIABLE.PRIMAL_SPELL_ATTACK, VARIABLE.SCORE_NONE, primalSpellAttack.NumUps, g_profMap.get("PrimalSpellAttacks")); + addStat(VARIABLE.PRIMAL_SPELL_ATTACK, 'USER_BONUS', primalSpellAttack.UserBonus); + } + let divineSpellAttack = getFinalProf(g_profMap.get("DivineSpellAttacks")); + if(divineSpellAttack != null){ + initializeVariableProf(VARIABLE.DIVINE_SPELL_ATTACK, VARIABLE.SCORE_NONE, divineSpellAttack.NumUps, g_profMap.get("DivineSpellAttacks")); + addStat(VARIABLE.DIVINE_SPELL_ATTACK, 'USER_BONUS', divineSpellAttack.UserBonus); + } + + let arcaneSpellDC = getFinalProf(g_profMap.get("ArcaneSpellDCs")); + if(arcaneSpellDC != null){ + initializeVariableProf(VARIABLE.ARCANE_SPELL_DC, VARIABLE.SCORE_NONE, arcaneSpellDC.NumUps, g_profMap.get("ArcaneSpellDCs")); + addStat(VARIABLE.ARCANE_SPELL_DC, 'USER_BONUS', arcaneSpellDC.UserBonus); + } + let occultSpellDC = getFinalProf(g_profMap.get("OccultSpellDCs")); + if(occultSpellDC != null){ + initializeVariableProf(VARIABLE.OCCULT_SPELL_DC, VARIABLE.SCORE_NONE, occultSpellDC.NumUps, g_profMap.get("OccultSpellDCs")); + addStat(VARIABLE.OCCULT_SPELL_DC, 'USER_BONUS', occultSpellDC.UserBonus); + } + let primalSpellDC = getFinalProf(g_profMap.get("PrimalSpellDCs")); + if(primalSpellDC != null){ + initializeVariableProf(VARIABLE.PRIMAL_SPELL_DC, VARIABLE.SCORE_NONE, primalSpellDC.NumUps, g_profMap.get("PrimalSpellDCs")); + addStat(VARIABLE.PRIMAL_SPELL_DC, 'USER_BONUS', primalSpellDC.UserBonus); + } + let divineSpellDC = getFinalProf(g_profMap.get("DivineSpellDCs")); + if(divineSpellDC != null){ + initializeVariableProf(VARIABLE.DIVINE_SPELL_DC, VARIABLE.SCORE_NONE, divineSpellDC.NumUps, g_profMap.get("DivineSpellDCs")); + addStat(VARIABLE.DIVINE_SPELL_DC, 'USER_BONUS', divineSpellDC.UserBonus); + } + + // Init Max HP + initializeVariable(VARIABLE.MAX_HEALTH, VAR_TYPE.INTEGER, 0); + initializeVariable(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL, VAR_TYPE.INTEGER, 0); + + // Init integer values, for adding bonuses/penalties to them + initializeVariable(VARIABLE.AC, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.DEX_CAP, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.ARMOR_CHECK_PENALTY, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.ARMOR_SPEED_PENALTY, VAR_TYPE.INTEGER, VAR_NULL); + + initializeVariable(VARIABLE.INVEST_LIMIT, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.BULK_LIMIT, VAR_TYPE.INTEGER, VAR_NULL); + + initializeVariable(VARIABLE.ATTACKS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.ATTACKS_DMG_DICE, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + + initializeVariable(VARIABLE.MELEE_ATTACKS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.MELEE_ATTACKS_DMG_DICE, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.MELEE_ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.AGILE_MELEE_ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.NON_AGILE_MELEE_ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + + initializeVariable(VARIABLE.RANGED_ATTACKS, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.RANGED_ATTACKS_DMG_DICE, VAR_TYPE.INTEGER, VAR_NULL); + initializeVariable(VARIABLE.RANGED_ATTACKS_DMG_BONUS, VAR_TYPE.INTEGER, VAR_NULL); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + // Run Items Code (investitures and others) // + // -- armor and shield item code runs when equipped + runAllItemsCode(); + determineInvestitures(); + + + // Display Ability Scores // + displayAbilityScores(); + + // Get STR and DEX score before conditions code runs (in the case of Enfeebled) + g_preConditions_strScore = getStatTotal(VARIABLE.SCORE_STR); + g_preConditions_dexScore = getStatTotal(VARIABLE.SCORE_DEX); + g_preConditions_conScore = getStatTotal(VARIABLE.SCORE_CON); + g_preConditions_intScore = getStatTotal(VARIABLE.SCORE_INT); + g_preConditions_wisScore = getStatTotal(VARIABLE.SCORE_WIS); + g_preConditions_chaScore = getStatTotal(VARIABLE.SCORE_CHA); + + // Run All Conditions Code // + runAllConditionsCode(); + + // Run Feats and Abilities Code // + runAllFeatsAndAbilitiesCode(); + + // Run Custom Code Block Code // + if(g_character.optionCustomCodeBlock === 1){ + processSheetCode(g_character.customCode, { + source: 'CustomCode', + sourceName: 'Custom Code', + }); + } + + // Determine Bulk and Coins // + determineBulkAndCoins(g_invStruct.InvItems, g_itemMap); + + // Display Health and Temp -> Stamina and Resolve // + g_variableMap.get(VARIABLE.MAX_HEALTH).Value = g_ancestry.hitPoints; + if(gOption_hasStamina){ + g_variableMap.get(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL).Value = 0; + } else { + g_variableMap.get(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL).Value = getModOfValue('CON'); + } + + // Run Toggleables (Sheet State) Code // + runAllSheetStateCode(); + + initHealthPointsAndMore(); + + // Determine Armor // + determineArmor(getModOfValue('DEX'), g_preConditions_strScore); + + // Display Conditions List // + displayConditionsList(); + + // Display All Other Info // + displayInformation(); + + // Hide Spells Tab // + if(g_spellSlotsMap.size === 0 && g_focusSpellMap.size === 0 && g_innateSpellArray.length === 0){ + $('#spellsTab').addClass('is-hidden'); + } else { + $('#spellsTab').removeClass('is-hidden'); + } + + // Hide Companions Tab // + if(gState_displayCompanionTab){ + $('#companionsTab').removeClass('is-hidden'); + } else { + $('#companionsTab').addClass('is-hidden'); + } + + // Make tabs smaller if too big + if(isOverflown($('#char-sheet-tabs'))){ + $('#char-sheet-tabs').removeClass('is-small-medium'); + $('#char-sheet-tabs').removeClass('is-medium'); + $('#char-sheet-tabs').addClass('is-small-medium'); + g_sheetTabSizeLock = true; + } else { + if(!g_sheetTabSizeLock){ + $('#char-sheet-tabs').removeClass('is-small-medium'); + $('#char-sheet-tabs').removeClass('is-medium'); + $('#char-sheet-tabs').addClass('is-medium'); + } + } + + // Open Weapons Tab Temporarily // -> To get data input for Calculated Stats + let prevSelectedTabID = g_selectedTabID; + $('#weaponsTab').trigger("click", [true]); + g_selectedTabID = prevSelectedTabID; + + // Set To Previous Tab // + g_selectedSubTabLock = true; + $('#'+g_selectedTabID).trigger("click", [true]); + if(g_selectedSubTabID != null){ + $('#'+g_selectedSubTabID).trigger("click"); + } + g_selectedSubTabLock = false; + + // Submit Calculated Stats // + socket.emit("requestUpdateCalculatedStats", + getCharIDFromURL(), + g_calculatedStats); + sendOutUpdateToGM('calculated-stats', g_calculatedStats); +} + +function displayAbilityScores() { + + //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////// Ability Scores //////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let strScore = getStatTotal(VARIABLE.SCORE_STR); + $("#strScore").html(strScore); + $("#strMod").html(signNumber(getMod(strScore))); + g_calculatedStats.totalAbilityScores.push({Name: 'Strength', Score: strScore});// Calculated Stat + $("#strSection").click(function(){ + openQuickView('abilityScoreView', { + AbilityName : 'Strength', + AbilityScore : strScore, + AbilityMod : getMod(strScore) + }); + }); + $("#strSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#strSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + let dexScore = getStatTotal(VARIABLE.SCORE_DEX); + $("#dexScore").html(dexScore); + $("#dexMod").html(signNumber(getMod(dexScore))); + g_calculatedStats.totalAbilityScores.push({Name: 'Dexterity', Score: dexScore});// Calculated Stat + $("#dexSection").click(function(){ + openQuickView('abilityScoreView', { + AbilityName : 'Dexterity', + AbilityScore : dexScore, + AbilityMod : getMod(dexScore) + }); + }); + $("#dexSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#dexSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + let conScore = getStatTotal(VARIABLE.SCORE_CON); + $("#conScore").html(conScore); + $("#conMod").html(signNumber(getMod(conScore))); + g_calculatedStats.totalAbilityScores.push({Name: 'Constitution', Score: conScore});// Calculated Stat + $("#conSection").click(function(){ + openQuickView('abilityScoreView', { + AbilityName : 'Constitution', + AbilityScore : conScore, + AbilityMod : getMod(conScore) + }); + }); + $("#conSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#conSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + let intScore = getStatTotal(VARIABLE.SCORE_INT); + $("#intScore").html(intScore); + $("#intMod").html(signNumber(getMod(intScore))); + g_calculatedStats.totalAbilityScores.push({Name: 'Intelligence', Score: intScore});// Calculated Stat + $("#intSection").click(function(){ + openQuickView('abilityScoreView', { + AbilityName : 'Intelligence', + AbilityScore : intScore, + AbilityMod : getMod(intScore) + }); + }); + $("#intSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#intSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + let wisScore = getStatTotal(VARIABLE.SCORE_WIS); + $("#wisScore").html(wisScore); + $("#wisMod").html(signNumber(getMod(wisScore))); + g_calculatedStats.totalAbilityScores.push({Name: 'Wisdom', Score: wisScore});// Calculated Stat + $("#wisSection").click(function(){ + openQuickView('abilityScoreView', { + AbilityName : 'Wisdom', + AbilityScore : wisScore, + AbilityMod : getMod(wisScore) + }); + }); + $("#wisSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#wisSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + let chaScore = getStatTotal(VARIABLE.SCORE_CHA); + $("#chaScore").html(chaScore); + $("#chaMod").html(signNumber(getMod(chaScore))); + g_calculatedStats.totalAbilityScores.push({Name: 'Charisma', Score: chaScore});// Calculated Stat + $("#chaSection").click(function(){ + openQuickView('abilityScoreView', { + AbilityName : 'Charisma', + AbilityScore : chaScore, + AbilityMod : getMod(chaScore) + }); + }); + $("#chaSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#chaSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + +} + +function displayInformation() { + + //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////// Character Info //////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#character-name').html(g_character.name); + let heritageAndAncestryName = ''; + if(g_heritage == null){ + heritageAndAncestryName = g_ancestry.name; + } else { + if(g_heritage.tagID != null){ + heritageAndAncestryName = g_heritage.name+' '+g_ancestry.name; + } else { + heritageAndAncestryName = g_heritage.name; + } + } + $('#character-type').html(heritageAndAncestryName+" "+g_classDetails.Class.name); + $('#character-level').html("Lvl "+g_character.level); + + // Calculated Stat + g_calculatedStats.generalInfo.className = g_classDetails.Class.name; + g_calculatedStats.generalInfo.heritageAncestryName = heritageAndAncestryName; + g_calculatedStats.generalInfo.backgroundName = g_background.name; + g_calculatedStats.generalInfo.size = capitalizeWord(g_charSize); + + let charTraits = cloneObj(g_charTagsArray); + charTraits.push('Humanoid'); + charTraits = charTraits.sort( + function(a, b) { + return a > b ? 1 : -1; + } + ); + g_calculatedStats.generalInfo.traits = charTraits; + // + + $("#charInfoContent").click(function(){ + openQuickView('charInfoView', { + }); + }); + $("#charInfoContent").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#charInfoContent").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////// Experience ////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let expInput = $('#exp-input'); + expInput.val(g_character.experience); + $(expInput).blur(function(){ + let experience = $(this).val(); + if(experience == null || experience > 99999 || experience < 0 || experience == '' || experience % 1 != 0) { + expInput.addClass('is-danger'); + } else { + expInput.removeClass('is-danger'); + socket.emit("requestExperienceSave", + getCharIDFromURL(), + experience); + g_character.experience = parseInt(experience); + sendOutUpdateToGM('exp', { value: g_character.experience }); + } + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////// Resist and Vulners ////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let resistAndVulnerText = ''; + if(g_resistAndVulners.Resistances.length != 0){ + resistAndVulnerText += 'Resistances'; + if(g_resistAndVulners.Vulnerabilities.length != 0){ + resistAndVulnerText += ' | '; + } + } + if(g_resistAndVulners.Vulnerabilities.length != 0){ + resistAndVulnerText += 'Weaknesses'; + } + + if(resistAndVulnerText != ''){ + $('#resistAndVulnerContent').removeClass('is-hidden'); + $('#resistAndVulnerText').html(resistAndVulnerText); + $('#resistAndVulnerContent').click(function(){ + openQuickView('resistView',{ + ResistAndVulners: g_resistAndVulners, + CharLevel : g_character.level, + }); + }); + $("#resistAndVulnerContent").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#resistAndVulnerContent").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + } else { + $('#resistAndVulnerContent').addClass('is-hidden'); + } + + $('#resistAndVulnerViewAllBtn').click(function(){ + openQuickView('resistListView',{ + ResistAndVulners: g_resistAndVulners, + CharLevel : g_character.level, + }); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////// Conditions /////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#addNewConditionsButton').click(function(){ + openSelectConditionsModal(); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// Class DC /////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let classDCContent = $("#classDCContent"); + + let classDC = getStatTotal(VARIABLE.CLASS_DC)+10; + let classDCBonusDisplayed = (hasConditionals(VARIABLE.CLASS_DC)) + ? classDC+'*' : classDC; + classDCContent.html(classDCBonusDisplayed); + g_calculatedStats.totalClassDC = classDC;// Calculated Stat + + let classDCData = getFinalProf(g_profMap.get("Class_DC")); + let classDCProfNum = getProfNumber(classDCData.NumUps, g_character.level); + $("#classDCSection").click(function(){ + openQuickView('classDCView', { + ProfData : classDCData, + ProfNum : classDCProfNum, + KeyMod : getModOfValue(g_classDetails.KeyAbility), + TotalDC : classDC, + CharLevel : g_character.level, + }); + }); + + $("#classDCSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#classDCSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////// Hero Points ////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $("#heroPointsSelect").val(g_character.heroPoints); + $("#heroPointsSelect").change(function(){ + socket.emit("requestHeroPointsSave", + getCharIDFromURL(), + $(this).val()); + g_character.heroPoints = parseInt($(this).val()); + sendOutUpdateToGM('hero-points', { value: g_character.heroPoints }); + }); + $("#heroPointsTitle").click(function(){ + openQuickView('heroPointsView', {}); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////// Back to Builder //////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + $("#backToBuilderButton").click(function(){ + if(!isViewOnly){ + // Hardcoded redirect + window.location.href = '/profile/characters/builder/basics/?id='+getCharIDFromURL(); + } + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////// Take Rest /////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + $("#restButton").click(function(){ + if(!isViewOnly){ + takeRest(); + } + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////// Copy and Export //////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + $('#copyCharButton').click(function() { + copyCharacter(getCharIDFromURL()); + startSpinnerSubLoader(); + }); + + $('#exportCharButton').click(function() { + exportCharacter(getCharIDFromURL()); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////// Unselected Data //////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + if(g_unselectedDataArray.length > 0){ + $('#warnings-icon').removeClass('is-hidden'); + $('#warnings-icon').click(function() { + openQuickView('warningsView', {}); + }); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////// Saves ///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let fortBonus = getStatTotal(VARIABLE.SAVE_FORT); + let fortBonusContent = $("#fortSave"); + let fortBonusDisplayed = (hasConditionals(VARIABLE.SAVE_FORT)) ? signNumber(fortBonus)+'*' : signNumber(fortBonus); + fortBonusContent.html(fortBonusDisplayed); + g_calculatedStats.totalSaves.push({Name: 'Fortitude', Bonus: fortBonus});// Calculated Stat + + let fortData = getFinalProf(g_profMap.get("Fortitude")); + let fortProfNum = getProfNumber(fortData.NumUps, g_character.level); + $("#fortSection").click(function(){ + openQuickView('savingThrowView', { + ProfSrcData : {For:'Save',To:'Fortitude'}, + ProfData : fortData, + ProfNum : fortProfNum, + AbilMod : getModOfValue('CON'), + TotalBonus : fortBonus, + CharLevel : g_character.level, + VARIABLE: VARIABLE.SAVE_FORT, + AbilityName : 'Constitution', + SavingThrowDescription : 'A Fortitude saving throw is used when your character’s health or vitality is under attack, such as from poison or disease.' + }); + }); + $("#fortSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#fortSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + let reflexBonus = getStatTotal(VARIABLE.SAVE_REFLEX); + let reflexBonusContent = $("#reflexSave"); + let reflexBonusDisplayed = (hasConditionals(VARIABLE.SAVE_REFLEX)) ? signNumber(reflexBonus)+'*' : signNumber(reflexBonus); + reflexBonusContent.html(reflexBonusDisplayed); + g_calculatedStats.totalSaves.push({Name: 'Reflex', Bonus: reflexBonus});// Calculated Stat + + let reflexData = getFinalProf(g_profMap.get("Reflex")); + let reflexProfNum = getProfNumber(reflexData.NumUps, g_character.level); + $("#reflexSection").click(function(){ + openQuickView('savingThrowView', { + ProfSrcData : {For:'Save',To:'Reflex'}, + ProfData : reflexData, + ProfNum : reflexProfNum, + AbilMod : getModOfValue('DEX'), + TotalBonus : reflexBonus, + CharLevel : g_character.level, + VARIABLE: VARIABLE.SAVE_REFLEX, + AbilityName : 'Dexterity', + SavingThrowDescription : 'A Reflex saving throw is called for when your character must dodge away from danger, usually something that affects a large area, such as the scorching blast of a fireball spell.' + }); + }); + $("#reflexSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#reflexSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + let willBonus = getStatTotal(VARIABLE.SAVE_WILL); + let willBonusContent = $("#willSave"); + let willBonusDisplayed = (hasConditionals(VARIABLE.SAVE_WILL)) ? signNumber(willBonus)+'*' : signNumber(willBonus); + willBonusContent.html(willBonusDisplayed); + g_calculatedStats.totalSaves.push({Name: 'Will', Bonus: willBonus});// Calculated Stat + + let willData = getFinalProf(g_profMap.get("Will")); + let willProfNum = getProfNumber(willData.NumUps, g_character.level); + $("#willSection").click(function(){ + openQuickView('savingThrowView', { + ProfSrcData : {For:'Save',To:'Will'}, + ProfData : willData, + ProfNum : willProfNum, + AbilMod : getModOfValue('WIS'), + TotalBonus : willBonus, + CharLevel : g_character.level, + VARIABLE: VARIABLE.SAVE_WILL, + AbilityName : 'Wisdom', + SavingThrowDescription : 'A Will saving throw is often used as your character’s defense against spells and effects that target their mind, such as a charm or confusion spell.' + }); + }); + $("#willSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $("#willSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////// Speed ///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let speedContent = $("#speedContent"); + let speedNum = getStatTotal(VARIABLE.SPEED); + speedNum = (speedNum > 5) ? speedNum : 5; + + let speedDisplayed = (hasConditionals(VARIABLE.SPEED)) ? + speedNum+' ft*' : speedNum+' ft'; + speedContent.html(speedDisplayed); + g_calculatedStats.totalSpeed = speedNum;// Calculated Stat + + $("#speedSection").click(function(){ + openQuickView('speedView', { + }); + }); + + if(g_otherSpeeds.length != 0){ + $("#speedBottom").removeClass('is-hidden'); + } else { + $("#speedBottom").addClass('is-hidden'); + } + + $("#speedSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + $("#speedDivider").addClass('hr-highlighted'); + }); + $("#speedSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $("#speedDivider").removeClass('hr-highlighted'); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////// Perception /////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let visionSenseArray = []; + let additionalSenseArray = []; + let primaryVisionSense = null; + for(const sense of g_senseArray){ + if(sense.value.isVisionType == 0){ + additionalSenseArray.push(sense.value); + } else { + visionSenseArray.push(sense.value); + if(primaryVisionSense == null || sense.value.visionPrecedence > primaryVisionSense.visionPrecedence) { + primaryVisionSense = sense.value; + } + } + } + + if(primaryVisionSense != null){ + $("#perceptionPrimaryVisionSense").html(primaryVisionSense.name); + } else { + $("#perceptionPrimaryVisionSense").html('None'); + } + + let perceptionBonusContent = $("#perceptionBonusContent"); + let perceptionBonus = getStatTotal(VARIABLE.PERCEPTION); + let perceptionBonusDisplayed = (hasConditionals(VARIABLE.PERCEPTION)) + ? signNumber(perceptionBonus)+'*' : signNumber(perceptionBonus); + perceptionBonusContent.html(perceptionBonusDisplayed); + g_calculatedStats.totalPerception = perceptionBonus;// Calculated Stat + + let perceptionData = getFinalProf(g_profMap.get("Perception")); + let perceptionProfNum = getProfNumber(perceptionData.NumUps, g_character.level); + $("#perceptionBonusSection").click(function(){ + openQuickView('perceptionView', { + ProfData : perceptionData, + ProfNum : perceptionProfNum, + WisMod : getModOfValue('WIS'), + TotalBonus : perceptionBonus, + CharLevel : g_character.level, + PrimaryVisionSense : primaryVisionSense, + VisionSenseArray : visionSenseArray, + AdditionalSenseArray : additionalSenseArray + }); + }); + + $("#perceptionBonusSection").mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + $("#perceptionBonusDivider").addClass('hr-highlighted'); + }); + $("#perceptionBonusSection").mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + $("#perceptionBonusDivider").removeClass('hr-highlighted'); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////// Attacks and Defenses ///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $("#addNewProfButton").click(function(){ + openQuickView('addProfView', { + }); + }); + + let otherProfsNum = 0; + + let attacks = $("#attacksContent"); + attacks.html(''); + + let profSimpleWeapons = getFinalProf(g_profMap.get("Simple_Weapons")); + if(profSimpleWeapons != null){ + + if(variables_getValue(VARIABLE.SIMPLE_WEAPONS) == null){ + initializeVariableProf(VARIABLE.SIMPLE_WEAPONS, VARIABLE.SCORE_NONE, profSimpleWeapons.NumUps, g_profMap.get("Simple_Weapons")); + } + + let profWord = getProfNameFromNumUps(profSimpleWeapons.NumUps); + otherProfsNum++; + otherProfBuild(attacks, profWord, 'Simple Weapons', otherProfsNum, profSimpleWeapons, {For:'Attack',To:'Simple_Weapons'}, VARIABLE.SIMPLE_WEAPONS); + } + let profMartialWeapons = getFinalProf(g_profMap.get("Martial_Weapons")); + if(profMartialWeapons != null){ + + if(variables_getValue(VARIABLE.MARTIAL_WEAPONS) == null){ + initializeVariableProf(VARIABLE.MARTIAL_WEAPONS, VARIABLE.SCORE_NONE, profMartialWeapons.NumUps, g_profMap.get("Martial_Weapons")); + } + + let profWord = getProfNameFromNumUps(profMartialWeapons.NumUps); + otherProfsNum++; + otherProfBuild(attacks, profWord, 'Martial Weapons', otherProfsNum, profMartialWeapons, {For:'Attack',To:'Martial_Weapons'}, VARIABLE.MARTIAL_WEAPONS); + } + let profAdvancedWeapons = getFinalProf(g_profMap.get("Advanced_Weapons")); + if(profAdvancedWeapons != null){ + + if(variables_getValue(VARIABLE.ADVANCED_WEAPONS) == null){ + initializeVariableProf(VARIABLE.ADVANCED_WEAPONS, VARIABLE.SCORE_NONE, profAdvancedWeapons.NumUps, g_profMap.get("Advanced_Weapons")); + } + + let profWord = getProfNameFromNumUps(profAdvancedWeapons.NumUps); + otherProfsNum++; + otherProfBuild(attacks, profWord, 'Advanced Weapons', otherProfsNum, profAdvancedWeapons, {For:'Attack',To:'Advanced_Weapons'}, VARIABLE.ADVANCED_WEAPONS); + } + let profUnarmedAttacks = getFinalProf(g_profMap.get("Unarmed_Attacks")); + if(profUnarmedAttacks != null){ + + if(variables_getValue(VARIABLE.UNARMED_ATTACKS) == null){ + initializeVariableProf(VARIABLE.UNARMED_ATTACKS, VARIABLE.SCORE_NONE, profUnarmedAttacks.NumUps, g_profMap.get("Unarmed_Attacks")); + } + + let profWord = getProfNameFromNumUps(profUnarmedAttacks.NumUps); + otherProfsNum++; + otherProfBuild(attacks, profWord, 'Unarmed Attacks', otherProfsNum, profUnarmedAttacks, {For:'Attack',To:'Unarmed_Attacks'}, VARIABLE.UNARMED_ATTACKS); + } + for(const [profName, profDataArray] of g_profMap.entries()){ + const finalProfData = getFinalProf(profDataArray); + if(finalProfData.For == "Attack" && profName != "Simple_Weapons" && profName != "Martial_Weapons" && profName != "Advanced_Weapons" && profName != "Unarmed_Attacks"){ + let dProfName = profName.replace(/_/g,' '); + let profWord = getProfNameFromNumUps(finalProfData.NumUps); + + // Get variable, init if null + let VARIABLE_NAME = 'WEAPON_'+profName.replace(/\s/g, "_").toUpperCase(); + if(variables_getValue(VARIABLE_NAME) == null){ + initializeVariableProf(VARIABLE_NAME, VARIABLE.SCORE_NONE, finalProfData.NumUps, profDataArray); + } + + otherProfsNum++; + otherProfBuild(attacks, profWord, capitalizeWords(dProfName), otherProfsNum, finalProfData, {For:'Attack',To:profName}, VARIABLE_NAME); + + } else if(finalProfData.For == "Group"){ + let dProfName = profName.replace(/_/g,' '); + let profWord = getProfNameFromNumUps(finalProfData.NumUps); + + // Get variable, init if null + let VARIABLE_NAME = 'GROUP_'+profName.replace(/\s/g, "_").toUpperCase(); + if(variables_getValue(VARIABLE_NAME) == null){ + initializeVariableProf(VARIABLE_NAME, VARIABLE.SCORE_NONE, finalProfData.NumUps, profDataArray); + } + + otherProfsNum++; + otherProfBuild(attacks, profWord, capitalizeWords(dProfName)+'s', otherProfsNum, finalProfData, {For:'Group',To:profName}, VARIABLE_NAME); + + } else if(finalProfData.For == "Trait"){ + let dProfName = profName.replace(/_/g,' '); + let profWord = getProfNameFromNumUps(finalProfData.NumUps); + + // Get variable, init if null + let VARIABLE_NAME = 'HAS_TRAIT_'+profName.replace(/\s/g, "_").toUpperCase(); + if(variables_getValue(VARIABLE_NAME) == null){ + initializeVariableProf(VARIABLE_NAME, VARIABLE.SCORE_NONE, finalProfData.NumUps, profDataArray); + } + + otherProfsNum++; + otherProfBuild(attacks, profWord, capitalizeWords(dProfName)+'s', otherProfsNum, finalProfData, {For:'Trait',To:profName}, VARIABLE_NAME); + } + } + + + let defenses = $("#defensesContent"); + defenses.html(''); + + let profLightArmor = getFinalProf(g_profMap.get("Light_Armor")); + if(profLightArmor != null){ + + if(variables_getValue(VARIABLE.LIGHT_ARMOR) == null){ + initializeVariableProf(VARIABLE.LIGHT_ARMOR, VARIABLE.SCORE_NONE, profLightArmor.NumUps, g_profMap.get("Light_Armor")); + } + + let profWord = getProfNameFromNumUps(profLightArmor.NumUps); + otherProfsNum++; + otherProfBuild(defenses, profWord, 'Light Armor', otherProfsNum, profLightArmor, {For:'Defense',To:'Light_Armor'}, VARIABLE.LIGHT_ARMOR); + } + let profMediumArmor = getFinalProf(g_profMap.get("Medium_Armor")); + if(profMediumArmor != null){ + + if(variables_getValue(VARIABLE.MEDIUM_ARMOR) == null){ + initializeVariableProf(VARIABLE.MEDIUM_ARMOR, VARIABLE.SCORE_NONE, profMediumArmor.NumUps, g_profMap.get("Medium_Armor")); + } + + let profWord = getProfNameFromNumUps(profMediumArmor.NumUps); + otherProfsNum++; + otherProfBuild(defenses, profWord, 'Medium Armor', otherProfsNum, profMediumArmor, {For:'Defense',To:'Medium_Armor'}, VARIABLE.MEDIUM_ARMOR); + } + let profHeavyArmor = getFinalProf(g_profMap.get("Heavy_Armor")); + if(profHeavyArmor != null){ + + if(variables_getValue(VARIABLE.HEAVY_ARMOR) == null){ + initializeVariableProf(VARIABLE.HEAVY_ARMOR, VARIABLE.SCORE_NONE, profHeavyArmor.NumUps, g_profMap.get("Heavy_Armor")); + } + + let profWord = getProfNameFromNumUps(profHeavyArmor.NumUps); + otherProfsNum++; + otherProfBuild(defenses, profWord, 'Heavy Armor', otherProfsNum, profHeavyArmor, {For:'Defense',To:'Heavy_Armor'}, VARIABLE.HEAVY_ARMOR); + } + let profUnarmoredDefense = getFinalProf(g_profMap.get("Unarmored_Defense")); + if(profUnarmoredDefense != null){ + + if(variables_getValue(VARIABLE.UNARMORED_DEFENSE) == null){ + initializeVariableProf(VARIABLE.UNARMORED_DEFENSE, VARIABLE.SCORE_NONE, profUnarmoredDefense.NumUps, g_profMap.get("Unarmored_Defense")); + } + + let profWord = getProfNameFromNumUps(profUnarmoredDefense.NumUps); + otherProfsNum++; + otherProfBuild(defenses, profWord, 'Unarmored Defense', otherProfsNum, profUnarmoredDefense, {For:'Defense',To:'Unarmored_Defense'}, VARIABLE.UNARMORED_DEFENSE); + } + for(const [profName, profDataArray] of g_profMap.entries()){ + const finalProfData = getFinalProf(profDataArray); + if(finalProfData.For == "Defense" && profName != "Light_Armor" && profName != "Medium_Armor" && profName != "Heavy_Armor" && profName != "Unarmored_Defense"){ + let dProfName = profName.replace(/_/g,' '); + let profWord = getProfNameFromNumUps(finalProfData.NumUps); + + // Get variable, init if null + let VARIABLE_NAME = 'ARMOR_'+profName.replace(/\s/g, "_").toUpperCase(); + if(variables_getValue(VARIABLE_NAME) == null){ + initializeVariableProf(VARIABLE_NAME, VARIABLE.SCORE_NONE, finalProfData.NumUps, profDataArray); + } + + otherProfsNum++; + otherProfBuild(defenses, profWord, capitalizeWords(dProfName), otherProfsNum, finalProfData, {For:'Defense',To:profName}, VARIABLE_NAME); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////// Spells //////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let spells = $("#spellsContent"); + spells.html(''); + + let arcaneSpellAttack = getFinalProf(g_profMap.get("ArcaneSpellAttacks")); + if(arcaneSpellAttack != null){ + let profWord = getProfNameFromNumUps(arcaneSpellAttack.NumUps); + otherProfsNum++; + otherProfBuild(spells, profWord, 'Arcane Attacks', otherProfsNum, arcaneSpellAttack, {For:'SpellAttack',To:'ArcaneSpellAttacks'}, VARIABLE.ARCANE_SPELL_ATTACK, { SpellTradition: 'ARCANE', SpellPart: 'Attack' }); + } + + let arcaneSpellDC = getFinalProf(g_profMap.get("ArcaneSpellDCs")); + if(arcaneSpellDC != null){ + let profWord = getProfNameFromNumUps(arcaneSpellDC.NumUps); + otherProfsNum++; + otherProfBuild(spells, profWord, 'Arcane DCs', otherProfsNum, arcaneSpellDC, {For:'SpellDC',To:'ArcaneSpellDCs'}, VARIABLE.ARCANE_SPELL_DC, { SpellTradition: 'ARCANE', SpellPart: 'DC' }); + } + + let divineSpellAttack = getFinalProf(g_profMap.get("DivineSpellAttacks")); + if(divineSpellAttack != null){ + let profWord = getProfNameFromNumUps(divineSpellAttack.NumUps); + otherProfsNum++; + otherProfBuild(spells, profWord, 'Divine Attacks', otherProfsNum, divineSpellAttack, {For:'SpellAttack',To:'DivineSpellAttacks'}, VARIABLE.DIVINE_SPELL_ATTACK, { SpellTradition: 'DIVINE', SpellPart: 'Attack' }); + } + + let divineSpellDC = getFinalProf(g_profMap.get("DivineSpellDCs")); + if(divineSpellDC != null){ + let profWord = getProfNameFromNumUps(divineSpellDC.NumUps); + otherProfsNum++; + otherProfBuild(spells, profWord, 'Divine DCs', otherProfsNum, divineSpellDC, {For:'SpellDC',To:'DivineSpellDCs'}, VARIABLE.DIVINE_SPELL_DC, { SpellTradition: 'DIVINE', SpellPart: 'DC' }); + } + + let occultSpellAttack = getFinalProf(g_profMap.get("OccultSpellAttacks")); + if(occultSpellAttack != null){ + let profWord = getProfNameFromNumUps(occultSpellAttack.NumUps); + otherProfsNum++; + otherProfBuild(spells, profWord, 'Occult Attacks', otherProfsNum, occultSpellAttack, {For:'SpellAttack',To:'OccultSpellAttacks'}, VARIABLE.OCCULT_SPELL_ATTACK, { SpellTradition: 'OCCULT', SpellPart: 'Attack' }); + } + + let occultSpellDC = getFinalProf(g_profMap.get("OccultSpellDCs")); + if(occultSpellDC != null){ + let profWord = getProfNameFromNumUps(occultSpellDC.NumUps); + otherProfsNum++; + otherProfBuild(spells, profWord, 'Occult DCs', otherProfsNum, occultSpellDC, {For:'SpellDC',To:'OccultSpellDCs'}, VARIABLE.OCCULT_SPELL_DC, { SpellTradition: 'OCCULT', SpellPart: 'DC' }); + } + + let primalSpellAttack = getFinalProf(g_profMap.get("PrimalSpellAttacks")); + if(primalSpellAttack != null){ + let profWord = getProfNameFromNumUps(primalSpellAttack.NumUps); + otherProfsNum++; + otherProfBuild(spells, profWord, 'Primal Attacks', otherProfsNum, primalSpellAttack, {For:'SpellAttack',To:'PrimalSpellAttacks'}, VARIABLE.PRIMAL_SPELL_ATTACK, { SpellTradition: 'PRIMAL', SpellPart: 'Attack' }); + } + + let primalSpellDC = getFinalProf(g_profMap.get("PrimalSpellDCs")); + if(primalSpellDC != null){ + let profWord = getProfNameFromNumUps(primalSpellDC.NumUps); + otherProfsNum++; + otherProfBuild(spells, profWord, 'Primal DCs', otherProfsNum, primalSpellDC, {For:'SpellDC',To:'PrimalSpellDCs'}, VARIABLE.PRIMAL_SPELL_DC, { SpellTradition: 'PRIMAL', SpellPart: 'DC' }); + } + + if(spells.html() == ''){ + $('#spellsContentSection').addClass('is-hidden'); + } else { + $('#spellsContentSection').removeClass('is-hidden'); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////// Skills //////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $("#addNewLoreButton").click(function(){ + openQuickView('addLoreView', { + }); + }); + + let skills = $("#skills"); + skills.html(''); + let hasFascinatedCondition = hasCondition(14); // Hardcoded - Fascinated condition decreases all skills by -2 + let untrainedImprovisation = g_featChoiceArray.find(feat => { + return feat.value != null && feat.value.id == 2270; // Hardcoded Untrained Improvisation Feat ID + }); + let hasUntrainedImprovisationFeat = (untrainedImprovisation != null); + for(const [skillName, skillData] of g_skillMap.entries()){ + let profData = getFinalProf(g_profMap.get(skillName)); + if(profData == null){ profData = skillData; } + + let skillButtonID = ("skillButton"+skillName).replace(/\W/g,'_'); + + let abilMod = getModOfValue(skillData.Skill.ability); + let profNum = getProfNumber(profData.NumUps, g_character.level); + + if(hasUntrainedImprovisationFeat){ + if(profData.NumUps === 0 && !gOption_hasProfWithoutLevel){ + if(g_character.level < 7){ + let profBonus = Math.floor(g_character.level/2); + addStat('SKILL_'+skillName, 'PROFICIENCY_BONUS', profBonus, 'Untrained Improvisation'); + } else { + addStat('SKILL_'+skillName, 'PROFICIENCY_BONUS', g_character.level, 'Untrained Improvisation'); + } + } + } + + if(gState_addLevelToUntrainedSkill) { + if(profData.NumUps === 0 && !gOption_hasProfWithoutLevel){ + addStat('SKILL_'+skillName, 'PROFICIENCY_BONUS', g_character.level, 'Level to Untrained Skills'); + } + } + + if(hasFascinatedCondition){ + addStatAndSrc('SKILL_'+skillName, 'STATUS_PENALTY', -2, 'Fascinated'); + } + + let totalBonus = getStatTotal('SKILL_'+skillName); + + let conditionalStar = (hasConditionals('SKILL_'+skillName)) ? '*' : ''; + + + let skillNameHTML = ''+skillName+''; + + // Underline if lore is user-added + if(skillName.includes(' Lore')){ + let userAddedData = getUserAddedData(g_profMap.get(skillName)); + if(userAddedData != null){ + skillNameHTML = ''+skillName+''; + } + } + + skills.append(` + + ${signNumber(totalBonus)+conditionalStar} + ${skillNameHTML} + ${getProfLetterFromNumUps(profData.NumUps)} + + `); + g_calculatedStats.totalSkills.push({Name: skillName, Bonus: totalBonus});// Calculated Stat + + $('#'+skillButtonID).click(function(){ + openQuickView('skillView', { + Skill : skillData.Skill, + SkillName : skillName, + ProfData : profData, + AbilMod : abilMod, + ProfNum : profNum, + TotalBonus : totalBonus, + CharLevel : g_character.level, + VARIABLE: 'SKILL_'+skillName, + }); + }); + + } + + + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////// Actions Tab ////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + let encounterFeatStructArray = []; + let explorationFeatStructArray = []; + let downtimeFeatStructArray = []; + + for(const [featID, featStruct] of g_featMap.entries()){ + + if(featStruct.Feat.isDefault == 1){ + + // Hardcoded Exploration and Downtime Tag IDs + let explorationTag = featStruct.Tags.find(tag => { + return tag.id === 15; + }); + let downtimeTag = featStruct.Tags.find(tag => { + return tag.id === 218; + }); + + if(explorationTag != null){ + explorationFeatStructArray.push(featStruct); + } else if(downtimeTag != null){ + downtimeFeatStructArray.push(featStruct); + } else if(featStruct.Feat.actions != 'NONE'){ + encounterFeatStructArray.push(featStruct); + } + } + } + + + encounterFeatStructArray = encounterFeatStructArray.sort( + function(a, b) { + return (a.Feat.name > b.Feat.name) ? 1 : -1; + } + ); + explorationFeatStructArray = explorationFeatStructArray.sort( + function(a, b) { + return (a.Feat.name > b.Feat.name) ? 1 : -1; + } + ); + downtimeFeatStructArray = downtimeFeatStructArray.sort( + function(a, b) { + return (a.Feat.name > b.Feat.name) ? 1 : -1; + } + ); + + $('#actionsTab').click(function(event, preventQuickviewClose){ + if(preventQuickviewClose){ + event.stopImmediatePropagation(); + } + changeTab('actionsTab', { + FeatMap : g_featMap, + FeatChoiceArray : g_featChoiceArray, + SkillMap : g_skillMap, + EncounterFeatStructArray : encounterFeatStructArray, + ExplorationFeatStructArray : explorationFeatStructArray, + DowntimeFeatStructArray : downtimeFeatStructArray + }); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////// Weapons Tab ////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#weaponsTab').click(function(event, preventQuickviewClose){ + if(preventQuickviewClose){ + event.stopImmediatePropagation(); + } + changeTab('weaponsTab', { + StrMod : getMod(getStatTotal(VARIABLE.SCORE_STR)), + DexMod : getMod(getStatTotal(VARIABLE.SCORE_DEX)), + }); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////// Spells Tab ////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#spellsTab').click(function(event, preventQuickviewClose){ + if(preventQuickviewClose){ + event.stopImmediatePropagation(); + } + changeTab('spellsTab', null); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////// Inventory Tab ///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#inventoryTab').click(function(event, preventQuickviewClose){ + if(preventQuickviewClose){ + event.stopImmediatePropagation(); + } + changeTab('inventoryTab', { + }); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////// Companions Tab ///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#companionsTab').click(function(event, preventQuickviewClose){ + if(preventQuickviewClose){ + event.stopImmediatePropagation(); + } + changeTab('companionsTab', { + }); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////// Details Tab ////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#detailsTab').click(function(event, preventQuickviewClose){ + if(preventQuickviewClose){ + event.stopImmediatePropagation(); + } + changeTab('detailsTab', { + FeatMap : g_featMap, + FeatChoiceArray : g_featChoiceArray, + AbilityMap : g_abilMap, + Character : g_character, + Heritage : g_heritage, + Background : g_background, + PhyFeats : g_phyFeatArray, + ClassDetails : g_classDetails, + Ancestry : g_ancestry + }); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////// Notes Tab /////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#notesTab').click(function(event, preventQuickviewClose){ + if(preventQuickviewClose){ + event.stopImmediatePropagation(); + } + changeTab('notesTab', { + }); + }); + + //////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////// Languages /////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $("#addNewLangButton").click(function(){ + openQuickView('addLangView', { + }); + }); + + let languagesContent = $('#languagesContent'); + languagesContent.html(''); + let langCount = 0; + for(const lang of g_langArray){ + if(lang.value == null) {continue;} + if(langCount != 0){languagesContent.append(', ');} + langCount++; + let langID = 'langLink'+lang.value.id+"C"+langCount; + + + let langNameHTML = ''+lang.value.name+''; + + // Underline if lang is user-added + if(lang.sourceType == 'user-added'){ + langNameHTML = ''+lang.value.name+''; + } + + languagesContent.append(''+langNameHTML+''); + $('#'+langID).click(function(){ + openQuickView('languageView', { + Language : lang.value, + SourceType : lang.sourceType, + }); + }); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////// Left Quickview ///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + $('#leftQuickviewButton').click(function(event){ + event.stopImmediatePropagation(); + openLeftQuickView('Toggleables'); + }); + +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////// Health //////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +function initHealthPointsAndMore() { + + // TODO - Rework this + // Sets the g_calculatedStats for both health and stamina + initHealthAndTemp(); + initStaminaAndResolve(); + // + + if(gOption_hasStamina){ + + if(g_showHealthPanel){ + initHealthAndTemp(); + } else { + initStaminaAndResolve(); + } + + $('#pointSwitchOutContainer').removeClass('is-hidden'); + $('#pointSwitchOutBtn').off(); + $('#pointSwitchOutBtn').click(function(){ + g_showHealthPanel = !g_showHealthPanel; + if(g_showHealthPanel){ + initHealthAndTemp(); + } else { + initStaminaAndResolve(); + } + }); + } else { + initHealthAndTemp(); + } + +} + +function initHealthAndTemp() { + $('#healthPointsContainer').removeClass('is-hidden'); + $('#tempPointsContainer').removeClass('is-hidden'); + $('#staminaPointsContainer').addClass('is-hidden'); + $('#resolvePointsContainer').addClass('is-hidden'); + + let maxHealth = $('#char-max-health'); + let maxHealthNum = getStatTotal(VARIABLE.MAX_HEALTH); + + if(gOption_hasStamina){ + maxHealthNum += (Math.floor(g_classDetails.Class.hitPoints/2)+getStatTotal(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL))*g_character.level; + } else { + maxHealthNum += (g_classDetails.Class.hitPoints+getStatTotal(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL))*g_character.level; + } + + if(maxHealthNum < 0){ maxHealthNum = 0; } + maxHealth.html(maxHealthNum); + g_calculatedStats.maxHP = maxHealthNum;// Calculated Stat + + if(g_character.currentHealth == null){ + g_character.currentHealth = maxHealthNum; + } + g_character.currentHealth = (g_character.currentHealth > maxHealthNum) ? maxHealthNum : g_character.currentHealth; + + let currentHealth = $('#char-current-health'); + let animationDelay = getAnimationDelayFromCurrentHP(g_character.currentHealth, maxHealthNum); + + currentHealth.html('

                      '+g_character.currentHealth+'

                      '); + + $(currentHealth).off('click'); + $(currentHealth).click(function(){ + if(!$(this).hasClass('is-in-input-mode')) { + + $(this).addClass('is-in-input-mode'); + $(this).html(''); + $('#current-health-input').focus(); + + $('#current-health-input').blur(function(){ + healthConfirm(maxHealthNum); + }); + + // Press Enter Key + $('#current-health-input').on('keypress',function(e){ + if(e.which == 13){ + healthConfirm(maxHealthNum); + } + }); + + } + }); + + + let tempHealth = $('#char-temp-health'); + + if(g_character.tempHealth == null){ + g_character.tempHealth = 0; + } + + if(g_character.tempHealth == 0){ + tempHealth.html('

                      '); + } else { + tempHealth.html('

                      '+g_character.tempHealth+'

                      '); + } + + $(tempHealth).off('click'); + $(tempHealth).click(function(){ + if(!$(this).hasClass('is-in-input-mode')) { + + $(this).addClass('is-in-input-mode'); + $(this).html(''); + $('#temp-health-input').focus(); + + $('#temp-health-input').blur(function(){ + tempHealthConfirm(); + }); + + // Press Enter Key + $('#temp-health-input').on('keypress',function(e){ + if(e.which == 13){ + tempHealthConfirm(); + } + }); + + } + }); + +} + +function healthConfirm(maxHealthNum){ + let currentHealthNum = $('#current-health-input').val(); + + let newCurrentHealth; + try { + newCurrentHealth = parseInt(math.evaluate(currentHealthNum)); + if(newCurrentHealth > maxHealthNum) { newCurrentHealth = maxHealthNum; } + if(newCurrentHealth < 0) { newCurrentHealth = 0; } + if(isNaN(newCurrentHealth)) { throw 'Value is not a number!'; } + } catch (err) { + $('#current-health-input').addClass('is-danger'); + return; + } + + if(g_character.currentHealth === 0 && newCurrentHealth > 0){ + removeCondition(11); // Hardcoded ID - Remove Dying Condition + let woundedCondition = getCondition(35); // Hardcoded ID - Wounded + if(woundedCondition != null){ + let woundedValue = woundedCondition.Value + 1; + addCondition(35, + woundedValue, + woundedCondition.SourceText, + woundedCondition.ParentID); + } else { + addCondition(35, 1, null); + } + } + + g_character.currentHealth = newCurrentHealth; + let animationDelay = getAnimationDelayFromCurrentHP(g_character.currentHealth, maxHealthNum); + + $('#char-current-health').html('

                      '+g_character.currentHealth+'

                      '); + + $('#char-current-health').removeClass('is-in-input-mode'); + socket.emit("requestCurrentHitPointsSave", + getCharIDFromURL(), + g_character.currentHealth); + sendOutUpdateToGM('hp', { value: g_character.currentHealth }); + + if(g_character.currentHealth === 0){ + let dyingValue = 1; + let woundedCondition = getCondition(35); // Hardcoded ID - Wounded + if(woundedCondition != null){ + dyingValue += woundedCondition.Value; + } + addCondition(11, dyingValue, null); // Hardcoded ID - Add Dying Condition + } +} + +function tempHealthConfirm(){ + let tempHealth = $('#char-temp-health'); + let tempHealthNum = $('#temp-health-input').val(); + + let newTempHealth; + try { + if(tempHealthNum == '') { tempHealthNum = '0'; } + newTempHealth = parseInt(math.evaluate(tempHealthNum)); + if(newTempHealth > 999) { newTempHealth = 999; } + if(newTempHealth < 0 || isNaN(newTempHealth)) { newTempHealth = 0; } + } catch (err) { + $('#temp-health-input').addClass('is-danger'); + return; + } + + g_character.tempHealth = newTempHealth; + if(g_character.tempHealth == 0){ + tempHealth.html('

                      '); + } else { + tempHealth.html('

                      '+g_character.tempHealth+'

                      '); + } + $('#char-temp-health').removeClass('is-in-input-mode'); + socket.emit("requestTempHitPointsSave", + getCharIDFromURL(), + g_character.tempHealth); + sendOutUpdateToGM('temp-hp', { value: g_character.tempHealth }); +} + +/////// + +function initStaminaAndResolve() { + $('#staminaPointsContainer').removeClass('is-hidden'); + $('#resolvePointsContainer').removeClass('is-hidden'); + $('#healthPointsContainer').addClass('is-hidden'); + $('#tempPointsContainer').addClass('is-hidden'); + + let maxStamina = $('#char-max-stamina'); + let maxStaminaNum = (Math.floor(g_classDetails.Class.hitPoints/2)+getModOfValue('CON'))*g_character.level; + + if(maxStaminaNum < 0){ maxStaminaNum = 0; } + maxStamina.html(maxStaminaNum); + g_calculatedStats.maxStamina = maxStaminaNum;// Calculated Stat + + if(g_character.currentStamina == null){ + g_character.currentStamina = maxStaminaNum; + } + g_character.currentStamina = (g_character.currentStamina > maxStaminaNum) ? maxStaminaNum : g_character.currentStamina; + + let currentStamina = $('#char-current-stamina'); + currentStamina.html('

                      '+g_character.currentStamina+'

                      '); + + $(currentStamina).off('click'); + $(currentStamina).click(function(){ + if(!$(this).hasClass('is-in-input-mode')) { + + $(this).addClass('is-in-input-mode'); + $(this).html(''); + $('#current-stamina-input').focus(); + + $('#current-stamina-input').blur(function(){ + staminaConfirm(maxStaminaNum); + }); + + // Press Enter Key + $('#current-stamina-input').on('keypress',function(e){ + if(e.which == 13){ + staminaConfirm(maxStaminaNum); + } + }); + + } + }); + + + let maxResolve = $('#char-max-resolve'); + let maxResolveNum = getModOfValue(g_classDetails.KeyAbility); + + if(maxResolveNum < 0){ maxResolveNum = 0; } + maxResolve.html(maxResolveNum); + g_calculatedStats.maxResolve = maxResolveNum;// Calculated Stat + + if(g_character.currentResolve == null){ + g_character.currentResolve = maxResolveNum; + } + g_character.currentResolve = (g_character.currentResolve > maxResolveNum) ? maxResolveNum : g_character.currentResolve; + + let currentResolve = $('#char-current-resolve'); + currentResolve.html(''); + + $(currentResolve).off('click'); + $(currentResolve).click(function(){ + if(!$(this).hasClass('is-in-input-mode')) { + + $(this).addClass('is-in-input-mode'); + $(this).html(''); + $('#current-resolve-input').focus(); + + $('#current-resolve-input').blur(function(){ + resolveConfirm(maxResolveNum); + }); + + // Press Enter Key + $('#current-resolve-input').on('keypress',function(e){ + if(e.which == 13){ + resolveConfirm(maxResolveNum); + } + }); + + } + }); + +} + +function staminaConfirm(maxStaminaNum){ + let currentStaminaNum = $('#current-stamina-input').val(); + + let newCurrentStamina; + try { + newCurrentStamina = parseInt(math.evaluate(currentStaminaNum)); + if(newCurrentStamina > maxStaminaNum) { newCurrentStamina = maxStaminaNum; } + if(newCurrentStamina < 0) { newCurrentStamina = 0; } + if(isNaN(newCurrentStamina)) { throw 'Value is not a number!'; } + } catch (err) { + $('#current-stamina-input').addClass('is-danger'); + return; + } + + g_character.currentStamina = newCurrentStamina; + $('#char-current-stamina').html('

                      '+g_character.currentStamina+'

                      '); + $('#char-current-stamina').removeClass('is-in-input-mode'); + socket.emit("requestCurrentStaminaPointsSave", + getCharIDFromURL(), + g_character.currentStamina); + sendOutUpdateToGM('stamina', { value: g_character.currentStamina }); +} + +function resolveConfirm(maxResolveNum){ + let currentResolveNum = $('#current-resolve-input').val(); + + let newCurrentResolve; + try { + newCurrentResolve = parseInt(math.evaluate(currentResolveNum)); + if(newCurrentResolve > maxResolveNum) { newCurrentResolve = maxResolveNum; } + if(newCurrentResolve < 0) { newCurrentResolve = 0; } + if(isNaN(newCurrentResolve)) { throw 'Value is not a number!'; } + } catch (err) { + $('#current-resolve-input').addClass('is-danger'); + return; + } + + g_character.currentResolve = newCurrentResolve; + $('#char-current-resolve').html(''); + $('#char-current-resolve').removeClass('is-in-input-mode'); + socket.emit("requestCurrentResolvePointsSave", + getCharIDFromURL(), + g_character.currentResolve); + sendOutUpdateToGM('resolve', { value: g_character.currentResolve }); +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////// Armor and Shields /////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +function determineArmor(dexMod, strScore) { + + let shieldStruct = findEquippedShield(); + if(shieldStruct != null){ + + let tagArray = getItemTraitsArray(shieldStruct.Item, shieldStruct.InvItem); + let investedTag = tagArray.find(tag => { + return tag.id === 235; // Hardcoded Invested Tag ID + }); + if(investedTag == null){ + processSheetCode(shieldStruct.InvItem.code, { + source: 'InvItem', + sourceName: shieldStruct.InvItem.name, + invItemID: shieldStruct.InvItem.id, + bagInvItemID: shieldStruct.InvItem.bagInvItemID, + }); + } + + // Halve maxHP if it's shoddy + let maxHP = (shieldStruct.InvItem.isShoddy == 1) ? Math.floor(shieldStruct.InvItem.hitPoints/2) : shieldStruct.InvItem.hitPoints; + + const speedPenalty = shieldStruct.Item.ShieldData.speedPenalty; + if(speedPenalty < 0){ + addStat(VARIABLE.SPEED, 'PENALTY (SHIELD)', speedPenalty); + } + + $('#shieldSection').removeClass('is-hidden'); + $('#shieldBonus').html('+'+shieldStruct.Item.ShieldData.acBonus); + $('#shieldSection').attr('data-tooltip', shieldStruct.InvItem.name+'\nHardness: '+shieldStruct.InvItem.hardness+'\nHealth: '+shieldStruct.InvItem.currentHitPoints+'/'+maxHP); + + $("#shieldSection").click(function(){ + openQuickView('invItemView', { + InvItem : shieldStruct.InvItem, + Item : shieldStruct.Item, + InvData : null, + ExtraData : {} + }); + }); + + } else { + $('#shieldSection').addClass('is-hidden'); + } + + let armorStruct = findEquippedArmor(); + if(armorStruct != null){ + + let tagArray = getItemTraitsArray(armorStruct.Item, armorStruct.InvItem); + + let investedTag = tagArray.find(tag => { + return tag.id === 235; // Hardcoded Invested Tag ID + }); + if(investedTag == null){ + processSheetCode(armorStruct.InvItem.code, { + source: 'InvItem', + sourceName: armorStruct.InvItem.name, + invItemID: armorStruct.InvItem.id, + bagInvItemID: armorStruct.InvItem.bagInvItemID, + }); + } + + let profData = g_armorProfMap.get(armorStruct.Item.ArmorData.profName); + + let profNumUps = null; + if(profData != null){ + profNumUps = profData.NumUps; + addStat(VARIABLE.AC, 'USER_BONUS', profData.UserBonus); + } else { + profNumUps = 0; + } + + let profNumber = getProfNumber(profNumUps, g_character.level); + + let pre_dexMod = getMod(g_preConditions_dexScore); + let dexCap = (getStatBonusTotal(VARIABLE.DEX_CAP) != null) ? getStatBonusTotal(VARIABLE.DEX_CAP) : armorStruct.Item.ArmorData.dexCap; + let newDexMod = (pre_dexMod > dexCap) ? dexCap : pre_dexMod; + dexMod = newDexMod - (pre_dexMod-dexMod); + + // Apply armor's rune effects to character... + if(isArmorPotencyOne(armorStruct.InvItem.fundPotencyRuneID)){ + addStat(VARIABLE.AC, 'ITEM_BONUS', 1); + } else if(isArmorPotencyTwo(armorStruct.InvItem.fundPotencyRuneID)){ + addStat(VARIABLE.AC, 'ITEM_BONUS', 2); + } else if(isArmorPotencyThree(armorStruct.InvItem.fundPotencyRuneID)){ + addStat(VARIABLE.AC, 'ITEM_BONUS', 3); + } else if(isArmorPotencyFour(armorStruct.InvItem.fundPotencyRuneID)){ + addStat(VARIABLE.AC, 'ITEM_BONUS', 4); + } + if(isResilient(armorStruct.InvItem.fundRuneID)){ + addStat(VARIABLE.SAVE_FORT, 'ITEM_BONUS', 1); + addStat(VARIABLE.SAVE_WILL, 'ITEM_BONUS', 1); + addStat(VARIABLE.SAVE_REFLEX, 'ITEM_BONUS', 1); + } else if(isGreaterResilient(armorStruct.InvItem.fundRuneID)){ + addStat(VARIABLE.SAVE_FORT, 'ITEM_BONUS', 2); + addStat(VARIABLE.SAVE_WILL, 'ITEM_BONUS', 2); + addStat(VARIABLE.SAVE_REFLEX, 'ITEM_BONUS', 2); + } else if(isMajorResilient(armorStruct.InvItem.fundRuneID)){ + addStat(VARIABLE.SAVE_FORT, 'ITEM_BONUS', 3); + addStat(VARIABLE.SAVE_WILL, 'ITEM_BONUS', 3); + addStat(VARIABLE.SAVE_REFLEX, 'ITEM_BONUS', 3); + } + runPropertyRuneCode(armorStruct.InvItem.propRune1ID, armorStruct.InvItem.id); + runPropertyRuneCode(armorStruct.InvItem.propRune2ID, armorStruct.InvItem.id); + runPropertyRuneCode(armorStruct.InvItem.propRune3ID, armorStruct.InvItem.id); + runPropertyRuneCode(armorStruct.InvItem.propRune4ID, armorStruct.InvItem.id); + + // Halve maxHP if it's shoddy + let maxHP = (armorStruct.InvItem.isShoddy == 1) ? Math.floor(armorStruct.InvItem.hitPoints/2) : armorStruct.InvItem.hitPoints; + // Reduce currentHP if it's over maxHP + armorStruct.InvItem.currentHitPoints = (armorStruct.InvItem.currentHitPoints > maxHP) ? maxHP : armorStruct.InvItem.currentHitPoints; + // Halve brokenThreshold if it's shoddy + let brokenThreshold = (armorStruct.InvItem.isShoddy == 1) ? Math.floor(armorStruct.InvItem.brokenThreshold/2) : armorStruct.InvItem.brokenThreshold; + + let brokenPenalty = 0; + let isBroken = (armorStruct.InvItem.currentHitPoints <= brokenThreshold); + if(doesntHaveItemHealth(armorStruct.InvItem)) {isBroken = false;} + if(isBroken){ + switch(armorStruct.Item.ArmorData.category){ + case 'LIGHT': brokenPenalty = -1; break; + case 'MEDIUM': brokenPenalty = -2; break; + case 'HEAVY': brokenPenalty = -3; break; + default: break; + } + } + + let shoddyPenalty = (armorStruct.InvItem.isShoddy == 1) ? -2 : 0; + let totalArmorBonus = armorStruct.Item.ArmorData.acBonus + brokenPenalty + shoddyPenalty; + + let totalAC = 10 + dexMod + profNumber + totalArmorBonus; + totalAC += getStatBonusTotal(VARIABLE.AC); + + // Apply armor penalties to character... + g_variableMap.get(VARIABLE.ARMOR_CHECK_PENALTY).Value = armorStruct.Item.ArmorData.checkPenalty; + g_variableMap.get(VARIABLE.ARMOR_SPEED_PENALTY).Value = armorStruct.Item.ArmorData.speedPenalty; + let checkPenalty = getStatTotal(VARIABLE.ARMOR_CHECK_PENALTY); + let speedPenalty = getStatTotal(VARIABLE.ARMOR_SPEED_PENALTY); + + checkPenalty += (armorStruct.InvItem.isShoddy == 1) ? -2 : 0; + + let noisyTag = tagArray.find(tag => { + return tag.id === 559; // Hardcoded Noisy Tag ID + }); + if(strScore >= armorStruct.Item.ArmorData.minStrength) { + + speedPenalty += 5; + + if(checkPenalty != 0){ + if(noisyTag != null){ + if(gState_armoredStealth && profNumUps > 0){ + // If you have Armor Stealth and are trained in the armor, ignore noisy trait + } else { + applyArmorCheckPenaltyToSkill('Stealth', checkPenalty); + } + } + } + + } else { + + if(checkPenalty != 0){ + let flexibleTag = tagArray.find(tag => { + return tag.id === 558; // Hardcoded Flexible Tag ID + }); + if(flexibleTag == null){ + applyArmorCheckPenaltyToSkill('Acrobatics', checkPenalty); + applyArmorCheckPenaltyToSkill('Athletics', checkPenalty); + } + if(gState_armoredStealth && profNumUps > 0 && noisyTag == null) { + /* If you have Armor Stealth and are trained in the armor, + ignore noisy trait and reduce Stealth penalty if no noisy trait. + */ + let stealthCheckPenalty = checkPenalty; + let stealthRank = variables_getFinalRank(VARIABLE.SKILL_STEALTH); + if(stealthRank == 'L'){ // Legendary + stealthCheckPenalty += 3; + } else if(stealthRank == 'M'){ // Master + stealthCheckPenalty += 2; + } else { // Expert or less + stealthCheckPenalty += 1; + } + if(stealthCheckPenalty > 0) { stealthCheckPenalty = 0; } + applyArmorCheckPenaltyToSkill('Stealth', stealthCheckPenalty); + } else { + applyArmorCheckPenaltyToSkill('Stealth', checkPenalty); + } + applyArmorCheckPenaltyToSkill('Thievery', checkPenalty); + } + + } + + if(speedPenalty < 0 && !gState_unburdenedIron){ + addStat(VARIABLE.SPEED, 'PENALTY (ARMOR)', speedPenalty); + } + + // Final Product + let totalACDisplayed = (hasConditionals(VARIABLE.AC)) ? totalAC+'*' : totalAC; + $('#acNumber').html(totalACDisplayed); + $('#acSection').attr('data-tooltip', armorStruct.InvItem.name); + g_calculatedStats.totalAC = totalAC;// Calculated Stat + + // Apply conditional if the armor has the Bulwark trait + let bulwarkTag = tagArray.find(tag => { + return tag.id === 560; // Hardcoded Bulwark Tag ID + }); + if(bulwarkTag != null){ + if(gState_mightyBulwark) { + addConditionalStat(VARIABLE.SAVE_REFLEX, 'You add a +4 modifier instead of your Dexterity modifier.', 'Worn Armor'); + } else { + addConditionalStat(VARIABLE.SAVE_REFLEX, 'On saves to avoid a damaging effect, you add a +3 modifier instead of your Dexterity modifier.', 'Worn Armor'); + } + } + + $("#acSection").click(function(){ + openQuickView('acView', { + TotalAC : totalAC, + DexMod : dexMod, + ArmorItemName : armorStruct.InvItem.name, + ProfNum : profNumber, + CharLevel : g_character.level, + NumUps : profNumUps, + ArmorBonus : totalArmorBonus, + }); + }); + + } else { + + let profData = g_armorProfMap.get('No Armor'); // Hardcoded - No Armor Hidden Prof Name + + let profNumUps = null; + if(profData != null){ + profNumUps = profData.NumUps; + addStat(VARIABLE.AC, 'USER_BONUS', profData.UserBonus); + } else { + profNumUps = 0; + } + + let profNumber = getProfNumber(profNumUps, g_character.level); + + let totalArmorBonus = 0; + + let dexCap = getStatBonusTotal(VARIABLE.DEX_CAP); + let dexModCapped = (dexCap != null) ? ((dexMod > dexCap) ? dexCap : dexMod) : dexMod; + + let totalAC = 10 + dexModCapped + profNumber + totalArmorBonus; + totalAC += getStatBonusTotal(VARIABLE.AC); + + // Final Product + let totalACDisplayed = (hasConditionals(VARIABLE.AC)) ? totalAC+'*' : totalAC; + $('#acNumber').html(totalACDisplayed); + $('#acSection').attr('data-tooltip', 'Wearing Nothing'); + g_calculatedStats.totalAC = totalAC;// Calculated Stat + + $("#acSection").click(function(){ + openQuickView('acView', { + TotalAC : totalAC, + DexMod : dexModCapped, + ArmorItemName : 'Wearing Nothing', + ProfNum : profNumber, + CharLevel : g_character.level, + NumUps : profNumUps, + ArmorBonus : totalArmorBonus, + }); + }); + + } + +} + +function runPropertyRuneCode(propertyRuneID, invItemID){ + + if(propertyRuneID == null){ return; } + + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.RuneData != null && itemData.RuneData.id == propertyRuneID){ + let propertyRuneCode = itemData.Item.code; + if(propertyRuneCode != null){ + processSheetCode(propertyRuneCode, { + source: 'PropertyRune', + sourceName: itemData.Item.name, + invItemID: invItemID, + }); + } + return; + } + } + +} + +function applyArmorCheckPenaltyToSkill(skillName, checkPenalty){ + + addStat('SKILL_'+skillName, 'PENALTY (ARMOR)', checkPenalty); + addConditionalStat('SKILL_'+skillName, signNumber(checkPenalty)+" penalty from armor is NOT applied to skill checks that have the attack trait", 'Worn Armor'); + +} + +function findEquippedArmor() { + for(const invItem of g_invStruct.InvItems){ + if(invItem.id == g_equippedArmorInvItemID) { + let item = g_itemMap.get(invItem.itemID+""); + if(item == null) { continue; } + if(invItem.bagInvItemID == null && item.ArmorData != null){ + return { Item : item, InvItem : invItem }; + } + } + } + return null; +} + +function findEquippedShield() { + for(const invItem of g_invStruct.InvItems){ + if(invItem.id == g_equippedShieldInvItemID) { + let item = g_itemMap.get(invItem.itemID+""); + if(item == null) { continue; } + if(invItem.bagInvItemID == null && item.ShieldData != null){ + + // Halve maxHP if it's shoddy + let maxHP = (invItem.isShoddy == 1) ? Math.floor(invItem.hitPoints/2) : invItem.hitPoints; + // Reduce currentHP if it's over maxHP + invItem.currentHitPoints = (invItem.currentHitPoints > maxHP) ? maxHP : invItem.currentHitPoints; + // Halve brokenThreshold if it's shoddy + let brokenThreshold = (invItem.isShoddy == 1) ? Math.floor(invItem.brokenThreshold/2) : invItem.brokenThreshold; + + if(invItem.currentHitPoints > brokenThreshold){ + return { Item : item, InvItem : invItem }; + } else { + g_equippedShieldInvItemID = null; + return null; + } + + } + } + } + return null; +} + +function removeInvalidItemsFromInventory(){ + + for(const invItem of g_invStruct.InvItems){ + + let item = g_itemMap.get(invItem.itemID+""); + if(item == null) { + console.warn("Removing invalid item from inventory: "+invItem.name); + socket.emit("requestRemoveItemFromInv", invItem.id); + } + + } + +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////// Rune Data Struct ////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +function generateRuneDataStruct(){ + + let weaponRuneArray = []; + let armorRuneArray = []; + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.RuneData != null){ + if(itemData.RuneData.etchedType == 'WEAPON'){ + weaponRuneArray[itemData.RuneData.id] = itemData; + } else if(itemData.RuneData.etchedType == 'ARMOR'){ + armorRuneArray[itemData.RuneData.id] = itemData; + } + } + } + let runesSort = function(a, b) { + if(a.RuneData.isFundamental == 1 && b.RuneData.isFundamental == 1){ + if(a.Item.name.includes('Potency')) { + if(!b.Item.name.includes('Potency')){ // A is, B is not + return 1; + } else { + return a.Item.id - b.Item.id; // Both are Potency + } + } else { + if(b.Item.name.includes('Potency')){ // A is not, B is + return -1; + } else { + return a.Item.id - b.Item.id; // Neither are Potency + } + } + } else { + if (a.Item.level === b.Item.level) { + // Name is only important when levels are the same + return a.Item.name > b.Item.name ? 1 : -1; + } else { + return a.Item.level - b.Item.level; + } + } + }; + weaponRuneArray = weaponRuneArray.sort(runesSort); + armorRuneArray = armorRuneArray.sort(runesSort); + + return { WeaponArray : weaponRuneArray, ArmorArray : armorRuneArray }; + +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////// Determine Bulk And Coins /////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +function determineBulkAndCoins(invItems, itemMap){ + + let bagBulkMap = new Map(); + let totalBulk = 0; + + let copperCoins = 0; + let silverCoins = 0; + let goldCoins = 0; + let platinumCoins = 0; + + let droppedItemArray = []; + for(const invItem of invItems){ + if(invItem.isDropped == 1) { droppedItemArray.push(invItem.id); continue; } + + // Coins - Hardcoded IDs // + let isCurrency = false; + if(invItem.itemID == 22){ // Copper + isCurrency = true; + copperCoins += invItem.quantity; + } else if(invItem.itemID == 23){ // Silver + isCurrency = true; + silverCoins += invItem.quantity; + } else if(invItem.itemID == 24){ // Gold + isCurrency = true; + goldCoins += invItem.quantity; + } else if(invItem.itemID == 25){ // Platinum + isCurrency = true; + platinumCoins += invItem.quantity; + } + + // Bulk // + if(invItem.bagInvItemID != null){ + let bagBulk = bagBulkMap.get(invItem.bagInvItemID); + if(bagBulk == null){ + let bagInvItem = invItems.find(searchInvItem => { + return searchInvItem.id == invItem.bagInvItemID; + }); + if(bagInvItem != null){ + let bagItem = itemMap.get(bagInvItem.itemID+""); + if(bagItem != null){ + let invItemQuantity = (invItem.quantity == null) ? 1 : invItem.quantity; + let invItemBulk = determineItemBulk(g_charSize, invItem.size, invItem.bulk); + invItemBulk = getWornArmorBulkAdjustment(invItem, invItemBulk); + invItemBulk = (invItemBulk == 0.0) ? 0.001 : invItemBulk; + let invItemTotalBulk = invItemBulk * invItemQuantity; + + if(isCurrency){ + invItemTotalBulk = Math.floor(invItemQuantity / 1000); + } + + let bulkIgnored = (bagItem.StorageData != null) ? bagItem.StorageData.bulkIgnored : 0; + + bagBulkMap.set(invItem.bagInvItemID, invItemTotalBulk-bulkIgnored); + } + } + } else { + let invItemQuantity = (invItem.quantity == null) ? 1 : invItem.quantity; + let invItemBulk = determineItemBulk(g_charSize, invItem.size, invItem.bulk); + invItemBulk = getWornArmorBulkAdjustment(invItem, invItemBulk); + invItemBulk = (invItemBulk == 0.0) ? 0.001 : invItemBulk; + let invItemTotalBulk = invItemBulk * invItemQuantity; + + if(isCurrency){ + invItemTotalBulk = Math.floor(invItemQuantity / 1000); + } + + bagBulkMap.set(invItem.bagInvItemID, bagBulk+invItemTotalBulk); + } + } else { + + let includeSelf = true; + let item = itemMap.get(invItem.itemID+""); + + if(item != null){ + + if(item.StorageData != null){ + if(item.StorageData.ignoreSelfBulkIfWearing == 1){ + includeSelf = false; + } + } + + if(includeSelf){ + let invItemQuantity = (invItem.quantity == null) ? 1 : invItem.quantity; + let invItemBulk = determineItemBulk(g_charSize, invItem.size, invItem.bulk); + invItemBulk = getWornArmorBulkAdjustment(invItem, invItemBulk); + invItemBulk = (invItemBulk == 0.0) ? 0.001 : invItemBulk; + let invItemTotalBulk = invItemBulk * invItemQuantity; + + if(isCurrency){ + invItemTotalBulk = Math.floor(invItemQuantity / 1000); + } + + totalBulk += invItemTotalBulk; + } + + } + } + } + + for(const [bagInvItemID, bulkAmount] of bagBulkMap.entries()){ + if(bulkAmount > 0 && !droppedItemArray.includes(bagInvItemID)){ + totalBulk += bulkAmount; + } + } + + totalBulk = round(totalBulk, 1); + + let strMod = getMod(g_preConditions_strScore); + let weightEncumbered = 5+strMod; + let weightMax = 10+strMod; + + weightEncumbered = Math.floor(weightEncumbered*getBulkLimitModifierForSize(g_charSize)); + weightMax = Math.floor(weightMax*getBulkLimitModifierForSize(g_charSize)); + + let bulkLimitBonus = getStatBonusTotal(VARIABLE.BULK_LIMIT); + if(bulkLimitBonus != null){ + weightEncumbered += bulkLimitBonus; + weightMax += bulkLimitBonus; + } + + let isEncumbered = false; + let cantMove = false; + + let encumberedSrcText = 'Exceeding the amount of Bulk you can even hold.'; + let immobilizedSrcText = 'Holding more Bulk than you can carry.'; + if(!gOption_hasIgnoreBulk){ + if(totalBulk > weightMax) { // Hardcoded Condition IDs + addCondition(13, null, encumberedSrcText); + cantMove = true; + } else { + removeCondition(13, encumberedSrcText); + if(totalBulk > weightEncumbered){ + addCondition(1, null, immobilizedSrcText); + isEncumbered = true; + } else { + removeCondition(1, immobilizedSrcText); + } + } + } else { // Remove conditions if they did exist before, + removeCondition(13, encumberedSrcText); + removeCondition(1, immobilizedSrcText); + } + + g_bulkAndCoinsStruct = { + TotalBulk : totalBulk, + BagBulkMap : bagBulkMap, + IsEncumbered : isEncumbered, + CantMove : cantMove, + WeightMax : weightMax, + WeightEncumbered : weightEncumbered, + CopperCoins : copperCoins, + SilverCoins : silverCoins, + GoldCoins : goldCoins, + PlatinumCoins : platinumCoins, + }; + + return g_bulkAndCoinsStruct; + +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////// Determine Investitures //////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// +function determineInvestitures(){ + + maxInvests = 10; + + let investLimitBonus = getStatBonusTotal(VARIABLE.INVEST_LIMIT); + if(investLimitBonus != null){ + maxInvests += investLimitBonus; + } + + currentInvests = 0; + for(const invItem of g_invStruct.InvItems){ + if(invItem.isInvested == 1) { + + currentInvests++; + + const item = g_itemMap.get(invItem.itemID+""); + if(item == null){ continue; } + if(item.ArmorData != null){ + if(g_equippedArmorInvItemID != invItem.id){ + continue; + } + } else if(item.ShieldData != null){ + if(g_equippedShieldInvItemID != invItem.id){ + continue; + } + } + + processSheetCode(invItem.code, { + source: 'InvItem', + sourceName: invItem.name, + invItemID: invItem.id, + bagInvItemID: invItem.bagInvItemID, + }); + runPropertyRuneCode(invItem.propRune1ID, invItem.id); + runPropertyRuneCode(invItem.propRune2ID, invItem.id); + runPropertyRuneCode(invItem.propRune3ID, invItem.id); + runPropertyRuneCode(invItem.propRune4ID, invItem.id); + + } + } + +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////// Feats, Abilities, Items Code ///////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +function runAllItemsCode() { + + for(const invItem of g_invStruct.InvItems){ + + let item = g_itemMap.get(invItem.itemID+""); + if(item == null) { continue; } + + let tagArray = getItemTraitsArray(item, invItem); + let investedTag = tagArray.find(tag => { + return tag.id === 235; // Hardcoded Invested Tag ID + }); + + if(investedTag == null && item.ArmorData == null && item.ShieldData == null){ + processSheetCode(invItem.code, { + source: 'InvItem', + sourceName: invItem.name, + invItemID: invItem.id, + bagInvItemID: invItem.bagInvItemID, + }); + runPropertyRuneCode(invItem.propRune1ID, invItem.id); + runPropertyRuneCode(invItem.propRune2ID, invItem.id); + runPropertyRuneCode(invItem.propRune3ID, invItem.id); + runPropertyRuneCode(invItem.propRune4ID, invItem.id); + } + + } + +} + +function runAllFeatsAndAbilitiesCode() { + + let totalClassAbilities = cloneObj(g_classDetails.Abilities); + for(let extraClassAbil of g_extraClassAbilities){ + extraClassAbil.value.dontRunCode = extraClassAbil.dontRunCode; + totalClassAbilities.push(extraClassAbil.value); + } + for(let heritageEffect of g_heritageEffects){ + let ability = cloneObj(heritageEffect.value); + ability.level = heritageEffect.sourceLevel; + ability.name = 'Heritage Benefits - '+ability.name; + totalClassAbilities.push(ability); + } + + for(let classAbil of totalClassAbilities){ + if(classAbil.selectType != 'SELECT_OPTION' && classAbil.level <= g_character.level) { + + let dontRunCode = classAbil.dontRunCode; + if(dontRunCode == null) { dontRunCode = false; } + + if(!dontRunCode){ + processSheetCode(classAbil.code, { + source: 'ClassAbility', + sourceName: classAbil.name, + abilityID: classAbil.id, + abilityLevel: classAbil.level, + selectType: classAbil.selectType, + }); + } + + if(classAbil.selectType == "SELECTOR"){ + for(let classAbilChoice of g_classDetails.AbilityChoices){ + if(classAbilChoice.SelectorID == classAbil.id){ + + let abilityOption = g_allClassAbilityOptions.find(ability => { + return ability.id == classAbilChoice.OptionID; + }); + if(abilityOption != null){ + if(!dontRunCode){ + processSheetCode(abilityOption.code, { + source: 'ClassAbilityOption', + sourceName: abilityOption.name, + abilityID: abilityOption.id, + abilityLevel: abilityOption.level, + }); + } + } + break; + + } + } + } + + } + } + + for(let phyFeat of g_phyFeatArray){ + if(phyFeat.value == null) { continue; } + processSheetCode(phyFeat.value.code, { + source: 'PhyFeat', + sourceName: phyFeat.value.name, + phyFeatID: phyFeat.value.id, + }); + } + + if(g_heritage != null){ + processSheetCode(g_heritage.code, { + source: 'Heritage', + sourceName: g_heritage.name+' Heritage', + heritageID: g_heritage.id, + }); + } + processSheetCode(g_background.code, { + source: 'Background', + sourceName: g_background.name+' Background', + backgroundID: g_background.id, + }); + + + for(const [featID, featStruct] of g_featMap.entries()){ + if(featStruct.Feat.isDefault == 1){ + processSheetCode(featStruct.Feat.code, { + source: 'Feat', + sourceName: featStruct.Feat.name, + featID: featStruct.Feat.id, + }); + } + } + + // Sort selected feats by what defines variables to execute first. + let sorted_featChoiceArray = g_featChoiceArray.sort( + function(a, b) { + if(a.value == null || b.value == null){ + return b.value != null ? 1 : -1; + } + + if(a.value.code == null || b.value.code == null){ + return b.value.code != null ? 1 : -1; + } + + let definesVarA = a.value.code.toUpperCase().includes('DEFINE-VARIABLE='); + let definesVarB = b.value.code.toUpperCase().includes('DEFINE-VARIABLE='); + if(definesVarA || definesVarB){ + return definesVarB ? 1 : -1; + } + + return a.value.level - b.value.level; + } + ); + for(const feat of sorted_featChoiceArray){ + if(feat != null && feat.value != null){ + processSheetCode(feat.value.code, { + source: 'Feat', + sourceName: feat.value.name, + featID: feat.value.id, + srcStructKey: srcStructToCompositeKey(feat), + }); + } + } + +} + +function runAllSheetStateCode() { + + for(const sheetState of getSheetStates()){ + if(sheetState.isActive){ + processSheetCode(sheetState.code, { + source: 'SheetState', + sourceName: sheetState.name+' (toggled)', + sheetStateID: sheetState.id, + }); + } + } + +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////// Other Profs ////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +function otherProfBuild(content, prof, name, otherProfsNum, profData, profSrcData, VARIABLE, extraData={}){ + + if(profData.UserAdded){ + prof = ''+prof+''; + } else { + prof = ''+prof+''; + } + + if(profData.UserBonus != 0 || profData.UserProfOverride){ + prof += '*'; + } + + + content.append(` +
                      +
                      +
                      +

                      ${prof}-

                      +
                      +
                      +

                      ${name}

                      +
                      +
                      +
                      + `); + + $("#otherProf"+otherProfsNum).click(function(){ + openQuickView('otherProfsView', { + ProfSrcData : profSrcData, + ProfData : profData, + Name : name, + ExtraData : extraData, + VARIABLE: VARIABLE, + }); + }); + +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////// Rest ///////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +function takeRest(){ + + // Regen Health + let conMod = getModOfValue('CON'); + if(1 > conMod){ conMod = 1; } + let regenAmount = g_character.level*conMod; + g_character.currentHealth += regenAmount; + + socket.emit("requestCurrentHitPointsSave", + getCharIDFromURL(), + g_character.currentHealth); + sendOutUpdateToGM('hp', { value: g_character.currentHealth }); + + // Regen Stamina and Resolve + if(gOption_hasStamina){ + g_character.currentStamina = (Math.floor(g_classDetails.Class.hitPoints/2)+getModOfValue('CON'))*g_character.level; + socket.emit("requestCurrentStaminaPointsSave", + getCharIDFromURL(), + g_character.currentStamina); + sendOutUpdateToGM('stamina', { value: g_character.currentStamina }); + + g_character.currentResolve = getModOfValue(g_classDetails.KeyAbility); + socket.emit("requestCurrentResolvePointsSave", + getCharIDFromURL(), + g_character.currentResolve); + sendOutUpdateToGM('resolve', { value: g_character.currentResolve }); + } + + // Reset Innate Spells + for(let innateSpell of g_innateSpellArray){ + innateSpell.TimesCast = 0; + socket.emit("requestInnateSpellCastingUpdate", + innateSpell, + 0); + } + + // Reset Focus Points + for(let focusPointData of g_focusPointArray){ + focusPointData.value = 1; + socket.emit("requestFocusPointUpdate", + getCharIDFromURL(), + focusPointData, + focusPointData.value); + } + + // Reset Spell Slots + for(const [level, slotArray] of g_spellSlotsMap.entries()){ + for(let slot of slotArray){ + slot.used = false; + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + slot); + } + } + + // Remove Fatigued Condition + removeCondition(15); // Hardcoded ID - Fatigued + + // Decrease Drained Condition + let drainedCondition = getCondition(10); // Hardcoded ID - Drained + if(drainedCondition != null){ + let drainedValue = drainedCondition.Value - 1; + if(drainedValue > 0){ + addCondition(10, + drainedValue, + drainedCondition.SourceText, + drainedCondition.ParentID); + } else { + removeCondition(10); + } + } + + // Decrease Doomed Condition + let doomedCondition = getCondition(9); // Hardcoded ID - Doomed + if(doomedCondition != null){ + let doomedValue = doomedCondition.Value - 1; + if(doomedValue > 0){ + addCondition(9, + doomedValue, + doomedCondition.SourceText, + doomedCondition.ParentID); + } else { + removeCondition(9); + } + } + + reloadCharSheet(); + +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////// Socket Returns //////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +socket.on("returnProfsAndSkills", function(profObject, skillObject){ + g_profMap = objToMap(profObject); + g_skillMap = objToMap(skillObject); + g_weaponProfMap = buildWeaponProfMap(); + g_armorProfMap = buildArmorProfMap(); + reloadCharSheet(); + closeQuickView(); +}); + +socket.on("returnHeroPointsSave", function(){ +}); + +socket.on("returnProficiencyChange", function(profChangePacket){ + socket.emit("requestProfsAndSkills", + getCharIDFromURL()); +}); + +socket.on("returnLoreChange", function(srcStruct, loreName, inputPacket, prof){ + socket.emit("requestProfsAndSkills", + getCharIDFromURL()); +}); + +socket.on("returnSpellSlotChange", function(spellSRC, spellSlot){ + if(spellSlot != null){ // Add Spell Slot + let slotArray = g_spellSlotsMap.get(spellSRC); + if(slotArray != null){ + slotArray.push(spellSlot); + g_spellSlotsMap.set(spellSRC, slotArray); + } + } + current_spellSRC = null; + closeManageSpellsModal(); + reloadCharSheet(); + closeQuickView(); +}); + +socket.on("returnLanguageChange", function(){ + g_langArray = g_langArray.sort( + function(a, b) { + if(a.value != null && b.value != null){ + return a.value.name > b.value.name ? 1 : -1; + } else { + return 1; + } + } + ); + reloadCharSheet(); + closeQuickView(); +}); + +socket.on("returnResistanceChange", function(resistData){ + if(resistData.Added){ // Add Resist + g_resistAndVulners.Resistances.push(resistData); + } else { + let newResistArray = []; // Remove Resist + for(let resists of g_resistAndVulners.Resistances){ + if(!hasSameSrc(resists, resistData)){ + newResistArray.push(resists); + } + } + g_resistAndVulners.Resistances = newResistArray; + } + closeQuickView(); + reloadCharSheet(); +}); + +socket.on("returnVulnerabilityChange", function(vulnerData){ + if(vulnerData.Added){ // Add Weakness + g_resistAndVulners.Vulnerabilities.push(vulnerData); + } else { + let newVulnerArray = []; // Remove Weakness + for(let vulners of g_resistAndVulners.Vulnerabilities){ + if(!hasSameSrc(vulners, vulnerData)){ + newVulnerArray.push(vulners); + } + } + g_resistAndVulners.Vulnerabilities = newVulnerArray; + } + closeQuickView(); + reloadCharSheet(); +}); + +socket.on("returnAddFundamentalRune", function(invItemID, invStruct){ + $('#invItemAddFundamentalRuneButton'+invItemID).removeClass('is-loading'); + g_invStruct = invStruct; + reloadCharSheet(); + closeQuickView(); +}); + +socket.on("returnAddItemToInv", function(item, invItem, invStruct){ + $('#addItemAddItem'+item.id).parent().removeClass('is-loading'); + $('#addItemAddItem'+item.id).removeClass('is-loading'); + $('#createCustomItemBtn').removeClass('is-loading'); + g_invStruct = invStruct; + processDefaultItemRuneSheetCode(item.code, item.id, invItem.id); + reloadCharSheet(); +}); + +socket.on("returnRemoveItemFromInv", function(invItemID, invStruct){ + $('#invItemRemoveButton'+invItemID).removeClass('is-loading'); + g_invStruct = invStruct; + reloadCharSheet(); + closeQuickView(); +}); + +socket.on("returnInvItemMoveBag", function(invItemID, invStruct){ + $('#invItemMoveSelect'+invItemID).removeClass('is-loading'); + g_invStruct = invStruct; + reloadCharSheet(); + closeQuickView(); +}); + +socket.on("returnAddItemToBag", function(){ + // Reloads inventory manually after some time. +}); + +socket.on("returnInvItemUpdated", function(invStruct){ + g_invStruct = invStruct; + reloadCharSheet(); + closeQuickView(); +}); + +socket.on("returnInvUpdate", function(invStruct){ + g_invStruct = invStruct; + reloadCharSheet(); +}); + +//// + +socket.on("returnNotesFieldChange", function(newNotesData, noteChangePacket) { + let newNoteData = { + charID: getCharIDFromURL(), + placeholderText: newNotesData.placeholderText, + source: 'notesField', + sourceCode: newNotesData.sourceCode, + sourceCodeSNum: newNotesData.sourceCodeSNum, + sourceLevel: newNotesData.sourceLevel, + sourceType: newNotesData.sourceType, + value: newNotesData.value, + text: '', + }; + let existingNoteData = g_notesFields.find(noteData => { + return hasSameSrc(noteData, newNoteData); + }); + if(existingNoteData == null){ + g_notesFields.push(newNoteData); + } +}); + +socket.on("returnNotesFieldDelete", function(srcStruct) { + let newNotesFieldArray = []; + for(let notesData of g_notesFields){ + if(srcStruct.sourceCode === notesData.sourceCode && + srcStruct.sourceCodeSNum === notesData.sourceCodeSNum){ + } else { + newNotesFieldArray.push(notesData); + } + } + g_notesFields = newNotesFieldArray; +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/general/coin-manager.js b/client/vue-src/legacy-js/sheet/general/coin-manager.js new file mode 100644 index 00000000..5156a559 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/coin-manager.js @@ -0,0 +1,134 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getTotalCoinsInCP(){ + let totalCP = g_bulkAndCoinsStruct.CopperCoins; + totalCP += g_bulkAndCoinsStruct.SilverCoins*10; + totalCP += g_bulkAndCoinsStruct.GoldCoins*100; + totalCP += g_bulkAndCoinsStruct.PlatinumCoins*1000; + return totalCP; +} + +function hasCoins(costInCP){ + return getTotalCoinsInCP() >= costInCP; +} + +function reduceAndSimplifyCoins(costInCP){ + if(!hasCoins(costInCP)) { return false; } + + let homeBagInvItemID = null; + let remainingCost = costInCP; + let reduceCoinRecords = []; + + let sortedInvItems = g_invStruct.InvItems.sort( + function(a, b) { + if (a.itemID === b.itemID) { + // bagInvItemID is only important when itemIDs are the same + return a.bagInvItemID - b.bagInvItemID; + } + return b.itemID - a.itemID; + } + ); + for(const invItem of sortedInvItems){ + + let itemValue = null; + // Coins - Hardcoded IDs // + if(invItem.itemID == 22){ // Copper + itemValue = 1; + } else if(invItem.itemID == 23){ // Silver + itemValue = 10; + } else if(invItem.itemID == 24){ // Gold + itemValue = 100; + } else if(invItem.itemID == 25){ // Platinum + itemValue = 1000; + } + if(itemValue == null) {continue;} + if(invItem.bagInvItemID != null && homeBagInvItemID == null) { homeBagInvItemID = invItem.bagInvItemID; } + + let qty; + for(qty = 0; qty < invItem.quantity; qty++){ + if(remainingCost <= 0) { break; } + remainingCost -= itemValue; + } + + reduceCoinRecords.push({ + invItemID: invItem.id, + newQty: invItem.quantity-qty, + }); + if(remainingCost <= 0) { break; } + + } + + // Update Coin Qtys + for(const coinRecord of reduceCoinRecords){ + if(coinRecord.newQty == 0){ + socket.emit("requestRemoveItemFromInv", + coinRecord.invItemID); + } else { + socket.emit("requestInvItemQtyChange", + coinRecord.invItemID, + coinRecord.newQty); + } + } + + // Give Back Overdrawn Cost + let coinsToReturn = convertRemainingCost(remainingCost); + if(coinsToReturn.pp != 0){ + addCoinToReturn(25, coinsToReturn.pp, homeBagInvItemID); // Platinum + } + if(coinsToReturn.gp != 0){ + addCoinToReturn(24, coinsToReturn.gp, homeBagInvItemID); // Gold + } + if(coinsToReturn.sp != 0){ + addCoinToReturn(23, coinsToReturn.sp, homeBagInvItemID); // Silver + } + if(coinsToReturn.cp != 0){ + addCoinToReturn(22, coinsToReturn.cp, homeBagInvItemID); // Copper + } + + return true; +} + +function convertRemainingCost(remainingCost){ + remainingCost = (remainingCost == 0) ? 0 : remainingCost*-1; + let pp = Math.floor(remainingCost/1000); + remainingCost = remainingCost%1000; + let gp = Math.floor(remainingCost/100); + remainingCost = remainingCost%100; + let sp = Math.floor(remainingCost/10); + remainingCost = remainingCost%10; + let cp = remainingCost; + return {pp, gp, sp, cp}; +} + +function addCoinToReturn(coinItemID, qty, homeBagInvItemID){ + + let coinInvItemInBag = g_invStruct.InvItems.find(invItem => { + return invItem.bagInvItemID == homeBagInvItemID && invItem.itemID == coinItemID; + }); + + if(coinInvItemInBag != null){ + + socket.emit("requestInvItemQtyChange", + coinInvItemInBag.id, + coinInvItemInBag.quantity+qty); + + } else { + + if(homeBagInvItemID == null){ + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + g_invStruct.Inventory.id, + coinItemID, + qty); + } else { + socket.emit("requestAddItemToBag", + coinItemID, + qty, + homeBagInvItemID); + } + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/general/conditions-manager.js b/client/vue-src/legacy-js/sheet/general/conditions-manager.js new file mode 100644 index 00000000..73ba5537 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/conditions-manager.js @@ -0,0 +1,333 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getConditionFromName(name) { + for (const condition of g_allConditions) { + if (condition.name.toLowerCase() == name.toLowerCase()) { + return condition; + } + } + return null; +} + +function getConditionFromID(conditionID) { + for (const condition of g_allConditions) { + if (condition.id == conditionID) { + return condition; + } + } + return null; +} + +function hasCondition(checkingConditionID) { + for (const [conditionID, conditionData] of g_conditionsMap.entries()) { + if (conditionID == checkingConditionID) { + return true; + } + } + return false; +} + +function getCondition(checkingConditionID) { + for (const [conditionID, conditionData] of g_conditionsMap.entries()) { + if (conditionID == checkingConditionID) { + return conditionData; + } + } + return null; +} + +function getCurrentConditionIDFromName(name) { + for (const [conditionID, conditionData] of g_conditionsMap.entries()) { + if (conditionData.Condition.name.toLowerCase() == name.toLowerCase()) { + return conditionData.EntryID; + } + } + return null; +} + +function getCurrentConditionIDFromSourceText(sourceText) { + for (const [conditionID, conditionData] of g_conditionsMap.entries()) { + if (conditionData.SourceText == sourceText) { + return conditionData.EntryID; + } + } + return null; +} + +function addCondition(conditionID, value, sourceText, parentID = null) { + let existingCondition = g_conditionsMap.get(conditionID + ''); + if (existingCondition != null) { + if ((existingCondition.SourceText == null && sourceText != null) || (existingCondition.Value != value)) { + // Replace unsourced with sourced condition OR update condition value + socket.emit("requestConditionUpdate", + getCharIDFromURL(), + conditionID, + value, + sourceText, + parentID); + } else { + return; + } + } else { + socket.emit("requestConditionAdd", + getCharIDFromURL(), + conditionID, + value, + sourceText, + parentID); + } + +} + +function removeCondition(conditionID, onlyWithSourceText = null) { + if (onlyWithSourceText != null) { + let conditionEntryID = getCurrentConditionIDFromSourceText(onlyWithSourceText); + if (conditionEntryID != null) { + socket.emit("requestConditionRemove", + getCharIDFromURL(), + conditionID); + } + } else { + socket.emit("requestConditionRemove", + getCharIDFromURL(), + conditionID); + } +} + +socket.on("returnUpdateConditionsMap", function (conditionsObject, reloadSheet) { + g_conditionsMap = objToMap(conditionsObject); + + if (reloadSheet) { + reloadCharSheet(); + } + +}); + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('#conditionsModalBackground').click(function () { + closeConditionsModal(); + }); + $('#conditionsModalCloseButton').click(function () { + closeConditionsModal(); + }); + + $('#conditionsModalSubtractButton').click(function () { + let value = parseInt($('#conditionsModalValue').html()); + if (!isNaN(value)) { + value--; + value = (value > 9) ? 9 : value; + value = (value < 1) ? 1 : value; + $('#conditionsModalValue').html(value); + } + }); + + $('#conditionsModalAddButton').click(function () { + let value = parseInt($('#conditionsModalValue').html()); + if (!isNaN(value)) { + value++; + value = (value > 9) ? 9 : value; + value = (value < 1) ? 1 : value; + $('#conditionsModalValue').html(value); + } + }); + +}); + +function displayConditionsList() { + + $('#conditionsContent').html(''); + + let conditionFound = false; + for (const [conditionID, conditionData] of g_conditionsMap.entries()) { + conditionFound = true; + let conditionLinkID = 'conditionLink' + conditionID; + let conditionValueHTML = (conditionData.Value != null) ? 'data-badge="' + conditionData.Value + '"' : ''; + $('#conditionsContent').append(''); + $('#' + conditionLinkID).click(function () { + openConditionsModal(conditionID); + }); + } + + if (!conditionFound) { + $('#conditionsContent').append('None'); + } + + // Calculated Stat + let conditionsList = []; + for (const [conditionID, conditionData] of g_conditionsMap.entries()) { + conditionsList.push({ + conditionID: conditionData.Condition.id, + name: conditionData.Condition.name, + entryID: conditionData.EntryID, + parentEntryID: conditionData.ParentID, + sourceText: conditionData.SourceText, + value: conditionData.Value, + }); + } + g_calculatedStats.conditions = conditionsList; + +} + +function runAllConditionsCode() { + for (const [conditionID, conditionData] of g_conditionsMap.entries()) { + runConditionCode(conditionID); + } +} + +function runConditionCode(conditionID) { + let conditionData = g_conditionsMap.get(conditionID + ""); + if (conditionData != null) { + + let conditionCode = conditionData.Condition.code; + if (conditionCode != null) { + conditionCode = conditionCode.replace(/CONDITION_VALUE_TIMES_TWO/g, conditionData.Value * 2); + conditionCode = conditionCode.replace(/CONDITION_VALUE/g, conditionData.Value); + + processSheetCode(conditionCode, { + source: 'Condition', + sourceName: conditionData.Condition.name, + conditionID: conditionData.Condition.id, + conditionValue: conditionData.Value, + }); + } + + } +} + +function openConditionsModal(conditionID) { + + let conditionData = g_conditionsMap.get(conditionID + ''); + + if (conditionData.Value != null) { + $('#conditionsModalFooter').addClass('buttons'); + $('#conditionsModalSubtractButton').removeClass('is-hidden'); + $('#conditionsModalValueButton').removeClass('is-hidden'); + $('#conditionsModalAddButton').removeClass('is-hidden'); + $('#conditionsModalValue').html(conditionData.Value); + } else { + $('#conditionsModalFooter').removeClass('buttons'); + $('#conditionsModalSubtractButton').addClass('is-hidden'); + $('#conditionsModalValueButton').addClass('is-hidden'); + $('#conditionsModalAddButton').addClass('is-hidden'); + $('#conditionsModalValue').html(''); + } + + if (conditionData.SourceText != null) { + $('#conditionsModalRemoveButton').addClass('is-hidden'); + $('#conditionsModalTitle').removeClass('pl-5'); + $('#conditionsModalSourceContent').html(conditionData.SourceText); + $('#conditionsModalSourceSection').removeClass('is-hidden'); + } else { + $('#conditionsModalRemoveButton').removeClass('is-hidden'); + $('#conditionsModalSourceSection').addClass('is-hidden'); + $('#conditionsModalTitle').addClass('pl-5'); + + $('#conditionsModalRemoveButton').off('click'); + $('#conditionsModalRemoveButton').click(function () { + removeCondition(conditionID); + closeConditionsModal(); + }); + + } + + $('#conditionsModalTitle').html(conditionData.Condition.name); + $('#conditionsModalContent').html(processText(conditionData.Condition.description, true, true, 'MEDIUM', false)); + + + $('#conditionsModalDefault').addClass('is-active'); + $('html').addClass('is-clipped'); + + $('#conditionsModalDefault').attr('name', conditionID); + +} + +function closeConditionsModal() { + + $('#conditionsModalDefault').removeClass('is-active'); + $('html').removeClass('is-clipped'); + + let conditionID = parseInt($('#conditionsModalDefault').attr('name')); + let conditionData = g_conditionsMap.get(conditionID + ''); + + if (conditionData != null && conditionData.Value != null) { + let value = parseInt($('#conditionsModalValue').html()); + if (conditionData.Value != value) { + socket.emit("requestConditionUpdate", + getCharIDFromURL(), + conditionID, + value, + conditionData.SourceText, + conditionData.ParentID); + } + } + +} + +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // +// ~~~~~~~~~~~~~~~~~~~~~~~~~~ Select Conditions ~~~~~~~~~~~~~~~~~~~~~~~~~~ // +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('#conditionsSelectModalBackground').click(function () { + closeSelectConditionsModal(); + }); + $('#conditionsSelectModalCloseButton').click(function () { + closeSelectConditionsModal(); + }); + +}); + + +function openSelectConditionsModal() { + + $('#conditionsSelectModalContent').html(''); + + for (const condition of g_allConditions) { + + let conditionSectionID = 'conditionSection' + condition.id; + let conditionData = g_conditionsMap.get(condition.id + ""); + + if (conditionData != null) { + + $('#conditionsSelectModalContent').append('

                      ' + condition.name + '

                      '); + + } else { + + $('#conditionsSelectModalContent').append('

                      ' + condition.name + '

                      '); + + $('#' + conditionSectionID).mouseenter(function () { + $(this).addClass('has-bg-selectable'); + }); + $('#' + conditionSectionID).mouseleave(function () { + $(this).removeClass('has-bg-selectable'); + }); + + $('#' + conditionSectionID).click(function () { + value = (condition.hasValue == 1) ? 1 : null; + addCondition(condition.id + "", value, null); + closeSelectConditionsModal(); + }); + + } + + + + } + + $('#conditionsSelectModalDefault').addClass('is-active'); + $('html').addClass('is-clipped'); + +} + +function closeSelectConditionsModal() { + + $('#conditionsSelectModalDefault').removeClass('is-active'); + $('html').removeClass('is-clipped'); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/general/critical-specializations.js b/client/vue-src/legacy-js/sheet/general/critical-specializations.js new file mode 100644 index 00000000..8221c061 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/critical-specializations.js @@ -0,0 +1,233 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function hasCriticalSpecialization(item){ + if(item.WeaponData != null){ + return hasWeaponCriticalSpecialization(item); + } else if(item.ArmorData != null){ + return hasArmorSpecialization(item); + } else { + return false; + } +} + +function hasWeaponCriticalSpecialization(item){ + let itemName = item.Item.name.toUpperCase().replace(/’/g,"'"); + let itemCategory = item.WeaponData.category.toUpperCase(); + + for(const weapCriticalData of g_specializationStruct.WeapCriticals){ + if(weapCriticalData.value.startsWith('TRAIT~')){ + let traitName = weapCriticalData.value.replace(/TRAIT\~/g,''); + traitName = traitName+' - ITEM'; + + let tag = item.TagArray.find(tag => { + return tag.name.toUpperCase() == traitName; + }); + if(tag != null){ + return true; + } + + } else if(weapCriticalData.value.startsWith('NAME~')){ + let weapName = weapCriticalData.value.replace(/NAME\~/g,''); + + if(weapName == itemName){ + return true; + } + + } else if(weapCriticalData.value.startsWith('GROUP~')){ + let groupName = weapCriticalData.value.replace(/GROUP\~/g,''); + + if(item.WeaponData.isMelee === 1){ + if(groupName === item.WeaponData.meleeWeaponType.toUpperCase()){ + return true; + } + } + + if(item.WeaponData.isRanged === 1){ + if(groupName === item.WeaponData.rangedWeaponType.toUpperCase()){ + return true; + } + } + + } else if(weapCriticalData.value.startsWith('PROF~')){ + let profNumUps = profToNumUp(weapCriticalData.value.replace(/PROF\~/g,'')); + + let profData = g_weaponProfMap.get(item.WeaponData.profName); + if(profData != null){ + let itemProfNumUps = profData.NumUps; + if(itemProfNumUps >= profNumUps){ + return true; + } + } + + } else { + + if(weapCriticalData.value.includes(itemCategory)){ + return true; + } + + } + } + return false; +} + +function hasArmorSpecialization(item){ + let itemName = item.Item.name.toUpperCase().replace(/’/g,"'"); + let itemCategory = item.ArmorData.category.toUpperCase(); + + for(const armorCriticalData of g_specializationStruct.ArmorSpecial){ + if(armorCriticalData.value.startsWith('TRAIT~')){ + let traitName = armorCriticalData.value.replace(/TRAIT\~/g,''); + traitName = traitName+' - ITEM'; + + let tag = item.TagArray.find(tag => { + return traitName == tag.name.toUpperCase(); + }); + if(tag != null){ + return true; + } + + } else if(armorCriticalData.value.startsWith('NAME~')){ + let armorName = armorCriticalData.value.replace(/NAME\~/g,''); + + if(armorName == itemName){ + return true; + } + + } else if(armorCriticalData.value.startsWith('GROUP~')){ + let groupName = armorCriticalData.value.replace(/GROUP\~/g,''); + + if(groupName === item.ArmorData.armorType.toUpperCase()){ + return true; + } + + } else if(armorCriticalData.value.startsWith('PROF~')){ + let profNumUps = profToNumUp(armorCriticalData.value.replace(/PROF\~/g,'')); + + let profData = g_armorProfMap.get(item.ArmorData.profName); + if(profData != null){ + let itemProfNumUps = profData.NumUps; + if(itemProfNumUps >= profNumUps){ + return true; + } + } + + } else { + + if(armorCriticalData.value.includes(itemCategory)){ + return true; + } + + } + } + return false; +} + +function displayCriticalSpecialization(qContent, item){ + + let title = criticalSpecializationTitle(item); + if(title == null) {return;} + let text = criticalSpecializationText(item); + if(text == null) {return;} + + qContent.append('

                      '+title+'

                      '); + qContent.append(''); + qContent.append('
                      '); + + $('#itemCritSpecialSection').append(processText(text, true, null, 'MEDIUM')); + + $('#itemCritSpecialName').click(function() { + if($("#itemCritSpecialSection").hasClass("is-hidden")) { + $("#itemCritSpecialSection").removeClass('is-hidden'); + $("#itemCritSpecialChevron").removeClass('fa-chevron-down'); + $("#itemCritSpecialChevron").addClass('fa-chevron-up'); + } else { + $("#itemCritSpecialSection").addClass('is-hidden'); + $("#itemCritSpecialChevron").removeClass('fa-chevron-up'); + $("#itemCritSpecialChevron").addClass('fa-chevron-down'); + } + }); + + if(hasCriticalSpecialization(item)){ + $("#itemCritSpecialName").trigger("click"); + } + +} + + + + +let g_critSpecialTextMap = new Map(); + +g_critSpecialTextMap.set('LEATHER', 'The thick second skin of the armor disperses blunt force to reduce bludgeoning damage. You gain resistance to bludgeoning damage equal to 1 + the value of the armor’s potency rune for medium armor, or 2 + the value of the armor’s potency rune for heavy armor.'); +g_critSpecialTextMap.set('COMPOSITE', 'The numerous overlapping pieces of this armor protect you from piercing attacks. You gain resistance to piercing damage equal to 1 + the value of the armor’s potency rune for medium armor, or 2 + the value of the armor’s potency rune for heavy armor.'); +g_critSpecialTextMap.set('PLATE', 'The sturdy plate provides no purchase for a cutting edge. You gain resistance to slashing damage equal to 1 + the value of the armor’s potency rune for medium armor, or 2 + the value of the armor’s potency rune for heavy armor.'); +g_critSpecialTextMap.set('CHAIN', 'The armor is so flexible it can bend with a critical hit and absorb some of the blow. Reduce the damage from critical hits by either 4 + the value of the armor’s potency rune for medium armor, or 6 + the value of the armor’s potency rune for heavy armor. This can’t reduce the damage to less than the damage rolled for the hit before doubling for a critical hit.'); + +g_critSpecialTextMap.set('SWORD', 'The target is made off-balance by your attack, becoming flat-footed until the start of your next turn.'); +g_critSpecialTextMap.set('SPEAR', 'The weapon pierces the target, weakening its attacks. The target is clumsy 1 until the start of your next turn.'); +g_critSpecialTextMap.set('SHIELD', 'You knock the target back from you 5 feet. This is forced movement.'); +g_critSpecialTextMap.set('POLEARM', 'The target is moved 5 feet in a direction of your choice. This is forced movement.'); +g_critSpecialTextMap.set('PICK', 'The weapon viciously pierces the target, who takes 2 additional damage per weapon damage die.'); +g_critSpecialTextMap.set('KNIFE', 'The target takes 1d6 persistent bleed damage. You gain an item bonus to this bleed damage equal to the weapon’s item bonus to attack rolls.'); +g_critSpecialTextMap.set('HAMMER', 'The target is knocked prone.'); +g_critSpecialTextMap.set('FLAIL', 'The target is knocked prone.'); +g_critSpecialTextMap.set('CLUB', 'You knock the target away from you up to 10 feet (you choose the distance). This is forced movement.'); +g_critSpecialTextMap.set('BRAWLING', 'The target must succeed at a Fortitude save against your class DC or be slowed 1 until the end of your next turn.'); +g_critSpecialTextMap.set('AXE', 'Choose one creature adjacent to the initial target and within reach. If its AC is lower than your attack roll result for the critical hit, you deal damage to that creature equal to the result of the weapon damage die you rolled (including extra dice from its striking rune, if any). This amount isn’t doubled, and no bonuses or other additional dice apply to this damage.'); + +g_critSpecialTextMap.set('SLING', 'The target must succeed at a Fortitude save against your class DC or be stunned 1.'); +g_critSpecialTextMap.set('DART', 'The target takes 1d6 persistent bleed damage. You gain an item bonus to this bleed damage equal to the weapon’s item bonus to attack rolls.'); +g_critSpecialTextMap.set('BOW', 'If the target of the critical hit is adjacent to a surface, it gets stuck to that surface by the missile. The target is immobilized and must spend an (action: Interact) action to attempt a DC 10 Athletics check to pull the missile free; it can’t move from its space until it succeeds. The creature doesn’t become stuck if it is incorporeal, is liquid (like a water elemental or some oozes), or could otherwise escape without effort.'); +g_critSpecialTextMap.set('BOMB', 'Increase the radius of the bomb’s splash damage (if any) to 10 feet.'); +g_critSpecialTextMap.set('FIREARM', ' The target must succeed at a Fortitude save against your class DC or be stunned 1.'); + + +function criticalSpecializationTitle(item){ + let isArmor = null; + if(item.ArmorData != null){ + isArmor = true; + } + if(item.WeaponData != null){ + isArmor = false; + } + if(isArmor == null) {return null;} + if(isArmor){ + return 'Armor Specialization'; + } else { + return 'Critical Specialization Effect'; + } +} + +function criticalSpecializationText(item){ + + let text = ''; + if(item.ArmorData != null){ + text = g_critSpecialTextMap.get(item.ArmorData.armorType); + + } else if(item.WeaponData != null){ + + if(item.WeaponData.isRanged == 1){ + if(item.WeaponData.isMelee == 1){ + text += '**Ranged Effect**\n'; + } + + if(item.WeaponData.rangedWeaponType == 'CROSSBOW') { + text += g_critSpecialTextMap.get('BOW'); + } else { + text += g_critSpecialTextMap.get(item.WeaponData.rangedWeaponType); + } + } + if(item.WeaponData.isMelee == 1){ + if(item.WeaponData.isRanged == 1){ + text += '\n**Melee Effect**\n'; + } + + text += g_critSpecialTextMap.get(item.WeaponData.meleeWeaponType); + } + } + + return text; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/general/item-runes.js b/client/vue-src/legacy-js/sheet/general/item-runes.js new file mode 100644 index 00000000..11475446 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/item-runes.js @@ -0,0 +1,539 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// HARDCODED - Note: The fundamental RuneIDs in here are hardcoded (itemRunes IDs, not itemIDs). // + +function isWeaponPotencyOne(runeID){ + return runeID == 20; +} + +function isWeaponPotencyTwo(runeID){ + return runeID == 27; +} + +function isWeaponPotencyThree(runeID){ + return runeID == 31; +} + +function isWeaponPotencyFour(runeID){ + return runeID == 112; +} + +// + +function isStriking(runeID){ + return runeID == 24; +} + +function isGreaterStriking(runeID){ + return runeID == 29; +} + +function isMajorStriking(runeID){ + return runeID == 33; +} + +// + +function isArmorPotencyOne(runeID){ + return runeID == 25; +} + +function isArmorPotencyTwo(runeID){ + return runeID == 28; +} + +function isArmorPotencyThree(runeID){ + return runeID == 32; +} + +function isArmorPotencyFour(runeID){ + return runeID == 113; +} + +// + +function isResilient(runeID){ + return runeID == 26; +} + +function isGreaterResilient(runeID){ + return runeID == 30; +} + +function isMajorResilient(runeID){ + return runeID == 34; +} + +// + +function isWeaponPotencyRune(runeID){ + return isWeaponPotencyOne(runeID) || isWeaponPotencyTwo(runeID) || isWeaponPotencyThree(runeID) || isWeaponPotencyFour(runeID); +} + +function isStrikingRune(runeID){ + return isStriking(runeID) || isGreaterStriking(runeID) || isMajorStriking(runeID); +} + +// + +function isArmorPotencyRune(runeID){ + return isArmorPotencyOne(runeID) || isArmorPotencyTwo(runeID) || isArmorPotencyThree(runeID) || isArmorPotencyFour(runeID); +} + +function isResilientRune(runeID){ + return isResilient(runeID) || isGreaterResilient(runeID) || isMajorResilient(runeID); +} + +// + +function runestoneNameToRuneName(runestoneItemName){ + return runestoneItemName.replace(' Runestone',''); +} + + + +function displayRunesForItem(qContent, invItem, isWeapon){ + const runeDataStruct = g_runeDataStruct; + + let invItemAddFundamentalRuneSelectID = 'invItemAddFundamentalRuneSelect'+invItem.id; + let invItemAddFundamentalRuneButtonID = 'invItemAddFundamentalRuneButton'+invItem.id; + + qContent.append('
                      '); + + $('#'+invItemAddFundamentalRuneSelectID).append(''); + $('#'+invItemAddFundamentalRuneSelectID).append(''); + + let foundRune = false; + if(isWeapon) { + + for(let weaponRuneItem of runeDataStruct.WeaponArray){ + if(weaponRuneItem == null){ continue; } + if(weaponRuneItem.RuneData.isFundamental == 1) { + + let dontDisplay = false; + if(gOption_hasAutoBonusProgression){ dontDisplay = true; } + + if(isWeaponPotencyRune(weaponRuneItem.RuneData.id)){ + let hasPotency = isWeaponPotencyRune(invItem.fundPotencyRuneID); + if(hasPotency) { + dontDisplay = true; + } + } + if(isStrikingRune(weaponRuneItem.RuneData.id)){ + let hasStriking = isStrikingRune(invItem.fundRuneID); + if(hasStriking) { + dontDisplay = true; + } + } + + if(!dontDisplay){ + foundRune = true; + $('#'+invItemAddFundamentalRuneSelectID).append(''); + } + } + } + + } else { + + for(let armorRuneItem of runeDataStruct.ArmorArray){ + if(armorRuneItem == null){ continue; } + if(armorRuneItem.RuneData.isFundamental == 1) { + + let dontDisplay = false; + if(gOption_hasAutoBonusProgression){ dontDisplay = true; } + + if(isArmorPotencyRune(armorRuneItem.RuneData.id)){ + let hasPotency = isArmorPotencyRune(invItem.fundPotencyRuneID); + if(hasPotency) { + dontDisplay = true; + } + } + if(isResilientRune(armorRuneItem.RuneData.id)){ + let hasResilient = isResilientRune(invItem.fundRuneID); + if(hasResilient) { + dontDisplay = true; + } + } + + if(!dontDisplay){ + foundRune = true; + $('#'+invItemAddFundamentalRuneSelectID).append(''); + } + } + } + + } + + if(!foundRune){ + $('#addFuneRuneField').addClass('is-hidden'); + } else { + $('#'+invItemAddFundamentalRuneButtonID).click(function() { + let runeID = $('#'+invItemAddFundamentalRuneSelectID).val(); + if(runeID != "chooseDefault"){ + $(this).addClass('is-loading'); + socket.emit("requestAddFundamentalRune", + invItem.id, + runeID); + } + }); + } + + displayRunesInQuickview(qContent, invItem, runeDataStruct, isWeapon); + +} + + + +function displayRunesInQuickview(qContent, invItem, runeDataStruct, isWeapon){ + + // If using AutoBonusProgression, remove all fundmental runes and just show potency rune slots at the correct levels. + if(gOption_hasAutoBonusProgression){ + + if(isWeapon) { + + if(invItem.fundPotencyRuneID != null && isWeaponPotencyFour(invItem.fundPotencyRuneID)){ + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 2); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 3); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 4); + + } else if(g_character.level >= 16 || (invItem.fundPotencyRuneID != null && isWeaponPotencyThree(invItem.fundPotencyRuneID))){ + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 2); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 3); + + } else if(g_character.level >= 10 || (invItem.fundPotencyRuneID != null && isWeaponPotencyTwo(invItem.fundPotencyRuneID))){ + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 2); + + } else if(g_character.level >= 2 || (invItem.fundPotencyRuneID != null && isWeaponPotencyOne(invItem.fundPotencyRuneID))){ + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 1); + + } + + } else { + + if(invItem.fundPotencyRuneID != null && isArmorPotencyFour(invItem.fundPotencyRuneID)){ + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 2); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 3); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 4); + + } else if(g_character.level >= 18 || (invItem.fundPotencyRuneID != null && isArmorPotencyThree(invItem.fundPotencyRuneID))){ + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 2); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 3); + + } else if(g_character.level >= 11 || (invItem.fundPotencyRuneID != null && isArmorPotencyTwo(invItem.fundPotencyRuneID))){ + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 2); + + } else if(g_character.level >= 5 || (invItem.fundPotencyRuneID != null && isArmorPotencyOne(invItem.fundPotencyRuneID))){ + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 1); + + } + + } + + return; + } + + if(invItem.fundRuneID != null){ + let fundRuneID = invItem.fundRuneID; + if(isStriking(fundRuneID)){ + + let runeName = "Striking"; + let runeDescription = "A striking rune stores destructive magic in the weapon, increasing the weapon damage dice it deals to two instead of one."; + addFundamentalRuneEntry(qContent, invItem, fundRuneID, runeName, runeDescription); + + } + + if(isGreaterStriking(fundRuneID)){ + + let runeName = "Greater Striking"; + let runeDescription = "A greater striking rune stores destructive magic in the weapon, increasing the weapon damage dice it deals to three instead of one."; + addFundamentalRuneEntry(qContent, invItem, fundRuneID, runeName, runeDescription); + + } + + if(isMajorStriking(fundRuneID)){ + + let runeName = "Major Striking"; + let runeDescription = "A major striking rune stores destructive magic in the weapon, increasing the weapon damage dice it deals to four instead of one."; + addFundamentalRuneEntry(qContent, invItem, fundRuneID, runeName, runeDescription); + + } + + //// + + if(isResilient(fundRuneID)){ + + let runeName = "Resilient"; + let runeDescription = "Resilient runes imbue armor with additional protective magic. This grants the wearer a +1 item bonus to saving throws."; + addFundamentalRuneEntry(qContent, invItem, fundRuneID, runeName, runeDescription); + + } + + if(isGreaterResilient(fundRuneID)){ + + let runeName = "Greater Resilient"; + let runeDescription = "Resilient runes imbue armor with additional protective magic. This grants the wearer a +2 item bonus to saving throws."; + addFundamentalRuneEntry(qContent, invItem, fundRuneID, runeName, runeDescription); + + } + + if(isMajorResilient(fundRuneID)){ + + let runeName = "Major Resilient"; + let runeDescription = "Resilient runes imbue armor with additional protective magic. This grants the wearer a +3 item bonus to saving throws."; + addFundamentalRuneEntry(qContent, invItem, fundRuneID, runeName, runeDescription); + + } + + } + if(invItem.fundPotencyRuneID != null){ + let potencyRuneID = invItem.fundPotencyRuneID; + if(isWeaponPotencyOne(potencyRuneID)){ + + let runeName = "+1 Weapon Potency"; + let runeDescription = "Magical enhancements make this weapon strike true. Attack rolls with this weapon gain a +1 item bonus, and the weapon can be etched with one property rune."; + addFundamentalRuneEntry(qContent, invItem, potencyRuneID, runeName, runeDescription); + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 1); + + } + + if(isWeaponPotencyTwo(potencyRuneID)){ + + let runeName = "+2 Weapon Potency"; + let runeDescription = "Magical enhancements make this weapon strike true. Attack rolls with this weapon gain a +2 item bonus, and the weapon can be etched with two property runes."; + addFundamentalRuneEntry(qContent, invItem, potencyRuneID, runeName, runeDescription); + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 2); + + } + + if(isWeaponPotencyThree(potencyRuneID)){ + + let runeName = "+3 Weapon Potency"; + let runeDescription = "Magical enhancements make this weapon strike true. Attack rolls with this weapon gain a +3 item bonus, and the weapon can be etched with three property runes."; + addFundamentalRuneEntry(qContent, invItem, potencyRuneID, runeName, runeDescription); + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 2); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 3); + + } + + if(isWeaponPotencyFour(potencyRuneID)){ + + let runeName = "+4 Weapon Potency"; + let runeDescription = "Magical enhancements make this weapon strike true. Attack rolls with this weapon gain a +4 item bonus, and the weapon can be etched with four property runes."; + addFundamentalRuneEntry(qContent, invItem, potencyRuneID, runeName, runeDescription); + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 2); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 3); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.WeaponArray, 4); + + } + + //// + + if(isArmorPotencyOne(potencyRuneID)){ + + let runeName = "+1 Armor Potency"; + let runeDescription = "Magic wards deflect attacks. Increase the armor’s item bonus to AC by 1. The armor can be etched with one property rune."; + addFundamentalRuneEntry(qContent, invItem, potencyRuneID, runeName, runeDescription); + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 1); + + } + + if(isArmorPotencyTwo(potencyRuneID)){ + + let runeName = "+2 Armor Potency"; + let runeDescription = "Magic wards deflect attacks. Increase the armor’s item bonus to AC by 2. The armor can be etched with two property runes."; + addFundamentalRuneEntry(qContent, invItem, potencyRuneID, runeName, runeDescription); + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 2); + + } + + if(isArmorPotencyThree(potencyRuneID)){ + + let runeName = "+3 Armor Potency"; + let runeDescription = "Magic wards deflect attacks. Increase the armor’s item bonus to AC by 3. The armor can be etched with three property rune."; + addFundamentalRuneEntry(qContent, invItem, potencyRuneID, runeName, runeDescription); + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 2); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 3); + + } + + if(isArmorPotencyFour(potencyRuneID)){ + + let runeName = "+4 Armor Potency"; + let runeDescription = "Magic wards deflect attacks. Increase the armor’s item bonus to AC by 4. The armor can be etched with four property rune."; + addFundamentalRuneEntry(qContent, invItem, potencyRuneID, runeName, runeDescription); + + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 1); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 2); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 3); + addPropertyRuneSelection(qContent, invItem, runeDataStruct.ArmorArray, 4); + + } + + } + +} + +function addFundamentalRuneEntry(qContent, invItem, runeID, runeName, runeDescription){ + + let runeEntryID = 'runeEntry'+runeID; + let runeEntryDeleteID = runeEntryID+'Delete'; + qContent.append(''); + + $('#'+runeEntryDeleteID).click(function() { + socket.emit("requestRemoveFundamentalRune", + invItem.id, + runeID); + }); + +} + +function getPropertyRuneIDBySlot(invItem, propertyRuneSlot){ + switch(propertyRuneSlot) { + case 1: + return invItem.propRune1ID; + case 2: + return invItem.propRune2ID; + case 3: + return invItem.propRune3ID; + case 4: + return invItem.propRune4ID; + default: + return null; + } +} + +function addPropertyRuneSelection(qContent, invItem, runeArray, propertyRuneSlot){ + + let propertyRuneSelectionID = 'propertyRuneSelection'+propertyRuneSlot; + qContent.append('
                      '); + + $('#'+propertyRuneSelectionID).append(''); + $('#'+propertyRuneSelectionID).append(''); + + let existingPropRuneID = getPropertyRuneIDBySlot(invItem, propertyRuneSlot); + for(let weaponRuneItem of runeArray){ + if(weaponRuneItem == null){ continue; } + if(weaponRuneItem.RuneData.isFundamental == 0) { + if(existingPropRuneID != null && existingPropRuneID == weaponRuneItem.RuneData.id){ + $('#'+propertyRuneSelectionID).append(''); + } else { + $('#'+propertyRuneSelectionID).append(''); + } + } + } + + if(existingPropRuneID != null){ + + let runeItem = runeArray.find(itemDataStruct => { + return itemDataStruct.RuneData.id == existingPropRuneID; + }).Item; + + let propertyRuneDescriptionNameID = 'propertyRuneDescriptionName'+propertyRuneSlot; + let propertyRuneDescriptionChevronID = 'propertyRuneDescriptionChevron'+propertyRuneSlot; + let propertyRuneDescriptionSectionID = 'propertyRuneDescriptionSection'+propertyRuneSlot; + + qContent.append(`

                      Description

                      `); + qContent.append(`

                      `); + + let usageText = (runeItem.usage != null) ? '

                      Usage: '+runeItem.usage+'

                      ' : ''; + $('#'+propertyRuneDescriptionSectionID).append(usageText+processText(runeItem.description, true, true, 'SMALL')+'
                      '); + + $('#'+propertyRuneDescriptionNameID).click(function() { + if($("#"+propertyRuneDescriptionSectionID).hasClass("is-hidden")) { + $("#"+propertyRuneDescriptionSectionID).removeClass('is-hidden'); + $("#"+propertyRuneDescriptionChevronID).removeClass('fa-chevron-down'); + $("#"+propertyRuneDescriptionChevronID).addClass('fa-chevron-up'); + } else { + $("#"+propertyRuneDescriptionSectionID).addClass('is-hidden'); + $("#"+propertyRuneDescriptionChevronID).removeClass('fa-chevron-up'); + $("#"+propertyRuneDescriptionChevronID).addClass('fa-chevron-down'); + } + }); + + /* If existingPropRuneID isn't null, a property rune is active */ + $('#'+propertyRuneSelectionID).parent().removeClass('is-success'); + $('#'+propertyRuneSelectionID).parent().addClass('is-success-dark'); + + } + + $('#'+propertyRuneSelectionID).change(function() { + let propRuneID = $('#'+propertyRuneSelectionID).val(); + if(propRuneID != "chooseDefault" && existingPropRuneID != propRuneID){ + socket.emit("requestAddPropertyRune", + invItem.id, + propRuneID, + propertyRuneSlot); + } else if(existingPropRuneID != null){ + socket.emit("requestRemovePropertyRune", + invItem.id, + propertyRuneSlot); + } + }); + +} + +function getInvItemLevel(item, invItem){ + + let highestLevel = item.Item.level; + + let runeArray = null; + if(item.WeaponData != null) { + runeArray = g_runeDataStruct.WeaponArray; + } else if(item.ArmorData != null) { + runeArray = g_runeDataStruct.ArmorArray; + } else { + return highestLevel; + } + + let runeIDArray = []; + runeIDArray.push(invItem.fundPotencyRuneID); + runeIDArray.push(invItem.fundRuneID); + runeIDArray.push(invItem.propRune1ID); + runeIDArray.push(invItem.propRune2ID); + runeIDArray.push(invItem.propRune3ID); + runeIDArray.push(invItem.propRune4ID); + + for(let runeID of runeIDArray){ + if(runeID != null){ + let rune = runeArray.find(rune => { + return rune != null && rune.RuneData.id == runeID; + }); + if(rune != null){ + if(rune.Item.level > highestLevel){ + highestLevel = rune.Item.level; + } + } + } + } + + return highestLevel; + +} diff --git a/client/vue-src/legacy-js/sheet/general/manage-spells.js b/client/vue-src/legacy-js/sheet/general/manage-spells.js new file mode 100644 index 00000000..c0faec4d --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/manage-spells.js @@ -0,0 +1,515 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let prev_spellSRC, prev_spellData = null; +let current_spellSRC = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('#manageSpellsModalBackground').click(function(){ + current_spellSRC = null; + closeManageSpellsModal(); + }); + $('#manageSpellsModalCloseButton').click(function(){ + current_spellSRC = null; + closeManageSpellsModal(); + }); + + $('#manageSpellsAddNewSlotBtn').click(function(){ + if(current_spellSRC != null){ + openQuickView('addSpellSlotView', { + SpellSRC: current_spellSRC, + }); + } + }); + +}); + +function openManageSpellsModal(data){ + + $('#manageSpellsTabs').html(''); + for(let spellBook of g_spellBookArray) { + if(spellBook.IsFocus) {continue;} + let spellSRCTabID = 'spellSRCTab'+spellBook.SpellSRC.replace(/\s/g, "_"); + $('#manageSpellsTabs').append('
                    • '+capitalizeWords(spellBook.SpellSRC)+'
                    • '); + + $('#'+spellSRCTabID).click(function(){ + $('.spellSRCTabs').removeClass('is-active'); + $('#'+spellSRCTabID).addClass('is-active'); + openSpellSRCTab(spellBook.SpellSRC, data); + $('#manageSpellsSlots').scrollTop(0); + }); + + } + + $("#manageSpellsTabs").children(":first").trigger("click"); + + + $('#manageSpellsModalDefault').addClass('is-active'); + $('html').addClass('is-clipped'); + +} + +function closeManageSpellsModal(){ + + $('#spellsTab').trigger("click", [true]); + + $('#manageSpellsModalDefault').removeClass('is-active'); + $('html').removeClass('is-clipped'); + +} + + + +// Socket.IO Spellbook Update // +socket.on("returnSpellBookUpdated", function(spellBookStruct){ + for (let i = 0; i < g_spellBookArray.length; i++) { + let spellBook = g_spellBookArray[i]; + if(spellBook.SpellSRC === spellBookStruct.SpellSRC && !spellBook.IsFocus){ + g_spellBookArray[i] = spellBookStruct; + } + } + + if(prev_spellSRC != null && prev_spellData != null){ + openSpellSRCTab(prev_spellSRC, prev_spellData); + prev_spellSRC = null; prev_spellData = null; + } +}); + + + +function openSpellSRCTab(spellSRC, data){ + current_spellSRC = spellSRC; + + let spellBook = g_spellBookArray.find(spellBook => { + return spellBook.SpellSRC === spellSRC; + }); + spellBook.SpellBook = removeAllNullSpells(spellBook.SpellBook); + spellBook.SpellBook = spellBook.SpellBook.sort( + function(a, b) { + let aStruct = data.SpellMap.get(a.SpellID+""); + let bStruct = data.SpellMap.get(b.SpellID+""); + if (a.SpellLevel === b.SpellLevel) { + // Name is only important when levels are the same + if(aStruct == null || bStruct == null) { return -1; } + return aStruct.Spell.name > bStruct.Spell.name ? 1 : -1; + } + return a.SpellLevel - b.SpellLevel; + } + ); + + $('#manageSpellsOpenSpellListsBtn').off('click'); + $('#manageSpellsOpenSpellListsBtn').click(function(){ + openQuickView('addSpellView', { + SpellBook: spellBook, + Data: data, + }); + }); + + if(spellBook.SpellCastingType === 'SPONTANEOUS-REPERTOIRE' || spellBook.SpellCastingType === 'FLEXIBLE-COLLECTION') { + displaySpellSpontaneous(spellBook, data); + displaySpellSlotsSpontaneous(spellSRC, data); + } else { + displaySpellBookPrepared(spellBook, data); + displaySpellSlotsPrepared(spellSRC, data); + } + + if(spellBook.SpellCastingType === 'PREPARED-BOOK'){ + $('#manageSpellsListName').html('

                      Spellbook

                      '); + } else if(spellBook.SpellCastingType === 'PREPARED-FAMILIAR'){ + $('#manageSpellsListName').html('

                      Familiar\'s Spells

                      '); + } else if(spellBook.SpellCastingType === 'PREPARED-LIST'){ + $('#manageSpellsListName').html('

                      Spell List

                      '); + } else if(spellBook.SpellCastingType === 'SPONTANEOUS-REPERTOIRE'){ + $('#manageSpellsListName').html('

                      Spell Repertoire

                      '); + } else if(spellBook.SpellCastingType === 'FLEXIBLE-COLLECTION'){ + $('#manageSpellsListName').html('

                      Spell Collection

                      '); + } + +} + + + + +function displaySpellSpontaneous(spellBook, data) { + + let spellBookSearch = $('#manageSpellsSpellBookSearch'); + let spellBookSearchInput = null; + if(spellBookSearch.val() != ''){ + spellBookSearchInput = spellBookSearch.val().toLowerCase(); + spellBookSearch.addClass('is-info'); + } else { + spellBookSearch.removeClass('is-info'); + } + + $('#manageSpellsSpellBookSearch').off('change'); + $('#manageSpellsSpellBookSearch').change(function(){ + displaySpellSpontaneous(spellBook, data); + }); + + + $('#manageSpellsSpellBook').html(''); + let spellListingCount = 0; + for(let spellData of spellBook.SpellBook) { + + let spellDataStruct = data.SpellMap.get(spellData.SpellID+""); + + // Filter Thru Search // + let willDisplay = true; + if(spellBookSearchInput != null){ + let spellName = spellDataStruct.Spell.name.toLowerCase(); + if(!spellName.includes(spellBookSearchInput)){ + willDisplay = false; + } + } + + if(!willDisplay){continue;} + // Display Spell in SpellBook // + if(spellDataStruct == null){continue;} + + let spellName = spellDataStruct.Spell.name; + if(spellDataStruct.Spell.isArchived === 1){ + spellName += '(archived)'; + } + + let bulmaColor = getSpellTypeBulmaColor(spellData.SpellType); + if(bulmaColor != '' && bulmaColor != 'has-text-info'){ + spellName += ''; + } + + let spellBookListingID = "spellBookListing"+spellListingCount; + let spellLevel = (spellData.SpellLevel == 0) ? "Cantrip" : "Lvl "+spellData.SpellLevel; + + $('#manageSpellsSpellBook').append('
                      '+spellName+'('+spellLevel+')
                      '); + + $('#'+spellBookListingID).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + SRCTabData: { + SpellBookSpellID: spellData.SpellBookSpellID, + SpellSRC: spellBook.SpellSRC, + SpellLevel: spellData.SpellLevel, + SpellType: spellData.SpellType, + Data: data}, + }); + }); + + $('#'+spellBookListingID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+spellBookListingID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + //$('#'+spellBookListingID).draggable({ opacity: 0.8, helper: "clone", revert: true }); + + spellListingCount++; + } + + if(spellBook.SpellBook.length == 0){ + $('#manageSpellsSpellBook').append('

                      You have no spells!

                      '); + } + +} + +function displaySpellSlotsSpontaneous(spellSRC, data) { + + let spellSlotArray = data.SpellSlotsMap.get(spellSRC); + let spellSlotMap = new Map(); + for(let spellSlot of spellSlotArray){ + let spellSlotMapArray = []; + if(spellSlotMap.has(spellSlot.slotLevel)){ + spellSlotMapArray = spellSlotMap.get(spellSlot.slotLevel); + } + spellSlotMapArray.push(spellSlot); + spellSlotMap.set(spellSlot.slotLevel, spellSlotMapArray); + } + + $('#manageSpellsSlots').html(''); + for(const [level, slotArray] of spellSlotMap){ + let sortedSlotArray = slotArray.sort( + function(a, b) { + return (a.used && !b.used) ? -1 : 1; + } + ); + + let sectionName = (level == 0) ? 'Cantrips' : 'Level '+level; + $('#manageSpellsSlots').append('

                      '+sectionName+'

                      '); + $('#manageSpellsSlots').append('
                      '); + + let spellSlotsButtonsID = 'spellManagerSlotsButtons'+level; + $('#manageSpellsSlots').append('
                      '); + if(level != 0) { + + for(let slot of sortedSlotArray){ + let spellManagerSlotID = 'spellManagerSlot'+slot.slotID; + + let bulmaColor = getSpellTypeBulmaColor(slot.type); + + let isSlotCustomClass = (slot.srcStruct.sourceType == 'user-added') ? 'is-underlined-thin-darker' : ''; + if(slot.used) { + $('#'+spellSlotsButtonsID).append(''); + } else { + $('#'+spellSlotsButtonsID).append(''); + } + + $('#'+spellManagerSlotID).click(function(){ + openQuickView('spellEmptyView', { + ViewType: 2, + SpellSlotData: {Slot: slot, SpellSRC: spellSRC, Data: data}, + }); + }); + + } + if(sortedSlotArray.length == 1){ + $('#'+spellSlotsButtonsID).append('

                      '+sortedSlotArray.length+' Spell Slot

                      '); + } else { + $('#'+spellSlotsButtonsID).append('

                      '+sortedSlotArray.length+' Spell Slots

                      '); + } + + } else { + for(let slot of sortedSlotArray){ + let spellManagerSlotID = 'spellManagerCantripSlot'+slot.slotID; + + let bulmaColor = getSpellTypeBulmaColor(slot.type); + + let isSlotCustomClass = (slot.srcStruct.sourceType == 'user-added') ? 'is-underlined-thin-darker' : ''; + $('#'+spellSlotsButtonsID).append(''); + + $('#'+spellManagerSlotID).click(function(){ + openQuickView('spellEmptyView', { + ViewType: 2, + SpellSlotData: {Slot: slot, SpellSRC: spellSRC, Data: data}, + }); + }); + } + $('#'+spellSlotsButtonsID).append('

                      '+sortedSlotArray.length+' Cantrips

                      '); + } + + } + +} + + + + + + +function displaySpellBookPrepared(spellBook, data) { + + let spellBookSearch = $('#manageSpellsSpellBookSearch'); + let spellBookSearchInput = null; + if(spellBookSearch.val() != ''){ + spellBookSearchInput = spellBookSearch.val().toLowerCase(); + spellBookSearch.addClass('is-info'); + } else { + spellBookSearch.removeClass('is-info'); + } + + $('#manageSpellsSpellBookSearch').off('change'); + $('#manageSpellsSpellBookSearch').change(function(){ + displaySpellBookPrepared(spellBook, data); + }); + + + $('#manageSpellsSpellBook').html(''); + let spellListingCount = 0; + for(let spellData of spellBook.SpellBook) { + + let spellDataStruct = data.SpellMap.get(spellData.SpellID+""); + + // Filter Thru Search // + let willDisplay = true; + if(spellBookSearchInput != null){ + let spellName = spellDataStruct.Spell.name.toLowerCase(); + if(!spellName.includes(spellBookSearchInput)){ + willDisplay = false; + } + } + + if(!willDisplay){continue;} + // Display Spell in SpellBook // + if(spellDataStruct == null){continue;} + + let spellName = spellDataStruct.Spell.name; + if(spellDataStruct.Spell.isArchived === 1){ + spellName += '(archived)'; + } + + let bulmaColor = getSpellTypeBulmaColor(spellData.SpellType); + if(bulmaColor != '' && bulmaColor != 'has-text-info'){ + spellName += ''; + } + + let spellBookListingID = "spellBookListing"+spellListingCount; + let spellLevel = (spellDataStruct.Spell.level == 0) ? "Cantrip" : "Lvl "+spellDataStruct.Spell.level; + + $('#manageSpellsSpellBook').append('
                      '+spellName+'('+spellLevel+')
                      '); + + $('#'+spellBookListingID).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + SRCTabData: { + SpellBookSpellID: spellData.SpellBookSpellID, + SpellSRC: spellBook.SpellSRC, + SpellLevel: spellData.SpellLevel, + SpellType: spellData.SpellType, + Data: data}, + }); + }); + + $('#'+spellBookListingID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+spellBookListingID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + $('#'+spellBookListingID).draggable({ opacity: 0.8, helper: "clone", revert: true }); + + spellListingCount++; + } + + if(spellBook.SpellBook.length == 0){ + $('#manageSpellsSpellBook').append('

                      You have no spells!

                      '); + } + +} + +function displaySpellSlotsPrepared(spellSRC, data) { + + let spellSlotArray = data.SpellSlotsMap.get(spellSRC); + let spellSlotMap = new Map(); + for(let spellSlot of spellSlotArray){ + let spellSlotMapArray = []; + if(spellSlotMap.has(spellSlot.slotLevel)){ + spellSlotMapArray = spellSlotMap.get(spellSlot.slotLevel); + } + spellSlotMapArray.push(spellSlot); + spellSlotMap.set(spellSlot.slotLevel, spellSlotMapArray); + } + + $('#manageSpellsSlots').html(''); + for(const [level, slotArray] of spellSlotMap){ + + let sectionName = (level == 0) ? 'Cantrips' : 'Level '+level; + $('#manageSpellsSlots').append('

                      '+sectionName+'

                      '); + $('#manageSpellsSlots').append('
                      '); + + let spellSlotsButtonsID = 'spellManagerSlotsButtons'+level; + $('#manageSpellsSlots').append('
                      '); + for(let slot of slotArray){ + let spellManagerSlotID = 'spellManagerSlot'+slot.slotID; + let spellDataStruct = data.SpellMap.get(slot.spellID+""); + + if(spellDataStruct != null) { + + let bulmaColor = getSpellTypeBulmaColor_SlotFilled(slot.type); + + let isSlotCustomClass = (slot.srcStruct.sourceType == 'user-added') ? 'is-underlined-darker' : ''; + $('#'+spellSlotsButtonsID).append('

                      '+spellDataStruct.Spell.name+'

                      '); + + $('#'+spellManagerSlotID).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + SpellSlotData: {Slot: slot, SpellSRC: spellSRC, Data: data}, + }); + }); + + } else { + + let bulmaColor = getSpellTypeBulmaColor_SlotEmpty(slot.type); + + let isSlotCustomClass = (slot.srcStruct.sourceType == 'user-added') ? 'is-underlined-darker' : ''; + $('#'+spellSlotsButtonsID).append('Empty'); + + $('#'+spellManagerSlotID).click(function(){ + openQuickView('spellEmptyView', { + ViewType: 1, + SpellSlotData: {Slot: slot, SpellSRC: spellSRC, Data: data}, + }); + }); + + } + + $("#"+spellManagerSlotID).droppable({ + tolerance: "pointer", + drop: function(event, ui) { + updateSpellSlot($(ui.draggable).attr('name'), slot, spellSRC, data); + } + }); + + } + + } + +} + +function slotCanTakeSpell(spellDataStruct, slot){ + if(spellDataStruct.Spell.level > slot.slotLevel){ + return false; + } + if(spellDataStruct.Spell.level == 0 && slot.slotLevel != 0){ + return false; + } + + return true; + +} + +function updateSpellSlot(spellID, slot, spellSRC, data){ + if(spellID != null) { + let spellDataStruct = data.SpellMap.get(spellID+""); + if(!slotCanTakeSpell(spellDataStruct, slot)){ + return; + } + } + + // Update Data Struct to Add Spell to Slot + slot.spellID = spellID; + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + slot); + + + let spellSlotsArray = g_spellSlotsMap.get(spellSRC); + if(spellSlotsArray != null){ + spellSlotsArray = updateSlotSpellID(spellSlotsArray, slot.slotID, spellID); + } + g_spellSlotsMap.set(spellSRC, spellSlotsArray); + data.SpellSlotsMap = g_spellSlotsMap; + + openSpellSRCTab(spellSRC, data); + +} + +function updateSlotSpellID(spellSlotsArray, slotID, spellID) { + for(let slot of spellSlotsArray){ + if(slot.slotID == slotID){ + slot.spellID = spellID; + return spellSlotsArray; + } + } + return spellSlotsArray; +} + +function updateSlotUsed(spellSlotsArray, slotID, used) { + for(let slot of spellSlotsArray){ + if(slot.slotID == slotID){ + slot.used = used; + return spellSlotsArray; + } + } + return spellSlotsArray; +} + +function removeAllNullSpells(spellBook) { + for(let i = spellBook.length - 1; i >= 0; i--) { + if(spellBook[i] === null) { + spellBook.splice(i, 1); + } + } + return spellBook; +} diff --git a/client/vue-src/legacy-js/sheet/general/notes-fields.js b/client/vue-src/legacy-js/sheet/general/notes-fields.js new file mode 100644 index 00000000..a961fe04 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/notes-fields.js @@ -0,0 +1,49 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function displayNotesField(qContent, srcStruct, rows=4){ + + let notesData = getNotesData(srcStruct); + if(notesData == null){ return; } + + let placeholderText = notesData.placeholderText; + let notesText = notesData.text; + + let notesFieldID = notesData.charID+'-'+notesData.source+'-'+notesData.sourceType+'-'+notesData.sourceLevel+'-'+notesData.sourceCode+'-'+notesData.sourceCodeSNum; + let notesFieldControlShellID = notesFieldID+'ControlShell'; + qContent.append('
                      '); + + $("#"+notesFieldID).blur(function(){ + if(notesData.text != $(this).val()) { + + $("#"+notesFieldControlShellID).addClass("is-loading"); + + notesData.text = $(this).val(); + + socket.emit("requestNotesFieldSave", + getCharIDFromURL(), + notesData, + notesFieldControlShellID); + + } + }); + +} + +function getNotesData(srcStruct){ + for(let notesData of g_notesFields) { + // Checks if the note field statement's parent is the input srcStruct + if(srcStruct.sourceCode === notesData.sourceCode){ + let sNum = notesData.sourceCodeSNum.substr(1); // Remove first char + if(srcStruct.sourceCodeSNum === sNum || (srcStruct.sourceCodeSNum == 'a' && sNum == '')) { + return notesData; + } + } + } + return null; +} + +socket.on("returnNotesFieldSave", function(notesFieldControlShellID){ + $("#"+notesFieldControlShellID).removeClass("is-loading"); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/general/prof-history-display.js b/client/vue-src/legacy-js/sheet/general/prof-history-display.js new file mode 100644 index 00000000..43dd50f7 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/prof-history-display.js @@ -0,0 +1,28 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getProfHistoryHTML(VARIABLE_NAME){ + VARIABLE_NAME = VARIABLE_NAME.replace(/\s/g, "_").toUpperCase(); + const variableValue = variables_getValue(VARIABLE_NAME); + const finalRank = variables_getFinalRank(VARIABLE_NAME); + + let tooltipText = 'Proficiency History:'; + if(finalRank == 'U'){ + tooltipText += '\nNone'; + return 'Untrained'; + } else { + + let sortedRankHistory = new Map([...variableValue.RankHistory.entries()].sort( + function(a, b) { + return profToNumUp(a[1].Rank) > profToNumUp(b[1].Rank) ? -1 : 1; + }) + ); + + for(const [srcStructKey, rankData] of sortedRankHistory){ + tooltipText += '\n'+profToWord(rankData.Rank)+' from '+rankData.SourceName; + } + return ''+profToWord(finalRank)+''; + } + +} diff --git a/client/vue-src/legacy-js/sheet/general/remote-updates.js b/client/vue-src/legacy-js/sheet/general/remote-updates.js new file mode 100644 index 00000000..b5eab2d8 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/remote-updates.js @@ -0,0 +1,192 @@ +/* Copyright (C) 2022, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +var notyf = new Notyf({ + duration: 5000, + ripple: true, + dismissible: true, + types: [ + { + type: 'success', + background: '#3298dc', + }, + ] +}); + + +/*~ Updates to this character ~*/ + +socket.on('sendCharacterUpdate-Health', function(charID, newHP){ + updateCampaignCharacter(charID, null, 'hp', { value: newHP }); + + if(getCharIDFromURL()+'' !== charID+'') { return; } + + $('#char-current-health').click(); + $('#current-health-input').val(newHP); + healthConfirm(g_calculatedStats.maxHP); + + notyf.success('The GM updated your Hit Points.'); + +}); + +socket.on('sendCharacterUpdate-TempHealth', function(charID, newTempHP){ + if(getCharIDFromURL()+'' !== charID+'') { return; } + + $('#char-temp-health').click(); + $('#temp-health-input').val(newTempHP); + tempHealthConfirm(); + + notyf.success('The GM updated your Temp HP.'); + +}); + +socket.on('sendCharacterUpdate-Exp', function(charID, newExp){ + if(getCharIDFromURL()+'' !== charID+'') { return; } + + $('#exp-input').val(newExp); + $('#exp-input').blur(); + + notyf.success('The GM updated your Experience.'); + +}); + +socket.on('sendCharacterUpdate-Stamina', function(charID, newStamina){ + if(getCharIDFromURL()+'' !== charID+'') { return; } + + $('#char-current-stamina').click(); + $('#current-stamina-input').val(newStamina); + staminaConfirm(g_calculatedStats.maxStamina); + + notyf.success('The GM updated your Stamina.'); + +}); + +socket.on('sendCharacterUpdate-Resolve', function(charID, newResolve){ + if(getCharIDFromURL()+'' !== charID+'') { return; } + + $('#char-current-resolve').click(); + $('#current-resolve-input').val(newResolve); + resolveConfirm(g_calculatedStats.maxResolve); + + notyf.success('The GM updated your Resolve.'); + +}); + +socket.on('sendCharacterUpdate-HeroPoints', function(charID, heroPoints){ + if(getCharIDFromURL()+'' !== charID+'') { return; } + + $("#heroPointsSelect").val(heroPoints); + $("#heroPointsSelect").change(); + + notyf.success('The GM updated your Hero Points.'); + +}); + +socket.on('sendCharacterUpdate-Conditions', function(charID, conditionsObject, reloadSheet){ + updateCampaignCharacter(charID, null, 'conditions', conditionsObject); + + if(getCharIDFromURL()+'' !== charID+'') { return; } + + g_conditionsMap = objToMap(conditionsObject); + + if (reloadSheet) { + reloadCharSheet(); + } + + notyf.success('The GM updated your Conditions.'); + +}); + +/*~ Recieve updates from other character ~*/ + +socket.on('sendCharacterUpdateToGM', function(charID, updates){ + if(!g_campaignDetails) { return; } + + let accessToken = g_campaignDetails.accessTokens.find(accessToken => { + return accessToken.charID == charID; + }); + + for(let update of updates){ + updateCampaignCharacter(charID, accessToken, update.type, update.data); + } + +}); + +function updateCampaignCharacter(charID, accessToken, type, data){ + + if(accessToken == null){ + accessToken = g_campaignDetails.accessTokens.find(accessToken => { + return accessToken.charID == charID; + }); + } + + if (type == 'hp') { + accessToken.character.currentHealth = data.value; + leftQuickview_setCharacterHealth(accessToken); + } else if (type == 'calculated-stats') { + accessToken.calculatedStat = data; + leftQuickview_setCharacterConditions(accessToken); + } else if (type == 'char-info') { + accessToken.character.infoJSON = data; + } else if (type == 'conditions') { + + if(!accessToken.calculatedStat){ + accessToken.calculatedStat = {}; + } + accessToken.calculatedStat.conditions = []; + + for(const [conditionID, conditionData] of objToMap(data).entries()){ + accessToken.calculatedStat.conditions.push({ + conditionID: conditionData.Condition.id, + name: conditionData.Condition.name, + entryID: conditionData.EntryID, + parentEntryID: conditionData.ParentID, + sourceText: conditionData.SourceText, + value: conditionData.Value, + }); + } + + leftQuickview_setCharacterConditions(accessToken); + + } + +} + +/*~ Send out character updates to GM ~*/ + +/* Data: + hp - { value } + temp-hp - { value } + exp - { value } + stamina - { value } + resolve - { value } + hero-points - { value } + calculated-stats - g_calculatedStats + char-info - charInfoJSON + roll-history - rollHistoryJSON +*/ + +let g_sendingUpdateToGM = false; +let g_updatesToGM = []; + +function sendOutUpdateToGM(field, updateStruct){ + if(!g_campaignDetails) { return; } + + // Update your own campaign character + updateCampaignCharacter(getCharIDFromURL(), null, field, updateStruct); + + g_updatesToGM.push({ type: field, data: updateStruct }); + if(!g_sendingUpdateToGM) { + setDelayToSendOutUpdateToGM(); + } +} + +function setDelayToSendOutUpdateToGM(){ + g_sendingUpdateToGM = true; + setTimeout(() => { + socket.emit(`requestCharacterUpdateToGM`, getCharIDFromURL(), g_updatesToGM); + g_updatesToGM = []; + g_sendingUpdateToGM = false; + }, 500); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/general/sheet-states.js b/client/vue-src/legacy-js/sheet/general/sheet-states.js new file mode 100644 index 00000000..62525c9f --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/sheet-states.js @@ -0,0 +1,52 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let sheetStateActiveMap = null; + +function initSheetStates(){ + + sheetStateActiveMap = new Map(); + for(const sheetState of g_sheetStatesArray){ + sheetStateActiveMap.set(sheetState.id, false); + } + +} + + +function getSheetStateByID(stateID){ + return g_sheetStatesArray.find(sheetState => { + return sheetState.id == stateID; + }); +} + +function getSheetStateByName(stateName){ + return g_sheetStatesArray.find(sheetState => { + return sheetState.name.toUpperCase() == stateName.toUpperCase(); + }); +} + +function isSheetStateActive(stateID){ + return sheetStateActiveMap.get(stateID); +} + +function setSheetStateActive(stateID, toggle){ + sheetStateActiveMap.set(stateID, toggle); +} + + +function getSheetStates(){ + + let stateArray = []; + for(let sheetStates of g_sheetStatesArray){ + sheetStates.isActive = isSheetStateActive(sheetStates.id); + stateArray.push(sheetStates); + } + + return stateArray.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/general/stat-manager.js b/client/vue-src/legacy-js/sheet/general/stat-manager.js new file mode 100644 index 00000000..a567b3c8 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/stat-manager.js @@ -0,0 +1,244 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +//let g_statManagerMap = null; +//let g_conditionalStatManagerMap = null; + +// key(name) value([ {Source, Value}, {Source, Value} ]) +/* + Keys + 'SCORE_STR' + 'SAVE_FORT' + + Values + 'BASE' -> Number + + 'PROF_BONUS' -> NumUps + + 'USER_BONUS' -> Number + 'CIRCUM_BONUS' -> Number + 'STATUS_BONUS' -> Number + 'ITEM_BONUS' -> Number + 'OTHER-(SRC-NAME)_BONUS' -> Number + + 'USER_PENALTY' -> Number + 'CIRCUM_PENALTY' -> Number + 'STATUS_PENALTY' -> Number + 'ITEM_PENALTY' -> Number + 'OTHER-(SRC-NAME)_PENALTY' -> Number + + 'MODIFIER' -> 'STR'/'DEX'/'CON'/'INT'/'WIS'/'CHA' + +*/ + +function initStats(){ + //g_statManagerMap = new Map(); + //g_conditionalStatManagerMap = new Map(); +} + +function addStat(statName, type, value){ + addStatAndSrc(statName, type, value, 'CORE'); +} + +function addStatAndSrc(statName, type, value, source){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + + // Don't add to map, just increase + if(statName == 'HEALTH') { + console.log(type); + if(type.includes('_BONUS')) { g_character.currentHealth += value; } + if(type.includes('_PENALTY')) { g_character.currentHealth -= value; } + if(!type.includes('_BONUS') && !type.includes('_PENALTY')) { g_character.currentHealth = value; } + socket.emit("requestCurrentHitPointsSave", + getCharIDFromURL(), + g_character.currentHealth); + sendOutUpdateToGM('hp', { value: g_character.currentHealth }); + initHealthPointsAndMore(); + return; + } else if(statName == 'TEMP_HEALTH'){ + if(type.includes('_BONUS')) { g_character.tempHealth += value; } + if(type.includes('_PENALTY')) { g_character.tempHealth -= value; } + if(!type.includes('_BONUS') && !type.includes('_PENALTY')) { g_character.tempHealth = value; } + socket.emit("requestTempHitPointsSave", + getCharIDFromURL(), + g_character.tempHealth); + sendOutUpdateToGM('temp-hp', { value: g_character.tempHealth }); + initHealthPointsAndMore(); + return; + } + + variables_addToBonuses(statName, value, type, source); +} + +/* +function removeStat(statName, source){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + let statDataMap = g_statManagerMap.get(statName); + if(statDataMap != null){ + statDataMap.delete(source); + } +} + +function removeStat(statName){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + g_statManagerMap.delete(statName); +}*/ + +function getStat(statName, type){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + let value = variables_getBonus(statName, type); + if(value === 'LAND_SPEED'){ + value = getStatTotal(VARIABLE.SPEED); + } + return value; +} + +function getStatTotal(statName, errorOnFailure=true){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + return variables_getTotal(statName, errorOnFailure); +} + +function getStatBonusTotal(statName){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + let bonusTotal = variables_getBonusTotal(statName); + if(bonusTotal == 0){ return null; } else { return bonusTotal; } +} + +function getStatExtraBonuses(statName){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + /* + let extraBonuses = null; + let statDataMap = g_statManagerMap.get(statName); + if(statDataMap != null){ + extraBonuses = []; + for(const [source, valueData] of statDataMap.entries()){ + if(source != 'PROF_BONUS' && source != 'MODIFIER' && source != 'BASE' && valueData.Value != 0){ + let cleanedSource = source.replace(/_/g, " ").toLowerCase(); + if(cleanedSource.startsWith('other-')){ + if(cleanedSource.includes('bonus')){ + cleanedSource = 'bonus'; + } else if(cleanedSource.includes('penalty')){ + cleanedSource = 'penalty'; + } + } + let statSource = (valueData.Src == 'CORE') ? null : capitalizeWords(valueData.Src); + if(statSource != null) { + extraBonuses.push(signNumber(valueData.Value)+' '+cleanedSource+' from '+statSource); + } else { + extraBonuses.push(signNumber(valueData.Value)+' '+cleanedSource); + } + } + } + }*/ + let extraBonuses = null; + let map = variables_getBonusesMap(statName); + if(map != null){ + extraBonuses = []; + for(let [type, valueData] of map){ + if(valueData.Value != 0){ + let cleanedType = type.replace(/_/g, " ").toLowerCase(); + if(cleanedType.startsWith('other-')){ + if(cleanedType.includes('bonus')){ + cleanedType = 'bonus'; + } else if(cleanedType.includes('penalty')){ + cleanedType = 'penalty'; + } + } + if(valueData.Src != 'CORE') { + extraBonuses.push(signNumber(valueData.Value)+' '+cleanedType+' from '+capitalizeWords(valueData.Src)); + } else { + extraBonuses.push(signNumber(valueData.Value)+' '+cleanedType); + } + } + } + } + return extraBonuses; +} + +function getStatMap(statName){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + return variables_getBonusesMap(statName); +} + +function getModOfValue(valueModName, errorOnFailure=true){ + if(valueModName == null){ return 0; } + valueModName = valueModName+''; // Convert to string, in case a num is passed + valueModName = valueModName.toUpperCase(); + switch(valueModName) { + case 'STR': + return getMod(getStatTotal(VARIABLE.SCORE_STR, errorOnFailure)); + case 'DEX': + return getMod(getStatTotal(VARIABLE.SCORE_DEX, errorOnFailure)); + case 'CON': + return getMod(getStatTotal(VARIABLE.SCORE_CON, errorOnFailure)); + case 'INT': + return getMod(getStatTotal(VARIABLE.SCORE_INT, errorOnFailure)); + case 'WIS': + return getMod(getStatTotal(VARIABLE.SCORE_WIS, errorOnFailure)); + case 'CHA': + return getMod(getStatTotal(VARIABLE.SCORE_CHA, errorOnFailure)); + + case 'PRE_STR': + return getMod(g_preConditions_strScore); + case 'PRE_DEX': + return getMod(g_preConditions_dexScore); + case 'PRE_CON': + return getMod(g_preConditions_conScore); + case 'PRE_INT': + return getMod(g_preConditions_intScore); + case 'PRE_WIS': + return getMod(g_preConditions_wisScore); + case 'PRE_CHA': + return getMod(g_preConditions_chaScore); + default: + return null; + } +} + + +// Conditionals // + +function addConditionalStat(statName, condition, source){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + variables_addToConditionals(statName, condition, source); +} + +/* +function removeConditionalStat(statName, condition){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + let statDataMap = g_conditionalStatManagerMap.get(statName); + if(statDataMap != null){ + statDataMap.delete(condition); + } +} + +function removeConditionalStat(statName){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + g_conditionalStatManagerMap.delete(statName); +} + +function getConditionalStat(statName, condition){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + let statDataMap = g_conditionalStatManagerMap.get(statName); + if(statDataMap != null){ + return statDataMap.get(condition); + } else { + return null; + } +}*/ + +function getConditionalStatMap(statName){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + let map = variables_getConditionalsMap(statName); + if(map == null){ + return new Map(); + } else { + return map; + } +} + +function hasConditionals(statName){ + statName = statName.replace(/\s/g, "_").toUpperCase(); + return variables_hasConditionals(statName); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/general/weap-mod-manager.js b/client/vue-src/legacy-js/sheet/general/weap-mod-manager.js new file mode 100644 index 00000000..71ea365f --- /dev/null +++ b/client/vue-src/legacy-js/sheet/general/weap-mod-manager.js @@ -0,0 +1,98 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_weapModManagerMap = null; +const g_weapMod_damageRegex = /^([ \-\+]|^)(\d+)+d(\d+)((\s*[+-]\s*\d+)*)( |)([^ .,;\n]+)$/im; + +function initWeapModManager(){ + g_weapModManagerMap = new Map(); +} + +/* + Weapon Modification types: + - DAMAGE-ON-HIT + - DAMAGE-ON-CRIT + + - OTHER-ON-HIT + - OTHER-ON-CRIT + + - CONDITIONAL-ON-HIT + - CONDITIONAL-ON-CRIT + + - ADJUST-RANGE + - ADJUST-RELOAD + + - ADD-TRAIT +*/ + +/* Layout: + g_weapModManagerMap: (invItemID) -> ({ Map: (weapModType) -> ({ Array: [weapMod, weapMod, ...] }) }) +*/ + +function addWeapMod(invItemID, weapMod, weapModType, extraInfo=''){ + if(invItemID == null) { return; } + if(weapModType == 'DAMAGE-ON-HIT' + || weapModType == 'DAMAGE-ON-CRIT' + || weapModType == 'OTHER-ON-HIT' + || weapModType == 'OTHER-ON-CRIT' + || weapModType == 'CONDITIONAL-ON-HIT' + || weapModType == 'CONDITIONAL-ON-CRIT' + || weapModType == 'ADJUST-RANGE' + || weapModType == 'ADJUST-RELOAD' + || weapModType == 'ADD-TRAIT') { + // Good, weapModType is a valid type + if(weapModType.includes('DAMAGE-')){ + let weapModMatch = weapMod.match(g_weapMod_damageRegex); + if(weapModMatch == null){ + displayError('(WeapModManager) weapMod is of type DAMAGE- but does not follow damage format: XdX+X dmgType'); return; + } else { + + weapMod = weapMod.trim().toLowerCase(); + if(weapMod.startsWith('+')){ + weapMod = weapMod.slice(1).trim(); + } else if(weapMod.startsWith('-')){ + weapMod = weapMod.slice(1).trim(); + weapMod = '-'+weapMod; + } + + } + } + } else { displayError('(WeapModManager) Invalid weapModType'); return; } + + let weapModDataMap = g_weapModManagerMap.get(invItemID+''); + if(weapModDataMap != null){ + let existingModArray = weapModDataMap.get(weapModType); + if(existingModArray != null){ + existingModArray.push({ mod: weapMod, info: extraInfo }); + } else { + existingModArray = [{ mod: weapMod, info: extraInfo }]; + } + weapModDataMap.set(weapModType, existingModArray); + g_weapModManagerMap.set(invItemID+'', weapModDataMap); + } else { + weapModDataMap = new Map(); + weapModDataMap.set(weapModType, [{ mod: weapMod, info: extraInfo }]); + g_weapModManagerMap.set(invItemID+'', weapModDataMap); + } + +} + +function getWeapMod(invItemID, weapModType){ + if(invItemID == null){ return []; } + let weapModDataMap = g_weapModManagerMap.get(invItemID+''); + if(weapModDataMap != null){ + let modArray = weapModDataMap.get(weapModType); + if(modArray == null){ + return []; + } else { + return cloneObj(modArray); + } + } else { + return []; + } +} + +function getWeapModAll(invItemID){ + return g_weapModManagerMap.get(invItemID+''); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/_left-quickview.js b/client/vue-src/legacy-js/sheet/quickviews/_left-quickview.js new file mode 100644 index 00000000..f1626685 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/_left-quickview.js @@ -0,0 +1,438 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openLeftQuickView(subtabName) { + + $('#quickViewLeftTitle').html('Sheet Tools'); + + $('#quickViewLeftTitleClose').html(''); + $('#quickViewLeftClose').click(function () { + $('#quickviewLeftDefault').removeClass('is-active'); + }); + + $('#quickviewLeftDefault').addClass('is-active'); + + // Listeners to open tabs + $('#quickViewLeftTab-DiceRoller').off('click'); + $('#quickViewLeftTab-DiceRoller').click(function () { + setLeftQuickViewTab('Dice Roller'); + }); + + $('#quickViewLeftTab-Toggleables').off('click'); + $('#quickViewLeftTab-Toggleables').click(function () { + setLeftQuickViewTab('Toggleables'); + }); + + if (g_campaignDetails) { + + $('#quickViewLeftTab-Campaign').parent().removeClass('is-hidden'); + + $('#quickViewLeftTab-Campaign').off('click'); + $('#quickViewLeftTab-Campaign').click(function () { + setLeftQuickViewTab('Campaign'); + }); + + } + + // Open tab + setLeftQuickViewTab(subtabName); + +} + +function closeLeftQuickView() { + $('#quickviewLeftDefault').removeClass('is-active'); +} + +function setLeftQuickViewTab(subtabName) { + + $('#quickViewLeftTitle').html('Sheet Tools - ' + subtabName); + $('#quickViewLeftContent').html(''); + $('#quickViewLeftContent').scrollTop(0); + + $('#quickViewLeftTab-DiceRoller').parent().removeClass("is-active"); + $('#quickViewLeftTab-Toggleables').parent().removeClass("is-active"); + $('#quickViewLeftTab-Campaign').parent().removeClass("is-active"); + $('#quickViewLeftTab-' + (subtabName.replace(/ /g, ''))).parent().addClass("is-active"); + + $('#quickViewLeftOuterExtra').html(''); + + if (subtabName == 'Toggleables') { + leftQuickview_OpenToggleables(); + } else if (subtabName == 'Dice Roller') { + leftQuickview_OpenDiceRoller(); + } else if (subtabName == 'Campaign') { + leftQuickview_OpenCampaign(); + } + +} + + + + + + +function leftQuickview_OpenToggleables() { + + let qContent = $('#quickViewLeftContent'); + + qContent.append(` +
                      +

                      The following are toggleable buttons that apply certain effects to the sheet when enabled. They can be useful for some abilities that tend to be either active or inactive.

                      +
                      + `); + + for (const sheetState of getSheetStates()) { + + let stateBtnID = 'sheetStateBtnID' + sheetState.id; + qContent.append(``); + + if (sheetState.isActive) { + $('#' + stateBtnID).addClass('is-focused'); + } + + $('#' + stateBtnID).click(function () { + setSheetStateActive(sheetState.id, !sheetState.isActive); + openLeftQuickView('Toggleables'); + reloadCharSheet(); + }); + + + } + +} + + +function leftQuickview_OpenDiceRoller() { + + let qContent = $('#quickViewLeftContent'); + + // Set HTML + qContent.append(` + +
                      +
                      +
                      +
                      + Roll +
                      +
                      +
                      +
                      +

                      + +

                      +

                      + + + +

                      +

                      + + +

                      +

                      + +

                      +
                      +
                      +
                      +
                      +
                      +
                      + +
                      +
                      + + `); + + // Enable Dice Integration Button // + if (gOption_hasDiceRoller) { + $('#quickViewLeftOuterExtra').html(` +
                      +

                      Dice Integration Enabled

                      +
                      +
                      +

                      (disable in the builder under options)

                      +
                      + `); + } else { + $('#quickViewLeftOuterExtra').html(` +
                      + +
                      + `); + $('#quickViewLeftEnableDiceIntegrationBtn').click(function () { + + socket.emit("requestCharacterOptionChange", + getCharIDFromURL(), + 'optionDiceRoller', + 1); + + gOption_hasDiceRoller = true; + reloadCharSheet(); + closeLeftQuickView(); + }); + } + + // Display Roll History + if (g_rollHistory.length > 0) { + for (let i = 0; i < g_rollHistory.length; i++) { + let rollStruct = g_rollHistory[i]; + + if (i == g_rollHistory.length - 1 && g_rollHistory.length > 1) { + $('#dice-roller-output-container').append('
                      '); + } + + // Display Roll // + let resultLine = '' + rollStruct.RollData.DiceNum + 'd' + rollStruct.RollData.DieType + ''; + if (rollStruct.RollData.Bonus != 0) { + resultLine += '+' + rollStruct.RollData.Bonus + ''; + } + + if (rollStruct.RollData.DiceNum != 1 || rollStruct.RollData.Bonus != 0) { + resultLine += ''; + let resultSubParts = ''; + let firstResult = true; + for (let result of rollStruct.ResultData) { + if (firstResult) { firstResult = false; } else { resultSubParts += '+'; } + + let bulmaColor = 'has-txt-listing'; + if (result == rollStruct.RollData.DieType) { bulmaColor = 'has-text-success'; } + else if (result == 1) { bulmaColor = 'has-text-danger'; } + + resultSubParts += '(' + result + ')'; + } + if (rollStruct.RollData.Bonus != 0) { + resultSubParts += '+' + rollStruct.RollData.Bonus + ''; + } + resultLine += '' + resultSubParts + ''; + } + + if (rollStruct.DoubleResult) { + resultLine += `2×${rollStruct.Total}${(rollStruct.Total * 2)} ${rollStruct.ResultSuffix}`; + } else { + resultLine += `${rollStruct.Total} ${rollStruct.ResultSuffix}`; + } + + $('#dice-roller-output-container').append(` +
                      +

                      ${resultLine}

                      +

                      ${rollStruct.Label.Name}

                      +

                      ${rollStruct.Timestamp.Time}

                      +
                      + `); + } + } else { + $('#dice-roller-output-container').html('

                      No roll history.

                      '); + } + + // Scroll to Bottom + window.setTimeout(() => { + $('#dice-roller-output-container').scrollTop($('#dice-roller-output-container')[0].scrollHeight); + }, 1); + + // Roll Btn Listener // + $('#dice-roller-input-roll').click(function () { + let diceAmtStr = $('#dice-roller-input-dice-amt').val(); + let dieSizeStr = $('#dice-roller-input-die-size').val(); + let bonusStr = $('#dice-roller-input-bonus').val(); + if (diceAmtStr != '') { + let diceAmt = parseInt(diceAmtStr); + let dieSize = parseInt(dieSizeStr); + let bonus = (bonusStr != '') ? parseInt(bonusStr) : 0; + makeDiceRoll(diceAmt, dieSize, bonus, ''); + } + }); + + // Clear History Listener // + $('#dice-roller-clear-btn').click(function () { + g_rollHistory = []; + openLeftQuickView('Dice Roller'); + + let rollHistoryJSON = JSON.stringify(g_rollHistory); + + socket.emit("requestRollHistorySave", + getCharIDFromURL(), + rollHistoryJSON); + sendOutUpdateToGM('roll-history', rollHistoryJSON); + }); + +} + + +function leftQuickview_OpenCampaign() { + + let qContent = $('#quickViewLeftContent'); + + qContent.append(` +

                      ${g_campaignDetails.campaign.name}

                      +
                      +

                      ${processText(g_campaignDetails.campaign.description, false, false, 'MEDIUM', false)}

                      +
                      +
                      + `); + + g_campaignDetails.accessTokens = g_campaignDetails.accessTokens.sort( + function(a, b) { + return a.character.name > b.character.name ? 1 : -1; + } + ); + + for (const accessToken of g_campaignDetails.accessTokens) { + + let charTitle = ''; + if (accessToken?.calculatedStat?.generalInfo && !accessToken.calculatedStat.fakeStats) { + let generalInfo = accessToken.calculatedStat.generalInfo; + if (typeof generalInfo === 'string' || generalInfo instanceof String){ + generalInfo = JSON.parse(generalInfo); + } + charTitle = generalInfo.heritageAncestryName + ' ' + generalInfo.className; + } else { + charTitle = 'Unknown Traveler'; + } + + let imageURL = ''; + + // Override with custom set title in char info + if(accessToken.character.infoJSON){ + let charInfo = accessToken.character.infoJSON; + if (typeof charInfo === 'string' || charInfo instanceof String){ + charInfo = JSON.parse(charInfo); + } + if(charInfo?.title && charInfo.title.trim() != ''){ + charTitle = charInfo.title.trim(); + } + + if (charInfo?.imageURL && charInfo.imageURL.match(/\.(jpeg|jpg|gif|png|webp)$/) != null) { + imageURL = charInfo.imageURL; + } + } + + qContent.append(` + +
                      +
                      + +

                      + ${accessToken.character.name.trim()}, ${charTitle} +

                      +
                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      +
                      +
                      + + `); + + if(imageURL.length > 0){ + $(`#campaign-character-image-${accessToken.charID}`).removeClass('is-hidden'); + } + + leftQuickview_setCharacterHealth(accessToken); + leftQuickview_setCharacterConditions(accessToken); + + } + +} + +function leftQuickview_setCharacterHealth(accessToken) { + if(!$('#quickviewLeftDefault').hasClass('is-active')) { return; } + + $(`#campaign-character-health-${accessToken.charID}`).html(''); + if (g_campaignDetails.campaign.optionDisplayPlayerHealth == 0 || !accessToken.calculatedStat || accessToken.calculatedStat.fakeStats) { return; } + + if(accessToken.character.currentHealth === null) { + accessToken.character.currentHealth = accessToken.calculatedStat.maxHP; + } + + let animationDelay = getAnimationDelayFromCurrentHP(accessToken.character.currentHealth, accessToken.calculatedStat.maxHP); + + if (g_campaignDetails.campaign.optionDisplayPlayerHealth == 1) { + + // Determine Status + let statusMessage = ''; + let percentage = accessToken.character.currentHealth / accessToken.calculatedStat.maxHP; + if(percentage >= 0.9){ + statusMessage = 'Good'; + } else if(percentage >= 0.7){ + statusMessage = 'Fine'; + } else if(percentage >= 0.4){ + statusMessage = 'Adequate'; + } else if(percentage >= 0.1){ + statusMessage = 'Serious'; + } else { + statusMessage = 'Critical'; + } + + $(`#campaign-character-health-${accessToken.charID}`).html(` +

                      + Status: ${statusMessage} +

                      ` + ); + + } else if (g_campaignDetails.campaign.optionDisplayPlayerHealth == 2) { + + $(`#campaign-character-health-${accessToken.charID}`).html(` +

                      + Health: ${accessToken.character.currentHealth} / ${accessToken.calculatedStat.maxHP} +

                      ` + ); + + } + +} + +function leftQuickview_setCharacterConditions(accessToken) { + if(!$('#quickviewLeftDefault').hasClass('is-active')) { return; } + + $(`#campaign-character-conditions-${accessToken.charID}`).html(''); + if (g_campaignDetails.campaign.optionDisplayPlayerHealth == 0 || !accessToken.calculatedStat || accessToken.calculatedStat.fakeStats) { return; } + + let conditions = accessToken.calculatedStat.conditions; + if (typeof conditions === 'string' || conditions instanceof String){ + conditions = JSON.parse(conditions); + } + if(conditions == null){ + conditions = []; + } + for (let condition of conditions) { + + let conditionDisplayName = capitalizeWords(condition.name); + if (condition.value != null) { conditionDisplayName += ` ${condition.value}`; } + + $(`#campaign-character-conditions-${accessToken.charID}`).append(` +
                      +
                      + +
                      +
                      + `); + + } + +} diff --git a/client/vue-src/legacy-js/sheet/quickviews/_old_add-item-view.js b/client/vue-src/legacy-js/sheet/quickviews/_old_add-item-view.js new file mode 100644 index 00000000..a43c27b5 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/_old_add-item-view.js @@ -0,0 +1,626 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAddItemQuickview(data) { + + $('#quickViewTitle').html('Add Items'); + $('#quickViewTitleRight').html(''); + $('#createCustomItemBtn').click(function(){ + $(this).addClass('is-loading'); + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + data.InvID, + 62, // Hardcoded New Item ID + 1); + $(this).blur(); + }); + + let qContent = $('#quickViewContent'); + + qContent.append(''); + + qContent.append('

                      '); + + qContent.append('
                      '); + + $('#itemTabAll').click(function(){ + $('#allItemsFilterBySubcategory').parent().parent().addClass('is-hidden'); + $('#allItemsFilterBySubcategory').html(''); + $('#allItemSearch').attr('placeholder', 'Search All Items'); + changeItemCategoryTab('itemTabAll', data); + }); + + $('#itemTabGeneral').click(function(){ + $('#allItemsFilterBySubcategory').parent().parent().removeClass('is-hidden'); + $('#allItemsFilterBySubcategory').html(` + + + + + + + + + + + + + + `); + $('#allItemSearch').attr('placeholder', 'Search General Items'); + changeItemCategoryTab('itemTabGeneral', data); + }); + + $('#itemTabMagical').click(function(){ + $('#allItemsFilterBySubcategory').parent().parent().removeClass('is-hidden'); + $('#allItemsFilterBySubcategory').html(` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `); + $('#allItemSearch').attr('placeholder', 'Search Magical Items'); + changeItemCategoryTab('itemTabMagical', data); + }); + + $('#itemTabAlchemical').click(function(){ + $('#allItemsFilterBySubcategory').parent().parent().removeClass('is-hidden'); + $('#allItemsFilterBySubcategory').html(''); + $('#allItemSearch').attr('placeholder', 'Search Alchemical Items'); + changeItemCategoryTab('itemTabAlchemical', data); + }); + + $('#itemTabCurrency').click(function(){ + $('#allItemsFilterBySubcategory').parent().parent().addClass('is-hidden'); + $('#allItemsFilterBySubcategory').html(''); + $('#allItemSearch').attr('placeholder', 'Search Currency'); + changeItemCategoryTab('itemTabCurrency', data); + }); + + $('#itemTabAll').click(); + +} + + + + + +function changeItemCategoryTab(type, data){ + + $('#addItemListSection').html(''); + + $('#itemTabAll').parent().removeClass("is-active"); + $('#itemTabGeneral').parent().removeClass("is-active"); + $('#itemTabMagical').parent().removeClass("is-active"); + $('#itemTabAlchemical').parent().removeClass("is-active"); + $('#itemTabCurrency').parent().removeClass("is-active"); + $('#'+type).parent().addClass("is-active"); + + let allItemSearch = $('#allItemSearch'); + let allItemSearchInput = null; + if(allItemSearch.val() != ''){ + allItemSearchInput = allItemSearch.val().toUpperCase(); + allItemSearch.addClass('is-info'); + } else { + allItemSearch.removeClass('is-info'); + if(type != 'itemTabAll') { + allItemSearch.blur(); + } + } + + let allItemsFilterBySubcategoryValue = $('#allItemsFilterBySubcategory').val(); + + $('#allItemSearch').off('change'); + $('#allItemSearch').change(function(){ + changeItemCategoryTab(type, data); + }); + + $('#allItemsFilterBySubcategory').off('change'); + $('#allItemsFilterBySubcategory').change(function(){ + changeItemCategoryTab(type, data); + }); + + for(const [itemID, itemDataStruct] of data.ItemMap.entries()){ + + let willDisplay = false; + + if(type == 'itemTabAll') { + willDisplay = (allItemSearchInput != null); + } else if(type == 'itemTabGeneral') { + let magical = itemDataStruct.TagArray.find(tag => { + // Hardcoded - Magical Trait ID 41; + // Primal Trait ID 304; Occult Trait ID 500; Divine Trait ID 265; Arcane Trait ID 2; + return tag.id === 41 || tag.id === 304 || tag.id === 500 || tag.id === 265 || tag.id === 2; + }); + let alchemical = itemDataStruct.TagArray.find(tag => { + return tag.id === 399; // Hardcoded - Alchemical Trait ID 399 + }); + willDisplay = (magical == null && alchemical == null && itemDataStruct.Item.itemType != 'CURRENCY'); + } else if(type == 'itemTabMagical') { + let magical = itemDataStruct.TagArray.find(tag => { + // Hardcoded - Magical Trait ID 41; + // Primal Trait ID 304; Occult Trait ID 500; Divine Trait ID 265; Arcane Trait ID 2; + return tag.id === 41 || tag.id === 304 || tag.id === 500 || tag.id === 265 || tag.id === 2; + }); + willDisplay = (magical != null); + } else if(type == 'itemTabAlchemical') { + let alchemical = itemDataStruct.TagArray.find(tag => { + return tag.id === 399; // Hardcoded - Alchemical Trait ID 399 + }); + willDisplay = (alchemical != null); + } else if(type == 'itemTabCurrency') { + if(itemDataStruct.Item.itemType == 'CURRENCY') { + willDisplay = true; + } + } + + if(allItemSearchInput != null){ + $('#allItemsFilterBySubcategory').parent().removeClass('is-info'); + + let itemName = itemDataStruct.Item.name.toUpperCase(); + if(!itemName.includes(allItemSearchInput)){ + willDisplay = false; + } + + } else { + $('#allItemsFilterBySubcategory').parent().addClass('is-info'); + + if(allItemsFilterBySubcategoryValue == 'ALL'){ + $('#allItemsFilterBySubcategory').parent().removeClass('is-info'); + if(type != 'itemTabCurrency'){ + willDisplay = false; + } + } else if(allItemsFilterBySubcategoryValue == 'OTHER'){ + let foundItemType = false; + if(itemDataStruct.Item.itemType != 'OTHER') { + $("#allItemsFilterBySubcategory option").each(function() { + if(itemDataStruct.Item.itemType === $(this).val()){ + foundItemType = true; + } + }); + } + if(foundItemType){ + willDisplay = false; + } + } else { + if(itemDataStruct.Item.itemType !== allItemsFilterBySubcategoryValue){ + willDisplay = false; + } + } + + } + + if(willDisplay){ + displayAddItem(itemID, itemDataStruct, data); + } + + } + + $('.itemEntryPart').click(function(){ + + let itemID = $(this).parent().attr('data-item-id'); + let itemDataStruct = data.ItemMap.get(itemID+""); + + let addItemChevronItemID = 'addItemChevronItemID'+itemID; + let addItemNameID = 'addItemName'+itemID; + let addItemDetailsItemID = 'addItemDetailsItem'+itemID; + if($('#'+addItemDetailsItemID).html() != ''){ + $('#'+addItemChevronItemID).removeClass('fa-chevron-up'); + $('#'+addItemChevronItemID).addClass('fa-chevron-down'); + $('#'+addItemNameID).removeClass('has-text-white-ter'); + //$(this).parent().removeClass('has-bg-options-header-bold'); + displayItemDetails(null, addItemDetailsItemID); + } else { + $('#'+addItemChevronItemID).removeClass('fa-chevron-down'); + $('#'+addItemChevronItemID).addClass('fa-chevron-up'); + $('#'+addItemNameID).addClass('has-text-white-ter'); + //$(this).parent().addClass('has-bg-options-header-bold'); + displayItemDetails(itemDataStruct, addItemDetailsItemID); + } + + }); + +} + +function displayAddItem(itemID, itemDataStruct, data){ + + if(itemDataStruct.Item.hidden == 1 || itemDataStruct.Item.isArchived == 1){ + return; + } + + let addItemAddItemID = 'addItemAddItem'+itemID; + let addItemChevronItemID = 'addItemChevronItemID'+itemID; + let addItemNameID = 'addItemName'+itemID; + let addItemDetailsItemID = 'addItemDetailsItem'+itemID; + + let itemLevel = (itemDataStruct.Item.level == 0 || itemDataStruct.Item.level == 999) ? "" : "Lvl "+itemDataStruct.Item.level; + + let itemName = itemDataStruct.Item.name; + if(itemDataStruct.Item.quantity > 1){ + itemName += ' ('+itemDataStruct.Item.quantity+')'; + } + + + let addItemHTML = null; + if (itemDataStruct.Item.itemType == 'CURRENCY'){ + addItemHTML = ''; + } else if (itemDataStruct.Item.price == 0) { + addItemHTML = '
                      '; + } else { + addItemHTML = '
                      '; + } + + $('#addItemListSection').append(` +
                      +
                      +

                      ${getItemIcon(itemDataStruct, null)}${itemName}

                      +
                      +
                      +

                      ${itemLevel}

                      +
                      +
                      ${addItemHTML}
                      +
                      + +
                      +
                      +
                      + `); + + if(itemDataStruct.Item.itemType != 'CURRENCY'){ + + $('#'+addItemAddItemID).change(function(){ + let addItemType = $("#"+addItemAddItemID+" option:selected").val(); + if(addItemType != 'chooseDefault') { + + if(addItemType == 'FORMULA') { + socket.emit("requestAddItemCustomizeToInv", + getCharIDFromURL(), + data.InvID, + 95, // Hardcoded - Parchment ID + { + name: 'Formula - '+itemDataStruct.Item.name, + price: 0, + bulk: 0, + description: 'This thin sheet of parchment is a schematic, containing the instructions for making the (item: '+itemDataStruct.Item.name.replaceAll(/[\(\)]/g, '')+') item.', + size: 'MEDIUM', + isShoddy: 0, + materialType: null, + hitPoints: 1, + brokenThreshold: 0, + hardness: 0, + code: null, + itemTagsData: null, + + weaponDieType: null, + weaponDamageType: null, + + storageMaxBulk: null, + + quantity: 1 + } + ); + } + + if(addItemType == 'GIVE') { + $(this).parent().addClass('is-loading'); + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + data.InvID, + itemID, + itemDataStruct.Item.quantity); + } + + if(addItemType == 'BUY') { + + const itemPrice = getConvertedPriceForSize(itemDataStruct.Item.size, itemDataStruct.Item.price); + let itemPriceInCP = itemPrice; + + const itemPriceSingleInCP = Math.ceil(itemPrice / itemDataStruct.Item.quantity); + const maxQtyForItem = Math.floor(getTotalCoinsInCP() / itemPriceSingleInCP); + + if(hasCoins(itemPriceInCP)){ + + let buyQtyHTML = ''; + if(itemDataStruct.Item.hasQuantity == 1){ + buyQtyHTML = ` + + + + + + + + `; + } + + new ConfirmMessage('Buy “'+itemDataStruct.Item.name+'”'+buyQtyHTML, 'This purchase will cost '+getCoinToString(itemPriceInCP)+', buying it will automatically simplify your coins. Are you sure you want to buy this?', 'Buy Item', 'modal-buy-item', 'modal-buy-item-btn', 'is-success'); + + if(itemDataStruct.Item.hasQuantity == 1){ + $('#modal-buy-item-qty-input').blur(function() { + let itemQty = parseInt($(this).val()); + if(isNaN(itemQty) || itemQty < 1) { itemQty = 1; } + if(itemQty > maxQtyForItem) { itemQty = maxQtyForItem; } + $(this).val(itemQty); + + itemPriceInCP = Math.ceil(itemPrice * (itemQty / itemDataStruct.Item.quantity)); + $('#modal-buy-item-price').text(getCoinToString(itemPriceInCP)); + + }); + } + + $('#modal-buy-item-btn').click(function(event) { + reduceAndSimplifyCoins(itemPriceInCP); + + let itemQty = itemDataStruct.Item.quantity; + if(itemDataStruct.Item.hasQuantity == 1){ + itemQty = parseInt($('#modal-buy-item-qty-input').val()); + if(isNaN(itemQty) || itemQty < 1) { itemQty = 1; } + if(itemQty > maxQtyForItem) { itemQty = maxQtyForItem; } + } + + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + data.InvID, + itemID, + itemQty); + }); + + } else { + + new ConfirmMessage('Insufficient Funds', 'This item costs '+itemPriceStr+', more than you have in your inventory.', 'Okay', 'modal-fail-to-buy-item', 'modal-fail-to-buy-item-btn'); + addQuickViewProtection(); + + } + + } + $("#"+addItemAddItemID).val('chooseDefault'); + } + }); + + } else { + + $('#'+addItemAddItemID).click(function(){ + $(this).addClass('is-loading'); + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + data.InvID, + itemID, + itemDataStruct.Item.quantity); + $(this).blur(); + }); + + } + +} + +function displayItemDetails(itemDataStruct, addItemDetailsItemID){ + + if(itemDataStruct == null){ + $('#'+addItemDetailsItemID).html(''); + return; + } + + $('#'+addItemDetailsItemID).html('
                      '); + let itemDetails = $('#'+addItemDetailsItemID+' > div'); + + let rarity = itemDataStruct.Item.rarity; + let tagsInnerHTML = ''; + switch(rarity) { + case 'UNCOMMON': tagsInnerHTML += ''; + break; + case 'RARE': tagsInnerHTML += ''; + break; + case 'UNIQUE': tagsInnerHTML += ''; + break; + default: break; + } + + let itemSize = itemDataStruct.Item.size; + switch(itemSize) { + case 'TINY': tagsInnerHTML += ''; + break; + case 'SMALL': tagsInnerHTML += ''; + break; + case 'LARGE': tagsInnerHTML += ''; + break; + case 'HUGE': tagsInnerHTML += ''; + break; + case 'GARGANTUAN': tagsInnerHTML += ''; + break; + default: break; + } + + for(const tag of itemDataStruct.TagArray){ + let tagDescription = tag.description; + if(tagDescription.length > g_tagStringLengthMax){ + tagDescription = tagDescription.substring(0, g_tagStringLengthMax); + tagDescription += '...'; + } + tagsInnerHTML += ''; + } + + if(tagsInnerHTML != ''){ + itemDetails.append('
                      '+tagsInnerHTML+'
                      '); + itemDetails.append('
                      '); + } + + $('.tagButton').click(function(){ + let tagName = $(this).text(); + openQuickView('tagView', { + TagName : tagName, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + if(itemDataStruct.WeaponData != null){ + + let weapGroup = null; + if(itemDataStruct.WeaponData.isRanged == 1){ + weapGroup = capitalizeWord(itemDataStruct.WeaponData.rangedWeaponType); + } + if(itemDataStruct.WeaponData.isMelee == 1){ + weapGroup = capitalizeWord(itemDataStruct.WeaponData.meleeWeaponType); + } + + let weapCategory = capitalizeWord(itemDataStruct.WeaponData.category); + itemDetails.append('

                      Category: '+weapCategory+'

                      Group: '+weapGroup+'

                      '); + + itemDetails.append('
                      '); + + } + + if(itemDataStruct.ArmorData != null){ + + let armorCategory = capitalizeWord(itemDataStruct.ArmorData.category); + let armorGroup = (itemDataStruct.ArmorData.armorType == 'N/A') ? '-' : capitalizeWord(itemDataStruct.ArmorData.armorType); + itemDetails.append('

                      Category: '+armorCategory+'

                      Group: '+armorGroup+'

                      '); + + itemDetails.append('
                      '); + + } + + + let price = getConvertedPriceForSize(itemDataStruct.Item.size, itemDataStruct.Item.price); + price = getCoinToString(price); + if(itemDataStruct.Item.quantity > 1){ + price += ' for '+itemDataStruct.Item.quantity; + } + + let bulk = determineItemBulk(g_charSize, itemDataStruct.Item.size, itemDataStruct.Item.bulk); + bulk = getBulkFromNumber(bulk); + + itemDetails.append('
                      Price
                      Bulk
                      Hands
                      '); + itemDetails.append('

                      '+price+'

                      '+bulk+'

                      '+getHandsToString(itemDataStruct.Item.hands)+'

                      '); + + if(itemDataStruct.Item.usage != null){ + itemDetails.append('
                      '); + itemDetails.append('

                      Usage: '+itemDataStruct.Item.usage+'

                      '); + } + + itemDetails.append('
                      '); + + + if(itemDataStruct.WeaponData != null){ + + let consumableTag = itemDataStruct.TagArray.find(tag => { + return tag.id == 402; // Hardcoded Consumable Tag ID + }); + + // Fixes Prisma empty enum for dieType, like for Blowguns + if(itemDataStruct.WeaponData.dieType == 'EMPTY_ENUM_VALUE'){ + itemDataStruct.WeaponData.dieType = ''; + } + + let damage = itemDataStruct.WeaponData.diceNum+""+itemDataStruct.WeaponData.dieType+" "+itemDataStruct.WeaponData.damageType; + damage = (consumableTag != null) ? 'See Text' : damage; + + itemDetails.append('
                      Damage
                      '); + itemDetails.append('

                      '+damage+'

                      '); + + itemDetails.append('
                      '); + + if(itemDataStruct.WeaponData.isRanged == 1){ + + let reload = itemDataStruct.WeaponData.rangedReload; + if(reload == 0){ reload = '-'; } + let range = itemDataStruct.WeaponData.rangedRange+" ft"; + itemDetails.append('
                      Range
                      Reload
                      '); + itemDetails.append('

                      '+range+'

                      '+reload+'

                      '); + + itemDetails.append('
                      '); + + } + + } + + if(itemDataStruct.ArmorData != null){ + + itemDetails.append('
                      AC Bonus
                      Dex Cap
                      '); + itemDetails.append('

                      '+signNumber(itemDataStruct.ArmorData.acBonus)+'

                      '+signNumber(itemDataStruct.ArmorData.dexCap)+'

                      '); + + itemDetails.append('
                      '); + + let minStrength = (itemDataStruct.ArmorData.minStrength == 0) ? '-' : itemDataStruct.ArmorData.minStrength+''; + let checkPenalty = (itemDataStruct.ArmorData.checkPenalty == 0) ? '-' : itemDataStruct.ArmorData.checkPenalty+''; + let speedPenalty = (itemDataStruct.ArmorData.speedPenalty == 0) ? '-' : itemDataStruct.ArmorData.speedPenalty+' ft'; + itemDetails.append('
                      Strength
                      Check Penalty
                      Speed Penalty
                      '); + itemDetails.append('

                      '+minStrength+'

                      '+checkPenalty+'

                      '+speedPenalty+'

                      '); + + itemDetails.append('
                      '); + + } + + if(itemDataStruct.ShieldData != null){ + + let speedPenalty = (itemDataStruct.ShieldData.speedPenalty == 0) ? '-' : itemDataStruct.ShieldData.speedPenalty+' ft'; + itemDetails.append('
                      AC Bonus
                      Speed Penalty
                      '); + itemDetails.append('

                      '+signNumber(itemDataStruct.ShieldData.acBonus)+'

                      '+speedPenalty+'

                      '); + + itemDetails.append('
                      '); + + } + + if(itemDataStruct.StorageData != null){ + + let maxBagBulk = itemDataStruct.StorageData.maxBulkStorage; + let bulkIgnored = itemDataStruct.StorageData.bulkIgnored; + let bulkIgnoredMessage = "-"; + if(bulkIgnored != 0.0){ + if(bulkIgnored == maxBagBulk){ + bulkIgnoredMessage = "All Items"; + } else { + bulkIgnoredMessage = "First "+bulkIgnored+" Bulk of Items"; + } + } + + itemDetails.append('
                      Bulk Storage
                      Bulk Ignored
                      '); + itemDetails.append('

                      '+maxBagBulk+'

                      '+bulkIgnoredMessage+'

                      '); + + itemDetails.append('
                      '); + } + + itemDetails.append(processText(itemDataStruct.Item.description, true, true, 'MEDIUM')); + + if(itemDataStruct.ShieldData != null) { // If item is shield, + itemDetails.append('
                      '); + itemDetails.append('

                      Hardness

                      '+itemDataStruct.Item.hardness+'

                      Hit Points

                      '+itemDataStruct.Item.hitPoints+'

                      BT

                      '+itemDataStruct.Item.brokenThreshold+'

                      '); + } + + let contentSourceHTML = getContentSource(itemDataStruct.Item.id, itemDataStruct.Item.contentSrc, itemDataStruct.Item.homebrewID).replace('position: fixed;', 'position: absolute;'); + itemDetails.append(contentSourceHTML); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/_quickviews.js b/client/vue-src/legacy-js/sheet/quickviews/_quickviews.js new file mode 100644 index 00000000..58faebed --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/_quickviews.js @@ -0,0 +1,234 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + let quickviews = bulmaQuickview.attach(); + + // Click will close right quickview (with protection) + $('#center-body, #main-top, #manageSpellsModalDefault').click(function () { + if ($('#quickviewDefault').hasClass('quickview-auto-close-protection')) { + $('#quickviewDefault').removeClass('quickview-auto-close-protection'); + } else { + if(!$('#quickviewDefault').hasClass('quickview-prevent-auto-close')){ + closeQuickView(); + } + } + }); + + // Double click will close left quickview + $('#center-body, #main-top, #manageSpellsModalDefault').dblclick(function () { + $('#quickviewLeftDefault').removeClass('is-active'); + }); + + // Press Esc key to close + $(document).on('keyup', function (e) { + if (e.which == 27) { + + if ($('#quickviewDefault').hasClass('is-active')) { + closeQuickView(); + } else if ($('#quickviewLeftDefault').hasClass('is-active')) { + $('#quickviewLeftDefault').removeClass('is-active'); + } else { + $('.modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + } + + } + }); + +}); + +let g_QViewLastType = null; +let g_QViewLastData = null; + +function openQuickView(type, data, noProtection = false) { + + $('#quickViewTitle').html(''); + $('#quickViewTitleRight').html(''); + $('#quickViewContent').html(''); + $('#quickViewContent').scrollTop(0); + + $('#quickViewTitleClose').html(''); + $('#quickViewClose').click(function () { + closeQuickView(); + }); + + if (!noProtection) { + $('#quickviewDefault').addClass('quickview-auto-close-protection'); + } + $('#quickviewDefault').addClass('is-active'); + + g_QViewLastType = type; + g_QViewLastData = data; + + if (type == 'addSpellView') { + openAddSpellQuickview(data); + } else if (type == 'spellView') { + openSpellQuickview(data); + } else if (type == 'spellEmptyView') { + openSpellEmptyQuickview(data); + } else if (type == 'skillView') { + openSkillQuickview(data); + } else if (type == 'abilityScoreView') { + openAbilityScoreQuickview(data); + } else if (type == 'heroPointsView') { + openHeroPointsQuickview(data); + } else if (type == 'languageView') { + openLanguageQuickview(data); + } else if (type == 'featView') { + openFeatQuickview(data); + } else if (type == 'savingThrowView') { + openSavingThrowQuickview(data); + } else if (type == 'perceptionView') { + openPerceptionQuickview(data); + } else if (type == 'speedView') { + openSpeedQuickview(data); + } else if (type == 'invItemView') { + openInvItemQuickview(data); + } else if (type == 'customizeItemView') { + openCustomizeItemQuickview(data); + } else if (type == 'addItemView') { + openAddItemQuickview(data); + } else if (type == 'itemView') { + openItemQuickview(data); + } else if (type == 'abilityView') { + openAbilityQuickview(data); + } else if (type == 'resistView') { + openResistancesQuickview(data); + } else if (type == 'resistListView') { + openResistancesListQuickview(data); + } else if (type == 'otherProfsView') { + openOtherProfsQuickview(data); + } else if (type == 'customizeProfView') { + openCustomizeProfQuickview(data); + } else if (type == 'addProfView') { + openAddProfQuickview(data); + } else if (type == 'addLoreView') { + openAddLoreQuickview(data); + } else if (type == 'addLangView') { + openAddLangQuickview(data); + } else if (type == 'addSpellSlotView') { + openAddSpellSlotQuickview(data); + } else if (type == 'addResistView') { + openAddResistQuickview(data); + } else if (type == 'addWeakView') { + openAddWeakQuickview(data); + } else if (type == 'addUnarmedAttackView') { + openAddUnarmedAttackQuickview(data); + } else if (type == 'tagView') { + openTagQuickview(data); + } else if (type == 'classDCView') { + openClassDCQuickview(data); + } else if (type == 'conditionView') { + openConditionQuickview(data); + } else if (type == 'acView') { + openACQuickview(data); + } else if (type == 'charInfoView') { + openCharInfoQuickview(data); + } else if (type == 'animalCompanionView') { + openAnimalCompQuickview(data); + } else if (type == 'familiarView') { + openFamiliarQuickview(data); + } else if (type == 'itemBreakdownView') { + openItemBreakdownQuickview(data); + } else if (type == 'generalBreakdownView') { + openGeneralBreakdownQuickview(data); + } else if (type == 'hitPointsBreakdownView') { + openHitPointsBreakdownQuickview(data); + } else if (type == 'abilityScoresBreakdownView') { + openAbilityScoresBreakdownQuickview(data); + } else if (type == 'warningsView') { + openWarningsQuickview(data); + } else if (type == 'creatureView') { + openCreatureQuickview(data); + } else if (type == 'creatureCustomView') { + openCreatureCustomQuickview(data); + } else if (type == 'characterView') { + openCharacterQuickview(data); + } + +} + +function closeQuickView() { + $('#quickviewDefault').removeClass('is-active'); + g_QViewLastData = null; + + // For toggle critical hit in invItem quickview + if (typeof g_invItemView_isCriticalHit !== 'undefined') { + g_invItemView_isCriticalHit = false; + } +} + +function addQuickViewProtection() { + $('#quickviewDefault').addClass('quickview-auto-close-protection'); +} + +function enablePreventQuickViewAutoClose(){ + $('#quickviewDefault').addClass('quickview-prevent-auto-close'); +} +function disablePreventQuickViewAutoClose(){ + $('#quickviewDefault').removeClass('quickview-prevent-auto-close'); +} + +function refreshQuickView(newData=g_QViewLastData) { + if ($('#quickviewDefault').hasClass('is-active')) { + let scrollAmt = $('#quickViewContent').parent().scrollTop(); + + openQuickView(g_QViewLastType, newData, true); + + $('#quickViewContent').parent().scrollTop(scrollAmt); + } +} + + +function addBackFunctionality(quickViewData) { + + if (quickViewData._prevBackData != null && quickViewData._prevBackData.Data != null) { + $('#quickViewTitleClose').html(''); + $('#quickViewBack').click(function () { + openQuickView(quickViewData._prevBackData.Type, quickViewData._prevBackData.Data, true); + }); + } + +} + +function getContentSource(contentID, contentSrc, homebrewID) { + + if (contentID != null && contentSrc == null && homebrewID == null) { + return '
                      #' + contentID + '
                      '; + } + + let sourceTextName, sourceLink; + if (homebrewID == null) { + sourceTextName = getContentSourceTextName(contentSrc); + sourceLink = getContentSourceLink(contentSrc); + if (sourceTextName == null) { sourceTextName = capitalizeWords(contentSrc); } + if (sourceLink == null) { sourceLink = ''; } + } else { + + sourceTextName = 'Bundle #' + homebrewID; + sourceLink = '/homebrew/?view_id=' + homebrewID; + + if (typeof g_enabledSources !== 'undefined') { + let enabledSource = g_enabledSources.find(enabledSource => { + return enabledSource.bundleID && enabledSource.bundleID + '' === homebrewID + ''; + }); + if (enabledSource) { + sourceTextName = enabledSource.name; + } + } + + } + + let contentIDStr = (contentID == null) ? '' : ', #' + contentID + ''; + return '
                      ' + sourceTextName + '' + contentIDStr + '
                      '; + +} + +function addContentSource(contentID, contentSrc, homebrewID) { + $('#quickViewContent').parent().css('position', 'relative'); + $('#quickViewContent').append(getContentSource(contentID, contentSrc, homebrewID)); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/ability-score-view.js b/client/vue-src/legacy-js/sheet/quickviews/ability-score-view.js new file mode 100644 index 00000000..305f4a13 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/ability-score-view.js @@ -0,0 +1,39 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAbilityScoreQuickview(data){ + + $('#quickViewTitle').html(data.AbilityName); + let qContent = $('#quickViewContent'); + + let abilityDescription = null; + + if(data.AbilityName == 'Strength'){ + abilityDescription = "Strength measures your character’s physical power. Strength is important if your character plans to engage in hand-to-hand combat. Your Strength modifier gets added to melee damage rolls and determines how much your character can carry."; + } else if(data.AbilityName == 'Dexterity'){ + abilityDescription = "Dexterity measures your character’s agility, balance, and reflexes. Dexterity is important if your character plans to make attacks with ranged weapons or use stealth to surprise foes. Your Dexterity modifier is also added to your character’s AC and Reflex saving throws."; + } else if(data.AbilityName == 'Constitution'){ + abilityDescription = "Constitution measures your character’s overall health and stamina. Constitution is an important statistic for all characters, especially those who fight in close combat. Your Constitution modifier is added to your Hit Points and Fortitude saving throws."; + } else if(data.AbilityName == 'Intelligence'){ + abilityDescription = "Intelligence measures how well your character can learn and reason. A high Intelligence allows your character to analyze situations and understand patterns, and it means they can become trained in additional skills and might be able to master additional languages."; + } else if(data.AbilityName == 'Wisdom'){ + abilityDescription = "Wisdom measures your character’s common sense, awareness, and intuition. Your Wisdom modifier is added to your Perception and Will saving throws."; + } else if(data.AbilityName == 'Charisma'){ + abilityDescription = "Charisma measures your character’s personal magnetism and strength of personality. A high Charisma score helps you influence the thoughts and moods of others. "; + } + + qContent.append('

                      Ability Score: '+data.AbilityScore+'

                      '); + qContent.append('

                      Ability Modifier: '+signNumber(data.AbilityMod)+'

                      '); + qContent.append('
                      '); + qContent.append('

                      '+abilityDescription+'

                      '); + qContent.append('
                      '); + qContent.append('

                      What is this all for?

                      '); + qContent.append('

                      Each ability represents a certain aspect of your character. The ability score is used to calculate that ability\'s modifier. That modifier is used to dictate how good or bad your character is in that aspect.

                      '); + /*ability score + qContent.append('
                      '); + qContent.append('

                      Calculating Ability Modifier from Score

                      '); + qContent.append('

                      To determine the ability modifier from its score, you must look at how far away it is from 10. For every 2 higher it is than 10, your modifier is that number greater. For example, the ability modifier of 16 is +3. If the score is odd, the modifier is the same of the score of one lower. So the ability modifier of 17 is still only +3. The same works in the opposite direction – the ability modifier of 8 is -1. The actual mathmatical formula for this is:

                      '); + qContent.append('

                      Modifier = ⌊(Score-10)/2⌋

                      ');*/ + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/ability-scores-breakdown-view.js b/client/vue-src/legacy-js/sheet/quickviews/ability-scores-breakdown-view.js new file mode 100644 index 00000000..54e76e91 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/ability-scores-breakdown-view.js @@ -0,0 +1,171 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + Requires variable-processing.js +*/ + +function openAbilityScoresBreakdownQuickview(data) { + + $('#quickViewTitle').html('Ability Scores'); + + let qContent = $('#quickViewContent'); + + const score_str = variables_getValue(VARIABLE.SCORE_STR); + const score_dex = variables_getValue(VARIABLE.SCORE_DEX); + const score_con = variables_getValue(VARIABLE.SCORE_CON); + const score_int = variables_getValue(VARIABLE.SCORE_INT); + const score_wis = variables_getValue(VARIABLE.SCORE_WIS); + const score_cha = variables_getValue(VARIABLE.SCORE_CHA); + + qContent.append(` +
                      +
                      +

                      Str

                      +

                      Dex

                      +

                      Con

                      +

                      Int

                      +

                      Wis

                      +

                      Cha

                      +
                      +
                      +

                      ${score_str.Score}

                      +

                      ${score_dex.Score}

                      +

                      ${score_con.Score}

                      +

                      ${score_int.Score}

                      +

                      ${score_wis.Score}

                      +

                      ${score_cha.Score}

                      +
                      +
                      + `); + + // Find greatest number of bonuses + let maxNumOfBonuses = 0; + if(score_str.Bonuses.size > maxNumOfBonuses) { maxNumOfBonuses = score_str.Bonuses.size; } + if(score_dex.Bonuses.size > maxNumOfBonuses) { maxNumOfBonuses = score_dex.Bonuses.size; } + if(score_con.Bonuses.size > maxNumOfBonuses) { maxNumOfBonuses = score_con.Bonuses.size; } + if(score_int.Bonuses.size > maxNumOfBonuses) { maxNumOfBonuses = score_int.Bonuses.size; } + if(score_wis.Bonuses.size > maxNumOfBonuses) { maxNumOfBonuses = score_wis.Bonuses.size; } + if(score_cha.Bonuses.size > maxNumOfBonuses) { maxNumOfBonuses = score_cha.Bonuses.size; } + + let inferSourceFromMetaData = function(metadata, value){ + let adjustmentWord = 'adjustment'; + if(value == 2) { + adjustmentWord = 'boost'; + } else if(value == -2) { + adjustmentWord = 'flaw'; + } + if(metadata.toLowerCase().includes('ancestry')){ + return 'This '+adjustmentWord+' comes from your ancestry.'; + } else if(metadata.toLowerCase().includes('background')){ + return 'This '+adjustmentWord+' comes from your background.'; + } else if(metadata.toLowerCase().includes('classability')){ + return 'This '+adjustmentWord+' comes from your class.'; + } else if(metadata.toLowerCase().includes('keyability')){ + return 'This '+adjustmentWord+' comes from your key ability, determined by your class.'; + } else { + return 'This '+adjustmentWord+' comes from an unknown source.'; + } + }; + + for (let i = 0; i < maxNumOfBonuses; i++) { + + const strBonus = Array.from(score_str.Bonuses)[i]; + const dexBonus = Array.from(score_dex.Bonuses)[i]; + const conBonus = Array.from(score_con.Bonuses)[i]; + const intBonus = Array.from(score_int.Bonuses)[i]; + const wisBonus = Array.from(score_wis.Bonuses)[i]; + const chaBonus = Array.from(score_cha.Bonuses)[i]; + + let strEntry = '

                      '; + if(strBonus != null){ + strEntry = `${signNumber(strBonus[1].Value)}`; + if(strBonus[1].Value < 0) { strEntry = strEntry.replace('has-text-info', 'has-text-danger'); } + } + let dexEntry = '

                      '; + if(dexBonus != null){ + dexEntry = `${signNumber(dexBonus[1].Value)}`; + if(dexBonus[1].Value < 0) { dexEntry = dexEntry.replace('has-text-info', 'has-text-danger'); } + } + let conEntry = '

                      '; + if(conBonus != null){ + conEntry = `${signNumber(conBonus[1].Value)}`; + if(conBonus[1].Value < 0) { conEntry = conEntry.replace('has-text-info', 'has-text-danger'); } + } + let intEntry = '

                      '; + if(intBonus != null){ + intEntry = `${signNumber(intBonus[1].Value)}`; + if(intBonus[1].Value < 0) { intEntry = intEntry.replace('has-text-info', 'has-text-danger'); } + } + let wisEntry = '

                      '; + if(wisBonus != null){ + wisEntry = `${signNumber(wisBonus[1].Value)}`; + if(wisBonus[1].Value < 0) { wisEntry = wisEntry.replace('has-text-info', 'has-text-danger'); } + } + let chaEntry = '

                      '; + if(chaBonus != null){ + chaEntry = `${signNumber(chaBonus[1].Value)}`; + if(chaBonus[1].Value < 0) { chaEntry = chaEntry.replace('has-text-info', 'has-text-danger'); } + } + + qContent.append(` +
                      +
                      ${strEntry}
                      +
                      ${dexEntry}
                      +
                      ${conEntry}
                      +
                      ${intEntry}
                      +
                      ${wisEntry}
                      +
                      ${chaEntry}
                      +
                      + `); + + } + + const strFinal = variables_getTotal(VARIABLE.SCORE_STR); + const dexFinal = variables_getTotal(VARIABLE.SCORE_DEX); + const conFinal = variables_getTotal(VARIABLE.SCORE_CON); + const intFinal = variables_getTotal(VARIABLE.SCORE_INT); + const wisFinal = variables_getTotal(VARIABLE.SCORE_WIS); + const chaFinal = variables_getTotal(VARIABLE.SCORE_CHA); + + if(strFinal > 18 || dexFinal > 18 || conFinal > 18 || intFinal > 18 || wisFinal > 18 || chaFinal > 18){ + qContent.append(`

                      Reduce boosts above 18

                      `); + } + + qContent.append(` +
                      +

                      =

                      +

                      =

                      +

                      =

                      +

                      =

                      +

                      =

                      +

                      =

                      +
                      + `); + + qContent.append(` +
                      +

                      ${strFinal}

                      +

                      ${dexFinal}

                      +

                      ${conFinal}

                      +

                      ${intFinal}

                      +

                      ${wisFinal}

                      +

                      ${chaFinal}

                      +
                      + `); + + qContent.append(` +
                      +

                      (${signNumber(getMod(strFinal))})

                      +

                      (${signNumber(getMod(dexFinal))})

                      +

                      (${signNumber(getMod(conFinal))})

                      +

                      (${signNumber(getMod(intFinal))})

                      +

                      (${signNumber(getMod(wisFinal))})

                      +

                      (${signNumber(getMod(chaFinal))})

                      +
                      + `); + + // + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/ability-view.js b/client/vue-src/legacy-js/sheet/quickviews/ability-view.js new file mode 100644 index 00000000..7cf5c157 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/ability-view.js @@ -0,0 +1,139 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAbilityQuickview(data) { + addBackFunctionality(data); + addContentSource(data.Ability.id, data.Ability.contentSrc, data.Ability.homebrewID); + + $('#quickViewTitle').html(data.Ability.name); + if(data.Ability.level != null && data.Ability.level > 0) { + $('#quickViewTitleRight').html('Level '+data.Ability.level+''); + } + let qContent = $('#quickViewContent'); + + qContent.append('
                      '+processText(data.Ability.description, true, true, 'MEDIUM')+'
                      '); + + if(data.Ability.selectType == "SELECTOR" && typeof g_classDetails !== 'undefined'){ + for(let classAbilChoice of g_classDetails.AbilityChoices){ + if(classAbilChoice.SelectorID == data.Ability.id){ + + // If has srcStruct (is extra class feature), confirm it's the correct one + if(data.Ability.srcStruct != null){ + if(!hasSameSrc(data.Ability.srcStruct, classAbilChoice)){ continue; } + } + + // Find ability option + let abilityOption = g_allClassAbilityOptions.find(ability => { + return ability.id == classAbilChoice.OptionID; + }); + if(abilityOption == null){ break; } + + let abilityOptionCardID = 'abilityOptionCard'+abilityOption.id; + + qContent.append('
                      '+abilityOption.name+'
                      '); + + $('#'+abilityOptionCardID).append(processText(abilityOption.description, true)); + + // Add Text Statements + processAddText(abilityOption.code, abilityOptionCardID); + + // Note Field Statements + let srcStruct = { // Hardcoded 'classAbilitySelector' sourceCode title name + sourceType: null, + sourceLevel: null, + sourceCode: 'classAbilitySelector-'+abilityOption.selectOptionFor, + sourceCodeSNum: 'a', + }; + + if(typeof displayNotesField === "function") { + displayNotesField($('#'+abilityOptionCardID), srcStruct); + } + + break; + + } + } + } + + // Add Text Statements + if(typeof processAddText === "function") { + processAddText(data.Ability.code, 'quickViewContent'); + } + + // Note Field Statements + let srcStruct = { // Hardcoded 'classAbility' sourceCode title name + sourceType: null, + sourceLevel: null, + sourceCode: 'classAbility-'+data.Ability.id, + sourceCodeSNum: 'a', + }; + if(typeof displayNotesField === "function") { + displayNotesField(qContent, srcStruct); + } + + showFeatListOptions(qContent, data.Ability.code); + + if(typeof g_isDeveloper !== 'undefined' && g_isDeveloper && data.Ability.code != null && data.Ability.code.trim() != '') { + qContent.append('
                      '); + qContent.append('

                      WSC Statements

                      '); + + let codeHTML = ''; + for(let codeStatement of data.Ability.code.split(/\n/)){ + codeHTML += '

                      '+codeStatement+'

                      '; + } + qContent.append('
                      '+codeHTML+'
                      '); + } + +} + + +function showFeatListOptions(qContent, wscStatements){ + if(wscStatements == null) {return;} + + let statementArray = wscStatements.split(/\n/); + + let statementCounts = {}; + statementArray.forEach(function(x) { statementCounts[x] = (statementCounts[x] || 0)+1; }); + + for(let statement in statementCounts) { + if(statement.includes("GIVE-FEAT-FROM=")){ // GIVE-FEAT-FROM=Choose a Tradition:feat 1,feat 2,feat 2 + let value = statement.split('GIVE-FEAT-FROM=')[1]; + let valueParts = value.split(':'); + if(valueParts.length != 2){ displayError('Invalid syntax "'+statement+'"'); continue; } + let selectorTitle = valueParts[0]; + let featNameList = handleVariableText(valueParts[1]).split(','); + + let repetitionWord = numToRepetitionWord(statementCounts[statement]); + + let listText = '**'+selectorTitle+' '+repetitionWord+'**\n'; + + let detectSameBeginningDashText = function(){ + let beginningDashText = null; + for(let featName of featNameList){ + if(beginningDashText == null){ + if(featName.includes(' - ')){ + beginningDashText = featName.split(' - ')[0]; + } else { + return null; + } + } else { + if(!featName.startsWith(beginningDashText+' - ')){ + return null; + } + } + } + return beginningDashText; + }; + const beginningDashText = detectSameBeginningDashText(); + + for(let featName of featNameList){ + if(featName.endsWith('}')){ featName = featName.replace('}',''); } + let displayFeatName = featName.replace(beginningDashText+' - ', ''); + listText += '* : (feat: '+displayFeatName+' | '+featName+')\n'; + } + qContent.append('
                      '); + qContent.append('
                      '+processText(listText, true, true, 'MEDIUM')+'
                      '); + } + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/ac-view.js b/client/vue-src/legacy-js/sheet/quickviews/ac-view.js new file mode 100644 index 00000000..98db1c43 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/ac-view.js @@ -0,0 +1,79 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openACQuickview(data) { + + $('#quickViewTitle').html('Armor Class - '+data.ArmorItemName+''); + + let qContent = $('#quickViewContent'); + + let profName = getProfNameFromNumUps(data.NumUps); + qContent.append('

                      Proficiency: '+profName+'

                      '); + + qContent.append('
                      '); + qContent.append('

                      Your Armor Class (AC) measures how well you can defend against attacks. When a creature attacks you, your Armor Class is the DC for that attack roll.

                      '); + qContent.append('
                      '); + qContent.append('

                      AC Breakdown

                      '); + + let breakDownInnerHTML = '

                      '+data.TotalAC+' = 10 + '; + + breakDownInnerHTML += ''+data.DexMod+''; + + breakDownInnerHTML += ' + '; + + breakDownInnerHTML += ''+data.ArmorBonus+''; + + breakDownInnerHTML += ' + '; + + if(profName == "Untrained") { + let untrainedProfBonus = 0; + if(gOption_hasProfWithoutLevel){ + untrainedProfBonus = -2; + } + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + if(gOption_hasProfWithoutLevel){ + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + breakDownInnerHTML += ''+data.ProfNum+''; + } + } + + breakDownInnerHTML += ' + '; + + let amalgBonus = data.TotalAC - (data.DexMod + data.ProfNum + data.ArmorBonus + 10); + breakDownInnerHTML += ''+amalgBonus+''; + + breakDownInnerHTML += '

                      '; + + qContent.append(breakDownInnerHTML); + + let amalgBonuses = getStatExtraBonuses(VARIABLE.AC); + if(amalgBonuses != null && amalgBonuses.length > 0){ + $('#amalgBonusNum').removeClass('has-tooltip-multiline'); + let amalgTooltipText = 'Additional adjustments:'; + for(let amalgExtra of amalgBonuses){ + amalgTooltipText += '\n'+amalgExtra; + } + $('#amalgBonusNum').attr('data-tooltip', amalgTooltipText); + } else { + $('#amalgBonusNum').addClass('has-tooltip-multiline'); + $('#amalgBonusNum').attr('data-tooltip', amalgamationBonusText); + } + + // Conditionals // + let conditionalStatMap = getConditionalStatMap(VARIABLE.AC); + if(conditionalStatMap != null && conditionalStatMap.size != 0){ + + qContent.append('
                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of conditionalStatMap.entries()){ + qContent.append('

                      '+condition+'

                      '); + } + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-item-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-item-view.js new file mode 100644 index 00000000..bcdfc438 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-item-view.js @@ -0,0 +1,947 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_addItems_itemSearchMap = null; +let g_addItems_appliedFilters = 0; +let g_addItems_itemMaxDisplay = 0; +const g_addItems_displayIncrement = 20; + +function openAddItemQuickview(data) { + + $('#quickViewTitle').html('Add Items'); + $('#quickViewTitleRight').html(''); + $('#createCustomItemBtn').click(function(){ + $(this).addClass('is-loading'); + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + data.InvID, + 62, // Hardcoded New Item ID + 1); + $(this).blur(); + }); + + let qContent = $('#quickViewContent'); + + qContent.append(` +
                      + +
                      + `); + + qContent.append(`
                      `); + + qContent.append(`
                      `); + + $('#addItemTabSearch').click(function(){ + + $('#addItemFilterSection').html(` +
                      +
                      +

                      +
                      +
                      + `); + $('#addItem-filterNameInput').on('input', function() { + applyFiltersAndItemSearch('addItemTabSearch', data); + }); + + applyFiltersAndItemSearch('addItemTabSearch', data); + }); + + $('#addItemTabAdvanced').click(function(){ + + $('#addItemFilterSection').html(` +
                      +
                      +

                      Applied Filters 0

                      +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      +

                      + + + +

                      +

                      + +

                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      +

                      + + + +

                      +

                      + +

                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      +

                      + + + +

                      +

                      + +

                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      + `); + for(let tag of g_allTags){ + $('#addItem-filterTagsInput').append(''); + } + $("#addItem-filterTagsInput").chosen({width: "100%"}); + $("#addItem-filterTagsInput").chosen(); + + $('#addItemFilterReveal').click(function(){ + if($('#addItemFilterApplySection').hasClass('is-hidden')){ + $('#addItemFilterChevron').removeClass('fa-chevron-up'); + $('#addItemFilterChevron').addClass('fa-chevron-down'); + $('#addItemFilterApplySection').removeClass('is-hidden'); + } else { + $('#addItemFilterChevron').removeClass('fa-chevron-down'); + $('#addItemFilterChevron').addClass('fa-chevron-up'); + $('#addItemFilterApplySection').addClass('is-hidden'); + } + }); + + $('#addItem-filterNameInput, #addItem-filterItemUsageInput, #addItem-filterDescInput, #addItem-filterLevelInput, #addItem-filterItemPriceInput, #addItem-filterItemBulkInput').on('input', function() { + applyFiltersAndItemSearch('addItemTabAdvanced', data); + }); + $('#addItem-filterTagsInput, #addItem-filterLevelRelationInput, #addItem-filterItemPriceRelationInput, #addItem-filterItemBulkRelationInput, #addItem-filterRarityInput, #addItem-filterItemCategoryInput').change(function(){ + applyFiltersAndItemSearch('addItemTabAdvanced', data); + }); + + applyFiltersAndItemSearch('addItemTabAdvanced', data); + }); + + $('#addItemTabCurrency').click(function(){ + $('#addItemFilterSection').html(`
                      `); + applyFiltersAndItemSearch('addItemTabCurrency', data); + }); + + $('#addItemTabSearch').click(); + +} + + + + + +function applyFiltersAndItemSearch(type, data){ + + $('#addItemListSection').html(''); + + $('#addItemTabSearch').parent().removeClass("is-active"); + $('#addItemTabAdvanced').parent().removeClass("is-active"); + $('#addItemTabCurrency').parent().removeClass("is-active"); + $('#'+type).parent().addClass("is-active"); + + + g_addItems_itemSearchMap = new Map(data.ItemMap); + g_addItems_appliedFilters = 0; + g_addItems_itemMaxDisplay = g_addItems_displayIncrement; + + if(type == 'addItemTabSearch' || type == 'addItemTabAdvanced'){ + + // Item Name + if($('#addItem-filterNameInput').val() != ''){ + + console.log('Add Item - Filtering by Name...'); + g_addItems_appliedFilters++; + + let parts = $('#addItem-filterNameInput').val().toUpperCase().split(' '); + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + if(!textContainsWords(itemStruct.Item.name, parts)){ + g_addItems_itemSearchMap.delete(itemID); + } + } + + $('#addItem-filterNameInput').addClass('is-info'); + } else { + $('#addItem-filterNameInput').removeClass('is-info'); + } + + } + + if(type == 'addItemTabAdvanced'){ + + // Item Usage + if($('#addItem-filterItemUsageInput').val() != ''){ + + console.log('Add Item - Filtering by Usage...'); + g_addItems_appliedFilters++; + + let parts = $('#addItem-filterItemUsageInput').val().toUpperCase().split(' '); + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + if(!textContainsWords(itemStruct.Item.usage, parts)){ + g_addItems_itemSearchMap.delete(itemID); + } + } + console.log('Matching Items: '+g_addItems_itemSearchMap.size); + + $('#addItem-filterItemUsageInput').addClass('is-info'); + } else { + $('#addItem-filterItemUsageInput').removeClass('is-info'); + } + + // Item Description + if($('#addItem-filterDescInput').val() != ''){ + + console.log('Add Item - Filtering by Description...'); + g_addItems_appliedFilters++; + + let parts = $('#addItem-filterDescInput').val().toUpperCase().split(' '); + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + if(!textContainsWords(itemStruct.Item.description, parts)){ + g_addItems_itemSearchMap.delete(itemID); + } + } + console.log('Matching Items: '+g_addItems_itemSearchMap.size); + + $('#addItem-filterDescInput').addClass('is-info'); + } else { + $('#addItem-filterDescInput').removeClass('is-info'); + } + + // Item Level + if($('#addItem-filterLevelInput').val() != ''){ + + console.log('Add Item - Filtering by Level...'); + g_addItems_appliedFilters++; + + let level = parseInt($('#addItem-filterLevelInput').val()); + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + switch($('#addItem-filterLevelRelationInput').val()) { + case 'EQUAL': if(itemStruct.Item.level === level) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'LESS': if(itemStruct.Item.level < level) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'GREATER': if(itemStruct.Item.level > level) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'LESS-EQUAL': if(itemStruct.Item.level <= level) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'GREATER-EQUAL': if(itemStruct.Item.level >= level) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'NOT-EQUAL': if(itemStruct.Item.level !== level) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + default: break; + } + } + console.log('Matching Items: '+g_addItems_itemSearchMap.size); + + $('#addItem-filterLevelInput').addClass('is-info'); + } else { + $('#addItem-filterLevelInput').removeClass('is-info'); + } + + // Item Price + if($('#addItem-filterItemPriceInput').val() != ''){ + + console.log('Add Item - Filtering by Price...'); + g_addItems_appliedFilters++; + + let price = parseInt($('#addItem-filterItemPriceInput').val()); + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + switch($('#addItem-filterItemPriceRelationInput').val()) { + case 'EQUAL': if(itemStruct.Item.price === price) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'LESS': if(itemStruct.Item.price < price) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'GREATER': if(itemStruct.Item.price > price) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'LESS-EQUAL': if(itemStruct.Item.price <= price) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'GREATER-EQUAL': if(itemStruct.Item.price >= price) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'NOT-EQUAL': if(itemStruct.Item.price !== price) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + default: break; + } + } + console.log('Matching Items: '+g_addItems_itemSearchMap.size); + + $('#addItem-filterItemPriceInput').addClass('is-info'); + } else { + $('#addItem-filterItemPriceInput').removeClass('is-info'); + } + + // Item Bulk + if($('#addItem-filterItemBulkInput').val() != ''){ + + console.log('Add Item - Filtering by Bulk...'); + g_addItems_appliedFilters++; + + let bulk = parseInt($('#addItem-filterItemBulkInput').val()); + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + switch($('#addItem-filterItemBulkRelationInput').val()) { + case 'EQUAL': if(itemStruct.Item.bulk === bulk) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'LESS': if(itemStruct.Item.bulk < bulk) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'GREATER': if(itemStruct.Item.bulk > bulk) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'LESS-EQUAL': if(itemStruct.Item.bulk <= bulk) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'GREATER-EQUAL': if(itemStruct.Item.bulk >= bulk) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + case 'NOT-EQUAL': if(itemStruct.Item.bulk !== bulk) {} else {g_addItems_itemSearchMap.delete(itemID);} break; + default: break; + } + } + console.log('Matching Items: '+g_addItems_itemSearchMap.size); + + $('#addItem-filterItemBulkInput').addClass('is-info'); + } else { + $('#addItem-filterItemBulkInput').removeClass('is-info'); + } + + // Item Rarity + if($('#addItem-filterRarityInput').val() != 'ANY'){ + + console.log('Add Item - Filtering by Rarity...'); + g_addItems_appliedFilters++; + + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + if(itemStruct.Item.rarity !== $('#addItem-filterRarityInput').val()){ + g_addItems_itemSearchMap.delete(itemID); + } + } + console.log('Matching Items: '+g_addItems_itemSearchMap.size); + + $('#addItem-filterRarityInput').parent().addClass('is-info'); + } else { + $('#addItem-filterRarityInput').parent().removeClass('is-info'); + } + + // Item Category + if($('#addItem-filterItemCategoryInput').val() != 'ANY'){ + + console.log('Add Item - Filtering by Category...'); + g_addItems_appliedFilters++; + + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + if(itemStruct.Item.itemType != $('#addItem-filterItemCategoryInput').val()){ + g_addItems_itemSearchMap.delete(itemID); + } + } + console.log('Matching Items: '+g_addItems_itemSearchMap.size); + + $('#addItem-filterItemCategoryInput').parent().addClass('is-info'); + } else { + $('#addItem-filterItemCategoryInput').parent().removeClass('is-info'); + } + + // Item Traits + if($('#addItem-filterTagsInput').val().length > 0){ + + console.log('Add Item - Filtering by Traits...'); + g_addItems_appliedFilters++; + + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + let foundTags = itemStruct.TagArray.filter(tag => { + return $('#addItem-filterTagsInput').val().includes(tag.id+""); + }); + if(foundTags.length !== $('#addItem-filterTagsInput').val().length){ + g_addItems_itemSearchMap.delete(itemID); + } + } + console.log('Matching Items: '+g_addItems_itemSearchMap.size); + + } + + // Update filter count + $('#addItemFilterNumOfFilters').text(g_addItems_appliedFilters); + + } + + if(type == 'addItemTabCurrency'){ + for(const [itemID, itemStruct] of g_addItems_itemSearchMap.entries()){ + if(itemStruct.Item.itemType != 'CURRENCY') { + g_addItems_itemSearchMap.delete(itemID); + } + } + } + + if(g_addItems_appliedFilters > 0 || type == 'addItemTabCurrency'){ + listItemsFromSearch(data); + } + +} + +function listItemsFromSearch(data){ + + $('#addItemListSection').html(''); + + let itemCount = 0; + let didntLoadAll = false; + for(const [itemID, itemDataStruct] of g_addItems_itemSearchMap.entries()){ + if(itemDataStruct.Item.hidden == 1 || itemDataStruct.Item.isArchived == 1) {continue;} + itemCount++; + displayAddItem(itemID, itemDataStruct, data); + if(itemCount >= g_addItems_itemMaxDisplay){ didntLoadAll = true; break; } + } + + $('.itemEntryPart').click(function(){ + + let itemID = $(this).parent().attr('data-item-id'); + let itemDataStruct = data.ItemMap.get(itemID+""); + + let addItemChevronItemID = 'addItemChevronItemID'+itemID; + let addItemNameID = 'addItemName'+itemID; + let addItemDetailsItemID = 'addItemDetailsItem'+itemID; + if($('#'+addItemDetailsItemID).html() != ''){ + $('#'+addItemChevronItemID).removeClass('fa-chevron-up'); + $('#'+addItemChevronItemID).addClass('fa-chevron-down'); + $('#'+addItemNameID).removeClass('has-text-white-ter'); + //$(this).parent().removeClass('has-bg-options-header-bold'); + displayItemDetails(null, addItemDetailsItemID); + } else { + $('#'+addItemChevronItemID).removeClass('fa-chevron-down'); + $('#'+addItemChevronItemID).addClass('fa-chevron-up'); + $('#'+addItemNameID).addClass('has-text-white-ter'); + //$(this).parent().addClass('has-bg-options-header-bold'); + displayItemDetails(itemDataStruct, addItemDetailsItemID); + } + + }); + + if(didntLoadAll){ + $('#addItemListSection').append(` + + `); + $('#addItemLoadMore').click(function(){ + g_addItems_itemMaxDisplay += g_addItems_displayIncrement; + listItemsFromSearch(data); + }); + } + +} + +function displayAddItem(itemID, itemDataStruct, data){ + + if(itemDataStruct.Item.hidden == 1 || itemDataStruct.Item.isArchived == 1){ + return; + } + + let addItemAddItemID = 'addItemAddItem'+itemID; + let addItemChevronItemID = 'addItemChevronItemID'+itemID; + let addItemNameID = 'addItemName'+itemID; + let addItemDetailsItemID = 'addItemDetailsItem'+itemID; + + let itemLevel = (itemDataStruct.Item.level == 0 || itemDataStruct.Item.level == 999) ? "" : "Lvl "+itemDataStruct.Item.level; + + let itemName = itemDataStruct.Item.name; + if(itemDataStruct.Item.quantity > 1){ + itemName += ' ('+itemDataStruct.Item.quantity+')'; + } + + + let addItemHTML = null; + if (itemDataStruct.Item.itemType == 'CURRENCY'){ + addItemHTML = ''; + } else if (itemDataStruct.Item.price == 0) { + addItemHTML = '
                      '; + } else { + addItemHTML = '
                      '; + } + + $('#addItemListSection').append(` +
                      +
                      +

                      ${getItemIcon(itemDataStruct, null)}${itemName}

                      +
                      +
                      +

                      ${itemLevel}

                      +
                      +
                      ${addItemHTML}
                      +
                      + +
                      +
                      +
                      + `); + + if(itemDataStruct.Item.itemType != 'CURRENCY'){ + + $('#'+addItemAddItemID).change(function(){ + let addItemType = $("#"+addItemAddItemID+" option:selected").val(); + if(addItemType != 'chooseDefault') { + + if(addItemType == 'FORMULA') { + socket.emit("requestAddItemCustomizeToInv", + getCharIDFromURL(), + data.InvID, + 95, // Hardcoded - Parchment ID + { + name: 'Formula - '+itemDataStruct.Item.name, + price: 0, + bulk: 0, + description: 'This thin sheet of parchment is a schematic, containing the instructions for making the (item: '+itemDataStruct.Item.name.replaceAll(/[\(\)]/g, '')+') item.', + size: 'MEDIUM', + isShoddy: 0, + materialType: null, + hitPoints: 1, + brokenThreshold: 0, + hardness: 0, + code: null, + itemTagsData: null, + + weaponDieType: null, + weaponDamageType: null, + + storageMaxBulk: null, + + quantity: 1 + } + ); + } + + if(addItemType == 'GIVE') { + $(this).parent().addClass('is-loading'); + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + data.InvID, + itemID, + itemDataStruct.Item.quantity); + } + + if(addItemType == 'BUY') { + + const itemPrice = getConvertedPriceForSize(itemDataStruct.Item.size, itemDataStruct.Item.price); + let itemPriceInCP = itemPrice; + + const itemPriceSingleInCP = Math.ceil(itemPrice / itemDataStruct.Item.quantity); + const maxQtyForItem = Math.floor(getTotalCoinsInCP() / itemPriceSingleInCP); + + if(hasCoins(itemPriceInCP)){ + + let buyQtyHTML = ''; + if(itemDataStruct.Item.hasQuantity == 1){ + buyQtyHTML = ` + + + + + + + + `; + } + + new ConfirmMessage('Buy “'+itemDataStruct.Item.name+'”'+buyQtyHTML, 'This purchase will cost '+getCoinToString(itemPriceInCP)+', buying it will automatically simplify your coins. Are you sure you want to buy this?', 'Buy Item', 'modal-buy-item', 'modal-buy-item-btn', 'is-success'); + + if(itemDataStruct.Item.hasQuantity == 1){ + $('#modal-buy-item-qty-input').blur(function() { + let itemQty = parseInt($(this).val()); + if(isNaN(itemQty) || itemQty < 1) { itemQty = 1; } + if(itemQty > maxQtyForItem) { itemQty = maxQtyForItem; } + $(this).val(itemQty); + + itemPriceInCP = Math.ceil(itemPrice * (itemQty / itemDataStruct.Item.quantity)); + $('#modal-buy-item-price').text(getCoinToString(itemPriceInCP)); + + }); + } + + $('#modal-buy-item-btn').click(function(event) { + reduceAndSimplifyCoins(itemPriceInCP); + + let itemQty = itemDataStruct.Item.quantity; + if(itemDataStruct.Item.hasQuantity == 1){ + itemQty = parseInt($('#modal-buy-item-qty-input').val()); + if(isNaN(itemQty) || itemQty < 1) { itemQty = 1; } + if(itemQty > maxQtyForItem) { itemQty = maxQtyForItem; } + } + + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + data.InvID, + itemID, + itemQty); + }); + + } else { + + new ConfirmMessage('Insufficient Funds', 'This item costs '+itemPriceStr+', more than you have in your inventory.', 'Okay', 'modal-fail-to-buy-item', 'modal-fail-to-buy-item-btn'); + addQuickViewProtection(); + + } + + } + $("#"+addItemAddItemID).val('chooseDefault'); + } + }); + + } else { + + $('#'+addItemAddItemID).click(function(){ + $(this).addClass('is-loading'); + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + data.InvID, + itemID, + itemDataStruct.Item.quantity); + $(this).blur(); + }); + + } + +} + +function displayItemDetails(itemDataStruct, addItemDetailsItemID){ + + if(itemDataStruct == null){ + $('#'+addItemDetailsItemID).html(''); + return; + } + + $('#'+addItemDetailsItemID).html('
                      '); + let itemDetails = $('#'+addItemDetailsItemID+' > div'); + + let rarity = itemDataStruct.Item.rarity; + let tagsInnerHTML = ''; + switch(rarity) { + case 'UNCOMMON': tagsInnerHTML += ''; + break; + case 'RARE': tagsInnerHTML += ''; + break; + case 'UNIQUE': tagsInnerHTML += ''; + break; + default: break; + } + + let itemSize = itemDataStruct.Item.size; + switch(itemSize) { + case 'TINY': tagsInnerHTML += ''; + break; + case 'SMALL': tagsInnerHTML += ''; + break; + case 'LARGE': tagsInnerHTML += ''; + break; + case 'HUGE': tagsInnerHTML += ''; + break; + case 'GARGANTUAN': tagsInnerHTML += ''; + break; + default: break; + } + + for(const tag of itemDataStruct.TagArray){ + let tagDescription = tag.description; + if(tagDescription.length > g_tagStringLengthMax){ + tagDescription = tagDescription.substring(0, g_tagStringLengthMax); + tagDescription += '...'; + } + tagsInnerHTML += ''; + } + + if(tagsInnerHTML != ''){ + itemDetails.append('
                      '+tagsInnerHTML+'
                      '); + itemDetails.append('
                      '); + } + + $('.tagButton').click(function(){ + let tagName = $(this).text(); + openQuickView('tagView', { + TagName : tagName, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + if(itemDataStruct.WeaponData != null){ + + let weapGroup = ''; + if(itemDataStruct.WeaponData.isRanged == 1){ + if(itemDataStruct.WeaponData.rangedWeaponType == 'CROSSBOW'){ + weapGroup += 'Bow'; + } else { + weapGroup += capitalizeWord(itemDataStruct.WeaponData.rangedWeaponType); + } + } + if(itemDataStruct.WeaponData.isMelee == 1){ + if(weapGroup != ''){ + weapGroup += ' & '; + } + weapGroup += capitalizeWord(itemDataStruct.WeaponData.meleeWeaponType); + } + + let weapCategory = capitalizeWord(itemDataStruct.WeaponData.category); + itemDetails.append('

                      Category: '+weapCategory+'

                      Group: '+weapGroup+'

                      '); + + itemDetails.append('
                      '); + + } + + if(itemDataStruct.ArmorData != null){ + + let armorCategory = capitalizeWord(itemDataStruct.ArmorData.category); + let armorGroup = (itemDataStruct.ArmorData.armorType == 'N/A') ? '-' : capitalizeWord(itemDataStruct.ArmorData.armorType); + itemDetails.append('

                      Category: '+armorCategory+'

                      Group: '+armorGroup+'

                      '); + + itemDetails.append('
                      '); + + } + + + let price = getConvertedPriceForSize(itemDataStruct.Item.size, itemDataStruct.Item.price); + price = getCoinToString(price); + if(itemDataStruct.Item.quantity > 1){ + price += ' for '+itemDataStruct.Item.quantity; + } + + let bulk = determineItemBulk(g_charSize, itemDataStruct.Item.size, itemDataStruct.Item.bulk); + bulk = getBulkFromNumber(bulk); + + itemDetails.append('
                      Price
                      Bulk
                      Hands
                      '); + itemDetails.append('

                      '+price+'

                      '+bulk+'

                      '+getHandsToString(itemDataStruct.Item.hands)+'

                      '); + + if(itemDataStruct.Item.usage != null){ + itemDetails.append('
                      '); + itemDetails.append('

                      Usage: '+itemDataStruct.Item.usage+'

                      '); + } + + itemDetails.append('
                      '); + + + if(itemDataStruct.WeaponData != null){ + + let consumableTag = itemDataStruct.TagArray.find(tag => { + return tag.id == 402; // Hardcoded Consumable Tag ID + }); + + // Fixes Prisma empty enum for dieType, like for Blowguns + if(itemDataStruct.WeaponData.dieType == 'EMPTY_ENUM_VALUE'){ + itemDataStruct.WeaponData.dieType = ''; + } + + let damage = itemDataStruct.WeaponData.diceNum+""+itemDataStruct.WeaponData.dieType+" "+itemDataStruct.WeaponData.damageType; + damage = (consumableTag != null) ? 'See Text' : damage; + + itemDetails.append('
                      Damage
                      '); + itemDetails.append('

                      '+damage+'

                      '); + + itemDetails.append('
                      '); + + if(itemDataStruct.WeaponData.isRanged == 1){ + + let reload = itemDataStruct.WeaponData.rangedReload; + if(reload == 0){ reload = '-'; } + let range = itemDataStruct.WeaponData.rangedRange+" ft"; + itemDetails.append('
                      Range
                      Reload
                      '); + itemDetails.append('

                      '+range+'

                      '+reload+'

                      '); + + itemDetails.append('
                      '); + + } + + } + + if(itemDataStruct.ArmorData != null){ + + itemDetails.append('
                      AC Bonus
                      Dex Cap
                      '); + itemDetails.append('

                      '+signNumber(itemDataStruct.ArmorData.acBonus)+'

                      '+signNumber(itemDataStruct.ArmorData.dexCap)+'

                      '); + + itemDetails.append('
                      '); + + let minStrength = (itemDataStruct.ArmorData.minStrength == 0) ? '-' : itemDataStruct.ArmorData.minStrength+''; + let checkPenalty = (itemDataStruct.ArmorData.checkPenalty == 0) ? '-' : itemDataStruct.ArmorData.checkPenalty+''; + let speedPenalty = (itemDataStruct.ArmorData.speedPenalty == 0) ? '-' : itemDataStruct.ArmorData.speedPenalty+' ft'; + itemDetails.append('
                      Strength
                      Check Penalty
                      Speed Penalty
                      '); + itemDetails.append('

                      '+minStrength+'

                      '+checkPenalty+'

                      '+speedPenalty+'

                      '); + + itemDetails.append('
                      '); + + } + + if(itemDataStruct.ShieldData != null){ + + let speedPenalty = (itemDataStruct.ShieldData.speedPenalty == 0) ? '-' : itemDataStruct.ShieldData.speedPenalty+' ft'; + itemDetails.append('
                      AC Bonus
                      Speed Penalty
                      '); + itemDetails.append('

                      '+signNumber(itemDataStruct.ShieldData.acBonus)+'

                      '+speedPenalty+'

                      '); + + itemDetails.append('
                      '); + + } + + if(itemDataStruct.StorageData != null){ + + let maxBagBulk = itemDataStruct.StorageData.maxBulkStorage; + let bulkIgnored = itemDataStruct.StorageData.bulkIgnored; + let bulkIgnoredMessage = "-"; + if(bulkIgnored != 0.0){ + if(bulkIgnored == maxBagBulk){ + bulkIgnoredMessage = "All Items"; + } else { + bulkIgnoredMessage = "First "+bulkIgnored+" Bulk of Items"; + } + } + + itemDetails.append('
                      Bulk Storage
                      Bulk Ignored
                      '); + itemDetails.append('

                      '+maxBagBulk+'

                      '+bulkIgnoredMessage+'

                      '); + + itemDetails.append('
                      '); + } + + itemDetails.append(processText(itemDataStruct.Item.description, true, true, 'MEDIUM')); + + if(itemDataStruct.ShieldData != null) { // If item is shield, + itemDetails.append('
                      '); + itemDetails.append('

                      Hardness

                      '+itemDataStruct.Item.hardness+'

                      Hit Points

                      '+itemDataStruct.Item.hitPoints+'

                      BT

                      '+itemDataStruct.Item.brokenThreshold+'

                      '); + } + + let contentSourceHTML = getContentSource(itemDataStruct.Item.id, itemDataStruct.Item.contentSrc, itemDataStruct.Item.homebrewID).replace('position: fixed;', 'position: absolute;'); + itemDetails.append(contentSourceHTML); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-lang-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-lang-view.js new file mode 100644 index 00000000..9222fd11 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-lang-view.js @@ -0,0 +1,51 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAddLangQuickview(data) { + + $('#quickViewTitle').html("Add Language"); + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + + qContent.append('
                      '); + + let langSelection = $('#addLangSelection'); + langSelection.append(''); + langSelection.append(''); + for(const lang of g_allLanguages) { + langSelection.append(''); + } + + $('#addLangAddButton').click(function(){ + + let langID = $('#addLangSelection').val(); + + if(langID != 'chooseDefault') { + + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: 'Lang #'+langID, + sourceCodeSNum: 'a', + }; + socket.emit("requestLanguageChange", + getCharIDFromURL(), + srcStruct, + langID + ); + + // Add lang to character's lang array + let lang = g_allLanguages.find(lang => { + return lang.id == langID; + }); + if(lang != null) { + g_langArray.push({ sourceType: 'user-added', value: lang }); + } + + } + + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-lore-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-lore-view.js new file mode 100644 index 00000000..9a50e0fd --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-lore-view.js @@ -0,0 +1,49 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAddLoreQuickview(data) { + + $('#quickViewTitle').html("Add Lore Skill"); + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + $('#addLoreAddButton').click(function(){ + + let loreName = $('#addLoreNewLoreName').val(); + + let validNameRegex = /^[A-Za-z0-9 \-_']+$/; + if(loreName != null && loreName != '' && validNameRegex.test(loreName)){ + $('#addLoreNewLoreName').removeClass("is-danger"); + + let abilScore = $('#addLoreNewAbilityScore').val(); + if(abilScore == 'INT') { abilScore = null; } + + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: loreName+' Lore', + sourceCodeSNum: 'a', + }; + socket.emit("requestLoreChange", + getCharIDFromURL(), + srcStruct, + loreName, + null, + 'T', + 'User-Added', + abilScore + ); + + } else { + $('#addLoreNewLoreName').addClass("is-danger"); + } + + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-prof-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-prof-view.js new file mode 100644 index 00000000..d4254340 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-prof-view.js @@ -0,0 +1,109 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAddProfQuickview(data) { + + $('#quickViewTitle').html("Add Proficiency"); + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + let sortedItemMap = new Map([...g_itemMap.entries()].sort( + function(a, b) { + return a[1].Item.name > b[1].Item.name ? 1 : -1; + }) + ); + + $('#addProfType').change(function() { + let profSubType = $('#addProfSubType'); + profSubType.html(''); + + let profType = $(this).val(); + + if(profType == 'Attack'){ + + profSubType.append(''); + profSubType.append(''); + profSubType.append(''); + profSubType.append(''); + + profSubType.append(''); + + for(const [itemID, itemDataStruct] of sortedItemMap.entries()){ + if(itemDataStruct.Item.itemType == 'WEAPON' && itemDataStruct.Item.hidden === 0 && itemDataStruct.WeaponData != null && itemDataStruct.WeaponData.profName == itemDataStruct.Item.name){ + + let profValue = itemDataStruct.Item.name.replace(/\s/g,'_'); + profSubType.append(''); + + } + } + + } else if(profType == 'Defense'){ + + profSubType.append(''); + profSubType.append(''); + profSubType.append(''); + profSubType.append(''); + + profSubType.append(''); + + for(const [itemID, itemDataStruct] of sortedItemMap.entries()){ + + if(itemDataStruct.Item.itemType == 'ARMOR' && itemDataStruct.Item.hidden === 0 && itemDataStruct.ArmorData != null && itemDataStruct.ArmorData.profName == itemDataStruct.Item.name){ + + let profValue = itemDataStruct.Item.name.replace(/\s/g,'_'); + profSubType.append(''); + + } + } + + } else if(profType == 'SpellAttack'){ + + profSubType.append(''); + profSubType.append(''); + profSubType.append(''); + profSubType.append(''); + + } else if(profType == 'SpellDC'){ + + profSubType.append(''); + profSubType.append(''); + profSubType.append(''); + profSubType.append(''); + + } + + }); + $('#addProfType').trigger("change"); + + $('#addProfAddButton').click(function(){ + + let type = $('#addProfType').val(); + let subType = $('#addProfSubType').val(); + let prof = $('#addProfProf').val(); + + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: subType, + sourceCodeSNum: 'a', + }; + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct : srcStruct}, + { + For : type, + To : subType, + Prof : prof, + SourceName: 'User-Added' + } + ); + + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-resist-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-resist-view.js new file mode 100644 index 00000000..c3fa90cd --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-resist-view.js @@ -0,0 +1,41 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAddResistQuickview(data) { + addBackFunctionality(data); + + $('#quickViewTitle').html("Add Resistance"); + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + $('#addResistAddButton').click(function(){ + + let resistType = $('#addResistNewType').val(); + let resistAmount = $('#addResistNewAmount').val(); + + if(resistType != null && resistType != '' && resistAmount != null && resistAmount != ''){ + + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: resistType+' '+resistAmount+' Resist', + sourceCodeSNum: 'a', + }; + socket.emit("requestResistanceChange", + getCharIDFromURL(), + srcStruct, + resistType, + resistAmount + ); + + } + + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-spell-slot-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-spell-slot-view.js new file mode 100644 index 00000000..fac45be7 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-spell-slot-view.js @@ -0,0 +1,33 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAddSpellSlotQuickview(data) { + + $('#quickViewTitle').html("Add Spell Slot"); + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + + qContent.append('
                      '); + + $('#addSlotAddButton').click(function(){ + + let slotLevel = $('#addSlotLevel').val(); + + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, // Random int for 'unique' srcStruct (temp solution) + sourceCode: 'AddedSlot-'+Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), + sourceCodeSNum: 'a', + }; + socket.emit("requestSpellSlotChange", + getCharIDFromURL(), + srcStruct, + data.SpellSRC, + slotLevel + ); + + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-spell-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-spell-view.js new file mode 100644 index 00000000..10c854b6 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-spell-view.js @@ -0,0 +1,430 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_addSpellEntrySetNum = 0; + +function openAddSpellQuickview(data){ + + $('#quickViewTitle').html("Tradition Spell List"); + let qContent = $('#quickViewContent'); + + qContent.append(''); + + qContent.append('

                      '); + + qContent.append('
                      '); + + $('#spellTraditionArcane').click(function(){ + changeSpellTraditionTab('spellTraditionArcane', 'arcane', data); + }); + + $('#spellTraditionDivine').click(function(){ + changeSpellTraditionTab('spellTraditionDivine', 'divine', data); + }); + + $('#spellTraditionOccult').click(function(){ + changeSpellTraditionTab('spellTraditionOccult', 'occult', data); + }); + + $('#spellTraditionPrimal').click(function(){ + changeSpellTraditionTab('spellTraditionPrimal', 'primal', data); + }); + + let spellList = data.SpellBook.SpellList.toUpperCase(); + if(spellList === 'ARCANE'){ + $('#spellTraditionArcane').click(); + } else if(spellList === 'DIVINE'){ + $('#spellTraditionDivine').click(); + } else if(spellList === 'OCCULT'){ + $('#spellTraditionOccult').click(); + } else if(spellList === 'PRIMAL'){ + $('#spellTraditionPrimal').click(); + } + +} + + + + + + +function changeSpellTraditionTab(type, traditionName, data){ + + $('#traitionSpellListSection').html(''); + + $('#spellTraditionArcane').parent().removeClass("is-active"); + $('#spellTraditionDivine').parent().removeClass("is-active"); + $('#spellTraditionOccult').parent().removeClass("is-active"); + $('#spellTraditionPrimal').parent().removeClass("is-active"); + $('#'+type).parent().addClass("is-active"); + + let traditionSpellsSearch = $('#traditionSpellsSearch'); + let traditionSpellsSearchInput = null; + if(traditionSpellsSearch.val() != ''){ + traditionSpellsSearchInput = traditionSpellsSearch.val().toUpperCase(); + traditionSpellsSearch.addClass('is-info'); + } else { + traditionSpellsSearch.removeClass('is-info'); + traditionSpellsSearch.blur(); + } + + let traditionSpellsLevelFilterValue = $('#traditionSpellsFilterByLevel').val(); + + $('#traditionSpellsSearch').off('change'); + $('#traditionSpellsSearch').change(function(){ + changeSpellTraditionTab(type, traditionName, data); + }); + + $('#traditionSpellsFilterByLevel').off('change'); + $('#traditionSpellsFilterByLevel').change(function(){ + changeSpellTraditionTab(type, traditionName, data); + }); + + for(const [spellID, spellDataStruct] of data.Data.SpellMap.entries()){ + + let willDisplay = false; + + let spellTraditions = JSON.parse(spellDataStruct.Spell.traditions); + if(spellTraditions.includes(traditionName)){ + willDisplay = true; + } + + if(traditionSpellsSearchInput != null){ + $('#traditionSpellsFilterByLevel').parent().removeClass('is-info'); + + let spellName = spellDataStruct.Spell.name.toUpperCase(); + if(!spellName.includes(traditionSpellsSearchInput)){ + willDisplay = false; + } + } else { + $('#traditionSpellsFilterByLevel').parent().addClass('is-info'); + + if(spellDataStruct.Spell.level != traditionSpellsLevelFilterValue){ + willDisplay = false; + } + + } + + if(willDisplay){ + displayAddSpell(spellDataStruct, data); + } + + } + + + $('.spellEntryPart').click(function(){ + + let spellID = $(this).parent().attr('data-spell-id'); + let spellDataStruct = data.Data.SpellMap.get(spellID+""); + + let spellTradChevronSpellID = 'addSpellFromTraditionChevronSpellID'+spellID; + let spellTradNameID = 'addSpellFromTraditionName'+spellID; + let spellTradDetailsSpellID = 'addSpellFromTraditionDetailsSpell'+spellID; + if($('#'+spellTradDetailsSpellID).html() != ''){ + $('#'+spellTradChevronSpellID).removeClass('fa-chevron-up'); + $('#'+spellTradChevronSpellID).addClass('fa-chevron-down'); + $('#'+spellTradNameID).removeClass('has-text-weight-bold'); + displaySpellDetails(null, spellTradDetailsSpellID); + } else { + $('#'+spellTradChevronSpellID).removeClass('fa-chevron-down'); + $('#'+spellTradChevronSpellID).addClass('fa-chevron-up'); + $('#'+spellTradNameID).addClass('has-text-weight-bold'); + displaySpellDetails(spellDataStruct, spellTradDetailsSpellID); + } + + }); + +} + +function displayAddSpell(spellDataStruct, data){ + + if(spellDataStruct.Spell.isArchived === 1){ + return; + } + if(spellDataStruct.Spell.isFocusSpell === 1){ + return; + } + + let spellID = spellDataStruct.Spell.id; + let spellLevel = (spellDataStruct.Spell.level == 0) ? "Cantrip" : "Lvl "+spellDataStruct.Spell.level; + let spellName = spellDataStruct.Spell.name; + + let spellTradAddSpellBtnWrapperID = 'addSpellBtnWrapper'+spellID; + let spellTradAddSpellID = 'addSpellFromTraditionAddSpell'+spellID; + let spellTradChevronSpellID = 'addSpellFromTraditionChevronSpellID'+spellID; + let spellTradNameID = 'addSpellFromTraditionName'+spellID; + let spellTradDetailsSpellID = 'addSpellFromTraditionDetailsSpell'+spellID; + + $('#traitionSpellListSection').append('

                      '+spellName+'

                      '); + + + if(data.SpellBook.SpellCastingType === 'SPONTANEOUS-REPERTOIRE' && spellDataStruct.Spell.level != 0) { + + let spellAddSelectHTML = '
                      '; + $('#'+spellTradAddSpellBtnWrapperID).html(spellAddSelectHTML); + + $('#'+spellTradAddSpellID).change(function(){ + let spellLevel = $("#"+spellTradAddSpellID+" option:selected").val(); + if(spellLevel != 'chooseDefault') { + prev_spellSRC = data.SpellBook.SpellSRC; + prev_spellData = data.Data; + socket.emit("requestSpellAddToSpellBook", + getCharIDFromURL(), + data.SpellBook.SpellSRC, + spellDataStruct.Spell.id, + spellLevel, + null); + data.SpellBook.SpellBook.push({SpellID: spellDataStruct.Spell.id, SpellLevel: spellLevel}); + $("#"+spellTradAddSpellID).val('chooseDefault'); + } + }); + + } else { + + let spellData = data.SpellBook.SpellBook.find(spellData => { + return spellData.SpellID == spellDataStruct.Spell.id; + }); + if(spellData != null) { + $('#'+spellTradAddSpellBtnWrapperID).html(''); + } else { + $('#'+spellTradAddSpellBtnWrapperID).html(''); + } + + $('#'+spellTradAddSpellID).click(function(){ + prev_spellSRC = data.SpellBook.SpellSRC; + prev_spellData = data.Data; + socket.emit("requestSpellAddToSpellBook", + getCharIDFromURL(), + data.SpellBook.SpellSRC, + spellDataStruct.Spell.id, + spellDataStruct.Spell.level, + null); + data.SpellBook.SpellBook.push({SpellID: spellDataStruct.Spell.id, SpellLevel: spellDataStruct.Spell.level}); + $('#'+spellTradAddSpellBtnWrapperID).html(''); + }); + + } + + +} + +function displaySpellDetails(spellDataStruct, spellTradDetailsSpellID){ + + if(spellDataStruct == null){ + $('#'+spellTradDetailsSpellID).html(''); + return; + } + + $('#'+spellTradDetailsSpellID).html('
                      '); + let spellDetails = $('#'+spellTradDetailsSpellID+' > div'); + + let rarity = spellDataStruct.Spell.rarity; + let tagsInnerHTML = ''; + switch(rarity) { + case 'UNCOMMON': tagsInnerHTML += ''; + break; + case 'RARE': tagsInnerHTML += ''; + break; + case 'UNIQUE': tagsInnerHTML += ''; + break; + default: break; + } + for(const tag of spellDataStruct.Tags){ + let tagDescription = tag.description; + if(tagDescription.length > g_tagStringLengthMax){ + tagDescription = tagDescription.substring(0, g_tagStringLengthMax); + tagDescription += '...'; + } + tagsInnerHTML += ''; + } + + if(tagsInnerHTML != ''){ + spellDetails.append('
                      '+tagsInnerHTML+'
                      '); + spellDetails.append('
                      '); + } + + $('.tagButton').click(function(){ + let tagName = $(this).text(); + openQuickView('tagView', { + TagName : tagName, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + // Traditions + let traditionsString = ''; + let spellTraditions = JSON.parse(spellDataStruct.Spell.traditions); + for(let tradition of spellTraditions){ + traditionsString += tradition+', '; + } + traditionsString = traditionsString.slice(0, -2);// Trim off that last ', ' + spellDetails.append('

                      Traditions '+traditionsString+'

                      '); + + // Cast + let castActions = null; + let wrapComponents = false; + switch(spellDataStruct.Spell.cast) { + case 'FREE_ACTION': castActions = '[free-action]'; break; + case 'REACTION': castActions = '[reaction]'; break; + case 'ACTION': castActions = '[one-action]'; break; + case 'TWO_ACTIONS': castActions = '[two-actions]'; break; + case 'THREE_ACTIONS': castActions = '[three-actions]'; break; + case 'ONE_TO_THREE_ACTIONS': castActions = '[one-action] to [three-actions]'; break; + case 'ONE_TO_TWO_ACTIONS': castActions = '[one-action] to [two-actions]'; break; + case 'TWO_TO_THREE_ACTIONS': castActions = '[two-actions] to [three-actions]'; break; + case 'TWO_TO_TWO_ROUNDS': castActions = '[two-actions] to 2 rounds'; break; + case 'TWO_TO_THREE_ROUNDS': castActions = '[two-actions] to 3 rounds'; break; + case 'THREE_TO_TWO_ROUNDS': castActions = '[three-actions] to 2 rounds'; break; + case 'THREE_TO_THREE_ROUNDS': castActions = '[three-actions] to 3 rounds'; break; + case 'TWO_ROUNDS': castActions = '2 rounds'; wrapComponents = true; break; + case 'THREE_ROUNDS': castActions = '3 rounds'; wrapComponents = true; break; + case 'ONE_MINUTE': castActions = '1 minute'; wrapComponents = true; break; + case 'FIVE_MINUTES': castActions = '5 minutes'; wrapComponents = true; break; + case 'TEN_MINUTES': castActions = '10 minutes'; wrapComponents = true; break; + case 'THIRTY_MINUTES': castActions = '30 minutes'; wrapComponents = true; break; + case 'ONE_HOUR': castActions = '1 hour'; wrapComponents = true; break; + case 'EIGHT_HOURS': castActions = '8 hours'; wrapComponents = true; break; + case 'ONE_DAY': castActions = '24 hours'; wrapComponents = true; break; + default: break; + } + + let componentsString = ''; + let spellComponents = JSON.parse(spellDataStruct.Spell.castingComponents); + for(let components of spellComponents){ + componentsString += components+', '; + } + componentsString = componentsString.slice(0, -2);// Trim off that last ', ' + if(wrapComponents && componentsString != ''){ + componentsString = '('+componentsString+')'; + } + + spellDetails.append('

                      Cast '+castActions+' '+componentsString+'

                      '); + + // Cost // Trigger // Requirements // + let ctrString = ''; + + let spellCost = ''; + if(spellDataStruct.Spell.cost != null){ + spellCost = 'Cost '+removePeriodAtEndOfStr(spellDataStruct.Spell.cost)+'; '; + } + ctrString += spellCost; + + let spellTrigger = ''; + if(spellDataStruct.Spell.trigger != null){ + spellTrigger = 'Trigger '+removePeriodAtEndOfStr(spellDataStruct.Spell.trigger)+'; '; + } + ctrString += spellTrigger; + + let spellRequirements = ''; + if(spellDataStruct.Spell.requirements != null){ + spellRequirements = 'Requirements '+removePeriodAtEndOfStr(spellDataStruct.Spell.requirements)+'; '; + } + ctrString += spellRequirements; + ctrString = ctrString.slice(0, -2);// Trim off that last '; ' + if(ctrString != '') {ctrString += '.';}// Add period at end. + + spellDetails.append('

                      '+ctrString+'

                      '); + + + // Range // Area // Targets // + let ratString = ''; + + let spellRange = ''; + if(spellDataStruct.Spell.range != null){ + spellRange = 'Range '+spellDataStruct.Spell.range+'; '; + } + ratString += spellRange; + + let spellArea = ''; + if(spellDataStruct.Spell.area != null){ + spellArea = 'Area '+spellDataStruct.Spell.area+'; '; + } + ratString += spellArea; + + let spellTargets = ''; + if(spellDataStruct.Spell.targets != null){ + spellTargets = 'Targets '+spellDataStruct.Spell.targets+'; '; + } + ratString += spellTargets; + ratString = ratString.slice(0, -2);// Trim off that last '; ' + + spellDetails.append('

                      '+ratString+'

                      '); + + // Saving Throw // Duration // + let sdString = ''; + + let savingThrowType = null; + switch(spellDataStruct.Spell.savingThrow) { + case 'FORT': savingThrowType = 'Fortitude'; break; + case 'REFLEX': savingThrowType = 'Reflex'; break; + case 'WILL': savingThrowType = 'Will'; break; + case 'BASIC_FORT': savingThrowType = 'basic Fortitude'; break; + case 'BASIC_REFLEX': savingThrowType = 'basic Reflex'; break; + case 'BASIC_WILL': savingThrowType = 'basic Will'; break; + default: break; + } + if(savingThrowType != null){ + sdString += 'Saving Throw '+savingThrowType+'; '; + } + + let spellDuration = ''; + if(spellDataStruct.Spell.duration != null){ + spellDuration = 'Duration '+spellDataStruct.Spell.duration+'; '; + } + sdString += spellDuration; + sdString = sdString.slice(0, -2);// Trim off that last '; ' + + spellDetails.append('

                      '+sdString+'

                      '); + + spellDetails.append('
                      '); + + spellDetails.append(processText(spellDataStruct.Spell.description, true, true, 'MEDIUM')); + + if(spellDataStruct.Spell.heightenedOneVal != null || spellDataStruct.Spell.heightenedTwoVal != null || spellDataStruct.Spell.heightenedThreeVal != null) { + + spellDetails.append('
                      '); + + if(spellDataStruct.Spell.heightenedOneVal != null){ + let heightenedTextName = getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedOneVal); + let hText; + if(heightenedTextName === "CUSTOM"){ + hText = 'Heightened '+spellDataStruct.Spell.heightenedOneText; + } else { + hText = 'Heightened ('+heightenedTextName+') '+spellDataStruct.Spell.heightenedOneText; + } + spellDetails.append('
                      '+processText(hText, true, true, 'MEDIUM')+'
                      '); + } + + if(spellDataStruct.Spell.heightenedTwoVal != null){ + let hText = 'Heightened ('+getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedTwoVal)+') '+spellDataStruct.Spell.heightenedTwoText; + spellDetails.append('
                      '+processText(hText, true, true, 'MEDIUM')+'
                      '); + } + + if(spellDataStruct.Spell.heightenedThreeVal != null){ + let hText = 'Heightened ('+getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedThreeVal)+') '+spellDataStruct.Spell.heightenedThreeText; + spellDetails.append('
                      '+processText(hText, true, true, 'MEDIUM')+'
                      '); + } + + if(spellDataStruct.Spell.heightenedFourVal != null){ + let hText = 'Heightened ('+getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedFourVal)+') '+spellDataStruct.Spell.heightenedFourText; + spellDetails.append('
                      '+processText(hText, true, true, 'MEDIUM')+'
                      '); + } + + } + + +} + +function removePeriodAtEndOfStr(str){ + if(str.endsWith('.')) { + return str.substring(0, str.length - 1); + } else { + return str; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-unarmed-attack-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-unarmed-attack-view.js new file mode 100644 index 00000000..20bc3608 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-unarmed-attack-view.js @@ -0,0 +1,254 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAddUnarmedAttackQuickview(data) { + addBackFunctionality(data); + + let itemID,itemName,itemDescription,itemDamageType,itemDieType,itemRange,itemReload,itemCode,itemMaterialType,itemTagArray, itemAtkBonus, itemDmgBonus; + if(data.IsCustomize){ // Customize Unarmed Attack + $('#quickViewTitle').html("Customize Unarmed Attack"); + + let itemData = data.InvItem; + + itemID = itemData.id; + itemName = itemData.name; + itemDescription = itemData.description; + itemDamageType = itemData.itemWeaponDamageType; + itemDieType = itemData.itemWeaponDieType; + itemRange = itemData.itemWeaponRange; + itemReload = itemData.itemWeaponReload; + itemAtkBonus = itemData.itemWeaponAtkBonus; + itemDmgBonus = itemData.itemWeaponDmgBonus; + itemCode = itemData.code; + itemMaterialType = itemData.materialType; + itemTagArray = itemData.itemTags; + if(itemTagArray == null) { itemTagArray = data.Item.TagArray; } + + } else { // Add Unarmed Attack + $('#quickViewTitle').html("Add Unarmed Attack"); + + let itemData = g_itemMap.get(data.AddedItemID+""); + + itemID = itemData.Item.id; + itemName = 'New '+itemData.Item.name; + itemDescription = itemData.Item.description; + itemDamageType = itemData.WeaponData.damageType; + itemDieType = itemData.WeaponData.dieType; + itemRange = itemData.WeaponData.rangedRange; + itemReload = itemData.WeaponData.rangedReload; + itemAtkBonus = itemData.itemWeaponAtkBonus; + itemDmgBonus = itemData.itemWeaponDmgBonus; + itemCode = itemData.Item.code; + itemMaterialType = itemData.Item.materialType; + itemTagArray = itemData.TagArray; + + if(itemRange == 0 && itemReload == 0) { itemReload = null; itemRange = null; } + + } + + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + + let tagsSelectOptions = ''; + for(let tag of g_allTags){ + if(tag.isHidden == 0 && tag.isArchived == 0){ + tagsSelectOptions += ''; + } + } + qContent.append('
                      '); + + $("#customizeItemTraits").chosen({width: "100%"}); + + qContent.append('
                      '); + + let materialSelectOptions = ''; + for(const [materialCodeName, data] of g_materialsMap.entries()){ + materialSelectOptions += ''; + } + qContent.append('
                      '); + + qContent.append('
                      '); + + itemCode = (itemCode == null) ? '' : itemCode; + qContent.append(` +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + `); + + if(data.IsCustomize){ + qContent.append('
                      '); + } else { + qContent.append('
                      '); + } + + + // Material // + $('#customizeItemMaterial').val(itemMaterialType); + + // Traits // + try { + for(let tagID of JSON.parse(itemTagArray)){ + $("#customizeItemTraits").find('option[value='+tagID+']').attr('selected','selected'); + } + } catch (err) { + for(let tag of itemTagArray){ + $("#customizeItemTraits").find('option[value='+tag.id+']').attr('selected','selected'); + } + } + $('#customizeItemTraits').trigger("chosen:updated"); + + // Weapon // + $('#customizeWeaponDamageDie').val(itemDieType); + + $('#customizeItemSaveButton').click(function(){ + + let name = $('#customizeItemName').val(); + let description = $('#customizeItemDescription').val(); + let materialType = $('#customizeItemMaterial').val(); + let code = $('#customizeItemCode').val(); + + let isValid = true; + + if(name == null || name == ''){ + $('#customizeItemName').addClass('is-danger'); + isValid = false; + } else { + $('#customizeItemName').removeClass('is-danger'); + } + + if(description == '') { + description = '__No Description__'; + } + + if(code == '') { + code = null; + } + + // Traits // + let itemTagsData = JSON.stringify($("#customizeItemTraits").val()); + if(itemTagsData.length > 400){ + itemTagsData = null; + } + + // Weapon // + let weaponDieType = $('#customizeWeaponDamageDie').val(); + let weaponDamageType = $('#customizeWeaponDamageType').val(); + let weaponRange = $('#customizeWeaponRange').val(); + let weaponReload = $('#customizeWeaponReload').val(); + let weaponAtkBonus = $('#customizeWeaponAtkBonus').val(); + let weaponDmgBonus = $('#customizeWeaponDmgBonus').val(); + + if(weaponRange == ''){ weaponRange = null; } + if(weaponReload == ''){ weaponReload = null; } + if(weaponAtkBonus == ''){ weaponAtkBonus = null; } + if(weaponDmgBonus == ''){ weaponDmgBonus = null; } + + if(isValid){ + + if(data.IsCustomize){ + + socket.emit("requestCustomizeInvItem", + itemID, + { + name: name, + price: 0, + bulk: 0, + description: description, + size: 'MEDIUM', + isShoddy: 0, + materialType: materialType, + hitPoints: 0, + brokenThreshold: 0, + hardness: 0, + code: code, + itemTagsData: itemTagsData, + + weaponDieType: weaponDieType, + weaponDamageType: weaponDamageType, + weaponRange: weaponRange, + weaponReload: weaponReload, + weaponAtkBonus: weaponAtkBonus, + weaponDmgBonus: weaponDmgBonus, + + storageMaxBulk: null, + } + ); + + } else { + + socket.emit("requestAddItemCustomizeToInv", + getCharIDFromURL(), + g_character.inventoryID, + itemID, + { + name: name, + price: 0, + bulk: 0, + description: description, + size: 'MEDIUM', + isShoddy: 0, + materialType: materialType, + hitPoints: 0, + brokenThreshold: 0, + hardness: 0, + code: code, + itemTagsData: itemTagsData, + + weaponDieType: weaponDieType, + weaponDamageType: weaponDamageType, + weaponRange: weaponRange, + weaponReload: weaponReload, + weaponAtkBonus: weaponAtkBonus, + weaponDmgBonus: weaponDmgBonus, + + storageMaxBulk: null, + + quantity: 1 + } + ); + closeQuickView(); + + } + + } + + }); + +} + + +function isUnarmedAttack(item){ + return (item != null && item.WeaponData != null && item.WeaponData.category.toUpperCase() == 'UNARMED'); +} diff --git a/client/vue-src/legacy-js/sheet/quickviews/add-weak-view.js b/client/vue-src/legacy-js/sheet/quickviews/add-weak-view.js new file mode 100644 index 00000000..fb71f586 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/add-weak-view.js @@ -0,0 +1,41 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAddWeakQuickview(data) { + addBackFunctionality(data); + + $('#quickViewTitle').html("Add Weakness"); + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + $('#addWeaknessAddButton').click(function(){ + + let weakType = $('#addWeaknessNewType').val(); + let weakAmount = $('#addWeaknessNewAmount').val(); + + if(weakType != null && weakType != '' && weakAmount != null && weakAmount != ''){ + + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: weakType+' '+weakAmount+' Weak', + sourceCodeSNum: 'a', + }; + socket.emit("requestVulnerabilityChange", + getCharIDFromURL(), + srcStruct, + weakType, + weakAmount + ); + + } + + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/animal-comp-view.js b/client/vue-src/legacy-js/sheet/quickviews/animal-comp-view.js new file mode 100644 index 00000000..88992232 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/animal-comp-view.js @@ -0,0 +1,404 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openAnimalCompQuickview(data) { + + let qContent = $('#quickViewContent'); + + let charAnimal = data.CharAnimalComp; + let animal = g_companionData.AllAnimalCompanions.find(animal => { + return animal.id == charAnimal.animalCompanionID; + }); + if(animal == null){ + qContent.append('

                      Could not find animal companion data!

                      '); + return; + } + + // Remove Button // + $('#quickViewTitleRight').html(''); + $('#removeAnimalBtn').click(function(){ + new ConfirmMessage('Remove Animal Companion', 'Are you sure you want to permanently remove this animal companion?', 'Remove', 'modal-remove-animal-companion-'+charAnimal.id, 'modal-remove-animal-companion-btn-'+charAnimal.id); + $('#modal-remove-animal-companion-btn-'+charAnimal.id).click(function() { + socket.emit("requestRemoveAnimalCompanion", + getCharIDFromURL(), + charAnimal.id); + }); + }); + + // Init Specializations // + initAnimalSpecializationArray(charAnimal); + + // Name // + qContent.append('
                      '); + + $("#animalName").on("input", function(){ + $('#quickViewTitle').html("Companion - "+$('#animalName').val()); + }); + $('#animalName').trigger("input"); + + $('#animalName').blur(function() { + if($('#animalName').val() != charAnimal.name){ + updateAnimalCompanion(charAnimal); + } + }); + + // Health // + let maxHP = getAnimalCompanionMaxHealth(charAnimal); + let currentHP = charAnimal.currentHP; + if(currentHP == -1){ currentHP = maxHP; } + + qContent.append(''); + // Press Enter Key + $('#animalHealthInput').on('keypress',function(e){ + if(e.which == 13){ + $('#animalHealthInput').blur(); + } + }); + $('#animalHealthInput').blur(function() { + if($('#animalHealthInput').val() != charAnimal.currentHP){ + try { + let newCurrentHP = parseInt(math.evaluate($('#animalHealthInput').val())); + if(newCurrentHP > maxHP) { newCurrentHP = maxHP; } + if(newCurrentHP < 0) { newCurrentHP = 0; } + if(isNaN(newCurrentHP)) { throw 'Value is not a number!'; } + + charAnimal.currentHP = newCurrentHP; + $('#animalHealthInput').val(newCurrentHP); + $('#animalHealthInput').removeClass('is-danger'); + updateAnimalCompanion(charAnimal); + } catch (err) { + $('#animalHealthInput').addClass('is-danger'); + } + } else { + $('#animalHealthInput').removeClass('is-danger'); + } + }); + + qContent.append('
                      '); + + // Char Level // + let lvl = g_character.level; + + // Ability Scores // + let modStr = getAnimalModStr(animal, charAnimal); + let modDex = getAnimalModDex(animal, charAnimal); + let modCon = getAnimalModCon(animal, charAnimal); + let modInt = getAnimalModInt(animal, charAnimal); + let modWis = getAnimalModWis(animal, charAnimal); + let modCha = getAnimalModCha(animal, charAnimal); + + qContent.append('

                      Str

                      Dex

                      Con

                      Int

                      Wis

                      Cha

                      '); + qContent.append('

                      '+signNumber(modStr)+'

                      '+signNumber(modDex)+'

                      '+signNumber(modCon)+'

                      '+signNumber(modInt)+'

                      '+signNumber(modWis)+'

                      '+signNumber(modCha)+'

                      '); + + qContent.append('
                      '); + + let percepBonus = modWis+getProfNumber(getAnimalPerceptionNumUps(animal, charAnimal), lvl); + let AC = 10+modDex+getProfNumber(getAnimalUnarmoredDefenseNumUps(animal, charAnimal), lvl); + + let fortBonus = modCon+getProfNumber(getAnimalFortitudeNumUps(animal, charAnimal), lvl); + let reflexBonus = modDex+getProfNumber(getAnimalReflexNumUps(animal, charAnimal), lvl); + let willBonus = modWis+getProfNumber(getAnimalWillNumUps(animal, charAnimal), lvl); + + qContent.append('

                      Perception

                      AC

                      Fort.

                      Reflex

                      Will

                      '); + qContent.append('

                      '+signNumber(percepBonus)+'

                      '+AC+'

                      '+signNumber(fortBonus)+'

                      '+signNumber(reflexBonus)+'

                      '+signNumber(willBonus)+'

                      '); + + qContent.append('
                      '); + + let skillsArray = []; + skillsArray.push('acrobatics'); + skillsArray.push('athletics'); + skillsArray.push('intimidation'); + skillsArray.push('stealth'); + skillsArray.push('survival'); + + for(let skill of skillsArray){ + let skillData = g_skillMap.get(capitalizeWords(skill)); + let abilScore = skillData.Skill.ability; + + let abilMod = null; + if(abilScore == 'STR'){ abilMod = modStr; } else if(abilScore == 'DEX'){ abilMod = modDex; } else if(abilScore == 'CON'){ abilMod = modCon; } else if(abilScore == 'INT'){ abilMod = modInt; } else if(abilScore == 'WIS'){ abilMod = modWis; } else if(abilScore == 'CHA'){ abilMod = modCha; } + + let skillNumUps = getAnimalSkillNumUps(animal, charAnimal, skill); + if(skillNumUps != 0){ + let skillBonus = abilMod+getProfNumber(skillNumUps, lvl); + + qContent.append('
                      '+signNumber(skillBonus)+'
                      '+capitalizeWords(skill)+'
                      '); + } + } + + qContent.append('
                      '); + + let animalSize = getAnimalSize(animal, charAnimal); + animalSize = (animalSize == 'SMALL-MED') ? 'Small or Medium' : capitalizeWords(animalSize); + animalSize = (animalSize == 'MED-LARGE') ? 'Medium or Large' : capitalizeWords(animalSize); + qContent.append('

                      Size '+animalSize+'

                      '); + + qContent.append('

                      Speed '+animal.speeds+'

                      '); + + let sensesText = animal.senses.toLowerCase(); + sensesText = sensesText.replace('low-light vision', 'low-light vision'); + sensesText = sensesText.replace('darkvision', 'darkvision'); + sensesText = sensesText.replace('scent', 'scent'); + sensesText = sensesText.replace('imprecise', 'imprecise'); + + + qContent.append('

                      Senses '+sensesText+'

                      '); + + if(animal.special != null){ + qContent.append('
                      '+processText('~ Special: '+animal.special, true, true, 'MEDIUM')+'
                      '); + } + + let specializationArray = getAnimalSpecializationArray(charAnimal); + if(specializationArray != null && specializationArray.length > 0){ + let specializationText = '**Extra**'; + for(let specialText of specializationArray){ + specializationText += '\n* : '+specialText; + } + qContent.append('
                      '+processText(specializationText, true, true, 'MEDIUM')+'
                      '); + } + + qContent.append('
                      '); + + displayAnimalCompanionAttack(qContent, animal, charAnimal, 1); + displayAnimalCompanionAttack(qContent, animal, charAnimal, 2); + displayAnimalCompanionAttack(qContent, animal, charAnimal, 3); + + if(hasAnimalAdvancedManeuver(animal, charAnimal)){ + qContent.append('
                      '+processText('~ Advanced Maneuver: (action:type-companion: '+capitalizeWords(animal.advancedManeuver)+')', true, true, 'MEDIUM')+'
                      '); + } + + if(hasAnimalMagicalAttacks(animal, charAnimal)){ + qContent.append('
                      '+processText(':> Your companion’s attacks become magical for the purpose of ignoring resistances.', true, true, 'MEDIUM')+'
                      '); + } + + qContent.append('
                      '); + + qContent.append('
                      '+processText('**Support** ONE-ACTION\n:> '+animal.supportBenefit, true, true, 'MEDIUM')+'
                      '); + + qContent.append('
                      '); + + if(charAnimal.age == 'NIMBLE' || charAnimal.age == 'SAVAGE' || charAnimal.age == 'INDOMITABLE' || charAnimal.age == 'UNSEEN'){ + qContent.append(` +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + ${processText('[https://pf2.easytool.es/index.php?id=6442&name=Specialized_Animal_Companions]', true, null, 'MEDIUM')} +
                      +
                      + +
                      +
                      + `); + } else { + qContent.append(` +
                      +
                      +
                      + +
                      +
                      + ${processText('[https://pf2.easytool.es/index.php?id=6431&name=Animal_Companions_and_Familiars]', true, null, 'MEDIUM')} +
                      + `); + } + + qContent.append('

                      '+getAnimalExtraText(animal, charAnimal)+'

                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + $('#animalDescription').blur(function() { + if($('#animalDescription').val() != charAnimal.description){ + updateAnimalCompanion(charAnimal); + } + }); + + qContent.append('
                      '); + $('#animalImageURL').blur(function() { + if($('#animalImageURL').val() != charAnimal.imageURL){ + updateAnimalCompanion(charAnimal); + } + }); + + $('#selectAnimalAge').val(charAnimal.age); + + $('#selectAnimalAge').change(function() { + if($('#selectAnimalAge').val() != charAnimal.age){ + updateAnimalCompanion(charAnimal); + openQuickView('animalCompanionView', { + CharAnimalComp: charAnimal, + ViewScroll: $('#quickviewDefault').find('.quickview-body').scrollTop(), + }, $('#quickviewDefault').hasClass('is-active')); + } + }); + + if($('#selectAnimalAge').val() == 'NIMBLE' || $('#selectAnimalAge').val() == 'SAVAGE' || $('#selectAnimalAge').val() == 'INDOMITABLE' || $('#selectAnimalAge').val() == 'UNSEEN'){ + + for(let specialization of g_animalSpecialArray) { + $('#selectAnimalSpecialization option[value="'+specialization+'"]').attr('selected','selected'); + } + $("#selectAnimalSpecialization").chosen({width: "100%"}); + + $("#selectAnimalSpecialization").chosen().change(function() { + if(JSON.stringify($('#selectAnimalSpecialization').val()) != charAnimal.specialization){ + updateAnimalCompanion(charAnimal); + openQuickView('animalCompanionView', { + CharAnimalComp: charAnimal, + ViewScroll: $('#quickviewDefault').find('.quickview-body').scrollTop(), + }, $('#quickviewDefault').hasClass('is-active')); + } + }); + + } + + + if(data.ViewScroll != null){ + $('#quickviewDefault').find('.quickview-body').scrollTop(data.ViewScroll); + } + +} + +function displayAnimalCompanionAttack(qContent, animal, charAnimal, attackNum) { + + // Name // + let attackName = animal['a'+attackNum+'Name']; + if(attackName == null){ return; } + attackName = attackName.toLowerCase(); + + // Type // + let attackType; + switch(animal['a'+attackNum+'Type']){ + case 'MELEE': attackType = 'Melee'; break; + case 'RANGED': attackType = 'Ranged'; break; + default: break; + } + + // Actions // + let attackAction; + switch(animal['a'+attackNum+'Actions']) { + case 'FREE_ACTION': attackAction = 'FREE-ACTION'; break; + case 'REACTION': attackAction = 'REACTION'; break; + case 'ACTION': attackAction = 'ONE-ACTION'; break; + case 'TWO_ACTIONS': attackAction = 'TWO-ACTIONS'; break; + case 'THREE_ACTIONS': attackAction = 'THREE-ACTIONS'; break; + default: break; + } + + // Traits // + let isFinesse = false; + + let attackTraits = ''; + let attackTraitsRaw = animal['a'+attackNum+'Tags']; + if(attackTraitsRaw != null){ + let attackTraitsParts = attackTraitsRaw.split(', '); + for(let attackTraitPart of attackTraitsParts){ + if(attackTraits != ''){ attackTraits += ', '; } + attackTraits += '(trait: '+attackTraitPart+')'; + + if(attackTraitPart == 'finesse'){ + isFinesse = true; + } + } + attackTraits = ' ('+attackTraits+')'; + } + + // Attack Bonus // + let trainedProfBonus = getProfNumber(getAnimalUnarmedAttacksNumUps(animal, charAnimal), g_character.level); + let attackModToBonus = (isFinesse) ? getAnimalModDex(animal, charAnimal) : getAnimalModStr(animal, charAnimal); + + let attackBonus = trainedProfBonus+attackModToBonus; + attackBonus = ''+signNumber(attackBonus)+''; + + // Damage // + let damageDieNum = getAnimalDamageDieNumber(animal, charAnimal); + + let damageDie = animal['a'+attackNum+'DmgDie']; + + let damageBonus = 0; + if(attackType == 'Melee'){ damageBonus += getAnimalModStr(animal, charAnimal); } + damageBonus += getAnimalAdditionalDamage(animal, charAnimal); + damageBonus = (damageBonus == 0) ? '' : signNumber(damageBonus); + + let damageType = animal['a'+attackNum+'DmgType']; + + // Finalize // + let attackEntryText = '**'+attackType+'** '+attackAction+' '+attackBonus+' '+attackName+''+attackTraits+', **Damage** '+damageDieNum+''+damageDie+''+damageBonus+' '+damageType; + qContent.append('
                      '+processText(attackEntryText, true, true, 'MEDIUM')+'
                      '); + +} + +function updateAnimalCompanion(charAnimalComp) { + + let updateValues = { + Name : $('#animalName').val(), + CurrentHealth : $('#animalHealthInput').val(), + Description : $('#animalDescription').val(), + ImageURL : $('#animalImageURL').val(), + Age : $('#selectAnimalAge').val(), + Specialization : JSON.stringify($('#selectAnimalSpecialization').val()), + }; + + if(updateValues.Age == 'YOUNG' || updateValues.Age == 'MATURE'){ + updateValues.Specialization = 'NONE'; + } + + charAnimalComp.name = updateValues.Name; + charAnimalComp.currentHP = updateValues.CurrentHealth; + charAnimalComp.description = updateValues.Description; + charAnimalComp.imageURL = updateValues.ImageURL; + charAnimalComp.age = updateValues.Age; + charAnimalComp.specialization = updateValues.Specialization; + + socket.emit("requestUpdateAnimalCompanion", + getCharIDFromURL(), + charAnimalComp.id, + updateValues); + +} + +socket.on("returnUpdateAnimalCompanion", function(){ + openCompanionTab(); +}); + +socket.on("returnRemoveAnimalCompanion", function(charAnimalCompID){ + + let newAnimalCompanions = []; + for(let charAnimal of g_companionData.AnimalCompanions){ + if(charAnimal.id != charAnimalCompID){ + newAnimalCompanions.push(charAnimal); + } + } + g_companionData.AnimalCompanions = newAnimalCompanions; + + closeQuickView(); + openCompanionTab(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/char-info-view.js b/client/vue-src/legacy-js/sheet/quickviews/char-info-view.js new file mode 100644 index 00000000..8447d9c7 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/char-info-view.js @@ -0,0 +1,225 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_charInfoData; + +function openCharInfoQuickview(data) { + + $('#quickViewTitle').html('Character Info'); + + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + + /// Basic Info /// + $('#charInfoBasicInfoSection').append('

                      '+g_character.name+'

                      '); + + $('#charInfoBasicInfoSection').append('

                      '+g_calculatedStats.generalInfo.className+'

                      '); + + $('#charInfoBasicInfoSection').append('

                      '+g_calculatedStats.generalInfo.heritageAncestryName+'

                      '); + + $('#charInfoBasicInfoSection').append('

                      '+g_calculatedStats.generalInfo.backgroundName+'

                      '); + + $('#charInfoPictureSection').append('
                      '); + + /// /// + + let tagsInnerHTML = ''; + tagsInnerHTML += ''; + for(const charTag of g_calculatedStats.generalInfo.traits){ + if(charTag != null && charTag != ''){ + tagsInnerHTML += ''; + } + } + if(tagsInnerHTML != ''){ + qContent.append('
                      '+tagsInnerHTML+'
                      '); + } + + /// /// + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + + // // + + /* + { + appearance: + personality: + alignment: + beliefs: + age: + gender: + pronouns: + title: + faction: + ethnicity: + nationality: + + imageURL: + } + */ + try { + g_charInfoData = JSON.parse(g_character.infoJSON); + } catch (error) { + g_charInfoData = {}; + } + if(g_charInfoData == null) { g_charInfoData = {}; } + + $('#charInfoInput-Appearance').val(g_charInfoData.appearance); + $('#charInfoInput-Personality').val(g_charInfoData.personality); + $('#charInfoInput-Alignment').val(g_charInfoData.alignment); + $('#charInfoInput-Beliefs').val(g_charInfoData.beliefs); + $('#charInfoInput-Age').val(g_charInfoData.age); + $('#charInfoInput-Gender').val(g_charInfoData.gender); + $('#charInfoInput-Pronouns').val(g_charInfoData.pronouns); + $('#charInfoInput-Title').val(g_charInfoData.title); + $('#charInfoInput-Faction').val(g_charInfoData.faction); + $('#charInfoInput-Ethnicity').val(g_charInfoData.ethnicity); + $('#charInfoInput-Nationality').val(g_charInfoData.nationality); + + $('#charInfoInput-ImageURL').val(g_charInfoData.imageURL); + updateCharInfoPicture(); + + // // + + $('#charInfoInput-Appearance').blur(function(){ + if($(this).val() != g_charInfoData.appearance){ + g_charInfoData.appearance = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Personality').blur(function(){ + if($(this).val() != g_charInfoData.personality){ + g_charInfoData.personality = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Alignment').blur(function(){ + if($(this).val() != g_charInfoData.alignment){ + g_charInfoData.alignment = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Beliefs').blur(function(){ + if($(this).val() != g_charInfoData.beliefs){ + g_charInfoData.beliefs = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Age').blur(function(){ + if($(this).val() != g_charInfoData.age){ + g_charInfoData.age = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Gender').blur(function(){ + if($(this).val() != g_charInfoData.gender){ + g_charInfoData.gender = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Pronouns').blur(function(){ + if($(this).val() != g_charInfoData.pronouns){ + g_charInfoData.pronouns = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Title').blur(function(){ + if($(this).val() != g_charInfoData.title){ + g_charInfoData.title = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Faction').blur(function(){ + if($(this).val() != g_charInfoData.faction){ + g_charInfoData.faction = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Ethnicity').blur(function(){ + if($(this).val() != g_charInfoData.ethnicity){ + g_charInfoData.ethnicity = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-Nationality').blur(function(){ + if($(this).val() != g_charInfoData.nationality){ + g_charInfoData.nationality = $(this).val(); + saveCharInfo(); + } + }); + + $('#charInfoInput-ImageURL').blur(function(){ + if($(this).val() != g_charInfoData.imageURL){ + g_charInfoData.imageURL = $(this).val(); + saveCharInfo(); + updateCharInfoPicture(); + } + }); + + +} + +function updateCharInfoPicture(){ + if(g_charInfoData.imageURL != null && g_charInfoData.imageURL.match(/\.(jpeg|jpg|gif|png|webp)$/) != null){ + $('#charInfoPicture').attr('src', g_charInfoData.imageURL); + } else { + $('#charInfoPicture').attr('src', '/images/fb_profile_pic.png'); + } +} + +function saveCharInfo(){ + let charInfoJSON = JSON.stringify(g_charInfoData); + if(charInfoJSON > 3000) {return;} + g_character.infoJSON = charInfoJSON; + socket.emit("requestCharInfoSave", + getCharIDFromURL(), + charInfoJSON); + sendOutUpdateToGM('char-info', charInfoJSON); +} + +socket.on("returnCharInfoSave", function(){ + +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/character-view.js b/client/vue-src/legacy-js/sheet/quickviews/character-view.js new file mode 100644 index 00000000..4995df09 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/character-view.js @@ -0,0 +1,564 @@ +/* Copyright (C) 2022, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_characterViewOpenedTab_rollHistory = false; +let g_characterViewOpenedTab_charInfo = false; + +function openCharacterQuickview(data) { + + let info = null; + if (data.character.infoJSON) { + info = JSON.parse(data.character.infoJSON); + } + + let rollHistory = []; + if (data.character.rollHistoryJSON) { + rollHistory = JSON.parse(data.character.rollHistoryJSON); + } + + $('#quickViewTitle').html(data.character.name); + $('#quickViewTitleRight').html(`Level ${data.character.level}`); + + let qContent = $('#quickViewContent'); + + + qContent.append('
                      '); + + /// Basic Info /// + + $('#charInfoBasicInfoSection').append('

                      ' + data.calculatedStat.generalInfo.className + '

                      '); + + $('#charInfoBasicInfoSection').append('

                      ' + data.calculatedStat.generalInfo.heritageAncestryName + '

                      '); + + $('#charInfoBasicInfoSection').append('

                      ' + data.calculatedStat.generalInfo.backgroundName + '

                      '); + + $('#charInfoBasicInfoSection').append(` + + `); + + $('#charInfoPictureSection').append('
                      '); + + if (info?.imageURL && info.imageURL.match(/\.(jpeg|jpg|gif|png|webp)$/) != null) { + $('#charInfoPicture').attr('src', info.imageURL); + } else { + $('#charInfoPicture').attr('src', '/images/fb_profile_pic.png'); + } + + /// /// + + let traitsInnerHTML = ''; + + if (data.calculatedStat.generalInfo.size) { + traitsInnerHTML += ''; + } + + for (const charTag of data.calculatedStat.generalInfo.traits) { + if (charTag != null && charTag != '') { + traitsInnerHTML += ''; + } + } + + if (traitsInnerHTML != '') { + qContent.append('
                      ' + traitsInnerHTML + '
                      '); + } + + qContent.append('
                      '); + + /// /// + + + // Conditions // + let conditionsInnerHTML = ''; + for (let condition of getAppliedConditions(data.calculatedStat.conditions)) { + conditionsInnerHTML += ``; + } + if (conditionsInnerHTML != '') { + qContent.append('
                      ' + conditionsInnerHTML + '
                      '); + qContent.append('
                      '); + } + + /// /// + + qContent.append(` +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      +
                      + +
                      + `); + + // HP // + $(`#charUpdateInput-HP`).on('keypress', function (e) { + if (e.which == 13) { + $(`#charUpdateInput-HP`).blur(); + } + }); + $(`#charUpdateInput-HP`).blur(function () { + let newHP = 0; + try { + newHP = parseInt(math.evaluate($(this).val())); + if (newHP > data.calculatedStat.maxHP) { newHP = data.calculatedStat.maxHP; } + if (newHP < 0) { newHP = 0; } + if (isNaN(newHP)) { newHP = 0; } + } catch (err) { + newHP = 0; + } + $(this).val(newHP); + data.character.currentHealth = newHP; + socket.emit(`requestCharacterUpdate-Health`, data.charID, newHP); + + // For encounter builder + if(typeof reloadEncounterMembers !== 'undefined'){ + reloadEncounterMembers(); + } + }); + $(`#charUpdateInput-HP`).click(function (event) { + event.stopImmediatePropagation(); + }); + + // Temp HP // + $(`#charUpdateInput-TempHP`).on('keypress', function (e) { + if (e.which == 13) { + $(`#charUpdateInput-TempHP`).blur(); + } + }); + $(`#charUpdateInput-TempHP`).blur(function () { + let newTempHP = 0; + try { + newTempHP = parseInt(math.evaluate($(this).val())); + if (newTempHP < 0) { newTempHP = 0; } + if (isNaN(newTempHP)) { newTempHP = 0; } + } catch (err) { + newTempHP = 0; + } + $(this).val(newTempHP); + data.character.tempHealth = newTempHP; + socket.emit(`requestCharacterUpdate-TempHealth`, data.charID, newTempHP); + }); + $(`#charUpdateInput-TempHP`).click(function (event) { + event.stopImmediatePropagation(); + }); + + // Experience // + $(`#charUpdateInput-Experience`).on('keypress', function (e) { + if (e.which == 13) { + $(`#charUpdateInput-Experience`).blur(); + } + }); + $(`#charUpdateInput-Experience`).blur(function () { + let newExperience = 0; + try { + newExperience = parseInt(math.evaluate($(this).val())); + if (newExperience < 0) { newExperience = 0; } + if (isNaN(newExperience)) { newExperience = 0; } + } catch (err) { + newExperience = 0; + } + $(this).val(newExperience); + data.character.experience = newExperience; + socket.emit(`requestCharacterUpdate-Exp`, data.charID, newExperience); + }); + $(`#charUpdateInput-Experience`).click(function (event) { + event.stopImmediatePropagation(); + }); + + // Hero Points // + $(`#charUpdateSelect-HeroPoints option[value="${data.character.heroPoints}"]`).attr('selected', 'selected'); + + $(`#charUpdateSelect-HeroPoints`).change(function () { + let newHeroPoints = $(this).val(); + data.character.heroPoints = newHeroPoints; + socket.emit(`requestCharacterUpdate-HeroPoints`, data.charID, newHeroPoints); + }); + + /// /// + + if (data.character.variantStamina == 1) { + + $('#staminaSection').html(` +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + `); + + // Stamina // + $(`#charUpdateInput-Stamina`).on('keypress', function (e) { + if (e.which == 13) { + $(`#charUpdateInput-Stamina`).blur(); + } + }); + $(`#charUpdateInput-Stamina`).blur(function () { + let newStamina = 0; + try { + newStamina = parseInt(math.evaluate($(this).val())); + if (newStamina > data.calculatedStat.maxStamina) { newStamina = data.calculatedStat.maxStamina; } + if (newStamina < 0) { newStamina = 0; } + if (isNaN(newStamina)) { newStamina = 0; } + } catch (err) { + newStamina = 0; + } + $(this).val(newStamina); + data.character.currentStamina = newStamina; + socket.emit(`requestCharacterUpdate-Stamina`, data.charID, newStamina); + }); + $(`#charUpdateInput-Stamina`).click(function (event) { + event.stopImmediatePropagation(); + }); + + // Resolve // + $(`#charUpdateInput-Resolve`).on('keypress', function (e) { + if (e.which == 13) { + $(`#charUpdateInput-Resolve`).blur(); + } + }); + $(`#charUpdateInput-Resolve`).blur(function () { + let newResolve = 0; + try { + newResolve = parseInt(math.evaluate($(this).val())); + if (newResolve > data.calculatedStat.maxResolve) { newResolve = data.calculatedStat.maxResolve; } + if (newResolve < 0) { newResolve = 0; } + if (isNaN(newResolve)) { newResolve = 0; } + } catch (err) { + newResolve = 0; + } + $(this).val(newResolve); + data.character.currentResolve = newResolve; + socket.emit(`requestCharacterUpdate-Resolve`, data.charID, newResolve); + }); + $(`#charUpdateInput-Resolve`).click(function (event) { + event.stopImmediatePropagation(); + }); + + } + + /// /// + + qContent.append('

                      Roll History

                      '); + + qContent.append(''); + qContent.append('
                      '); + + $('#charRollHistoryName').click(function () { + if ($("#charRollHistorySection").hasClass("is-hidden")) { + $("#charRollHistorySection").removeClass('is-hidden'); + $("#charRollHistoryChevron").removeClass('fa-chevron-down'); + $("#charRollHistoryChevron").addClass('fa-chevron-up'); + $('#charRollHistoryBar').addClass('is-hidden'); + g_characterViewOpenedTab_rollHistory = true; + + // Scroll to bottom + $('#charRollHistorySection').scrollTop($('#charRollHistorySection')[0].scrollHeight); + } else { + $("#charRollHistorySection").addClass('is-hidden'); + $("#charRollHistoryChevron").removeClass('fa-chevron-up'); + $("#charRollHistoryChevron").addClass('fa-chevron-down'); + $('#charRollHistoryBar').removeClass('is-hidden'); + g_characterViewOpenedTab_rollHistory = false; + } + }); + + let populateRollHistory = function (rollHistory) { + + $('#charRollHistorySection').html(''); + + // Display Roll History + if (rollHistory.length > 0) { + for (let i = 0; i < rollHistory.length; i++) { + let rollStruct = rollHistory[i]; + + if (i == rollHistory.length - 1 && rollHistory.length > 1) { + $('#charRollHistorySection').append('
                      '); + } + + // Display Roll // + let resultLine = '' + rollStruct.RollData.DiceNum + 'd' + rollStruct.RollData.DieType + ''; + if (rollStruct.RollData.Bonus != 0) { + resultLine += '+' + rollStruct.RollData.Bonus + ''; + } + + if (rollStruct.RollData.DiceNum != 1 || rollStruct.RollData.Bonus != 0) { + resultLine += ''; + let resultSubParts = ''; + let firstResult = true; + for (let result of rollStruct.ResultData) { + if (firstResult) { firstResult = false; } else { resultSubParts += '+'; } + + let bulmaColor = 'has-txt-listing'; + if (result == rollStruct.RollData.DieType) { bulmaColor = 'has-text-success'; } + else if (result == 1) { bulmaColor = 'has-text-danger'; } + + resultSubParts += '(' + result + ')'; + } + if (rollStruct.RollData.Bonus != 0) { + resultSubParts += '+' + rollStruct.RollData.Bonus + ''; + } + resultLine += '' + resultSubParts + ''; + } + + if (rollStruct.DoubleResult) { + resultLine += `2×${rollStruct.Total}${(rollStruct.Total * 2)} ${rollStruct.ResultSuffix}`; + } else { + resultLine += `${rollStruct.Total} ${rollStruct.ResultSuffix}`; + } + + $('#charRollHistorySection').append(` +
                      +

                      ${resultLine}

                      +

                      ${rollStruct.Label.Name}

                      +

                      ${rollStruct.Timestamp.Time}

                      +
                      + `); + } + } else { + $('#charRollHistorySection').html('

                      No roll history.

                      '); + } + + // Scroll to Bottom + window.setTimeout(() => { + $('#charRollHistorySection').scrollTop($('#charRollHistorySection')[0].scrollHeight); + }, 1); + + } + + populateRollHistory(rollHistory); + + if(g_characterViewOpenedTab_rollHistory){ + $('#charRollHistoryName').click(); + } + + /// /// + + qContent.append('

                      Character Info

                      '); + + qContent.append(''); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + $('#charInfoSection').append('
                      '); + + qContent.append('
                      '); + + // + if (info?.appearance) { + $('#charInfoInput-Appearance').val(info.appearance); + } else { + $('#charInfoContainer-Appearance').addClass('is-hidden'); + } + + if (info?.personality) { + $('#charInfoInput-Personality').val(info.personality); + } else { + $('#charInfoContainer-Personality').addClass('is-hidden'); + } + + if (info?.alignment) { + $('#charInfoInput-Alignment').val(info.alignment); + } else { + $('#charInfoContainer-Alignment').addClass('is-hidden'); + } + + if (info?.beliefs) { + $('#charInfoInput-Beliefs').val(info.beliefs); + } else { + $('#charInfoContainer-Beliefs').addClass('is-hidden'); + } + + if (info?.age || info?.gender || info?.pronouns || info?.title) { + } else { + $('#charInfoBar-AGPT').addClass('is-hidden'); + } + + if (info?.age) { + $('#charInfoInput-Age').val(info.age); + } else { + $('#charInfoContainer-Age').addClass('is-hidden'); + } + + if (info?.gender) { + $('#charInfoInput-Gender').val(info.gender); + } else { + $('#charInfoContainer-Gender').addClass('is-hidden'); + } + + if (info?.pronouns) { + $('#charInfoInput-Pronouns').val(info.pronouns); + } else { + $('#charInfoContainer-Pronouns').addClass('is-hidden'); + } + + if (info?.title) { + $('#charInfoInput-Title').val(info.title); + } else { + $('#charInfoContainer-Title').addClass('is-hidden'); + } + + if (info?.faction || info?.ethnicity || info?.nationality) { + } else { + $('#charInfoBar-FEN').addClass('is-hidden'); + } + + if (info?.faction) { + $('#charInfoInput-Faction').val(info.faction); + } else { + $('#charInfoContainer-Faction').addClass('is-hidden'); + } + + if (info?.ethnicity) { + $('#charInfoInput-Ethnicity').val(info.ethnicity); + } else { + $('#charInfoContainer-Ethnicity').addClass('is-hidden'); + } + + if (info?.nationality) { + $('#charInfoInput-Nationality').val(info.nationality); + } else { + $('#charInfoContainer-Nationality').addClass('is-hidden'); + } + + if (info?.appearance || info?.personality || info?.alignment || info?.beliefs || info?.age || info?.gender || info?.pronouns || info?.title || info?.faction || info?.ethnicity || info?.nationality) { + $('#charInfoName').click(function () { + if ($("#charInfoSection").hasClass("is-hidden")) { + $("#charInfoSection").removeClass('is-hidden'); + $("#charInfoChevron").removeClass('fa-chevron-down'); + $("#charInfoChevron").addClass('fa-chevron-up'); + $('#charInfoBar-Bottom').addClass('is-hidden'); + g_characterViewOpenedTab_charInfo = true; + } else { + $("#charInfoSection").addClass('is-hidden'); + $("#charInfoChevron").removeClass('fa-chevron-up'); + $("#charInfoChevron").addClass('fa-chevron-down'); + $('#charInfoBar-Bottom').removeClass('is-hidden'); + g_characterViewOpenedTab_charInfo = false; + } + }); + + if(g_characterViewOpenedTab_charInfo){ + $('#charInfoName').click(); + } + + } else { + $('#charInfoName').addClass('is-hidden'); + $('#charInfoSection').addClass('is-hidden'); + $('#charInfoBar-Bottom').addClass('is-hidden'); + } + + // + +} diff --git a/client/vue-src/legacy-js/sheet/quickviews/class-dc-view.js b/client/vue-src/legacy-js/sheet/quickviews/class-dc-view.js new file mode 100644 index 00000000..0cc42453 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/class-dc-view.js @@ -0,0 +1,108 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openClassDCQuickview(data) { + let noteFieldID = 'classDC'; + + $('#quickViewTitle').html('Class DC'); + $('#quickViewTitleRight').html(''); + $('#customizeProfBtn').click(function(){ + openQuickView('customizeProfView', { + ProfSrcData : {For:'Class_DC',To:'Class_DC'}, + ProfData : data.ProfData, + NoteFieldID : noteFieldID, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + let qContent = $('#quickViewContent'); + + let profName = getProfNameFromNumUps(data.ProfData.NumUps); + let profNameHTML = getProfHistoryHTML(VARIABLE.CLASS_DC); + if(data.ProfData.UserProfOverride){ + qContent.append('

                      Proficiency: '+profNameHTML+' ( Override )

                      '); + } else { + qContent.append('

                      Proficiency: '+profNameHTML+'

                      '); + } + + let keyAbilityName = lengthenAbilityType(g_classDetails.KeyAbility); + keyAbilityName = (keyAbilityName == null) ? 'Unselected' : keyAbilityName; + qContent.append('

                      Ability Score: '+keyAbilityName+'

                      '); + + let userBonus = data.ProfData.UserBonus; + if(userBonus != 0){ + qContent.append('

                      Extra Bonus: '+signNumber(userBonus)+'

                      '); + } + + qContent.append('
                      '); + qContent.append('

                      Your class DC sets the difficulty for certain abilities granted by your character’s class.

                      '); + qContent.append('
                      '); + qContent.append('

                      DC Breakdown

                      '); + + let breakDownInnerHTML = '

                      '+data.TotalDC+' = 10 + '; + + breakDownInnerHTML += ''+data.KeyMod+''; + + breakDownInnerHTML += ' + '; + + if(profName == "Untrained") { + let untrainedProfBonus = 0; + if(gOption_hasProfWithoutLevel){ + untrainedProfBonus = -2; + } + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + if(gOption_hasProfWithoutLevel){ + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + breakDownInnerHTML += ''+data.ProfNum+''; + } + } + + breakDownInnerHTML += ' + '; + + let amalgBonus = data.TotalDC - (data.KeyMod + data.ProfNum + 10); + breakDownInnerHTML += ''+amalgBonus+''; + + breakDownInnerHTML += '

                      '; + + qContent.append(breakDownInnerHTML); + + let amalgBonuses = getStatExtraBonuses(VARIABLE.CLASS_DC); + if(amalgBonuses != null && amalgBonuses.length > 0){ + $('#amalgBonusNum').removeClass('has-tooltip-multiline'); + let amalgTooltipText = 'Additional adjustments:'; + for(let amalgExtra of amalgBonuses){ + amalgTooltipText += '\n'+amalgExtra; + } + $('#amalgBonusNum').attr('data-tooltip', amalgTooltipText); + } else { + $('#amalgBonusNum').addClass('has-tooltip-multiline'); + $('#amalgBonusNum').attr('data-tooltip', amalgamationBonusText); + } + + // Conditionals // + let conditionalStatMap = getConditionalStatMap(VARIABLE.CLASS_DC); + if(conditionalStatMap != null && conditionalStatMap.size != 0){ + + qContent.append('
                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of conditionalStatMap.entries()){ + qContent.append('

                      '+condition+'

                      '); + } + + } + + // Display Note Field + let noteFieldSrcStruct = { + sourceType: 'bonus-area', + sourceLevel: 0, + sourceCode: 'bonus-area-'+noteFieldID, + sourceCodeSNum: 'a', + }; + displayNotesField(qContent, noteFieldSrcStruct); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/condition-view.js b/client/vue-src/legacy-js/sheet/quickviews/condition-view.js new file mode 100644 index 00000000..570c3376 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/condition-view.js @@ -0,0 +1,13 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openConditionQuickview(data) { + addBackFunctionality(data); + + $('#quickViewTitle').html('Condition - '+capitalizeWords(data.Condition.name)); + let qContent = $('#quickViewContent'); + + qContent.append(processText(data.Condition.description, true, true, 'MEDIUM', false)); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/creature-custom-view.js b/client/vue-src/legacy-js/sheet/quickviews/creature-custom-view.js new file mode 100644 index 00000000..671d1cfa --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/creature-custom-view.js @@ -0,0 +1,59 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openCreatureCustomQuickview(data) { + + let name = data.name; + if(name.trim() == ``){ name = `Unnamed Entry`; } + $('#quickViewTitle').html(`${name}`); + + $('#quickViewTitleRight').html(`Level ${data.level}`); + + let qContent = $('#quickViewContent'); + + // Conditions // + let conditionsInnerHTML = ''; + for(let condition of getAppliedConditions(data.conditions)){ + + let fullCondition = g_allConditions.find(fullCondition => { + return fullCondition.name.toLowerCase() === condition.name.toLowerCase(); + }); + + let conditionDescription = fullCondition.description; + + if (conditionDescription.length > g_conditionStringLengthMax) { + // Reduce to tag limit + conditionDescription = conditionDescription.substring(0, g_conditionStringLengthMax); + // Reduce to include up to last complete sentence. + conditionDescription = conditionDescription.substring(0, conditionDescription.lastIndexOf(".")+1); + } + + conditionsInnerHTML += ``; + + } + if (conditionsInnerHTML != '') { + qContent.append('
                      ' + conditionsInnerHTML + '
                      '); + } + + // HP // + let hpMaxStr = data.maxHP; + if(data.customData.hpMax != data.maxHP){ + hpMaxStr = `${hpMaxStr}`; + } + qContent.append(` +
                      +

                      + HP ${hpMaxStr} +

                      +
                      + `); + + // Comments // + let comments = data.comments; + if(comments.trim() == ``){ + comments = `__Any comments or notes would be displayed here.__`; + } + qContent.append('
                      '+processText(comments, false, true, 'MEDIUM')+'
                      '); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/creature-view.js b/client/vue-src/legacy-js/sheet/quickviews/creature-view.js new file mode 100644 index 00000000..ae185ec3 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/creature-view.js @@ -0,0 +1,968 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let creatureQuickView_data = null; +let creatureQuickView_stats = null; + +function openCreatureQuickview(mainData) { + addContentSource(null, mainData.data.contentSrc, mainData.data.homebrewID); + + const data = applyEliteWeak(mainData.data, mainData.eliteWeak); + creatureQuickView_data = data; + + // Get adjusted stats + const stats = calculateCreatureStats(data, mainData.conditions); + creatureQuickView_stats = stats; + + // Fix null data + for(let d in data) { if(data[d] == null){ data[d] = ''; } } + + // Fix data for JSON.parse + if(data.traitsJSON == ''){ + data.traitsJSON = '[]'; + } + if(data.languagesJSON == ''){ + data.languagesJSON = '[]'; + } + if(data.skillsJSON == ''){ + data.skillsJSON = '[]'; + } + if(data.itemsJSON == ''){ + data.itemsJSON = '[]'; + } + if(data.interactionAbilitiesJSON == ''){ + data.interactionAbilitiesJSON = '[]'; + } + if(data.immunitiesJSON == ''){ + data.immunitiesJSON = '[]'; + } + if(data.weaknessesJSON == ''){ + data.weaknessesJSON = '[]'; + } + if(data.resistancesJSON == ''){ + data.resistancesJSON = '[]'; + } + if(data.defensiveAbilitiesJSON == ''){ + data.defensiveAbilitiesJSON = '[]'; + } + if(data.otherSpeedsJSON == ''){ + data.otherSpeedsJSON = '[]'; + } + if(data.attacksJSON == ''){ + data.attacksJSON = '[]'; + } + if(data.spellcastingJSON == ''){ + data.spellcastingJSON = '[]'; + } + if(data.offensiveAbilitiesJSON == ''){ + data.offensiveAbilitiesJSON = '[]'; + } + + + let name = data.name; + if(mainData.eliteWeak == 'elite' || mainData.eliteWeak == 'weak'){ + name = `${capitalizeWord(mainData.eliteWeak)} ${name}`; + } + $('#quickViewTitle').html(name); + + $('#quickViewTitleRight').html(`Creature ${data.level}`); + + let qContent = $('#quickViewContent'); + + // Traits // + let traitsInnerHTML = ''; + + switch (data.rarity) { + case 'UNCOMMON': traitsInnerHTML += ''; + break; + case 'RARE': traitsInnerHTML += ''; + break; + case 'UNIQUE': traitsInnerHTML += ''; + break; + default: break; + } + + switch (data.alignment) { + case 'LE': traitsInnerHTML += ''; + break; + case 'LG': traitsInnerHTML += ''; + break; + case 'LN': traitsInnerHTML += ''; + break; + case 'CE': traitsInnerHTML += ''; + break; + case 'CG': traitsInnerHTML += ''; + break; + case 'CN': traitsInnerHTML += ''; + break; + case 'N': traitsInnerHTML += ''; + break; + case 'NE': traitsInnerHTML += ''; + break; + case 'NG': traitsInnerHTML += ''; + break; + default: break; + } + + switch (data.size) { + case 'TINY': traitsInnerHTML += ''; + break; + case 'SMALL': traitsInnerHTML += ''; + break; + case 'MEDIUM': traitsInnerHTML += ''; + break; + case 'LARGE': traitsInnerHTML += ''; + break; + case 'HUGE': traitsInnerHTML += ''; + break; + case 'GARGANTUAN': traitsInnerHTML += ''; + break; + default: break; + } + + let traits = JSON.parse(data.traitsJSON).sort( + function (a, b) { + return a > b ? 1 : -1; + } + ); + + for (const traitName of traits) { + + let tag = g_allTags.find(tag => { + return tag.name.toLowerCase() === traitName.toLowerCase(); + }); + + if (tag == null) { + console.error('Unknown trait: ' + traitName); + tag = { + name: traitName, + description: `Unknown trait!`, + isImportant: 0, + }; + } + + let tagDescription = tag.description; + + if (tagDescription.length > g_tagStringLengthMax) { + tagDescription = tagDescription.substring(0, g_tagStringLengthMax); + tagDescription += '...'; + } + + traitsInnerHTML += ''; + } + if (traitsInnerHTML != '') { + qContent.append('
                      ' + traitsInnerHTML + '
                      '); + qContent.append('
                      '); + } + + $('.tagButton').click(function () { + let tagName = $(this).text(); + openQuickView('tagView', { + TagName: tagName, + _prevBackData: { Type: g_QViewLastType, Data: g_QViewLastData }, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + // Conditions // + let conditionsInnerHTML = ''; + for(let condition of getAppliedConditions(mainData.conditions)){ + + let fullCondition = g_allConditions.find(fullCondition => { + return fullCondition.name.toLowerCase() === condition.name.toLowerCase(); + }); + + let conditionDescription = fullCondition.description; + + if (conditionDescription.length > g_conditionStringLengthMax) { + // Reduce to tag limit + conditionDescription = conditionDescription.substring(0, g_conditionStringLengthMax); + // Reduce to include up to last complete sentence. + conditionDescription = conditionDescription.substring(0, conditionDescription.lastIndexOf(".")+1); + } + + conditionsInnerHTML += ``; + + } + if (conditionsInnerHTML != '') { + qContent.append('
                      ' + conditionsInnerHTML + '
                      '); + } + + + // Recall Knowledge // + // TODO + + + // Perception // + let perceptionStr = signNumber(stats.perception); + if(stats.perception != data.perceptionBonus){ + perceptionStr = wrapAdjust(perceptionStr, (stats.perception < data.perceptionBonus)); + } + + qContent.append(` +
                      +

                      + Perception ${perceptionStr}${stats.perceptionConditionals}${(data.senses != ``) ? `; ${data.senses}` : ``} +

                      +
                      + `); + + // Languages // + let langStr = ''; + for (let language of JSON.parse(data.languagesJSON)) { + langStr += language + ', '; + } + langStr = langStr.slice(0, -2);// Trim off that last ', ' + if (data.languagesCustom != ``) { + langStr += `; ${data.languagesCustom}`; + } + if (langStr != ``) { + qContent.append(` +
                      +

                      + Languages ${langStr} +

                      +
                      + `); + } + + // Skills // + let skillStr = ''; + for (let skill of stats.skills) { + + let singleSkillStr = `${skill.name} ${signNumber(skill.bonus)}`; + + let dSkill = data.skills.find(dSkill => { + return dSkill.name === skill.name; + }); + if(dSkill != null && skill.bonus != dSkill.bonus){ + singleSkillStr = wrapAdjust(singleSkillStr, (skill.bonus < dSkill.bonus)); + } + + skillStr += `${singleSkillStr}, `; + } + skillStr = skillStr.slice(0, -2);// Trim off that last ', ' + if (skillStr != ``) { + qContent.append(` +
                      +

                      + Skills ${skillStr} +

                      +
                      + `); + } + + // Ability Mods // + let strStr = signNumber(stats.abilityMods.str); + let dexStr = signNumber(stats.abilityMods.dex); + let conStr = signNumber(stats.abilityMods.con); + let intStr = signNumber(stats.abilityMods.int); + let wisStr = signNumber(stats.abilityMods.wis); + let chaStr = signNumber(stats.abilityMods.cha); + + if(stats.abilityMods.str != data.strMod){ + strStr = wrapAdjust(strStr, (stats.abilityMods.str < data.strMod)); + } + if(stats.abilityMods.dex != data.dexMod){ + dexStr = wrapAdjust(dexStr, (stats.abilityMods.dex < data.dexMod)); + } + if(stats.abilityMods.con != data.conMod){ + conStr = wrapAdjust(conStr, (stats.abilityMods.con < data.conMod)); + } + if(stats.abilityMods.int != data.intMod){ + intStr = wrapAdjust(intStr, (stats.abilityMods.int < data.intMod)); + } + if(stats.abilityMods.wis != data.wisMod){ + wisStr = wrapAdjust(wisStr, (stats.abilityMods.wis < data.wisMod)); + } + if(stats.abilityMods.cha != data.chaMod){ + chaStr = wrapAdjust(chaStr, (stats.abilityMods.cha < data.chaMod)); + } + + qContent.append(` +
                      +

                      + Str ${strStr}, + Dex ${dexStr}, + Con ${conStr}, + Int ${intStr}, + Wis ${wisStr}, + Cha ${chaStr} +

                      +
                      + `); + + // Items // + let itemsStr = ''; + for (let item of JSON.parse(data.itemsJSON)) { + + if (item.quantity > 1) { + itemsStr += `${item.quantity}x `; + } + + if (item.doIndex) { + itemsStr += item.displayName.replace(new RegExp(item.name, 'i'), `(item: ${item.name})`).toLowerCase(); + } else { + itemsStr += item.displayName.toLowerCase(); + } + + if (item.shieldStats != null) { + itemsStr += ` __(${signNumber(item.shieldStats.armor)} to AC; Hardness ${item.shieldStats.hardness}, HP ${item.shieldStats.hp}, BT ${item.shieldStats.bt})__`; + } + + itemsStr += `, `; + + } + itemsStr = itemsStr.slice(0, -2);// Trim off that last ', ' + if (itemsStr != ``) { + itemsStr = `~ Items: ${itemsStr}`; + qContent.append(` +
                      + ${processText(itemsStr, false, false, 'MEDIUM')} +
                      + `); + } + + // Interaction Abilities // + let interactionAbilities = JSON.parse(data.interactionAbilitiesJSON); + for (let ability of interactionAbilities) { + // Remove Darkvision or other base machanics like that + if (ability.description == `` || ability.description.startsWith(`

                      @Localize[PF2E.NPC.Abilities.Glossary.`)) { continue; } + addAbility(qContent, ability); + } + + qContent.append('


                      '); + + // AC & Saves // + let acStr = stats.ac; + let fortStr = signNumber(stats.saves.fort); + let reflexStr = signNumber(stats.saves.reflex); + let willStr = signNumber(stats.saves.will); + + if(stats.ac != data.acValue){ + acStr = wrapAdjust(acStr, (stats.ac < data.acValue)); + } + if(stats.saves.fort != data.fortBonus){ + fortStr = wrapAdjust(fortStr, (stats.saves.fort < data.fortBonus)); + } + if(stats.saves.reflex != data.reflexBonus){ + reflexStr = wrapAdjust(reflexStr, (stats.saves.reflex < data.reflexBonus)); + } + if(stats.saves.will != data.willBonus){ + willStr = wrapAdjust(willStr, (stats.saves.will < data.willBonus)); + } + + qContent.append(` +
                      +

                      + AC ${acStr}; + Fort ${fortStr}, + Ref ${reflexStr}, + Will ${willStr}${(data.allSavesCustom != null && data.allSavesCustom != ``) ? `; ` : ``} + ${(data.allSavesCustom != null && data.allSavesCustom != ``) ? `${data.allSavesCustom}` : ``} +

                      +
                      + `); + + // HP, Imm, Weak, Resist // + let immunitiesStr = ''; + for (let immunity of JSON.parse(data.immunitiesJSON)) { + immunitiesStr += `${immunity}, `; + } + immunitiesStr = immunitiesStr.slice(0, -2);// Trim off that last ', ' + + let weaknessesStr = ''; + for (let weakness of JSON.parse(data.weaknessesJSON)) { + weaknessesStr += `${weakness.type} ${weakness.value}`; + if (weakness.exceptions != null && weakness.exceptions != '') { + weaknessesStr += ` (${weakness.exceptions})`; + } + weaknessesStr += `, `; + } + weaknessesStr = weaknessesStr.slice(0, -2);// Trim off that last ', ' + + let resistancesStr = ''; + for (let resistance of JSON.parse(data.resistancesJSON)) { + resistancesStr += `${resistance.type} ${resistance.value}`; + if (resistance.exceptions != null && resistance.exceptions != '') { + resistancesStr += ` (${resistance.exceptions})`; + } + resistancesStr += `, `; + } + resistancesStr = resistancesStr.slice(0, -2);// Trim off that last ', ' + + let hpMaxStr = stats.hpMax; + if(stats.hpMax != data.hpMax){ + hpMaxStr = wrapAdjust(hpMaxStr, (stats.hpMax < data.hpMax)); + } + + qContent.append(` +
                      +

                      + HP ${hpMaxStr}${(data.hpDetails != ``) ? `, ${data.hpDetails}` : ``}${(immunitiesStr != ``) ? `; Immunities ${immunitiesStr}` : ``}${(weaknessesStr != ``) ? `; Weaknesses ${weaknessesStr}` : ``}${(resistancesStr != ``) ? `; Resistances ${resistancesStr}` : ``} +

                      +
                      + `); + + // Defensive Abilities // + let defensiveAbilities = JSON.parse(data.defensiveAbilitiesJSON); + for (let ability of defensiveAbilities) { + if(ability.description == ``) { continue; } + addAbility(qContent, ability); + } + + qContent.append('
                      '); + + // Speeds // + let otherSpeedsStr = ''; + for (let otherSpeed of JSON.parse(data.otherSpeedsJSON)) { + let speedValue = parseInt(otherSpeed.value) + stats.adj_speed; + if(speedValue < 5){ speedValue = 5; } + otherSpeedsStr += `, ${otherSpeed.type} ${speedValue} feet`; + } + let speedStr; + if(data.speed == 0){ + speedStr = ``; + otherSpeedsStr = otherSpeedsStr.slice(2); // Remove first ', ' + } else { + let speedValue = parseInt(data.speed) + stats.adj_speed; + if(speedValue < 5){ speedValue = 5; } + speedStr = `${speedValue} feet`; + } + + if(stats.adj_speed != 0){ + speedStr = wrapAdjust(speedStr, (stats.adj_speed < 0)); + otherSpeedsStr = wrapAdjust(otherSpeedsStr, (stats.adj_speed < 0)); + } + + qContent.append(` +
                      +

                      + Speed ${speedStr}${otherSpeedsStr} +

                      +
                      + `); + + // Attacks // + for (let attack of JSON.parse(data.attacksJSON)) { + + let traitsStr = stringifyTraits(attack.traits, true); + + let agileTrait = attack.traits.find(trait => { + return trait == 'agile'; + }); + let hasAgile = (agileTrait != null); + + let finesseTrait = attack.traits.find(trait => { + return trait == 'finesse'; + }); + let hasFinesse = (finesseTrait != null); + + let brutalTrait = attack.traits.find(trait => { + return trait == 'brutal'; + }); + let hasBrutal = (brutalTrait != null); + + let thrownTrait = attack.traits.find(trait => { + return trait.startsWith('thrown'); + }); + let hasThrown = (thrownTrait != null); + + let propulsiveTrait = attack.traits.find(trait => { + return trait == 'propulsive'; + }); + let hasPropulsive = (propulsiveTrait != null); + + let adj_attack = (attack.type.toLowerCase() == 'melee') ? stats.adj_meleeAttack : stats.adj_rangedAttack; + let adj_damage = (attack.type.toLowerCase() == 'melee') ? stats.adj_meleeDamage : stats.adj_rangedDamage; + + let data_adj_attack = (attack.type.toLowerCase() == 'melee') ? data.adj_meleeAttack : data.adj_rangedAttack; + let data_adj_damage = (attack.type.toLowerCase() == 'melee') ? data.adj_meleeDamage : data.adj_rangedDamage; + + // Apply trait-based adjustments (by un-baking stats and re-adjusting) + if(hasFinesse){ + let usesDex = (data.dexMod >= data.strMod); + + let dex_adj_attack = stats.adj_rangedAttack+(usesDex ? 0 : (data.dexMod - data.strMod)); + let dex_data_adj_attack = data.adj_rangedAttack+(usesDex ? 0 : (data.dexMod - data.strMod)); + + let str_adj_attack = stats.adj_meleeAttack+(usesDex ? (data.strMod - data.dexMod) : 0); + let str_data_adj_attack = data.adj_meleeAttack+(usesDex ? (data.strMod - data.dexMod) : 0); + + if(dex_adj_attack > str_adj_attack){ + adj_attack = dex_adj_attack; + data_adj_attack = dex_data_adj_attack; + } else { + adj_attack = str_adj_attack; + data_adj_attack = str_data_adj_attack; + } + } + if(hasBrutal){ + adj_attack = stats.adj_meleeAttack; + data_adj_attack = data.adj_meleeAttack; + } + if(hasThrown){ + let prevStrAdj = data.strMod; + adj_damage = stats.adj_rangedDamage + stats.abilityMods.str - prevStrAdj; + data_adj_damage = data.adj_rangedDamage + data.strMod - prevStrAdj; + } + if(hasPropulsive){ + let prevStrAdj = (data.strMod > 0) ? Math.floor(data.strMod/2) : -1*data.strMod; + if(stats.abilityMods.str > 0){ + adj_damage = stats.adj_rangedDamage + Math.floor((stats.abilityMods.str)/2) - prevStrAdj; + data_adj_damage = data.adj_rangedDamage + Math.floor((data.strMod)/2) - prevStrAdj; + } else { + adj_damage = stats.adj_rangedDamage + stats.abilityMods.str - prevStrAdj; + data_adj_damage = data.adj_rangedDamage + data.strMod - prevStrAdj; + } + } + + let attackBonus_1 = signNumber(attack.bonus+adj_attack); + let attackBonus_2 = signNumber(attack.bonus+adj_attack - (hasAgile ? 4 : 5)); + let attackBonus_3 = signNumber(attack.bonus+adj_attack - (hasAgile ? 8 : 10)); + let attackBonusStr = `${attackBonus_1} / ${attackBonus_2} / ${attackBonus_3}`; + + if(adj_attack != data_adj_attack){ + attackBonusStr = wrapAdjust(attackBonusStr, (adj_attack < data_adj_attack)); + } + + let damageStr = ''; + for (let damage of attack.damage) { + let damageType = damage.damageType; + //if (damageType.toLowerCase() == 'piercing') { damageType = 'P'; } + //if (damageType.toLowerCase() == 'slashing') { damageType = 'S'; } + //if (damageType.toLowerCase() == 'bludgeoning') { damageType = 'B'; } + + if(adj_damage != data_adj_damage){ + + let finalDamage = damage.damage.replace(/(\s*)([+-])(\s*)(\d+)$/, function(match, space1, numSign, space2, bonus){ + + let numBonus = parseInt(bonus); + if(numSign == '-'){ numBonus = -1*numBonus; } + + let resultBonus = numBonus + adj_damage; + let finalSign = (resultBonus >= 0 ? '+' : '-'); + let finalBonus = Math.abs(resultBonus); + + return wrapAdjust(`${space1}${finalSign}${space2}${finalBonus}`, (adj_damage < data_adj_damage)); + }); + + damageStr += `${finalDamage} ${damageType}, `; + } else { + if(adj_damage != 0){ + damageStr += `${damage.damage+signNumber(adj_damage)} ${damageType}, `; + } else { + damageStr += `${damage.damage} ${damageType}, `; + } + } + } + if (attack.effects != ``) { + damageStr += `plus ${attack.effects}`; + } else { + damageStr = damageStr.slice(0, -2);// Trim off that last ', ' + } + + qContent.append(` +
                      + ${processText(`~ ${capitalizeWord(attack.type)}: ONE-ACTION ${attack.name.toLowerCase()} ${attackBonusStr}${traitsStr}, **Damage** ${damageStr}`, false, false, 'MEDIUM')} +
                      + `); + + } + + // Spellcasting // + for (let spellcasting of JSON.parse(data.spellcastingJSON)) { + + let indexSpells = (!spellcasting.name.includes(`Ritual`)); + + let spellsStr = ``; + if (spellcasting.focus != 0) { + spellsStr += `${spellcasting.focus} Focus Points`; + } + if (spellcasting.dc != 0) { + if (spellsStr != ``) { spellsStr += `, `; } + + let spellDCStr = `DC ${spellcasting.dc+stats.adj_spellDC}`; + if(stats.adj_spellDC != data.adj_spellDC){ + spellDCStr = wrapAdjust(spellDCStr, (stats.adj_spellDC < data.adj_spellDC)); + } + + spellsStr += spellDCStr; + } + if (spellcasting.attack != 0) { + if (spellsStr != ``) { spellsStr += `, `; } + + let spellAttackStr = `attack ${signNumber(spellcasting.attack+stats.adj_spellAttack)}`; + if(stats.adj_spellAttack != data.adj_spellAttack){ + spellAttackStr = wrapAdjust(spellAttackStr, (stats.adj_spellAttack < data.adj_spellAttack)); + } + + spellsStr += spellAttackStr; + + } + spellsStr += `; `; + + // Spells + let spells = spellcasting.spells.sort( + function (a, b) { + if (a.level === b.level) { + // Name is only important when levels are the same + return a.name > b.name ? 1 : -1; + } + return b.level - a.level; + } + ); + let spell_lastLevel = 999; + for(let spell of spells){ + if(spell.level < spell_lastLevel){ + if(spell_lastLevel != 999){ + spellsStr = spellsStr.slice(0, -2);// Trim off that last ', ' + spellsStr += `; `; + } + if(spell.level == 0){ + spellsStr += `**Cantrips (${rankLevel(spells[0].level)})** `; + } else { + spellsStr += `**${rankLevel(spell.level)}** `; + } + } + if(indexSpells){ + spellsStr += `(spell: ${spell.name.toLowerCase()})${spell.isAtWill ? ` (at will)` : ``}, `; + } else { + spellsStr += `${spell.name.toLowerCase()}${spell.isAtWill ? ` (at will)` : ``}, `; + } + spell_lastLevel = spell.level; + } + if(spells.length > 0){ + spellsStr = spellsStr.slice(0, -2);// Trim off that last ', ' + } + // + + // Constant Spells + let constantSpells = spellcasting.constantSpells.sort( + function (a, b) { + if (a.level === b.level) { + // Name is only important when levels are the same + return a.name > b.name ? 1 : -1; + } + return b.level - a.level; + } + ); + if(constantSpells.length > 0){ + if(spells.length > 0){ + spellsStr += `; `; + } + spellsStr += `**Constant** `; + } + let constant_lastLevel = 999; + for(let spell of constantSpells){ + if(spell.level < constant_lastLevel){ + if(constant_lastLevel != 999){ + spellsStr = spellsStr.slice(0, -2);// Trim off that last ', ' + spellsStr += `; `; + } + if(spell.level == 0){ + spellsStr += `**(Cantrips)** `; + } else { + spellsStr += `**(${rankLevel(spell.level)})** `; + } + } + if(indexSpells){ + spellsStr += `(spell: ${spell.name.toLowerCase()}), `; + } else { + spellsStr += `${spell.name.toLowerCase()}, `; + } + constant_lastLevel = spell.level; + } + if(constantSpells.length > 0){ + spellsStr = spellsStr.slice(0, -2);// Trim off that last ', ' + } + // + + qContent.append(` +
                      + ${processText(`~ ${spellcasting.name}: ${spellsStr}`, false, false, 'MEDIUM')} +
                      + `); + + } + + // Offensive Abilities // + let offensiveAbilities = JSON.parse(data.offensiveAbilitiesJSON); + for (let ability of offensiveAbilities) { + addAbility(qContent, ability); + } + + if (data.flavorText != null && data.flavorText != ``) { + qContent.append('
                      '); + + qContent.append(` + + `); + + $('.creature-view-flavor-text').click(function () { + openQuickView('abilityView', { + Ability: { + name: data.name, + description: `
                      ${data.flavorText}
                      `, + level: 0, + }, + _prevBackData: { Type: g_QViewLastType, Data: g_QViewLastData }, + }, $('#quickviewDefault').hasClass('is-active')); + }); + } + +} + + +function addAbility(qContent, ability) { + + let traitsStr = stringifyTraits(ability.traits, true); + + let abilityID = 'creature-ability-' + ability.name.replace(/\W/g, '-'); + + let actions = ability.actions; + if (actions == null) { actions = ''; } + + + if (ability.description.startsWith(`

                      @Localize[PF2E.NPC.Abilities.Glossary.`)) { + // It's just the name of the ability and a link, + + let abilityName = ability.name; + let extraText = ``; + + let matchFeet = ability.name.match(/ \d+ feet.*/); + if(matchFeet != null){ + extraText = matchFeet[0]; + abilityName = ability.name.replace(extraText, ''); + } else { + let matchNum = ability.name.match(/ \d+.*/); + if(matchNum != null){ + extraText = matchNum[0]; + abilityName = ability.name.replace(extraText, ''); + } + } + + qContent.append(` +

                      + ${processText(`(feat: ${abilityName})${extraText} ${actions}${traitsStr}`, false, false, 'MEDIUM')} +
                      + `); + + } else { + + qContent.append(` +
                      + ${processText(`${ability.name} ${actions}${traitsStr}`, false, false, 'MEDIUM')} + +
                      + `); + + $(`#${abilityID}-header`).click(function () { + if ($(`#${abilityID}-description`).hasClass("is-hidden")) { + $(`#${abilityID}-description`).removeClass('is-hidden'); + $(`#${abilityID}-chevron`).removeClass('fa-chevron-right'); + $(`#${abilityID}-chevron`).addClass('fa-chevron-down'); + } else { + $(`#${abilityID}-description`).addClass('is-hidden'); + $(`#${abilityID}-chevron`).removeClass('fa-chevron-down'); + $(`#${abilityID}-chevron`).addClass('fa-chevron-right'); + } + }); + + } + +} + +function wrapAdjust(value, isNegative){ + if(isNegative){ + return `${value}`; + } else { + return `${value}`; + } +} + +function stringifyTraits(traits, surroundWithParentheses = false) { + let traitsStr = ''; + for (let trait of traits) { + + if (trait.toLowerCase().startsWith('reach-')) { + + let reachAmt = trait.toLowerCase().replace('reach-', ''); + traitsStr += `(trait: reach) ${reachAmt} feet, `; + + } else if (trait.toLowerCase().startsWith('range-')) { + + let rangeAmt = trait.toLowerCase().replace('range-', ''); + rangeAmt = rangeAmt.replace('increment-', ''); + traitsStr += `range ${rangeAmt} feet, `; + + } else if (trait.toLowerCase().startsWith('reload-')) { + + let reloadAmt = trait.toLowerCase().replace('reload-', ''); + traitsStr += `reload ${reloadAmt}, `; + + } else if (trait.toLowerCase().startsWith('thrown-')) { + + let thrownAmt = trait.toLowerCase().replace('thrown-', ''); + traitsStr += `(trait: thrown) ${thrownAmt} feet, `; + + } else { + traitsStr += `(trait: ${trait.replace(/-/g, ' ')}), `; + } + + } + traitsStr = traitsStr.slice(0, -2);// Trim off that last ', ' + if (traitsStr != '' && surroundWithParentheses) { traitsStr = ` (${traitsStr})`; } + return traitsStr; +} + +function parseDescription(text) { + + text = text.replace(/\[\[\/(r|br) (.*?)\]\]{(.*?)}/g, handleParse_DamageExt); + text = text.replace(/\[\[\/(r|br) (.*)\]\]/g, handleParse_Damage); + text = text.replace(/
                      \n

                      @Compendium\[pf2e\.bestiary-effects\.Effect:(.+?)<\/p>/gi, ''); + text = text.replace(/@Compendium\[(.+?)\]{(.*?)}/g, handleParse_Compendium); + text = text.replace(/@Template\[(.+?)\]/g, handleParse_Template); + text = text.replace(/@Check\[(.+?)\]/g, handleParse_Check); + text = text.replace(/@Localize\[PF2E\.NPC\.Abilities\.Glossary\.(.+?)\]/g, handleParse_Glossary); + + // Adjustments + if(creatureQuickView_stats.adj_generalDamage != 0){ + text = text.replace(/(^| )(\d+)+d(\d+)((\s*[+-]\s*\d+)*)($|\D)/g, function(match, startChar, diceNum, diceType, extraBonuses, lastBonus, endChar){ + + let generalDamageStr = signNumber(creatureQuickView_stats.adj_generalDamage); + if(creatureQuickView_stats.adj_generalDamage != creatureQuickView_data.adj_generalDamage){ + generalDamageStr = wrapAdjust(generalDamageStr, (creatureQuickView_stats.adj_generalDamage < creatureQuickView_data.adj_generalDamage)); + } + + return `${startChar}${diceNum}d${diceType}${extraBonuses}${generalDamageStr}${endChar}`; + }); + } + if(creatureQuickView_stats.adj_generalDC != 0){ + text = text.replace(/(^| )DC (\d+)($|\D)/g, function(match, startChar, dcValue, endChar){ + + let generalDCStr = ''+(parseInt(dcValue) + creatureQuickView_stats.adj_generalDC); + if(creatureQuickView_stats.adj_generalDC != creatureQuickView_data.adj_generalDC){ + generalDCStr = wrapAdjust(generalDCStr, (creatureQuickView_stats.adj_generalDC < creatureQuickView_data.adj_generalDC)); + } + + return `${startChar}DC ${generalDCStr}${endChar}`; + }); + } + + return text; +} + +function handleParse_DamageExt(match, rBr, innerText, displayText) { + return displayText; +} + +function handleParse_Damage(match, rBr, innerText) { + return innerText.replace(/\W/g, ' ').trim(); +} + +function handleParse_Glossary(match, innerText) { + + if (typeof g_featMap !== 'undefined' && g_featMap != null) { + innerText = innerText.toLowerCase(); + + for (const [featID, featStruct] of g_featMap.entries()) { + let reducedName = featStruct.Feat.name.replace(/ /g, '').toLowerCase(); + if (reducedName === innerText) { + + let description = ``; + + if (featStruct.Feat.frequency != null && featStruct.Feat.frequency != '') { + description += `**Frequency** ${featStruct.Feat.frequency}\n`; + } + if (featStruct.Feat.cost != null && featStruct.Feat.cost != '') { + description += `**Cost** ${featStruct.Feat.cost}\n`; + } + if (featStruct.Feat.trigger != null && featStruct.Feat.trigger != '') { + description += `**Trigger** ${featStruct.Feat.trigger}\n`; + } + if (featStruct.Feat.requirements != null && featStruct.Feat.requirements != '') { + description += `**Requirements** ${featStruct.Feat.requirements}\n`; + } + + return description+featStruct.Feat.description; + } + } + return `Failed to find description of ${innerText}.`; + } else { + return `Description of ${innerText}.`; + } + +} + +function handleParse_Compendium(match, innerText, displayText) { + if (innerText.includes('Persistent Damage')) { + return 'damage'; + } else { + return displayText.toLowerCase(); + } +} + +function handleParse_Template(match, innerText) { + innerText = innerText.toLowerCase(); + + let type = null; + let distance = null; + + let values = innerText.split('|'); + for (let value of values) { + + if (value.startsWith('type:')) { + type = value.replace('type:', ''); + } else if (value.startsWith('distance:')) { + distance = value.replace('distance:', ''); + } + + } + + if (type != null && distance != null) { + return `${distance}-foot ${type} `; + } else { + return innerText; + } + +} + +function handleParse_Check(match, innerText) { + innerText = innerText.toLowerCase(); + + let type = null; + let dc = null; + let basic = null; + let name = null; + let traits = null; + + let values = innerText.split('|'); + for (let value of values) { + + if (value.startsWith('type:')) { + type = value.replace('type:', ''); + } else if (value.startsWith('dc:')) { + dc = value.replace('dc:', ''); + } else if (value.startsWith('basic:')) { + basic = value.replace('basic:', ''); + } else if (value.startsWith('name:')) { + name = value.replace('name:', ''); + } else if (value.startsWith('traits:')) { + traits = value.replace('traits:', ''); + } + + } + + if (dc != null && type != null) { + let basicStr = (basic != null && basic == 'true') ? 'basic ' : ''; + return `DC ${dc} ${basicStr}${capitalizeWords(type)}`; + } else { + return innerText; + } + +} diff --git a/client/vue-src/legacy-js/sheet/quickviews/customize-item-view.js b/client/vue-src/legacy-js/sheet/quickviews/customize-item-view.js new file mode 100644 index 00000000..42b88d10 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/customize-item-view.js @@ -0,0 +1,247 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openCustomizeItemQuickview(data) { + addBackFunctionality(data); + + $('#quickViewTitle').html("Customize Item"); + let qContent = $('#quickViewContent'); + + qContent.append('

                      '); + qContent.append('
                      '); + qContent.append('
                      '); + qContent.append('
                      '); + + if(data.InvItem.itemIsWeapon == 1){ + + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + + } + + if(data.InvItem.itemIsStorage == 1){ + + qContent.append('
                      '); + + qContent.append('
                      '); + + } + + qContent.append('
                      '); + + let tagsSelectOptions = ''; + for(let tag of g_allTags){ + if(tag.isHidden == 0 && tag.isArchived == 0){ + tagsSelectOptions += ''; + } + } + qContent.append('
                      '); + + $("#customizeItemTraits").chosen({width: "100%"}); + + qContent.append('
                      '); + + let materialSelectOptions = ''; + for(const [materialCodeName, data] of g_materialsMap.entries()){ + materialSelectOptions += ''; + } + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + + data.InvItem.code = (data.InvItem.code == null) ? '' : data.InvItem.code; + qContent.append(` +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + `); + + qContent.append('
                      '); + + + $('#customizeItemSize').val(data.InvItem.size); + if(data.InvItem.isShoddy == 1){ + $('#customizeItemShoddy').prop('checked', true); + } + $('#customizeItemMaterial').val(data.InvItem.materialType); + + // Traits // + try { + let tagArray = JSON.parse(data.InvItem.itemTags); + for(let tagID of tagArray){ + $("#customizeItemTraits").find('option[value='+tagID+']').attr('selected','selected'); + } + } catch (err) { + for(let tag of data.Item.TagArray){ + $("#customizeItemTraits").find('option[value='+tag.id+']').attr('selected','selected'); + } + } + $('#customizeItemTraits').trigger("chosen:updated"); + + // Weapon // + if(data.InvItem.itemIsWeapon == 1){ + $('#customizeWeaponDamageDie').val(data.InvItem.itemWeaponDieType); + } + + $('#customizeItemSaveButton').click(function(){ + + let name = $('#customizeItemName').val(); + let price = parseInt($('#customizeItemPrice').val()); + let bulk = parseFloat($('#customizeItemBulk').val()); + let description = $('#customizeItemDescription').val(); + let size = $('#customizeItemSize').val(); + let isShoddy = ($('#customizeItemShoddy').prop('checked') == true) ? 1 : 0; + let materialType = $('#customizeItemMaterial').val(); + let hitPoints = parseInt($('#customizeItemHitPoints').val()); + let brokenThreshold = parseInt($('#customizeItemBrokenThreshold').val()); + let hardness = parseInt($('#customizeItemHardness').val()); + let code = $('#customizeItemCode').val(); + + let isValid = true; + + if(name == null || name == ''){ + $('#customizeItemName').addClass('is-danger'); + isValid = false; + } else { + $('#customizeItemName').removeClass('is-danger'); + } + + if(price == null || price > 99999999 || price < 0 || price % 1 != 0) { + $('#customizeItemPrice').addClass('is-danger'); + isValid = false; + } else { + $('#customizeItemPrice').removeClass('is-danger'); + } + + if(bulk == null || bulk > 99 || bulk < 0) { + $('#customizeItemBulk').addClass('is-danger'); + isValid = false; + } else { + $('#customizeItemBulk').removeClass('is-danger'); + } + + if(description == '') { + description = '__No Description__'; + } + + if(hitPoints == null || hitPoints > 99999 || hitPoints < 0 || hitPoints % 1 != 0) { + $('#customizeItemHitPoints').addClass('is-danger'); + isValid = false; + } else { + $('#customizeItemHitPoints').removeClass('is-danger'); + } + + if(brokenThreshold == null|| brokenThreshold > hitPoints || brokenThreshold < 0 || brokenThreshold % 1 != 0) { + $('#customizeItemBrokenThreshold').addClass('is-danger'); + isValid = false; + } else { + $('#customizeItemBrokenThreshold').removeClass('is-danger'); + } + + if(hardness == null || hardness > 99999 || hardness < 0 || hardness % 1 != 0) { + $('#customizeItemHardness').addClass('is-danger'); + isValid = false; + } else { + $('#customizeItemHardness').removeClass('is-danger'); + } + + if(code == '') { + code = null; + } + + // Traits // + let itemTagsData = JSON.stringify($("#customizeItemTraits").val()); + if(itemTagsData.length > 400){ + itemTagsData = null; + } + + // Weapon // + let weaponDieType, weaponDamageType = null; + let weaponRange = 0; + let weaponReload = 0; + let weaponAtkBonus = 0; + let weaponDmgBonus = 0; + if(data.InvItem.itemIsWeapon == 1){ + weaponDieType = $('#customizeWeaponDamageDie').val(); + weaponDamageType = $('#customizeWeaponDamageType').val(); + weaponRange = $('#customizeWeaponRange').val(); + weaponReload = $('#customizeWeaponReload').val(); + weaponAtkBonus = $('#customizeWeaponAtkBonus').val(); + weaponDmgBonus = $('#customizeWeaponDmgBonus').val(); + } + if(weaponRange == ''){ weaponRange = null; } + if(weaponReload == ''){ weaponReload = null; } + if(weaponAtkBonus == ''){ weaponAtkBonus = null; } + if(weaponDmgBonus == ''){ weaponDmgBonus = null; } + + // Storage // + let storageMaxBulk = null; + if(data.InvItem.itemIsStorage == 1){ + storageMaxBulk = $('#customizeStorageMaxBulk').val(); + } + + if(isValid){ + socket.emit("requestCustomizeInvItem", + data.InvItem.id, + { + name: name, + price: price, + bulk: bulk, + description: description, + size: size, + isShoddy: isShoddy, + materialType: materialType, + hitPoints: hitPoints, + brokenThreshold: brokenThreshold, + hardness: hardness, + code: code, + itemTagsData: itemTagsData, + + weaponDieType: weaponDieType, + weaponDamageType: weaponDamageType, + weaponRange: weaponRange, + weaponReload: weaponReload, + weaponAtkBonus: weaponAtkBonus, + weaponDmgBonus: weaponDmgBonus, + + storageMaxBulk: storageMaxBulk, + } + ); + } + + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/customize-prof-view.js b/client/vue-src/legacy-js/sheet/quickviews/customize-prof-view.js new file mode 100644 index 00000000..a8c8976e --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/customize-prof-view.js @@ -0,0 +1,113 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openCustomizeProfQuickview(data) { + addBackFunctionality(data); + + let profName = data.ProfData.Name.replace(/_/g,' '); + $('#quickViewTitle').html("Customize - "+capitalizeWords(profName).replace('Class Dc', 'Class DC')); + let qContent = $('#quickViewContent'); + + qContent.append('
                      '); + + let userBonus = (data.ProfData.UserBonus != null) ? data.ProfData.UserBonus : 0; + qContent.append('
                      '); + + qContent.append('
                      '); + + qContent.append('
                      '); + + if(data.ProfData.UserProfOverride != null && data.ProfData.UserProfOverride){ + let userSetProfData = getUserSetData(g_profMap.get(data.ProfSrcData.To)); + console.log(userSetProfData); + $('#customizeProf').val(userSetProfData.Prof); + } else { + $('#customizeProf').val('chooseDefault'); + } + + let noteFieldSrcStruct = { + sourceType: 'bonus-area', + sourceLevel: 0, + sourceCode: 'bonus-area-'+data.NoteFieldID, + sourceCodeSNum: 'a', + }; + let notesData = getNotesData(noteFieldSrcStruct); + if(notesData != null){ + $('#customizeHasNoteField').prop('checked', true); + } + + $('#customizeSaveButton').click(function(){ + + // Reloads character sheet twice, which is unnecessary. + + let prof = $('#customizeProf').val(); + let userBonus = $('#customizeBonus').val(); + let hasNoteField = $('#customizeHasNoteField').prop('checked'); + + if(hasNoteField) { + socket.emit("requestNotesFieldChange", + getCharIDFromURL(), + noteFieldSrcStruct, + 'Additional bonuses...', + null); + } else { + socket.emit("requestNotesFieldDelete", + getCharIDFromURL(), + noteFieldSrcStruct); + } + + + let srcStructProf = { + sourceType: 'user-set', + sourceLevel: 0, + sourceCode: data.ProfSrcData.To+",,,Prof", + sourceCodeSNum: 'a', + }; + if(prof === 'chooseDefault'){ + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct : srcStructProf}, + null + ); + } else { + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct : srcStructProf}, + { + For : data.ProfSrcData.For, + To : data.ProfSrcData.To, + Prof : prof, + SourceName: 'User-Override', + } + ); + } + + let srcStructBonus = { + sourceType: 'user-set', + sourceLevel: 0, + sourceCode: data.ProfSrcData.To+",,,Bonus", + sourceCodeSNum: 'a', + }; + if(userBonus == 0 || userBonus == ''){ + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct : srcStructBonus}, + null + ); + } else { + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct : srcStructBonus}, + { + For : data.ProfSrcData.For, + To : data.ProfSrcData.To, + Prof : parseInt(userBonus), + SourceName: 'User-Override', + } + ); + } + + }); + +} diff --git a/client/vue-src/legacy-js/sheet/quickviews/familiar-view.js b/client/vue-src/legacy-js/sheet/quickviews/familiar-view.js new file mode 100644 index 00000000..04de4e86 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/familiar-view.js @@ -0,0 +1,262 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openFamiliarQuickview(data) { + + let qContent = $('#quickViewContent'); + + let familiar = data.CharFamiliar; + processFamiliarAbilities(familiar); + + let specificStruct = getFamiliarSpecificStruct(familiar.specificType); + + // Remove Button // + $('#quickViewTitleRight').html(''); + $('#removeFamiliarBtn').click(function(){ + new ConfirmMessage('Remove Familiar', 'Are you sure you want to permanently remove this familiar?', 'Remove', 'modal-remove-familiar-'+familiar.id, 'modal-remove-familiar-btn-'+familiar.id); + $('#modal-remove-familiar-btn-'+familiar.id).click(function() { + socket.emit("requestRemoveFamiliar", + getCharIDFromURL(), + familiar.id); + }); + }); + + // Familiar Traits // + displayFamiliarTraits(qContent, specificStruct); + + // Name // + qContent.append('
                      '); + + $("#familiarName").on("input", function(){ + let familiarName = $('#familiarName').val(); + if(familiarName != 'Familiar'){ + $('#quickViewTitle').html("Familiar - "+familiarName); + } else { + $('#quickViewTitle').html("Familiar"); + } + }); + $('#familiarName').trigger("input"); + + $('#familiarName').blur(function() { + if($('#familiarName').val() != familiar.name){ + updateFamiliar(familiar); + } + }); + + // Health // + let maxHP = getFamiliarMaxHealth(familiar); + let currentHP = familiar.currentHP; + if(currentHP == -1){ currentHP = maxHP; } + + qContent.append(''); + // Press Enter Key + $('#familiarHealthInput').on('keypress',function(e){ + if(e.which == 13){ + $('#familiarHealthInput').blur(); + } + }); + $('#familiarHealthInput').blur(function() { + if($('#familiarHealthInput').val() != familiar.currentHP){ + try { + let newCurrentHP = parseInt(math.evaluate($('#familiarHealthInput').val())); + if(newCurrentHP > maxHP) { newCurrentHP = maxHP; } + if(newCurrentHP < 0) { newCurrentHP = 0; } + if(isNaN(newCurrentHP)) { throw 'Value is not a number!'; } + + familiar.currentHP = newCurrentHP; + $('#familiarHealthInput').val(newCurrentHP); + $('#familiarHealthInput').removeClass('is-danger'); + updateFamiliar(familiar); + } catch (err) { + $('#familiarHealthInput').addClass('is-danger'); + } + } else { + $('#familiarHealthInput').removeClass('is-danger'); + } + }); + + qContent.append('
                      '); + + let percepBonus = getFamiliarPerception(); + let AC = getFamiliarAC(); + + let fortBonus = getFamiliarFortBonus(); + let reflexBonus = getFamiliarReflexBonus(); + let willBonus = getFamiliarWillBonus(); + + qContent.append('

                      Perception

                      AC

                      Fort.

                      Reflex

                      Will

                      '); + qContent.append('

                      '+signNumber(percepBonus)+'

                      '+AC+'

                      '+signNumber(fortBonus)+'

                      '+signNumber(reflexBonus)+'

                      '+signNumber(willBonus)+'

                      '); + + qContent.append('
                      '); + + qContent.append('
                      '+signNumber(getFamiliarAcrobatics())+'
                      Acrobatics
                      '); + qContent.append('
                      '+signNumber(getFamiliarStealth())+'
                      Stealth
                      '); + qContent.append('
                      '+signNumber(getFamiliarMiscBonus())+'
                      Misc. Bonus
                      '); + + qContent.append('
                      '); + + qContent.append('

                      Size '+capitalizeWords(getFamiliarSize())+'

                      '); + + qContent.append('

                      Speed '+getFamiliarSpeed(familiar)+'

                      '); + + let sensesText = getFamiliarSense(familiar); + sensesText = sensesText.replace('low-light vision', 'low-light vision'); + sensesText = sensesText.replace('darkvision', 'darkvision'); + sensesText = sensesText.replace('scent', 'scent'); + sensesText = sensesText.replace('imprecise', 'imprecise'); + + qContent.append('

                      Senses '+sensesText+'

                      '); + + // Familiar Alignment // + displayFamiliarAlignment(qContent, specificStruct); + + // Familiar Required Number of Abilities // + displayFamiliarReqAbils(qContent, specificStruct); + + qContent.append('
                      '); + + let familiarAbilityHTML = ''; + let masterAbilityHTML = ''; + for(let famAbility of g_companionData.AllFamiliarAbilities){ + if(famAbility.isMaster == 1){ + masterAbilityHTML += ''; + } else { + familiarAbilityHTML += ''; + } + } + + qContent.append('
                      '); + qContent.append('
                      '); + + qContent.append('
                      '); + qContent.append('
                      '); + + let abilityArray = g_familiarAbilitiesMap.get(familiar.id); + if(abilityArray != null){ + for(let ability of abilityArray) { + $('#selectFamiliarAbility option[value="'+ability.name+'"]').attr('selected','selected'); + $('#selectMasterAbility option[value="'+ability.name+'"]').attr('selected','selected'); + } + } + + $("#selectFamiliarAbility").chosen({width: "100%"}); + $("#selectMasterAbility").chosen({width: "100%"}); + + $("#selectFamiliarAbility").chosen().change(function() { + updateFamiliar(familiar); + openQuickView('familiarView', { + CharFamiliar: familiar, + ViewScroll: $('#quickviewDefault').find('.quickview-body').scrollTop(), + }, $('#quickviewDefault').hasClass('is-active')); + }); + $("#selectMasterAbility").chosen().change(function() { + updateFamiliar(familiar); + openQuickView('familiarView', { + CharFamiliar: familiar, + ViewScroll: $('#quickviewDefault').find('.quickview-body').scrollTop(), + }, $('#quickviewDefault').hasClass('is-active')); + }); + + if(abilityArray != null){ + for(let ability of abilityArray) { + let descriptionContent = null; + if(ability.isMaster == 1) { + descriptionContent = $('#masterAbilityDescriptions'); + } else { + descriptionContent = $('#familiarAbilityDescriptions'); + } + descriptionContent.append('
                      '); + descriptionContent.append('

                      '+ability.name+'

                      '); + if(ability.prerequisites != null){ + descriptionContent.append('

                      Prerequisites '+ability.prerequisites+'

                      '); + } + if(ability.requirements != null){ + descriptionContent.append('

                      Requirements '+ability.requirements+'

                      '); + } + descriptionContent.append('
                      '+processText(ability.description, true, true, 'MEDIUM')+'
                      '); + + let familiarAbilityCodeID = 'familiarAbility'+ability.id; + descriptionContent.append('
                      '); + // Add Text Statements + processAddText(ability.code, familiarAbilityCodeID); + // Note Field Statements + let srcStruct = { + sourceType: 'familiar', + sourceLevel: 0, + sourceCode: 'familiarAbility-'+familiar.id+'-'+ability.id, + sourceCodeSNum: 'a', + }; + displayNotesField($('#'+familiarAbilityCodeID), srcStruct, 1); + } + } + + // Familiar Extra Abilities // + displayFamiliarExtraAbils(qContent, specificStruct); + + qContent.append('
                      '); + + qContent.append('
                      '); + $('#familiarDescription').blur(function() { + if($('#familiarDescription').val() != familiar.description){ + updateFamiliar(familiar); + } + }); + + qContent.append('
                      '); + $('#familiarImageURL').blur(function() { + if($('#familiarImageURL').val() != familiar.imageURL){ + updateFamiliar(familiar); + } + }); + + + if(data.ViewScroll != null){ + $('#quickviewDefault').find('.quickview-body').scrollTop(data.ViewScroll); + } + +} + +function updateFamiliar(familiar) { + + let familiarAbilityArray = $('#selectFamiliarAbility').val(); + let masterAbilityArray = $('#selectMasterAbility').val(); + + let updateValues = { + Name : $('#familiarName').val(), + CurrentHealth : $('#familiarHealthInput').val(), + Description : $('#familiarDescription').val(), + ImageURL : $('#familiarImageURL').val(), + AbilitiesJSON : JSON.stringify(familiarAbilityArray.concat(masterAbilityArray)), + }; + + familiar.name = updateValues.Name; + familiar.currentHP = updateValues.CurrentHealth; + familiar.description = updateValues.Description; + familiar.imageURL = updateValues.ImageURL; + familiar.abilitiesJSON = updateValues.AbilitiesJSON; + + socket.emit("requestUpdateFamiliar", + getCharIDFromURL(), + familiar.id, + updateValues); + +} + +socket.on("returnUpdateFamiliar", function(){ + openCompanionTab(); +}); + +socket.on("returnRemoveFamiliar", function(charFamiliarID){ + + let newFamiliars = []; + for(let charFamiliar of g_companionData.Familiars){ + if(charFamiliar.id != charFamiliarID){ + newFamiliars.push(charFamiliar); + } + } + g_companionData.Familiars = newFamiliars; + + closeQuickView(); + openCompanionTab(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/feat-view.js b/client/vue-src/legacy-js/sheet/quickviews/feat-view.js new file mode 100644 index 00000000..be2f6aec --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/feat-view.js @@ -0,0 +1,316 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* +data = { + Feat : selectedFeat.Feat, + Tags : selectedFeat.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, +} +Requires: + - Text-Processing + - g_allConditions + - g_allLanguages + - g_featMap + - g_itemMap + - g_spellMap + - Add-Text-Processing + - g_skillMap (either CharGathering or GeneralGathering version) + - g_allTags +*/ +function openFeatQuickview(data) { + addBackFunctionality(data); + addContentSource(data.Feat.id, data.Feat.contentSrc, data.Feat.homebrewID); + + let featNameInnerHTML = ''+data.Feat.name+''; + switch(data.Feat.actions) { + case 'FREE_ACTION': featNameInnerHTML += '[free-action]'; break; + case 'REACTION': featNameInnerHTML += '[reaction]'; break; + case 'ACTION': featNameInnerHTML += '[one-action]'; break; + case 'TWO_ACTIONS': featNameInnerHTML += '[two-actions]'; break; + case 'THREE_ACTIONS': featNameInnerHTML += '[three-actions]'; break; + default: break; + } + + if(data.Feat.isArchived === 1){ + featNameInnerHTML += '(archived)'; + } + + $('#quickViewTitle').html(featNameInnerHTML); + if(data.Feat.level > 0){ + $('#quickViewTitleRight').html('Level '+data.Feat.level+''); + } + let qContent = $('#quickViewContent'); + + let featTagsInnerHTML = '
                      '; + switch(data.Feat.rarity) { + case 'UNCOMMON': featTagsInnerHTML += ''; + break; + case 'RARE': featTagsInnerHTML += ''; + break; + case 'UNIQUE': featTagsInnerHTML += ''; + break; + default: break; + } + if(data.Feat.skillID != null){ + let skill = null; + for(const [skillName, skillData] of g_skillMap.entries()){ + if(skillData.Skill.id == data.Feat.skillID) { + skill = skillData.Skill; + break; + } + } + if(skill != null){ + featTagsInnerHTML += ''; + } + } + + data.Tags = data.Tags.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + for(const tag of data.Tags){ + if(data.Feat.level == -1 && tag.name == 'General'){ continue; } + let tagDescription = tag.description; + if(tagDescription.length > g_tagStringLengthMax){ + tagDescription = tagDescription.substring(0, g_tagStringLengthMax); + tagDescription += '...'; + } + featTagsInnerHTML += ''; + } + featTagsInnerHTML += '
                      '; + + qContent.append(featTagsInnerHTML); + + $('.tagButton').click(function(){ + let tagName = $(this).text(); + openQuickView('tagView', { + TagName : tagName, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + let featContentInnerHTML = ''; + let foundUpperFeatLine = false; + if(data.Feat.prerequisites != null){ + if(isBuilderPage() && g_character.optionAutoDetectPreReqs === 1) { + let resultArray = preReqResultArray(data.Feat.prerequisites); + + let preReqStr = ''; + for(let resultData of resultArray){ + let dataLinkClass = 'dataLink-'+Math.floor((Math.random()*99999)); + if(resultData.Result == 'TRUE'){ + if(resultData.Type == 'FEAT'){ + preReqStr += ''+resultData.PreReqPart+''+preReqGetIconTrue(); + preReqFeatLink(dataLinkClass, resultData.PreReqPart); + } else if(resultData.Type == 'CLASS-FEATURE'){ + preReqStr += ''+resultData.PreReqPart+''+preReqGetIconTrue(); + } else { + preReqStr += ''+resultData.PreReqPart+''+preReqGetIconTrue(); + } + } else if(resultData.Result == 'FALSE') { + if(resultData.Type == 'FEAT'){ + preReqStr += ''+resultData.PreReqPart+''+preReqGetIconFalse(); + preReqFeatLink(dataLinkClass, resultData.PreReqPart); + } else if(resultData.Type == 'CLASS-FEATURE'){ + preReqStr += ''+resultData.PreReqPart+''+preReqGetIconFalse(); + } else { + preReqStr += ''+resultData.PreReqPart+''+preReqGetIconFalse(); + } + } else if(resultData.Result == 'UNKNOWN') { + preReqStr += ''+resultData.PreReqPart+''+preReqGetIconUnknown(); + } + preReqStr += ', '; + } + preReqStr = preReqStr.slice(0, -2);// Trim off that last ', ' + featContentInnerHTML += '

                      Prerequisites '+preReqStr+'

                      '; + } else if(isSheetPage()) { + // Don't display prereq, unnecessary + } else { + featContentInnerHTML += '

                      Prerequisites '+data.Feat.prerequisites+'

                      '; + } + foundUpperFeatLine = true; + } + if(data.Feat.frequency != null){ + featContentInnerHTML += '

                      Frequency '+data.Feat.frequency+'

                      '; + foundUpperFeatLine = true; + } + if(data.Feat.cost != null){ + featContentInnerHTML += '

                      Cost '+data.Feat.cost+'

                      '; + foundUpperFeatLine = true; + } + if(data.Feat.trigger != null){ + featContentInnerHTML += '

                      Trigger '+data.Feat.trigger+'

                      '; + foundUpperFeatLine = true; + } + if(data.Feat.requirements != null){ + featContentInnerHTML += '

                      Requirements '+data.Feat.requirements+'

                      '; + foundUpperFeatLine = true; + } + + if(foundUpperFeatLine){ + featContentInnerHTML += '
                      '; + } + + let description = featViewTextProcessor(data.Feat.description); + featContentInnerHTML += '
                      '+processText(description, true, true, 'MEDIUM')+'
                      '; + + if(data.Feat.special != null){ + featContentInnerHTML += '
                      '+processText('~ Special: '+data.Feat.special, true, true, 'MEDIUM')+'
                      '; + } + + qContent.append(featContentInnerHTML); + + // Add Text Statements + if(typeof processAddText === "function") { + processAddText(data.Feat.code, 'quickViewContent'); + } + + // Note Field Statements + if(data.SrcStruct != null){ + displayNotesField(qContent, data.SrcStruct); + } + + showFeatListOptions(qContent, data.Feat.code); + + if(!isSheetPage()){ + showFeatPrerequisiteFor(qContent, data.Feat.name); + } + + if(typeof g_isDeveloper !== 'undefined' && g_isDeveloper && data.Feat.code != null && data.Feat.code.trim() != '') { + qContent.append('
                      '); + qContent.append('

                      WSC Statements

                      '); + + let codeHTML = ''; + for(let codeStatement of data.Feat.code.split(/\n/)){ + codeHTML += '

                      '+codeStatement+'

                      '; + } + qContent.append('
                      '+codeHTML+'
                      '); + } + +} + + + +function showFeatListOptions(qContent, wscStatements){ + if(wscStatements == null) {return;} + + let statementArray = wscStatements.split(/\n/); + + let statementCounts = {}; + statementArray.forEach(function(x) { statementCounts[x] = (statementCounts[x] || 0)+1; }); + + for(let statement in statementCounts) { + if(statement.includes("GIVE-FEAT-FROM=")){ // GIVE-FEAT-FROM=Choose a Tradition:feat 1,feat 2,feat 2 + let value = statement.split('GIVE-FEAT-FROM=')[1]; + let valueParts = value.split(':'); + if(valueParts.length != 2){ displayError('Invalid syntax "'+statement+'"'); continue; } + let selectorTitle = valueParts[0]; + let featNameList = handleVariableText(valueParts[1]).split(','); + + let repetitionWord = numToRepetitionWord(statementCounts[statement]); + + let listText = '**'+selectorTitle+' '+repetitionWord+'**\n'; + + let detectSameBeginningDashText = function(){ + let beginningDashText = null; + for(let featName of featNameList){ + if(beginningDashText == null){ + if(featName.includes(' - ')){ + beginningDashText = featName.split(' - ')[0]; + } else { + return null; + } + } else { + if(!featName.startsWith(beginningDashText+' - ')){ + return null; + } + } + } + return beginningDashText; + }; + const beginningDashText = detectSameBeginningDashText(); + + for(let featName of featNameList){ + if(featName.endsWith('}')){ featName = featName.replace('}',''); } + let displayFeatName = featName.replace(beginningDashText+' - ', ''); + listText += '* : (feat: '+displayFeatName+' | '+featName+')\n'; + } + qContent.append('
                      '); + qContent.append('
                      '+processText(listText, true, true, 'MEDIUM')+'
                      '); + } + } +} + +function showFeatPrerequisiteFor(qContent, featName) { + if(typeof g_featMap == 'undefined') { return; } + + let prereqFeatMap = new Map(); + for(const [featID, featStruct] of g_featMap.entries()){ + if(featStruct.Feat.prerequisites != null && !prereqFeatMap.has(featStruct.Feat.name) && featNameIsFeatPrerequisite(featStruct.Feat.prerequisites, featName)) { + prereqFeatMap.set(featStruct.Feat.name, featStruct); + } + } + + let prereqFeatArray = Array.from(prereqFeatMap.values()); + prereqFeatArray = prereqFeatArray.sort( + function(a, b) { + if (a.Feat.level === b.Feat.level) { + // Name is only important when levels are the same + return a.Feat.name > b.Feat.name ? 1 : -1; + } + return a.Feat.level - b.Feat.level; + } + ); + + if(prereqFeatArray.length > 0){ + + let prereqForStr = ''; + for (let i = 0; i < prereqFeatArray.length; i++) { + const preReqFeat = prereqFeatArray[i]; + + prereqForStr += '(feat: '+preReqFeat.Feat.name+')'; + if(preReqFeat.Feat.level > 0){ + prereqForStr += ' ('+preReqFeat.Feat.level+')'; + } + + if(i === prereqFeatArray.length-2) { + prereqForStr += ', and '; + } else if(i === prereqFeatArray.length-1) { + prereqForStr += '.'; + } else { + prereqForStr += ', '; + } + } + + qContent.append('
                      '); + qContent.append('
                      '+processText('~ Prerequisite for: '+prereqForStr, true, true, 'MEDIUM')+'
                      '); + + } +} + +function featNameIsFeatPrerequisite(prerequisites, featName){ + if(prerequisites == featName) { return true; } + if(prerequisites.includes(', '+featName) && prerequisites.endsWith(featName)) { return true; } + if(prerequisites.includes('; '+featName) && prerequisites.endsWith(featName)) { return true; } + if(prerequisites.startsWith(featName) && prerequisites.includes(featName+', ')) { return true; } + if(prerequisites.startsWith(featName) && prerequisites.includes(featName+'; ')) { return true; } + return false; +} + +function featViewTextProcessor(text){ + if(!isSheetPage()) { return text; } + + let speedNum = getStatTotal(VARIABLE.SPEED); + speedNum = (speedNum > 5) ? speedNum : 5; + + text = text.replace('for 5 feet plus 5 feet per 20 feet of your land Speed', ''+(5+5*Math.floor(speedNum/20))+' feet'); + text = text.replace('for 5 feet per 20 feet of your land Speed', ''+(5*Math.floor(speedNum/20) != 0 ? 5*Math.floor(speedNum/20) : 5)+' feet'); + + text = text.replace('10 feet plus 5 feet per 20 feet of your land Speed', ''+(10+5*Math.floor(speedNum/20))+' feet'); + text = text.replace('5 feet plus 5 feet per 20 feet of your land Speed.', ''+(5+5*Math.floor(speedNum/20))+' feet'); + + return text; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/general-breakdown-view.js b/client/vue-src/legacy-js/sheet/quickviews/general-breakdown-view.js new file mode 100644 index 00000000..de5e23f1 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/general-breakdown-view.js @@ -0,0 +1,219 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + data + title + name + varName + isProfDC, optional +*/ + +let amalgamationBonusText = "This is a collection of any additional bonuses or penalties you might have. This includes adjustments from feats, items, conditions, or those you may have added manually."; + +function openGeneralBreakdownQuickview(data) { + + $('#quickViewTitle').html(data.title); + + let qContent = $('#quickViewContent'); + + const variable = g_variableMap.get(data.varName); + if(variable == null) { + qContent.append(` +

                      + Unknown variable: ${data.varName}! +

                      + `); + return; + } + + //////// Prof //////// + if(variable.Type == VAR_TYPE.PROFICIENCY){ + + const rankName = profToWord(variables_getFinalRank(data.varName)); + const profNameHTML = getProfHistoryHTML(data.varName); + qContent.append('

                      Proficiency: '+profNameHTML+'

                      '); + + if(variable.Value.AbilityScore != VARIABLE.SCORE_NONE){ + + const abilityScoreName = lengthenAbilityType(variable.Value.AbilityScore.replace('SCORE_', '')); + const profBonus = getProfNumber(profToNumUp(variables_getFinalRank(data.varName)), g_character.level); + const isDC = (data.isProfDC != null && data.isProfDC); + + let totalValue = variables_getTotal(data.varName); + if(isDC){ + totalValue += 10; + } else { + totalValue = signNumber(totalValue); + } + + qContent.append(` +

                      + Ability Score: ${abilityScoreName} +

                      ` + ); + + qContent.append('
                      '); + + qContent.append(`

                      ${(isDC)?'DC':'Bonus'} Breakdown

                      `); + + let breakDownInnerHTML = ` +

                      ${totalValue} = + `; + + if(isDC){ + breakDownInnerHTML += ' 10 + '; + } + + breakDownInnerHTML += ` + + ${getMod(variables_getTotal(variable.Value.AbilityScore))} + + `; + + breakDownInnerHTML += ' + '; + + if(rankName == "Untrained") { + let untrainedProfBonus = 0; + if(gOption_hasProfWithoutLevel){ + untrainedProfBonus = -2; + } + breakDownInnerHTML += ` + + ${profBonus} + + `; + } else { + if(gOption_hasProfWithoutLevel){ + breakDownInnerHTML += ` + + ${profBonus} + + `; + } else { + breakDownInnerHTML += ` + + ${profBonus} + + `; + } + } + + breakDownInnerHTML += ' + '; + + // Bonuses + let amalgBonus = variables_getBonusTotal(data.varName); + breakDownInnerHTML += ''+amalgBonus+''; + + breakDownInnerHTML += '

                      '; + + qContent.append(breakDownInnerHTML); + + let amalgBonuses = getStatExtraBonuses(data.varName); + if(amalgBonuses != null && amalgBonuses.length > 0){ + $('#amalgBonusNum').removeClass('has-tooltip-multiline'); + let amalgTooltipText = 'Additional adjustments:'; + for(let amalgExtra of amalgBonuses){ + amalgTooltipText += '\n'+amalgExtra; + } + $('#amalgBonusNum').attr('data-tooltip', amalgTooltipText); + } else { + $('#amalgBonusNum').addClass('has-tooltip-multiline'); + $('#amalgBonusNum').attr('data-tooltip', amalgamationBonusText); + } + + // Conditionals + let conditionalStatMap = getConditionalStatMap(data.varName); + if(conditionalStatMap != null && conditionalStatMap.size != 0){ + + qContent.append('
                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of conditionalStatMap.entries()){ + qContent.append('

                      '+condition+'

                      '); + } + + } + + } + + //////// Int //////// + if(variable.Type == VAR_TYPE.INTEGER){ + + qContent.append(`

                      Value Breakdown

                      `); + + let breakDownInnerHTML = ` +

                      ${variables_getTotal(data.varName)} = + `; + + breakDownInnerHTML += ` + + ${variables_getValue(data.varName)} + + `; + + // Bonuses + let map = variables_getBonusesMap(data.varName); + for(let [type, valueData] of map.entries()){ + breakDownInnerHTML += ` + + ${valueData.Value} + + `; + } + + if(breakDownInnerHTML.endsWith(' + ')){ + breakDownInnerHTML = breakDownInnerHTML.slice(0, -3);// Trim off that last ' + ' + } + + qContent.append(breakDownInnerHTML); + + // Conditionals + let conditionalStatMap = getConditionalStatMap(data.varName); + if(conditionalStatMap != null && conditionalStatMap.size != 0){ + + qContent.append('


                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of conditionalStatMap.entries()){ + qContent.append('

                      '+condition+'

                      '); + } + + } + + } + + //////// String //////// + if(variable.Type == VAR_TYPE.STRING){ + + qContent.append(`

                      Value Breakdown

                      `); + + let breakDownInnerHTML = ``; + + breakDownInnerHTML += ` + + ${variables_getValue(data.varName)} + + `; + + // Extras + let map = variables_getExtrasMap(data.varName); + for(let [type, valueData] of map.entries()){ + breakDownInnerHTML += ` + + ${valueData.Value} + , `; + } + + if(breakDownInnerHTML.endsWith(', ')){ + breakDownInnerHTML = breakDownInnerHTML.slice(0, -2);// Trim off that last ', ' + } + + qContent.append(breakDownInnerHTML); + + } + + } + + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/hero-points-view.js b/client/vue-src/legacy-js/sheet/quickviews/hero-points-view.js new file mode 100644 index 00000000..9227b085 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/hero-points-view.js @@ -0,0 +1,18 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openHeroPointsQuickview(data) { + + $('#quickViewTitle').html('Hero Points'); + let qContent = $('#quickViewContent'); + + qContent.append(processText('Your character usually begins each game session with 1 Hero Point, and you can gain more later by devising clever strategies or performing heroic deeds - something selfless, daring, or beyond normal expectations.\nThe GM is in charge of awarding Hero Points and they may have their own rules on how one gains Hero Points.\nFor more information about Hero Points see page 467.', true, true)); + qContent.append('
                      '); + qContent.append('

                      You can spend Hero Points on the following:

                      '); + qContent.append('

                      Spend 1 Hero Point

                      '); + qContent.append('

                      You can reroll any check. You must use the second result. This is a fortune effect (which means you can’t use more than 1 Hero Point on a check).

                      '); + qContent.append('

                      Spend all your Hero Points

                      '); + qContent.append('

                      You avoid death. You must spend a minimum of 1 Hero Point to do this. You can do this when your dying condition would increase. You lose the dying condition entirely and stabilize with 0 Hit Points. You don’t gain the wounded condition or increase its value from losing the dying condition in this way, but if you already had that condition, you don’t lose it or decrease its value.

                      '); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/hit-points-breakdown-view.js b/client/vue-src/legacy-js/sheet/quickviews/hit-points-breakdown-view.js new file mode 100644 index 00000000..ced443fc --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/hit-points-breakdown-view.js @@ -0,0 +1,100 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + data + classHitPoints +*/ + +let hitPointsFlatBonusText = "This is a collection of any additional Hit Points you might be given. This primarily includes additional Hit Points given from feats."; + +let hitPointsPerLevelBonusText = "This is a collection of any additional Hit Points you gain at each level that you might be given. This primarily includes additional Hit Points given from feats."; + +function openHitPointsBreakdownQuickview(data) { + + $('#quickViewTitle').html('Hit Points'); + + let qContent = $('#quickViewContent'); + + qContent.append(`

                      Value Breakdown

                      `); + + const flatHitPoints = variables_getTotal(VARIABLE.MAX_HEALTH); + const conMod = getMod(variables_getTotal(VARIABLE.SCORE_CON)); + const hitPointsPerLevel = variables_getTotal(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL); + + const totalHitPoints = flatHitPoints + (data.classHitPoints+conMod+hitPointsPerLevel)*g_character.level; + + let breakDownInnerHTML = ` +

                      ${totalHitPoints} = + `; + + breakDownInnerHTML += ` + + ${variables_getValue(VARIABLE.MAX_HEALTH)} + + `; + + breakDownInnerHTML += ' + '; + + breakDownInnerHTML += ''+variables_getBonusTotal(VARIABLE.MAX_HEALTH)+''; + + breakDownInnerHTML += ' + '; + + breakDownInnerHTML += ` + + ${g_character.level}`; + + breakDownInnerHTML += '×('; + + breakDownInnerHTML += ` + + ${data.classHitPoints} + + `; + + breakDownInnerHTML += ' + '; + + breakDownInnerHTML += ` + + ${conMod} + + `; + + breakDownInnerHTML += ' + '; + + breakDownInnerHTML += ''+hitPointsPerLevel+''; + + breakDownInnerHTML += ')'; + + qContent.append(breakDownInnerHTML); + + + let hitPointsFlatBonuses = getStatExtraBonuses(VARIABLE.MAX_HEALTH); + if(hitPointsFlatBonuses != null && hitPointsFlatBonuses.length > 0){ + $('#hitPointsFlatBonus').removeClass('has-tooltip-multiline'); + let tooltipText = 'Additional adjustments:'; + for(let hitPointsExtra of hitPointsFlatBonuses){ + tooltipText += '\n'+hitPointsExtra; + } + $('#hitPointsFlatBonus').attr('data-tooltip', tooltipText); + } else { + $('#hitPointsFlatBonus').addClass('has-tooltip-multiline'); + $('#hitPointsFlatBonus').attr('data-tooltip', hitPointsFlatBonusText); + } + + let hitPointsPerLevelBonuses = getStatExtraBonuses(VARIABLE.MAX_HEALTH_BONUS_PER_LEVEL); + if(hitPointsPerLevelBonuses != null && hitPointsPerLevelBonuses.length > 0){ + $('#hitPointsPerLevelBonus').removeClass('has-tooltip-multiline'); + let tooltipText = 'Additional adjustments:'; + for(let hitPointsExtra of hitPointsPerLevelBonuses){ + tooltipText += '\n'+hitPointsExtra; + } + $('#hitPointsPerLevelBonus').attr('data-tooltip', tooltipText); + } else { + $('#hitPointsPerLevelBonus').addClass('has-tooltip-multiline'); + $('#hitPointsPerLevelBonus').attr('data-tooltip', hitPointsPerLevelBonusText); + } + + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/inv-item-view.js b/client/vue-src/legacy-js/sheet/quickviews/inv-item-view.js new file mode 100644 index 00000000..00f06c9b --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/inv-item-view.js @@ -0,0 +1,856 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_invItemView_isCriticalHit = false; + +function openInvItemQuickview(data) { + addBackFunctionality(data); + + let viewOnly = (data.InvItem.viewOnly != null) ? true : false; + + let invItemName = data.InvItem.name; + + let itemLevel = getInvItemLevel(data.Item, data.InvItem); + if(itemLevel > 0 && itemLevel != 999){ + invItemName += ' Lvl '+itemLevel+''; + } + // Hardcoded New Item ID // If item isn't New Item, Paper, Parchment, and isn't an item with N/A level + if(data.InvItem.name != data.Item.Item.name && data.Item.Item.id != 62 && data.Item.Item.id != 94 && data.Item.Item.id != 95 && data.Item.Item.level != 999 && data.ExtraData.IsCustomUnarmedAttack !== true){ + invItemName += '

                      ( '+data.Item.Item.name+' )

                      '; + } + $('#quickViewTitle').html(invItemName); + let qContent = $('#quickViewContent'); + + let invItemQtyInputID = 'invItemQtyInput'+data.InvItem.id; + let invItemHPInputID = 'invItemHPInput'+data.InvItem.id; + + let invItemMoveSelectID = 'invItemMoveSelect'+data.InvItem.id; + let invItemMoveButtonID = 'invItemMoveButton'+data.InvItem.id; + + let invItemRemoveButtonID = 'invItemRemoveButton'+data.InvItem.id; + let invItemCustomizeButtonID = 'invItemCustomizeButton'+data.InvItem.id; + + let isShoddy = (data.InvItem.isShoddy == 1); + let maxHP = (isShoddy) ? Math.floor(data.InvItem.hitPoints/2) : data.InvItem.hitPoints; + let brokenThreshold = (isShoddy) ? Math.floor(data.InvItem.brokenThreshold/2) : data.InvItem.brokenThreshold; + + data.InvItem.currentHitPoints = (data.InvItem.currentHitPoints > maxHP) ? maxHP : data.InvItem.currentHitPoints; + + let isBroken = (data.InvItem.currentHitPoints <= brokenThreshold); + if(doesntHaveItemHealth(data.InvItem)) {isBroken = false;} + + let isInvestable = false; + + let tagsInnerHTML = ''; + + let rarity = data.Item.Item.rarity; + switch(rarity) { + case 'UNCOMMON': tagsInnerHTML += ''; + break; + case 'RARE': tagsInnerHTML += ''; + break; + case 'UNIQUE': tagsInnerHTML += ''; + break; + default: break; + } + + if(isBroken){ + tagsInnerHTML += ''; + } + if(isShoddy){ + tagsInnerHTML += ''; + } + + let itemSize = data.InvItem.size; + switch(itemSize) { + case 'TINY': tagsInnerHTML += ''; + break; + case 'SMALL': tagsInnerHTML += ''; + break; + case 'LARGE': tagsInnerHTML += ''; + break; + case 'HUGE': tagsInnerHTML += ''; + break; + case 'GARGANTUAN': tagsInnerHTML += ''; + break; + default: break; + } + + if(data.InvItem.materialType != null){ + let itemMaterial = g_materialsMap.get(data.InvItem.materialType); + if(itemMaterial != null){ + tagsInnerHTML += ''; + } + } + + let tagArray = getItemTraitsArray(data.Item, data.InvItem); + for(const tag of tagArray){ + let tagDescription = tag.description; + if(tagDescription.length > g_tagStringLengthMax){ + tagDescription = tagDescription.substring(0, g_tagStringLengthMax); + tagDescription += '...'; + } + tagsInnerHTML += ''; + if(tag.id === 235){ // Hardcoded Invested Tag ID + if(maxInvests > currentInvests || (maxInvests == currentInvests && data.InvItem.isInvested == 1)) { + $('#quickViewTitleRight').html('Invest'); + } else { + $('#quickViewTitleRight').html('Invest'); + } + isInvestable = true; + } + } + + if(tagsInnerHTML != ''){ + qContent.append('
                      '+tagsInnerHTML+'
                      '); + qContent.append('
                      '); + } + + $('.tagButton').click(function(){ + let tagName = $(this).text(); + openQuickView('tagView', { + TagName : tagName, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + if(isInvestable){ + + if(data.InvItem.isInvested == 1) { + $('#investedIconButton').removeClass('is-outlined'); + $('#investedIconName').text('Invested'); + } else { + $('#investedIconButton').addClass('is-outlined'); + $('#investedIconName').text('Invest'); + } + + $('#investedIconButton').click(function() { + let isInvested = (data.InvItem.isInvested == 1) ? 0 : 1; + socket.emit("requestInvItemInvestChange", + data.InvItem.id, + isInvested); + }); + + } + + let price = getConvertedPriceForSize(data.InvItem.size, data.InvItem.price); + price = getCoinToString(price); + if(data.Item.Item.quantity > 1){ + price += ' for '+data.Item.Item.quantity; + } + + qContent.append('

                      Price '+price+'

                      '); + + let usageBulkEntry = ''; + if(data.Item.Item.usage != null){ + usageBulkEntry += 'Usage '+data.Item.Item.usage+'; '; + } + let bulk = determineItemBulk(g_charSize, data.InvItem.size, data.InvItem.bulk); + + let armorAdjBulk = getWornArmorBulkAdjustment(data.InvItem, bulk); + let armorAdjBulkText = null; + if(bulk == 0.1 && armorAdjBulk == 1){ + armorAdjBulkText = '1 from carrying and not wearing armor'; + } else if(armorAdjBulk > bulk) { + armorAdjBulkText = ' + 1 from carrying and not wearing armor'; + } + + bulk = getBulkFromNumber(bulk); + usageBulkEntry += 'Bulk '+bulk; + if(armorAdjBulkText != null) { usageBulkEntry += armorAdjBulkText; } + if(data.InvItem.isDropped == 1) { usageBulkEntry += ' (Dropped)'; } + qContent.append('

                      '+usageBulkEntry+'

                      '); + + if(data.Item.Item.hands != 'NONE'){ + qContent.append('

                      Hands '+getHandsToString(data.Item.Item.hands)+'

                      '); + } + + qContent.append('
                      '); + + if(data.Item.WeaponData != null){ + + qContent.append('
                      '); + + let populateAttackBonusAndDamage = function(){ + + let attackBonusAndDamageContent = $('#qContent-invItem-attackBonusAndDamage'); + attackBonusAndDamageContent.html(''); + + let calcStruct = getAttackAndDamage(data.Item, data.InvItem); + let map = generateMAP(calcStruct.AttackBonus, tagArray); + + if(g_invItemView_isCriticalHit && hasCriticalSpecialization(data.Item)){ + calcStruct.WeapStruct.damage.modifications.on_crit_other.push({ + mod: criticalSpecializationText(data.Item), + info: 'CriticalSpecialization' + }); + } + + if(g_invItemView_isCriticalHit){ + let deadlyTag = tagArray.find(tag => { + return tag.name.match(/^Deadly d(\d+)$/m) != null; + }); + if(deadlyTag != null){ + const die_type = deadlyTag.name.replace('Deadly ', ''); + let diceNum = 1; + if(isGreaterStriking(data.InvItem.fundRuneID)){ + diceNum = 2; + } else if(isMajorStriking(data.InvItem.fundRuneID)){ + diceNum = 3; + } + calcStruct.WeapStruct.damage.modifications.on_crit_damage.push({ + mod: diceNum+''+die_type+' '+calcStruct.WeapStruct.damage.type, + info: 'DeadlyTrait' + }); + } + + let fatalTag = tagArray.find(tag => { + return tag.name.match(/^Fatal d(\d+)$/m) != null; + }); + if(fatalTag != null){ + const die_type = fatalTag.name.replace('Fatal ', ''); + const old_die_type = calcStruct.WeapStruct.damage.die_type; + + calcStruct.WeapStruct.damage.die_type = die_type; + calcStruct.Damage = calcStruct.Damage.replace(old_die_type, die_type); + calcStruct.DamageDice = calcStruct.DamageDice.replace(old_die_type, die_type); + + calcStruct.WeapStruct.damage.modifications.on_crit_damage.push({ + mod: '1'+die_type+' '+calcStruct.WeapStruct.damage.type, + info: 'FatalTrait' + }); + } + } + + let attackHasConditionals = (calcStruct.WeapStruct.attack.conditionals != null && calcStruct.WeapStruct.attack.conditionals.size != 0); + let damageHasConditionals = ((calcStruct.WeapStruct.damage.conditionals != null && calcStruct.WeapStruct.damage.conditionals.size != 0) || calcStruct.WeapStruct.damage.modifications.on_hit_other.length != 0); + + let doubleDamageClass = (g_invItemView_isCriticalHit) ? 'damage-roll-double-result' : ''; + + let weapDamageModHTML = ''; + for(const onHitDmgMod of calcStruct.WeapStruct.damage.modifications.on_hit_damage){ + let modification = onHitDmgMod.mod; + if(modification.startsWith('-')){ + modification = modification.slice(1); + weapDamageModHTML += ` - `; + } else { + weapDamageModHTML += ` + `; + } + weapDamageModHTML += `${modification}`; + } + + let damageHTML = `${calcStruct.Damage} + ${weapDamageModHTML}`; + if(g_invItemView_isCriticalHit) { + damageHTML = `2×( ${damageHTML} )`; + + if(calcStruct.WeapStruct.damage.modifications.on_crit_other.length != 0){ + damageHasConditionals = true; + } + + for(const onCritDmgMod of calcStruct.WeapStruct.damage.modifications.on_crit_damage){ + let modification = onCritDmgMod.mod; + if(modification.startsWith('-')){ + modification = modification.slice(1); + damageHTML += ` - `; + } else { + damageHTML += ` + `; + } + damageHTML += `${modification}`; + } + + } + + attackBonusAndDamageContent.append(` +
                      +
                      + Attack Bonus${(attackHasConditionals) ? ('*') : ('')} +
                      +
                      + + + + + ${g_invItemView_isCriticalHit ? ('Crit. ') : ('')}Damage${(damageHasConditionals) ? ('*') : ('')} +
                      +
                      + `); + attackBonusAndDamageContent.append(` +
                      +
                      + + ${map.one} + / + ${map.two} + / + ${map.three} + +
                      +
                      + + ${damageHTML} + +
                      +
                      + `); + if(gOption_hasDiceRoller) { refreshStatRollButtons(); } + + $('#damageCriticalHit').click(function() { + g_invItemView_isCriticalHit = !g_invItemView_isCriticalHit; + populateAttackBonusAndDamage(); + }); + + $('#invWeapAttackView').click(function() { + openQuickView('itemBreakdownView', { + title: data.InvItem.name+' - Attack Bonus', + breakdownTitle: 'Bonus', + breakdownTotal: calcStruct.AttackBonus, + breakdownMap: calcStruct.WeapStruct.attack.parts, + conditionalMap: calcStruct.WeapStruct.attack.conditionals, + isBonus: true, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + $('#invWeapAttackView').mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#invWeapAttackView').mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + $('#invWeapDamageView').click(function() { + openQuickView('itemBreakdownView', { + title: data.InvItem.name+(g_invItemView_isCriticalHit ? ' - Crit. Damage' : ' - Damage'), + breakdownTitle: 'Damage', + breakdownTotal: calcStruct.Damage, + breakdownDamageDice: calcStruct.DamageDice, + breakdownDamageType: calcStruct.WeapStruct.damage.type, + breakdownMap: calcStruct.WeapStruct.damage.parts, + conditionalMap: calcStruct.WeapStruct.damage.conditionals, + modifications: calcStruct.WeapStruct.damage.modifications, + isBonus: false, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + $('#invWeapDamageView').mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#invWeapDamageView').mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + }; + populateAttackBonusAndDamage(); + + qContent.append('
                      '); + + if(data.Item.WeaponData.isRanged == 1){ + + let weaponRange = '-'; + let weaponReload = '-'; + if(data.InvItem.itemWeaponRange == null && data.InvItem.itemWeaponReload == null){ + weaponRange = data.Item.WeaponData.rangedRange; + weaponReload = data.Item.WeaponData.rangedReload; + } else { + weaponRange = data.InvItem.itemWeaponRange; + weaponReload = data.InvItem.itemWeaponReload; + } + + for(const weapRangeMod of getWeapMod(data.InvItem.id, 'ADJUST-RANGE')){ + weaponRange += parseInt(weapRangeMod.mod); + } + for(const weapReloadMod of getWeapMod(data.InvItem.id, 'ADJUST-RELOAD')){ + weaponReload += parseInt(weapReloadMod.mod); + } + + if(weaponReload == 0){ weaponReload = '-'; } + weaponRange += ' ft'; + + qContent.append(` +
                      +
                      + Range +
                      +
                      + Reload +
                      +
                      + `); + qContent.append(` +
                      +
                      +

                      + + ${weaponRange} + +

                      + + + +
                      +
                      +

                      + ${weaponReload} +

                      +
                      +
                      + `); + + $('#itemRangeAmount').click(function() { + if($("#itemRangeCalcSection").hasClass("is-hidden")) { + $("#itemRangeCalcSection").removeClass('is-hidden'); + $("#itemRangeCalcChevron").removeClass('fa-chevron-down'); + $("#itemRangeCalcChevron").addClass('fa-chevron-up'); + } else { + $("#itemRangeCalcSection").addClass('is-hidden'); + $("#itemRangeCalcChevron").removeClass('fa-chevron-up'); + $("#itemRangeCalcChevron").addClass('fa-chevron-down'); + } + }); + + $('#itemRangeCalcInput').on('keypress',function(e){ + if(e.which == 13){ // Press Enter Key + $('#itemRangeCalcInput').blur(); + } + }); + $('#itemRangeCalcInput').blur(function() { + let newDistance = $(this).val(); + $(this).removeClass('is-danger'); + if(newDistance == '' || newDistance == null || newDistance == 0){ + $('#itemRangeCalcInput').val(0); + $('#itemRangeCalcOutput').text('-0'); + } else if(newDistance > 6*parseInt(weaponRange) || newDistance < 0){ + $(this).addClass('is-danger'); + $('#itemRangeCalcOutput').text('×'); + } else { + let penalty = (Math.ceil(newDistance/parseInt(weaponRange))-1)*2; + // For -0 to show properly, split '-' from penalty + $('#itemRangeCalcOutput').text('-'+penalty); + } + }); + + qContent.append('
                      '); + + } + + } + + if(data.Item.ArmorData != null){ + + // Apply Shoddy to Armor + let acBonus = data.Item.ArmorData.acBonus; + acBonus += (isShoddy) ? -2 : 0; + + let armorCheckPenalty = data.Item.ArmorData.checkPenalty; + armorCheckPenalty += (isShoddy) ? -2 : 0; + // + + qContent.append('
                      AC Bonus
                      Dex Cap
                      '); + qContent.append('

                      '+signNumber(acBonus)+'

                      '+signNumber(data.Item.ArmorData.dexCap)+'

                      '); + + qContent.append('
                      '); + + let minStrength = (data.Item.ArmorData.minStrength == 0) ? '-' : data.Item.ArmorData.minStrength+''; + let checkPenalty = (armorCheckPenalty == 0) ? '-' : armorCheckPenalty+''; + let speedPenalty = (data.Item.ArmorData.speedPenalty == 0) ? '-' : data.Item.ArmorData.speedPenalty+' ft'; + qContent.append('
                      Strength
                      Check Penalty
                      Speed Penalty
                      '); + qContent.append('

                      '+minStrength+'

                      '+checkPenalty+'

                      '+speedPenalty+'

                      '); + + qContent.append('
                      '); + + } + + if(data.Item.ShieldData != null){ + + let speedPenalty = (data.Item.ShieldData.speedPenalty == 0) ? '-' : data.Item.ShieldData.speedPenalty+' ft'; + qContent.append('
                      AC Bonus
                      Speed Penalty
                      '); + qContent.append('

                      '+signNumber(data.Item.ShieldData.acBonus)+'

                      '+speedPenalty+'

                      '); + + qContent.append('
                      '); + + } + + if(data.Item.StorageData != null){ + + let maxBagBulk = data.InvItem.itemStorageMaxBulk; + if(maxBagBulk == null){ maxBagBulk = data.Item.StorageData.maxBulkStorage; } + let bulkIgnored = data.Item.StorageData.bulkIgnored; + let bulkIgnoredMessage = "-"; + if(bulkIgnored != 0.0){ + if(bulkIgnored == maxBagBulk){ + bulkIgnoredMessage = "All Items"; + } else { + bulkIgnoredMessage = "First "+bulkIgnored+" Bulk of Items"; + } + } + + qContent.append('
                      Bulk Storage
                      Bulk Ignored
                      '); + qContent.append('

                      '+maxBagBulk+'

                      '+bulkIgnoredMessage+'

                      '); + + qContent.append('
                      '); + } + + qContent.append('
                      '+processText(data.InvItem.description, true, true, 'MEDIUM')+'
                      '); + + if(data.Item.Item.craftRequirements != null){ + qContent.append('
                      '); + qContent.append('
                      '+processText('~ Craft Requirements: '+data.Item.Item.craftRequirements, true, true, 'MEDIUM')+'
                      '); + } + + qContent.append('
                      '); + + // Attachments + if(data.Item.StorageData == null){ + let hasInvData = (data.InvData != null); + // Not storage but has items stored under it. + if((hasInvData && data.InvData.ItemIsStorage) || (!hasInvData && (g_bulkAndCoinsStruct.BagBulkMap.get(data.InvItem.id) != null))) { + + qContent.append(` +
                      +
                      + Attachments +
                      +
                      + +
                      +
                      + `); + + for(const attachedInvItem of g_invStruct.InvItems){ + if(data.InvItem.id == attachedInvItem.bagInvItemID){ + + const itemAttachmentID = 'itemAttachment-'+attachedInvItem.id; + + $('#itemAttachmentsSection').append(` +

                      ${attachedInvItem.name}

                      + `); + + $('#'+itemAttachmentID).click(function(){ + if(hasInvData) { + openQuickView('invItemView', { + InvItem : attachedInvItem, + Item : g_itemMap.get(attachedInvItem.itemID+""), + InvData : { + OpenBagItemArray : data.InvData.OpenBagItemArray, + ItemIsStorage : (g_bulkAndCoinsStruct.BagBulkMap.get(attachedInvItem.id) != null), + ItemIsStorageAndEmpty : true + }, + ExtraData : {}, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + } else { + openQuickView('invItemView', { + InvItem : attachedInvItem, + Item : g_itemMap.get(attachedInvItem.itemID+""), + InvData : null, + ExtraData : {}, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + } + }); + + } + } + + qContent.append('
                      '); + + } + } + + // Item Runes + let consumableTag = tagArray.find(tag => { + return tag.id == 402; // Hardcoded Consumable Tag ID + }); + if(!viewOnly && consumableTag == null){ // In ViewOnly mode you cannot view weapon runes + if(data.Item.WeaponData != null){ + + displayRunesForItem(qContent, data.InvItem, true); + + qContent.append('
                      '); + + } + + if(data.Item.ArmorData != null){ + + displayRunesForItem(qContent, data.InvItem, false); + + qContent.append('
                      '); + + } + } + + // Item Quantity + if(!viewOnly && data.Item.Item.hasQuantity == 1){ + qContent.append(''); + + $('#'+invItemQtyInputID).blur(function() { + let newQty = $(this).val(); + if(newQty != data.InvItem.quantity && newQty != ''){ + if(newQty <= 9999999 && newQty >= 0) { + $(this).removeClass('is-danger'); + socket.emit("requestInvItemQtyChange", + data.InvItem.id, + newQty); + } else { + $(this).addClass('is-danger'); + } + } else { + if(newQty <= 9999999 && newQty >= 0) { + $(this).removeClass('is-danger'); + } + } + }); + } + + // Weapon and Armor Category + if(data.Item.WeaponData != null){ + + let weapGroup = ''; + if(data.Item.WeaponData.isRanged == 1){ + if(data.Item.WeaponData.rangedWeaponType == 'CROSSBOW'){ + weapGroup += 'Bow'; + } else { + weapGroup += capitalizeWord(data.Item.WeaponData.rangedWeaponType); + } + } + if(data.Item.WeaponData.isMelee == 1){ + if(weapGroup != ''){ + weapGroup += ' & '; + } + weapGroup += capitalizeWord(data.Item.WeaponData.meleeWeaponType); + } + + let weapCategory = capitalizeWord(data.Item.WeaponData.category); + let weapOrAttack = (weapCategory === 'Unarmed') ? 'Attack' : 'Weapon'; + + if(weapGroup != ''){ + qContent.append('

                      '+weapCategory+' '+weapOrAttack+' - '+weapGroup+'

                      '); + } else { + qContent.append('

                      '+weapCategory+' '+weapOrAttack+'

                      '); + } + + qContent.append('
                      '); + + } + + if(data.Item.ArmorData != null){ + + let armorTypeAndGroupListing = ''; + let armorCategory = capitalizeWord(data.Item.ArmorData.category); + if(data.Item.ArmorData.armorType == 'N/A'){ + armorTypeAndGroupListing = (armorCategory == 'Unarmored') ? armorCategory : armorCategory+' Armor'; + } else { + let armorGroup = capitalizeWord(data.Item.ArmorData.armorType); + armorTypeAndGroupListing = (armorCategory == 'Unarmored') ? armorCategory+' - '+armorGroup : armorCategory+' Armor - '+armorGroup; + } + qContent.append('

                      '+armorTypeAndGroupListing+'

                      '); + + qContent.append('
                      '); + + } + + // Item Specializations + displayCriticalSpecialization(qContent, data.Item); + + // Health, Hardness, and Broken Threshold + if(!viewOnly && !doesntHaveItemHealth(data.InvItem)) { + + + qContent.append('

                      Health

                      '); + + qContent.append(''); + + $('#itemHealthSection').append(''); + $('#itemHealthSection').append('

                      Hardness: '+data.InvItem.hardness+'

                      Broken Threshold: '+brokenThreshold+'

                      '); + + $('#itemHealthName').click(function() { + if($("#itemHealthSection").hasClass("is-hidden")) { + $("#itemHealthSection").removeClass('is-hidden'); + $("#itemHealthChevron").removeClass('fa-chevron-down'); + $("#itemHealthChevron").addClass('fa-chevron-up'); + } else { + $("#itemHealthSection").addClass('is-hidden'); + $("#itemHealthChevron").removeClass('fa-chevron-up'); + $("#itemHealthChevron").addClass('fa-chevron-down'); + } + }); + + if(data.Item.ShieldData != null){ + $("#itemHealthName").trigger("click"); + } + + qContent.append('
                      '); + + $('#'+invItemHPInputID).blur(function() { + let newHP = $(this).val(); + if(newHP != data.InvItem.currentHitPoints && newHP != ''){ + if(newHP <= maxHP && newHP >= 0) { + $(this).removeClass('is-danger'); + socket.emit("requestInvItemHPChange", + data.InvItem.id, + newHP); + } else { + $(this).addClass('is-danger'); + } + } + }); + } + + // Move, Customize, and Remove Item + if(!viewOnly) { + if(data.InvData != null){ + + qContent.append('
                      '); + + $('#'+invItemMoveSelectID).append(''); + + // Attachments // + if(data.Item.StorageData == null && ( + data.Item.Item.itemType == 'AMMUNITION' || + data.Item.Item.itemType == 'TALISMAN' || + data.Item.Item.itemType == 'FULU' || + data.Item.Item.itemType == 'RUNE' || + data.Item.Item.itemType == 'GADGET' || + data.Item.Item.itemType == 'GIFT' || + data.Item.Item.itemType == 'ADJUSTMENT' || + data.Item.Item.itemType == 'OTHER' || + data.Item.Item.itemType == 'SPELLHEART')) { + // Item is attachment + + $('#'+invItemMoveSelectID).append(''); + for(const attachableInvItem of g_invStruct.InvItems){ + if(data.InvItem.id != attachableInvItem.id) { + + // Item is attachable + const attachableItem = g_itemMap.get(attachableInvItem.itemID+""); + if(attachableItem != null + && attachableInvItem.bagInvItemID == null // Not stored + && attachableItem.StorageData == null // Not storage + && attachableItem.Item.hidden == 0 // Not hidden + && ( + attachableItem.Item.itemType == 'WEAPON' || + attachableItem.Item.itemType == 'ARMOR' || + attachableItem.Item.itemType == 'SHIELD' || + attachableItem.Item.itemType == 'WAND' || + attachableItem.Item.itemType == 'STAFF' || + attachableItem.Item.itemType == 'STRUCTURE' || + attachableItem.Item.itemType == 'HAT' || + attachableItem.Item.itemType == 'CLOAK' || + attachableItem.Item.itemType == 'BELT' || + attachableItem.Item.itemType == 'BOOTS' || + attachableItem.Item.itemType == 'OTHER')) { + + if(data.InvItem.bagInvItemID == attachableInvItem.id){ + $('#'+invItemMoveSelectID).append(''); + } else { + $('#'+invItemMoveSelectID).append(''); + } + + } + + } + } + + } + + // Storage // + if(data.InvData.ItemIsStorage && !data.InvData.ItemIsStorageAndEmpty) { + // Don't include for storage items that contain other items. + } else { + $('#'+invItemMoveSelectID).append(''); + for(const bagItemStruct of data.InvData.OpenBagItemArray){ + if(data.InvItem.id != bagItemStruct.InvItem.id) { + if(data.InvItem.bagInvItemID == bagItemStruct.InvItem.id){ + $('#'+invItemMoveSelectID).append(''); + } else { + $('#'+invItemMoveSelectID).append(''); + } + } + } + } + + $('#'+invItemMoveSelectID).append(''); + $('#'+invItemMoveSelectID).append(''); + + if(data.InvItem.isDropped == 1){ $('#'+invItemMoveSelectID).val('Dropped'); } + $('#'+invItemMoveButtonID).click(function() { + let bagItemID = $('#'+invItemMoveSelectID).val(); + let isDropped = 0; + if(bagItemID == 'Unstored') { bagItemID = null; } + if(bagItemID == 'Dropped') { bagItemID = null; isDropped = 1; } + $(this).addClass('is-loading'); + socket.emit("requestInvItemMoveBag", + data.InvItem.id, + bagItemID, + isDropped); + }); + + + qContent.append(''); + + $('#'+invItemRemoveButtonID).click(function() { + $(this).addClass('is-loading'); + socket.emit("requestRemoveItemFromInv", + data.InvItem.id); + }); + + $('#'+invItemCustomizeButtonID).click(function() { + openQuickView('customizeItemView', { + Item: data.Item, + InvItem: data.InvItem, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + } else { + + if(data.ExtraData.IsUnarmedAttack === true){ + if(data.ExtraData.IsCustomUnarmedAttack === true) { + + qContent.append(''); + + $('#'+invItemCustomizeButtonID).click(function() { + openQuickView('addUnarmedAttackView', { + IsCustomize: true, + Item: data.Item, + InvItem: data.InvItem, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + $('#'+invItemRemoveButtonID).click(function() { + $(this).addClass('is-loading'); + socket.emit("requestRemoveItemFromInv", + data.InvItem.id); + }); + + } else { + + qContent.append(''); + + $('#'+invItemCustomizeButtonID).click(function() { + openQuickView('addUnarmedAttackView', { + IsCustomize: true, + Item: data.Item, + InvItem: data.InvItem, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + } + + } + } + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/item-breakdown-view.js b/client/vue-src/legacy-js/sheet/quickviews/item-breakdown-view.js new file mode 100644 index 00000000..bb1bf5b6 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/item-breakdown-view.js @@ -0,0 +1,192 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + data + title + breakdownTitle + breakdownTotal + breakdownMap - Key = Source, Value = value + conditionalMap - Key = Condition, Value = value + isBonus +*/ +function openItemBreakdownQuickview(data) { + addBackFunctionality(data); + + $('#quickViewTitle').html(data.title); + + let qContent = $('#quickViewContent'); + + if(data.breakdownMap != null){ + qContent.append('

                      '+data.breakdownTitle+' Breakdown

                      '); + + if(gOption_hasDiceRoller) { refreshStatRollButtons(); } + //let rollerClass = (data.isBonus) ? 'stat-roll-btn' : 'damage-roll-btn'; + + let breakDownInnerHTML = ''; + + if(data.isBonus){ + breakDownInnerHTML += ''+data.breakdownTotal+' = '; + } else { + breakDownInnerHTML += ''+data.breakdownDamageDice+' + '; + } + + for(const [source, amount] of data.breakdownMap.entries()){ + if(amount != 0){ + breakDownInnerHTML += ''+amount+''; + breakDownInnerHTML += ' + '; + } + } + + if(data.breakdownDamageType != null){ + breakDownInnerHTML = breakDownInnerHTML.slice(0, -3);// Trim off that last ' + ' + breakDownInnerHTML += ' '+data.breakdownDamageType+' + '; + } + + if(data.modifications != null){ + for(const onHitDmgMod of data.modifications.on_hit_damage){ + + let modification = onHitDmgMod.mod; + if(modification.startsWith('-')){ + modification = modification.slice(1); + breakDownInnerHTML = breakDownInnerHTML.slice(0, -3);// Trim off that last ' + ' + breakDownInnerHTML += ' - '; + } + + let source = ''; + if(onHitDmgMod.info == 'InvItem'){ + source = 'This extra damage comes from the item itself.'; + } else if(onHitDmgMod.info == 'AttachedItem'){ + source = 'This extra damage comes from an attached item.'; + } else { + source = 'This extra damage comes from the '+runestoneNameToRuneName(onHitDmgMod.info)+' property rune this item has.'; + } + + breakDownInnerHTML += ` + ${modification}`; + breakDownInnerHTML += ' + '; + + } + } + + breakDownInnerHTML = breakDownInnerHTML.slice(0, -3);// Trim off that last ' + ' + + if(g_invItemView_isCriticalHit && !data.isBonus){ + breakDownInnerHTML = `( ${breakDownInnerHTML} )`; + + if(data.modifications != null){ + breakDownInnerHTML += ' + '; + for(const onCritDmgMod of data.modifications.on_crit_damage){ + + let modification = onCritDmgMod.mod; + if(modification.startsWith('-')){ + modification = modification.slice(1); + breakDownInnerHTML = breakDownInnerHTML.slice(0, -3);// Trim off that last ' + ' + breakDownInnerHTML += ' - '; + } + + let source = ''; + if(onCritDmgMod.info == 'InvItem'){ + source = 'This extra damage comes from the item itself and applies only when you critically hit.'; + } else if(onHitDmgMod.info == 'AttachedItem'){ + source = 'This extra damage comes from an attached item and applies only when you critically hit.'; + } else if(onCritDmgMod.info == 'DeadlyTrait') { + source = 'This extra damage comes from the deadly trait this item has. It adds an amount of extra damage (depending the item\'s Striking runes) that applies only when you critically hit.'; + } else if(onCritDmgMod.info == 'FatalTrait') { + source = 'This extra damage comes from the fatal trait this item has. When you critically hit, it increases the weapon\'s damage die to the size listed in the trait and adds an additional damage die of that size.'; + } else { + source = 'This extra damage comes from the '+runestoneNameToRuneName(onCritDmgMod.info)+' property rune this item has and applies only when you critically hit.'; + } + + breakDownInnerHTML += ` + ${modification}`; + breakDownInnerHTML += ' + '; + + } + if(breakDownInnerHTML.endsWith(' + ')){ + breakDownInnerHTML = breakDownInnerHTML.slice(0, -3);// Trim off that last ' + ' + } + } + + } + + breakDownInnerHTML = `

                      ${breakDownInnerHTML}

                      `; + + qContent.append(breakDownInnerHTML); + } + + if(data.modifications != null && data.modifications.on_hit_other.length > 0){ + + qContent.append('
                      '); + + for(const onHitOtherMod of data.modifications.on_hit_other){ + + let source = ''; + if(onHitOtherMod.info == 'InvItem'){ + source = 'This additional effect comes from the item itself.'; + } else if(onHitOtherMod.info == 'AttachedItem'){ + source = 'This additional effect comes from an attached item.'; + } else { + source = 'This additional effect comes from the '+runestoneNameToRuneName(onHitOtherMod.info)+' property rune this item has.'; + } + + qContent.append(`
                      ${processText(onHitOtherMod.mod, true)}
                      `); + + } + + } + + if(g_invItemView_isCriticalHit){ + + if(data.modifications != null && data.modifications.on_crit_other.length > 0){ + + qContent.append('
                      '); + + for(const onCritOtherMod of data.modifications.on_crit_other){ + + let source = ''; + if(onCritOtherMod.info == 'InvItem'){ + source = 'This additional effect comes from the item itself and applies only when you critically hit.'; + } else if(onCritOtherMod.info == 'AttachedItem'){ + source = 'This additional effect comes from an attached item and applies only when you critically hit.'; + } else if(onCritOtherMod.info == 'CriticalSpecialization') { + source = 'This is the critical specialization effect determined by your weapon\'s group (club, hammer, sword, etc).'; + } else { + source = 'This additional effect comes from the '+runestoneNameToRuneName(onCritOtherMod.info)+' property rune this item has and applies only when you critically hit.'; + } + + qContent.append(`
                      ${processText(onCritOtherMod.mod, true)}
                      `); + + } + + } + + } + + if(data.conditionalMap != null && data.conditionalMap.size != 0){ + + qContent.append('
                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of data.conditionalMap.entries()){ + let conditional = condition; + if(gOption_hasDiceRoller){ + conditional = processDiceNotation(conditional); + refreshDiceNotationButtons(); + } + if (valueData.Src == 'WEAP-MOD:ON-HIT') { + qContent.append('

                      '+conditional+'

                      '); + } else if (valueData.Src == 'WEAP-MOD:ON-CRIT') { + if(g_invItemView_isCriticalHit) { + qContent.append('

                      '+conditional+'

                      '); + } + } else { + qContent.append('

                      '+conditional+'

                      '); + } + } + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/item-view.js b/client/vue-src/legacy-js/sheet/quickviews/item-view.js new file mode 100644 index 00000000..1df60094 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/item-view.js @@ -0,0 +1,242 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openItemQuickview(data) { + addBackFunctionality(data); + addContentSource(data.ItemDataStruct.Item.id, data.ItemDataStruct.Item.contentSrc, data.ItemDataStruct.Item.homebrewID); + + let qContent = $('#quickViewContent'); + + let itemDataStruct = data.ItemDataStruct; + + let itemName = itemDataStruct.Item.name; + if(itemDataStruct.Item.quantity > 1){ + itemName += ' ('+itemDataStruct.Item.quantity+')'; + } + $('#quickViewTitle').html(itemName); + + let itemLevel = (itemDataStruct.Item.level == 0 || itemDataStruct.Item.level == 999) ? "" : "Lvl "+itemDataStruct.Item.level; + $('#quickViewTitleRight').html(''+itemLevel+''); + + let tagsInnerHTML = ''; + + let rarity = itemDataStruct.Item.rarity; + switch(rarity) { + case 'UNCOMMON': tagsInnerHTML += ''; + break; + case 'RARE': tagsInnerHTML += ''; + break; + case 'UNIQUE': tagsInnerHTML += ''; + break; + default: break; + } + + let itemSize = itemDataStruct.Item.size; + switch(itemSize) { + case 'TINY': tagsInnerHTML += ''; + break; + case 'SMALL': tagsInnerHTML += ''; + break; + case 'LARGE': tagsInnerHTML += ''; + break; + case 'HUGE': tagsInnerHTML += ''; + break; + case 'GARGANTUAN': tagsInnerHTML += ''; + break; + default: break; + } + + if(itemDataStruct.Item.materialType != null){ + let itemMaterial = g_materialsMap.get(itemDataStruct.Item.materialType); + if(itemMaterial != null){ + tagsInnerHTML += ''; + } + } + + itemDataStruct.TagArray = itemDataStruct.TagArray.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + for(const tag of itemDataStruct.TagArray){ + let tagDescription = tag.description; + if(tagDescription.length > g_tagStringLengthMax){ + tagDescription = tagDescription.substring(0, g_tagStringLengthMax); + tagDescription += '...'; + } + tagsInnerHTML += ''; + } + + if(tagsInnerHTML != ''){ + qContent.append('
                      '+tagsInnerHTML+'
                      '); + qContent.append('
                      '); + } + + $('.tagButton').click(function(){ + let tagName = $(this).text(); + openQuickView('tagView', { + TagName : tagName, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + if(itemDataStruct.WeaponData != null){ + + let weapGroup = ''; + if(itemDataStruct.WeaponData.isRanged == 1){ + if(itemDataStruct.WeaponData.rangedWeaponType == 'CROSSBOW'){ + weapGroup += 'Bow'; + } else { + weapGroup += capitalizeWord(itemDataStruct.WeaponData.rangedWeaponType); + } + } + if(itemDataStruct.WeaponData.isMelee == 1){ + if(weapGroup != ''){ + weapGroup += ' & '; + } + weapGroup += capitalizeWord(itemDataStruct.WeaponData.meleeWeaponType); + } + + let weapCategory = capitalizeWord(itemDataStruct.WeaponData.category); + qContent.append('

                      Category: '+weapCategory+'

                      Group: '+weapGroup+'

                      '); + + qContent.append('
                      '); + + } + + if(itemDataStruct.ArmorData != null){ + + let armorCategory = capitalizeWord(itemDataStruct.ArmorData.category); + let armorGroup = (itemDataStruct.ArmorData.armorType == 'N/A') ? '-' : capitalizeWord(itemDataStruct.ArmorData.armorType); + qContent.append('

                      Category: '+armorCategory+'

                      Group: '+armorGroup+'

                      '); + + qContent.append('
                      '); + + } + + let price = getConvertedPriceForSize(itemDataStruct.Item.size, itemDataStruct.Item.price); + price = getCoinToString(price); + if(price == '0 cp'){ price = '-'; } + if(itemDataStruct.Item.quantity > 1){ + price += ' for '+itemDataStruct.Item.quantity; + } + qContent.append('
                      Price
                      Bulk
                      Hands
                      '); + let bulk = getConvertedBulkForSize(itemDataStruct.Item.size, itemDataStruct.Item.bulk); + bulk = getBulkFromNumber(bulk); + qContent.append('

                      '+price+'

                      '+bulk+'

                      '+getHandsToString(itemDataStruct.Item.hands)+'

                      '); + + if(itemDataStruct.Item.usage != null){ + qContent.append('
                      '); + qContent.append('

                      Usage '+itemDataStruct.Item.usage+'

                      '); + } + + qContent.append('
                      '); + + if(itemDataStruct.WeaponData != null){ + + // Fixes Prisma empty enum for dieType, like for Blowguns + if(itemDataStruct.WeaponData.dieType == 'EMPTY_ENUM_VALUE'){ + itemDataStruct.WeaponData.dieType = ''; + } + + let damage = itemDataStruct.WeaponData.diceNum+""+itemDataStruct.WeaponData.dieType+" "+itemDataStruct.WeaponData.damageType; + if(itemDataStruct.WeaponData.dieType == 'NONE'){ damage = '-'; } + + qContent.append('
                      Damage
                      '); + qContent.append('

                      '+damage+'

                      '); + if(typeof gOption_hasDiceRoller !== 'undefined' && gOption_hasDiceRoller) { refreshStatRollButtons(); } + + qContent.append('
                      '); + + if(itemDataStruct.WeaponData.isRanged == 1){ + + let reload = itemDataStruct.WeaponData.rangedReload; + if(reload == 0){ reload = '-'; } + let range = itemDataStruct.WeaponData.rangedRange; + qContent.append('
                      Range
                      Reload
                      '); + qContent.append('

                      '+range+' ft

                      '+reload+'

                      '); + + qContent.append('
                      '); + + } + + } + + if(itemDataStruct.ArmorData != null){ + + qContent.append('
                      AC Bonus
                      Dex Cap
                      '); + qContent.append('

                      '+signNumber(itemDataStruct.ArmorData.acBonus)+'

                      '+signNumber(itemDataStruct.ArmorData.dexCap)+'

                      '); + + qContent.append('
                      '); + + let minStrength = (itemDataStruct.ArmorData.minStrength == 0) ? '-' : itemDataStruct.ArmorData.minStrength+''; + let checkPenalty = (itemDataStruct.ArmorData.checkPenalty == 0) ? '-' : itemDataStruct.ArmorData.checkPenalty+''; + let speedPenalty = (itemDataStruct.ArmorData.speedPenalty == 0) ? '-' : itemDataStruct.ArmorData.speedPenalty+' ft'; + qContent.append('
                      Strength
                      Check Penalty
                      Speed Penalty
                      '); + qContent.append('

                      '+minStrength+'

                      '+checkPenalty+'

                      '+speedPenalty+'

                      '); + + qContent.append('
                      '); + + } + + if(itemDataStruct.ShieldData != null){ + + let speedPenalty = (itemDataStruct.ShieldData.speedPenalty == 0) ? '-' : itemDataStruct.ShieldData.speedPenalty+' ft'; + qContent.append('
                      AC Bonus
                      Speed Penalty
                      '); + qContent.append('

                      '+signNumber(itemDataStruct.ShieldData.acBonus)+'

                      '+speedPenalty+'

                      '); + + qContent.append('
                      '); + + } + + if(itemDataStruct.StorageData != null){ + + let maxBagBulk = itemDataStruct.StorageData.maxBulkStorage; + let bulkIgnored = itemDataStruct.StorageData.bulkIgnored; + let bulkIgnoredMessage = "-"; + if(bulkIgnored != 0.0){ + if(bulkIgnored == maxBagBulk){ + bulkIgnoredMessage = "All Items"; + } else { + bulkIgnoredMessage = "First "+bulkIgnored+" Bulk of Items"; + } + } + + qContent.append('
                      Bulk Storage
                      Bulk Ignored
                      '); + qContent.append('

                      '+maxBagBulk+'

                      '+bulkIgnoredMessage+'

                      '); + + qContent.append('
                      '); + } + + qContent.append('
                      '+processText(itemDataStruct.Item.description, true, true, 'MEDIUM')+'
                      '); + + if(itemDataStruct.Item.craftRequirements != null){ + qContent.append('
                      '); + qContent.append(processText('~ Craft Requirements: '+itemDataStruct.Item.craftRequirements, true, true, 'MEDIUM')); + } + + // Item Specializations + if(isSheetPage()) { + qContent.append('
                      '); + displayCriticalSpecialization(qContent, itemDataStruct); + } + + if(itemDataStruct.ShieldData != null) { // If item is shield, + qContent.append('
                      '); + qContent.append('

                      Hardness

                      '+itemDataStruct.Item.hardness+'

                      Hit Points

                      '+itemDataStruct.Item.hitPoints+'

                      BT

                      '+itemDataStruct.Item.brokenThreshold+'

                      '); + } + + + if(typeof g_isDeveloper !== 'undefined' && g_isDeveloper && itemDataStruct.Item.code != null && itemDataStruct.Item.code.trim() != '') { + qContent.append('
                      '); + qContent.append('

                      WSC Statements

                      '); + + let codeHTML = ''; + for(let codeStatement of itemDataStruct.Item.code.split(/\n/)){ + codeHTML += '

                      '+codeStatement+'

                      '; + } + qContent.append('
                      '+codeHTML+'
                      '); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/language-view.js b/client/vue-src/legacy-js/sheet/quickviews/language-view.js new file mode 100644 index 00000000..fa75a0ab --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/language-view.js @@ -0,0 +1,83 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openLanguageQuickview(data) { + addBackFunctionality(data); + + $('#quickViewTitle').html(data.Language.name); + let qContent = $('#quickViewContent'); + + if(data.Language.speakers != null){ + qContent.append('

                      Speakers '+data.Language.speakers+'

                      '); + } + if(data.Language.script != null){ + qContent.append('

                      Script '+data.Language.script+'

                      '); + } + + // Description + if(data.Language.description != null){ + qContent.append('
                      '); + qContent.append(processText(data.Language.description, true, true, 'MEDIUM')); + } + + // Script + let scriptClass = ''; + if(data.Language.script == 'Common'){ + scriptClass = 'font-common'; + } else if(data.Language.script == 'Iokharic'){ + scriptClass = 'font-iokharic'; + } else if(data.Language.script == 'Dethek'){ + scriptClass = 'font-dethek'; + } else if(data.Language.script == 'Rellanic'){ + scriptClass = 'font-rellanic'; + } else if(data.Language.script == 'Barazhad'){ + scriptClass = 'font-barazhad'; + } else if(data.Language.script == 'Enochian'){ + scriptClass = 'font-enochian'; + } else if(data.Language.script == 'Aklo'){ + scriptClass = 'font-aklo'; + } else if(data.Language.script == 'Gnomish'){ + scriptClass = 'font-gnomish'; + } else if(data.Language.script == 'Necril'){ + scriptClass = 'font-necril'; + } else if(data.Language.script == 'Druidic'){ + scriptClass = 'font-druidic'; + } + if(scriptClass != ''){ + qContent.append('
                      '); + qContent.append(''); + $('#scriptDisplayArea').addClass(scriptClass); + } + + // User Added, Remove Button + if(data.SourceType == 'user-added'){ + qContent.append(''); + + $('#removeUserAddedLangButton').click(function(){ // Remove User-Added Lang + + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: 'Lang #'+data.Language.id, + sourceCodeSNum: 'a', + }; + socket.emit("requestLanguageChange", + getCharIDFromURL(), + srcStruct, + null + ); + + // Remove lang from character's lang array + let newLangArray = []; + for(const langData of g_langArray){ + if(langData.value.id != data.Language.id){ + newLangArray.push(langData); + } + } + g_langArray = newLangArray; + + }); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/other-profs-view.js b/client/vue-src/legacy-js/sheet/quickviews/other-profs-view.js new file mode 100644 index 00000000..f2a652e9 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/other-profs-view.js @@ -0,0 +1,113 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openOtherProfsQuickview(data) { + let noteFieldID = 'otherProf-'+data.Name.replace(/\s/g, "_"); + + $('#quickViewTitle').html(data.Name); + $('#quickViewTitleRight').html(''); + $('#customizeProfBtn').click(function(){ + openQuickView('customizeProfView', { + ProfSrcData : data.ProfSrcData, + ProfData : data.ProfData, + NoteFieldID : noteFieldID, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + let qContent = $('#quickViewContent'); + + let profName = getProfNameFromNumUps(data.ProfData.NumUps); + let profNameHTML = getProfHistoryHTML(data.VARIABLE); + if(data.ProfData.UserProfOverride){ + qContent.append('

                      Proficiency: '+profNameHTML+' ( Override )

                      '); + } else { + qContent.append('

                      Proficiency: '+profNameHTML+'

                      '); + } + + let userBonus = data.ProfData.UserBonus; + if(userBonus != 0){ + qContent.append('

                      Extra Bonus: '+signNumber(userBonus)+'

                      '); + } + + if(data.ExtraData.SpellTradition != null && data.ExtraData.SpellPart != null){ + let spellBook = g_spellBookArray.find(spellBook => { + return (spellBook.SpellList == data.ExtraData.SpellTradition); + }); + if(spellBook != null){ + if(data.ExtraData.SpellPart == 'Attack') { + + let spellAttack = getStatTotal(data.ExtraData.SpellTradition+'_SPELL_ATTACK'); + let abilityMod = getModOfValue(spellBook.SpellKeyAbility); + spellAttack += abilityMod; + + qContent.append('

                      '+data.Name+': '+signNumber(spellAttack)+'

                      '); + + } else if(data.ExtraData.SpellPart == 'DC') { + + let spellDC = getStatTotal(data.ExtraData.SpellTradition+'_SPELL_DC'); + let abilityMod = getModOfValue(spellBook.SpellKeyAbility); + spellDC += abilityMod; + spellDC += 10; + + qContent.append('

                      '+data.Name+': '+spellDC+'

                      '); + + } + } + } + + // Display Note Field + let noteFieldSrcStruct = { + sourceType: 'bonus-area', + sourceLevel: 0, + sourceCode: 'bonus-area-'+noteFieldID, + sourceCodeSNum: 'a', + }; + displayNotesField(qContent, noteFieldSrcStruct); + + + if(data.ProfData.UserAdded){ + qContent.append(''); + + $('#removeUserAddedProfButton').click(function(){ // Remove User-Added and User-Set Profs + let srcStructAdded = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: data.ProfSrcData.To, + sourceCodeSNum: 'a', + }; + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct : srcStructAdded}, + null + ); + + let srcStructProf = { + sourceType: 'user-set', + sourceLevel: 0, + sourceCode: data.ProfSrcData.To+",,,Prof", + sourceCodeSNum: 'a', + }; + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct : srcStructProf}, + null + ); + + let srcStructBonus = { + sourceType: 'user-set', + sourceLevel: 0, + sourceCode: data.ProfSrcData.To+",,,Bonus", + sourceCodeSNum: 'a', + }; + socket.emit("requestProficiencyChange", + getCharIDFromURL(), + {srcStruct : srcStructBonus}, + null + ); + }); + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/perception-view.js b/client/vue-src/legacy-js/sheet/quickviews/perception-view.js new file mode 100644 index 00000000..1e089a30 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/perception-view.js @@ -0,0 +1,118 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openPerceptionQuickview(data) { + let noteFieldID = 'perception-'+data.ProfData.Name.replace(/\s/g, "_"); + + $('#quickViewTitle').html(data.ProfData.Name); + $('#quickViewTitleRight').html(''); + $('#customizeProfBtn').click(function(){ + openQuickView('customizeProfView', { + ProfSrcData : {For:'Perception',To:'Perception'}, + ProfData : data.ProfData, + NoteFieldID : noteFieldID, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + let qContent = $('#quickViewContent'); + + let profName = getProfNameFromNumUps(data.ProfData.NumUps); + let profNameHTML = getProfHistoryHTML(VARIABLE.PERCEPTION); + if(data.ProfData.UserProfOverride){ + qContent.append('

                      Proficiency: '+profNameHTML+' ( Override )

                      '); + } else { + qContent.append('

                      Proficiency: '+profNameHTML+'

                      '); + } + + let userBonus = data.ProfData.UserBonus; + if(userBonus != 0){ + qContent.append('

                      Extra Bonus: '+signNumber(userBonus)+'

                      '); + } + + qContent.append('

                      Ability Score: Wisdom

                      '); + qContent.append('
                      '); + qContent.append('

                      Perception measures your character’s ability to notice hidden objects or unusual situations, and it usually determines how quickly the character springs into action in combat.

                      '); + qContent.append('
                      '); + qContent.append('

                      Bonus Breakdown

                      '); + + if(gOption_hasDiceRoller) { refreshStatRollButtons(); } + let breakDownInnerHTML = '

                      '+signNumber(data.TotalBonus)+' = '; + + breakDownInnerHTML += ''+data.WisMod+''; + + breakDownInnerHTML += ' + '; + + if(profName == "Untrained") { + let untrainedProfBonus = 0; + if(gOption_hasProfWithoutLevel){ + untrainedProfBonus = -2; + } + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + if(gOption_hasProfWithoutLevel){ + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + breakDownInnerHTML += ''+data.ProfNum+''; + } + } + + breakDownInnerHTML += ' + '; + + let amalgBonus = data.TotalBonus - (data.WisMod + data.ProfNum); + breakDownInnerHTML += ''+amalgBonus+''; + + breakDownInnerHTML += '

                      '; + + qContent.append(breakDownInnerHTML); + + let amalgBonuses = getStatExtraBonuses(VARIABLE.PERCEPTION); + if(amalgBonuses != null && amalgBonuses.length > 0){ + $('#amalgBonusNum').removeClass('has-tooltip-multiline'); + let amalgTooltipText = 'Additional adjustments:'; + for(let amalgExtra of amalgBonuses){ + amalgTooltipText += '\n'+amalgExtra; + } + $('#amalgBonusNum').attr('data-tooltip', amalgTooltipText); + } else { + $('#amalgBonusNum').addClass('has-tooltip-multiline'); + $('#amalgBonusNum').attr('data-tooltip', amalgamationBonusText); + } + + // Conditionals // + let conditionalStatMap = getConditionalStatMap(VARIABLE.PERCEPTION); + if(conditionalStatMap != null && conditionalStatMap.size != 0){ + + qContent.append('
                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of conditionalStatMap.entries()){ + qContent.append('

                      '+condition+'

                      '); + } + + } + + // Display Note Field + let noteFieldSrcStruct = { + sourceType: 'bonus-area', + sourceLevel: 0, + sourceCode: 'bonus-area-'+noteFieldID, + sourceCodeSNum: 'a', + }; + displayNotesField(qContent, noteFieldSrcStruct); + + + // Senses // + qContent.append('
                      '); + + qContent.append('

                      Senses

                      '); + + qContent.append('

                      '+data.PrimaryVisionSense.name+'

                      '); + + for(let additionalSense of data.AdditionalSenseArray) { + qContent.append('

                      '+additionalSense.name+'

                      '); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/resist-list-view.js b/client/vue-src/legacy-js/sheet/quickviews/resist-list-view.js new file mode 100644 index 00000000..1fc40be6 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/resist-list-view.js @@ -0,0 +1,105 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openResistancesListQuickview(data) { + + $('#quickViewTitle').html('Resistance / Weakness List'); + + let qContent = $('#quickViewContent'); + + qContent.append('

                      This is a list of all of your resistances and weaknesses. Here you\'re able to add or remove any custom resistances or weaknesses you might have.

                      '); + + // // // + + let addResistBtnID = 'resistListAddBtn'; + qContent.append('

                      Resistances

                      '); + + $('#'+addResistBtnID).click(function(){ + openQuickView('addResistView',{ + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + if(data.ResistAndVulners.Resistances.length == 0){ + qContent.append('

                      None

                      '); + } + + for (let i = 0; i < data.ResistAndVulners.Resistances.length; i++) { + const resists = data.ResistAndVulners.Resistances[i]; + let type = capitalizeWords(resists.Type); + let amount = capitalizeWords(resists.Amount); + + if(resists.sourceType == 'user-added'){ + + let removeBtnID = 'resistListRemoveBtn-'+i; + qContent.append('

                      '+type+' : '+amount+'

                      '); + + $('#'+removeBtnID).click(function(){ + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: resists.Type+' '+resists.Amount+' Resist', + sourceCodeSNum: 'a', + }; + socket.emit("requestResistanceChange", + getCharIDFromURL(), + srcStruct, + null, + null + ); + }); + + } else { + qContent.append('

                      '+type+' : '+amount+'

                      '); + } + + } + + // // // + + let addWeakBtnID = 'weakListAddBtn'; + qContent.append('

                      Weaknesses

                      '); + + $('#'+addWeakBtnID).click(function(){ + openQuickView('addWeakView',{ + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + if(data.ResistAndVulners.Vulnerabilities.length == 0){ + qContent.append('

                      None

                      '); + } + + for (let i = 0; i < data.ResistAndVulners.Vulnerabilities.length; i++) { + const vulners = data.ResistAndVulners.Vulnerabilities[i]; + let type = capitalizeWords(vulners.Type); + let amount = capitalizeWords(vulners.Amount); + + if(vulners.sourceType == 'user-added'){ + + let removeBtnID = 'vulnerListRemoveBtn-'+i; + qContent.append('

                      '+type+' : '+amount+'

                      '); + + $('#'+removeBtnID).click(function(){ + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: vulners.Type+' '+vulners.Amount+' Weak', + sourceCodeSNum: 'a', + }; + socket.emit("requestVulnerabilityChange", + getCharIDFromURL(), + srcStruct, + null, + null + ); + }); + + } else { + qContent.append('

                      '+type+' : '+amount+'

                      '); + } + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/resist-view.js b/client/vue-src/legacy-js/sheet/quickviews/resist-view.js new file mode 100644 index 00000000..aef6f24d --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/resist-view.js @@ -0,0 +1,72 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openResistancesQuickview(data) { + + let resistAndVulnerText = ''; + if(data.ResistAndVulners.Resistances.length != 0){ + resistAndVulnerText += 'Resistances'; + if(data.ResistAndVulners.Vulnerabilities.length != 0){ + resistAndVulnerText += ' and '; + } + } + if(data.ResistAndVulners.Vulnerabilities.length != 0){ + resistAndVulnerText += 'Weaknesses'; + } + $('#quickViewTitle').html(resistAndVulnerText); + + let qContent = $('#quickViewContent'); + + qContent.append('

                      If you have resistance to a type of damage, each time you take that type of damage, you reduce the amount of damage you take by the listed amount (to a minimum of 0 damage). If you have more than one type of resistance that would apply to the same instance of damage, use only the highest applicable resistance value.

                      '); + qContent.append('

                      Having a weakness to a type of damage is the same process but in reverse, each time you take that type of damage, increase the damage amount by the value of your weakness.

                      '); + qContent.append('
                      '); + + if(data.ResistAndVulners.Resistances.length != 0){ + let resistMap = processResistsOrWeaksToMap(data.ResistAndVulners.Resistances, data.CharLevel); + qContent.append('

                      Resistances

                      '); + for(const [type, amount] of resistMap.entries()){ + qContent.append('

                      '+type+' '+amount+'

                      '); + } + } + + if(data.ResistAndVulners.Vulnerabilities.length != 0){ + let vulnerMap = processResistsOrWeaksToMap(data.ResistAndVulners.Vulnerabilities, data.CharLevel); + qContent.append('

                      Weaknesses

                      '); + for(const [type, amount] of vulnerMap.entries()){ + qContent.append('

                      '+type+' '+amount+'

                      '); + } + } + +} + +function processResistsOrWeaksToMap(array, charLevel){ + let map = new Map(); + for(let entry of array) { + + let type = capitalizeWords(entry.Type); + let amount = entry.Amount.toUpperCase(); + if(amount.includes('HALF_LEVEL')){ + let halfLevel = Math.floor(charLevel/2); + if(halfLevel == 0) { halfLevel = 1; } // Round down, minimum of 1 + amount = amount.replace('HALF_LEVEL', halfLevel); + } else if(amount.includes('LEVEL')){ + amount = amount.replace('LEVEL', charLevel); + } + try{ + amount = parseInt(math.evaluate(amount)); + }catch(err){ + amount = -1; + } + + if(map.has(type)){ + let existingAmount = map.get(type); + if(amount > existingAmount){ + map.set(type, amount); + } + } else { + map.set(type, amount); + } + } + return map; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/saving-throw-view.js b/client/vue-src/legacy-js/sheet/quickviews/saving-throw-view.js new file mode 100644 index 00000000..45aead5a --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/saving-throw-view.js @@ -0,0 +1,107 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openSavingThrowQuickview(data) { + let noteFieldID = 'savingThrow-'+data.ProfData.Name.replace(/\s/g, "_"); + + $('#quickViewTitle').html(data.ProfData.Name); + $('#quickViewTitleRight').html(''); + $('#customizeProfBtn').click(function(){ + openQuickView('customizeProfView', { + ProfSrcData : data.ProfSrcData, + ProfData : data.ProfData, + NoteFieldID : noteFieldID, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + let qContent = $('#quickViewContent'); + + let profName = getProfNameFromNumUps(data.ProfData.NumUps); + let profNameHTML = getProfHistoryHTML(data.VARIABLE); + if(data.ProfData.UserProfOverride){ + qContent.append('

                      Proficiency: '+profNameHTML+' ( Override )

                      '); + } else { + qContent.append('

                      Proficiency: '+profNameHTML+'

                      '); + } + + let userBonus = data.ProfData.UserBonus; + if(userBonus != 0){ + qContent.append('

                      Extra Bonus: '+signNumber(userBonus)+'

                      '); + } + + qContent.append('

                      Ability Score: '+data.AbilityName+'

                      '); + qContent.append('
                      '); + qContent.append('

                      '+data.SavingThrowDescription+'

                      '); + qContent.append('
                      '); + qContent.append('

                      Bonus Breakdown

                      '); + + if(gOption_hasDiceRoller) { refreshStatRollButtons(); } + let breakDownInnerHTML = '

                      '+signNumber(data.TotalBonus)+' = '; + + breakDownInnerHTML += ''+data.AbilMod+''; + + breakDownInnerHTML += ' + '; + + if(profName == "Untrained") { + let untrainedProfBonus = 0; + if(gOption_hasProfWithoutLevel){ + untrainedProfBonus = -2; + } + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + if(gOption_hasProfWithoutLevel){ + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + breakDownInnerHTML += ''+data.ProfNum+''; + } + } + + breakDownInnerHTML += ' + '; + + let amalgBonus = data.TotalBonus - (data.AbilMod + data.ProfNum); + breakDownInnerHTML += ''+amalgBonus+''; + + breakDownInnerHTML += '

                      '; + + qContent.append(breakDownInnerHTML); + + let saveDataName = (data.ProfData.Name == 'Fortitude') ? 'SAVE_Fort' : 'SAVE_'+data.ProfData.Name; + + let amalgBonuses = getStatExtraBonuses(saveDataName); + if(amalgBonuses != null && amalgBonuses.length > 0){ + $('#amalgBonusNum').removeClass('has-tooltip-multiline'); + let amalgTooltipText = 'Additional adjustments:'; + for(let amalgExtra of amalgBonuses){ + amalgTooltipText += '\n'+amalgExtra; + } + $('#amalgBonusNum').attr('data-tooltip', amalgTooltipText); + } else { + $('#amalgBonusNum').addClass('has-tooltip-multiline'); + $('#amalgBonusNum').attr('data-tooltip', amalgamationBonusText); + } + + let conditionalStatMap = getConditionalStatMap(saveDataName); + if(conditionalStatMap != null && conditionalStatMap.size != 0){ + + qContent.append('
                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of conditionalStatMap.entries()){ + qContent.append('

                      '+condition+'

                      '); + } + + } + + // Display Note Field + let noteFieldSrcStruct = { + sourceType: 'bonus-area', + sourceLevel: 0, + sourceCode: 'bonus-area-'+noteFieldID, + sourceCodeSNum: 'a', + }; + displayNotesField(qContent, noteFieldSrcStruct); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/skill-view.js b/client/vue-src/legacy-js/sheet/quickviews/skill-view.js new file mode 100644 index 00000000..7b34528e --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/skill-view.js @@ -0,0 +1,136 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let amalgamationBonusText = "This is a collection of any additional bonuses or penalties you might have. This includes adjustments from feats, items, conditions, or those you may have added manually."; + +function openSkillQuickview(data) { + + let noteFieldID = 'skill-'+data.SkillName.replace(/\s/g, "_"); + + $('#quickViewTitle').html(data.SkillName); + $('#quickViewTitleRight').html(''); + $('#customizeProfBtn').click(function(){ + openQuickView('customizeProfView', { + ProfSrcData : {For:'Skill',To:data.SkillName}, + ProfData : data.ProfData, + NoteFieldID : noteFieldID, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + let qContent = $('#quickViewContent'); + + let abilityScoreName = lengthenAbilityType(data.Skill.ability); + + let profName = getProfNameFromNumUps(data.ProfData.NumUps); + let profNameHTML = getProfHistoryHTML(data.VARIABLE); + if(data.ProfData.UserProfOverride != null && data.ProfData.UserProfOverride){ + qContent.append('

                      Proficiency: '+profNameHTML+' ( Override )

                      '); + } else { + qContent.append('

                      Proficiency: '+profNameHTML+'

                      '); + } + + let userBonus = data.ProfData.UserBonus; + if(data.ProfData.UserBonus != null && userBonus != 0){ + qContent.append('

                      Extra Bonus: '+signNumber(userBonus)+'

                      '); + } + + qContent.append('

                      Ability Score: '+abilityScoreName+'

                      '); + qContent.append('
                      '); + qContent.append(processText(data.Skill.description, true, true, 'MEDIUM')); + qContent.append('
                      '); + qContent.append('

                      Bonus Breakdown

                      '); + + if(gOption_hasDiceRoller) { refreshStatRollButtons(); } + let breakDownInnerHTML = '

                      '+signNumber(data.TotalBonus)+' = '; + + breakDownInnerHTML += ''+data.AbilMod+''; + + breakDownInnerHTML += ' + '; + + if(profName == "Untrained") { + let untrainedProfBonus = 0; + if(gOption_hasProfWithoutLevel){ + untrainedProfBonus = -2; + } + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + if(gOption_hasProfWithoutLevel){ + breakDownInnerHTML += ''+data.ProfNum+''; + } else { + breakDownInnerHTML += ''+data.ProfNum+''; + } + } + + breakDownInnerHTML += ' + '; + + let amalgBonus = data.TotalBonus - (data.AbilMod + data.ProfNum); + breakDownInnerHTML += ''+amalgBonus+''; + + breakDownInnerHTML += '

                      '; + + qContent.append(breakDownInnerHTML); + + let amalgBonuses = getStatExtraBonuses('SKILL_'+data.SkillName); + if(amalgBonuses != null && amalgBonuses.length > 0){ + $('#amalgBonusNum').removeClass('has-tooltip-multiline'); + let amalgTooltipText = 'Additional adjustments:'; + for(let amalgExtra of amalgBonuses){ + amalgTooltipText += '\n'+amalgExtra; + } + $('#amalgBonusNum').attr('data-tooltip', amalgTooltipText); + } else { + $('#amalgBonusNum').addClass('has-tooltip-multiline'); + $('#amalgBonusNum').attr('data-tooltip', amalgamationBonusText); + } + + let conditionalStatMap = getConditionalStatMap('SKILL_'+data.SkillName); + if(conditionalStatMap != null && conditionalStatMap.size != 0){ + + qContent.append('
                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of conditionalStatMap.entries()){ + qContent.append('

                      '+condition+'

                      '); + } + + } + + // Display Note Field + let noteFieldSrcStruct = { + sourceType: 'bonus-area', + sourceLevel: 0, + sourceCode: 'bonus-area-'+noteFieldID, + sourceCodeSNum: 'a', + }; + displayNotesField(qContent, noteFieldSrcStruct); + + + let userAddedData = getUserAddedData(g_profMap.get(data.SkillName)); + if(userAddedData != null){ + qContent.append('
                      '); + qContent.append(''); + + $('#removeUserAddedLoreButton').click(function(){ // Remove User-Added Lore + + let srcStruct = { + sourceType: 'user-added', + sourceLevel: 0, + sourceCode: data.SkillName, + sourceCodeSNum: 'a', + }; + socket.emit("requestLoreChange", + getCharIDFromURL(), + srcStruct, + null, + null, + 'T', + 'User-Added' + ); + + }); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/speed-view.js b/client/vue-src/legacy-js/sheet/quickviews/speed-view.js new file mode 100644 index 00000000..8bc8d0ac --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/speed-view.js @@ -0,0 +1,69 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openSpeedQuickview(data) { + + $('#quickViewTitle').html('Speed'); + let qContent = $('#quickViewContent'); + + qContent.append('

                      Speed is the distance a character can move using a single action, measured in feet. Moving through an area of difficult terrain costs an extra 5 feet and moving through an area of greater difficult terrain costs 10 additional feet for each 5 feet of movement.

                      '); + + addSpeedContent(qContent, 'SPEED', 'Speed'); + + for(const otherSpeed of g_otherSpeeds){ + addSpeedContent(qContent, 'SPEED_'+otherSpeed.Type, capitalizeWords(otherSpeed.Type)); + } + + // Conditionals // + let conditionalStatMap = getConditionalStatMap(VARIABLE.SPEED); + if(conditionalStatMap != null && conditionalStatMap.size != 0){ + + qContent.append('
                      '); + + qContent.append('

                      Conditionals

                      '); + + for(const [condition, valueData] of conditionalStatMap.entries()){ + qContent.append('

                      '+condition+'

                      '); + } + + } + +} + +function addSpeedContent(qContent, speedStatName, speedName){ + qContent.append('
                      '); + + let speedAmalgBonusNumID = 'amalgSpeedBonusNum'+speedStatName; + let speedTotal = getStatTotal(speedStatName); + + let speedBase = variables_getValue(speedStatName); + + + qContent.append('

                      '+speedName+'

                      '); + + let amalgBonuses = getStatExtraBonuses(speedStatName); + if(amalgBonuses != null && amalgBonuses.length > 0){ + + let breakDownInnerHTML = '

                      '+speedTotal+' = '; + breakDownInnerHTML += ''+speedBase+''; + breakDownInnerHTML += ' + '; + let amalgBonus = speedTotal-speedBase; + breakDownInnerHTML += ''+amalgBonus+''; + breakDownInnerHTML += '

                      '; + qContent.append(breakDownInnerHTML); + + $('#'+speedAmalgBonusNumID).removeClass('has-tooltip-multiline'); + let amalgTooltipText = 'Additional adjustments:'; + for(let amalgExtra of amalgBonuses){ + amalgTooltipText += '\n'+amalgExtra; + } + $('#'+speedAmalgBonusNumID).attr('data-tooltip', amalgTooltipText); + + } else { + + qContent.append('

                      '+speedTotal+'

                      '); + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/spell-empty-view.js b/client/vue-src/legacy-js/sheet/quickviews/spell-empty-view.js new file mode 100644 index 00000000..1afa0679 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/spell-empty-view.js @@ -0,0 +1,93 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openSpellEmptyQuickview(data) { + + if(data.ViewType == 1){ + $('#quickViewTitle').html('Empty Slot'); + } else if(data.ViewType == 2){ + $('#quickViewTitle').html('Spell Slot'); + } + let qContent = $('#quickViewContent'); + + if(data.SpellSlotData != null){ // Set Slot Color-Type // + + let typeStruct = getSpellTypeStruct(data.SpellSlotData.Slot.type); + + let displayColorTypes = function(typeStruct) { + let redTypeIcon = (typeStruct.Red) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + let greenTypeIcon = (typeStruct.Green) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + let blueTypeIcon = (typeStruct.Blue) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + + $('#quickViewTitleRight').html(''); + + $('.spellSlotRedType').click(function(){ + typeStruct.Red = !typeStruct.Red; + data.SpellSlotData.Slot.type = getSpellTypeData(typeStruct); + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + data.SpellSlotData.Slot); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SpellSlotData.SpellSRC, data.SpellSlotData.Data); + }); + + $('.spellSlotGreenType').click(function(){ + typeStruct.Green = !typeStruct.Green; + data.SpellSlotData.Slot.type = getSpellTypeData(typeStruct); + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + data.SpellSlotData.Slot); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SpellSlotData.SpellSRC, data.SpellSlotData.Data); + }); + + $('.spellSlotBlueType').click(function(){ + typeStruct.Blue = !typeStruct.Blue; + data.SpellSlotData.Slot.type = getSpellTypeData(typeStruct); + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + data.SpellSlotData.Slot); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SpellSlotData.SpellSRC, data.SpellSlotData.Data); + }); + }; + + displayColorTypes(typeStruct); + + } + + let emptySlotText; + if(data.ViewType == 1){ + emptySlotText = 'This spell slot is empty. To fill it with a spell, drag and drop a spell from your spell list over to the slot.\nYou can assign a color to a spell slot to distinguish it from others - this has no effect, it is solely there for your convenience as a way to distinguish slots when needed.'; + } else if(data.ViewType == 2){ + emptySlotText = 'This is one of your spell slots.\nYou can assign a color to a spell slot to distinguish it from others - this has no effect, it is solely there for your convenience as a way to distinguish slots when needed.'; + } + qContent.append(processText(emptySlotText, true, true, 'MEDIUM')); + + // User Added, Remove Button + if(data.SpellSlotData.Slot.srcStruct.sourceType == 'user-added'){ + qContent.append(''); + + $('#removeUserAddedSlotButton').click(function(){ // Remove User-Added Spell Slot + + socket.emit("requestSpellSlotChange", + getCharIDFromURL(), + data.SpellSlotData.Slot.srcStruct, + data.SpellSlotData.Slot.SpellSRC, + null + ); + + // Remove spell slot from g_spellSlotsMap + let newSlotArray = []; + for(let slot of g_spellSlotsMap.get(data.SpellSlotData.Slot.SpellSRC)){ + if(slot.slotID != data.SpellSlotData.Slot.slotID){ + newSlotArray.push(slot); + } + } + g_spellSlotsMap.set(data.SpellSlotData.Slot.SpellSRC, newSlotArray); + + }); + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/spell-view.js b/client/vue-src/legacy-js/sheet/quickviews/spell-view.js new file mode 100644 index 00000000..2fefb1ab --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/spell-view.js @@ -0,0 +1,1211 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_spellView_spellKeyAbility = null; + +function openSpellQuickview(data){ + addBackFunctionality(data); + addContentSource(data.SpellDataStruct.Spell.id, data.SpellDataStruct.Spell.contentSrc, data.SpellDataStruct.Spell.homebrewID); + + let spellDataStruct = data.SpellDataStruct; + let spellID = spellDataStruct.Spell.id; + let spellName = spellDataStruct.Spell.name; + let spellHeightenLevel = null; + + let sheetSpellType = null; + if(data.SheetData != null){ + if(data.SheetData.Slot != null) { + sheetSpellType = 'CORE'; + } else if(data.SheetData.InnateSpell != null){ + sheetSpellType = 'INNATE'; + } else if(data.SheetData.FocusSpell != null){ + sheetSpellType = 'FOCUS'; + } + } + + if(data.SheetData != null){ + let spellLevel = (spellDataStruct.Spell.level === 0) ? "Cantrip" : "Lvl "+spellDataStruct.Spell.level; + let spellHeightened = null; + if(sheetSpellType === 'CORE'){ + spellHeightened = data.SheetData.Slot.slotLevel; + } else if(sheetSpellType === 'INNATE'){ + spellHeightened = data.SheetData.InnateSpell.SpellLevel; + } else if(sheetSpellType === 'FOCUS'){ + let focusHeightened = Math.ceil(g_character.level/2); + spellHeightened = (focusHeightened > spellDataStruct.Spell.level) ? focusHeightened : spellDataStruct.Spell.level; + } + if(spellDataStruct.Spell.level === 0) { + let cantripHeightened = Math.ceil(g_character.level/2); + spellHeightened = (spellHeightened > cantripHeightened) ? spellHeightened : cantripHeightened; + } + if(spellHeightened === null || spellDataStruct.Spell.level == spellHeightened || + (spellDataStruct.Spell.level === 0 && spellHeightened == 1)) { + spellName += ''+spellLevel+''; + spellHeightenLevel = -1; + } else { + if(spellLevel == 'Cantrip') { spellLevel+=' (1)'; } + spellName += ''+spellLevel+''+spellHeightened+''; + spellHeightenLevel = spellHeightened; + } + } + + if(data.SRCTabData != null){ + let spellLevel = (data.SRCTabData.SpellLevel === 0) ? "Cantrip" : "Lvl "+data.SRCTabData.SpellLevel; + spellName += ''+spellLevel+''; + } + + if(spellDataStruct.Spell.isArchived === 1){ + spellName += '(archived)'; + } + + $('#quickViewTitle').html(spellName); + let qContent = $('#quickViewContent'); + + // Display Level to right if just viewing spell from index + if(data.SheetData == null && data.SpellSlotData == null){ + let spellLevel = (spellDataStruct.Spell.level === 0) ? "Cantrip" : "Lvl "+spellDataStruct.Spell.level; + $('#quickViewTitleRight').html(''+spellLevel+''); + } + + // Coloring Spell SLOT // + if(data.SpellSlotData != null){ // Set Slot Color-Type // + + let typeStruct = getSpellTypeStruct(data.SpellSlotData.Slot.type); + + let displayColorTypes = function(typeStruct) { + let redTypeIcon = (typeStruct.Red) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + let greenTypeIcon = (typeStruct.Green) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + let blueTypeIcon = (typeStruct.Blue) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + + $('#quickViewTitleRight').html(''); + + $('.spellSlotRedType').click(function(){ + typeStruct.Red = !typeStruct.Red; + data.SpellSlotData.Slot.type = getSpellTypeData(typeStruct); + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + data.SpellSlotData.Slot); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SpellSlotData.SpellSRC, data.SpellSlotData.Data); + }); + + $('.spellSlotGreenType').click(function(){ + typeStruct.Green = !typeStruct.Green; + data.SpellSlotData.Slot.type = getSpellTypeData(typeStruct); + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + data.SpellSlotData.Slot); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SpellSlotData.SpellSRC, data.SpellSlotData.Data); + }); + + $('.spellSlotBlueType').click(function(){ + typeStruct.Blue = !typeStruct.Blue; + data.SpellSlotData.Slot.type = getSpellTypeData(typeStruct); + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + data.SpellSlotData.Slot); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SpellSlotData.SpellSRC, data.SpellSlotData.Data); + }); + }; + + displayColorTypes(typeStruct); + + } + + // Coloring SPELL in Spellbook // + if(data.SRCTabData != null && data.SRCTabData.SpellBookSpellID != null && data.SRCTabData.SpellType != null){ + + let typeStruct = getSpellTypeStruct(data.SRCTabData.SpellType); + + let displayColorTypes = function(typeStruct) { + let redTypeIcon = (typeStruct.Red) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + let greenTypeIcon = (typeStruct.Green) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + let blueTypeIcon = (typeStruct.Blue) ? 'fas fa-xs fa-circle' : 'far fa-xs fa-circle'; + + $('#quickViewTitleRight').html(''); + + $('.spellSlotRedType').click(function(){ + typeStruct.Red = !typeStruct.Red; + data.SRCTabData.SpellType = getSpellTypeData(typeStruct); + updateSpellBookSpellType(data.SRCTabData.SpellBookSpellID, data.SRCTabData.SpellType); + socket.emit("requestSpellTypeUpdate", + getCharIDFromURL(), + data.SRCTabData.SpellBookSpellID, + data.SRCTabData.SpellType); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SRCTabData.SpellSRC, data.SRCTabData.Data); + }); + + $('.spellSlotGreenType').click(function(){ + typeStruct.Green = !typeStruct.Green; + data.SRCTabData.SpellType = getSpellTypeData(typeStruct); + updateSpellBookSpellType(data.SRCTabData.SpellBookSpellID, data.SRCTabData.SpellType); + socket.emit("requestSpellTypeUpdate", + getCharIDFromURL(), + data.SRCTabData.SpellBookSpellID, + data.SRCTabData.SpellType); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SRCTabData.SpellSRC, data.SRCTabData.Data); + }); + + $('.spellSlotBlueType').click(function(){ + typeStruct.Blue = !typeStruct.Blue; + data.SRCTabData.SpellType = getSpellTypeData(typeStruct); + updateSpellBookSpellType(data.SRCTabData.SpellBookSpellID, data.SRCTabData.SpellType); + socket.emit("requestSpellTypeUpdate", + getCharIDFromURL(), + data.SRCTabData.SpellBookSpellID, + data.SRCTabData.SpellType); + displayColorTypes(typeStruct); + openSpellSRCTab(data.SRCTabData.SpellSRC, data.SRCTabData.Data); + }); + }; + + displayColorTypes(typeStruct); + + } + + + if(data.SRCTabData != null){ // Remove from SpellBook // + + qContent.append(''); + + qContent.append('
                      '); + + $('#spellRemoveFromSpellBookBtn').click(function(){ + prev_spellSRC = data.SRCTabData.SpellSRC; + prev_spellData = data.SRCTabData.Data; + socket.emit("requestSpellRemoveFromSpellBook", + getCharIDFromURL(), + data.SRCTabData.SpellSRC, + spellID, + data.SRCTabData.SpellLevel); + closeQuickView(); + }); + } + + if(data.SpellSlotData != null){ // Clear from SpellSlots // + + qContent.append(''); + + qContent.append('
                      '); + + $('#spellClearSpellSlotBtn').click(function(){ + updateSpellSlot(null, data.SpellSlotData.Slot, data.SpellSlotData.SpellSRC, data.SpellSlotData.Data); + closeQuickView(); + }); + } + + let spellTradition = null; + let spellKeyAbility = null; + if(data.SheetData != null){ // View and Cast from Sheet // + + let spellSRC = null; + let spellUsed = null; + if(sheetSpellType === 'CORE') { + let spellBook = g_spellBookArray.find(spellBook => { + return spellBook.SpellSRC === data.SheetData.Slot.SpellSRC; + }); + spellTradition = spellBook.SpellList; + spellSRC = spellBook.SpellSRC; + spellKeyAbility = spellBook.SpellKeyAbility; + spellUsed = data.SheetData.Slot.used; + } else if(sheetSpellType === 'FOCUS') { + let spellBook = g_spellBookArray.find(spellBook => { + return spellBook.SpellSRC === data.SheetData.FocusSpell.SpellSRC; + }); + spellTradition = spellBook.SpellList; + spellSRC = spellBook.SpellSRC; + spellKeyAbility = spellBook.SpellKeyAbility; + if(spellDataStruct.Spell.level == 0) { + spellUsed = false; + } else { + spellUsed = !g_focusOpenPoint; + } + } else if(sheetSpellType === 'INNATE') { + spellTradition = data.SheetData.InnateSpell.SpellTradition; + spellKeyAbility = data.SheetData.InnateSpell.KeyAbility; + spellUsed = (data.SheetData.InnateSpell.TimesCast == data.SheetData.InnateSpell.TimesPerDay); + } + g_spellView_spellKeyAbility = spellKeyAbility; + + $('#quickViewTitleRight').html(''+capitalizeWord(spellTradition)+''); + + let spellAttack = 0; + let spellDC = 0; + if(spellTradition === 'ARCANE'){ + spellAttack = data.SheetData.Data.ArcaneSpellAttack; + spellDC = data.SheetData.Data.ArcaneSpellDC; + } else if(spellTradition === 'DIVINE'){ + spellAttack = data.SheetData.Data.DivineSpellAttack; + spellDC = data.SheetData.Data.DivineSpellDC; + } else if(spellTradition === 'OCCULT'){ + spellAttack = data.SheetData.Data.OccultSpellAttack; + spellDC = data.SheetData.Data.OccultSpellDC; + } else if(spellTradition === 'PRIMAL'){ + spellAttack = data.SheetData.Data.PrimalSpellAttack; + spellDC = data.SheetData.Data.PrimalSpellDC; + } + + /* + "You're always trained in spell attack rolls and spell DCs + for your innate spells, even if you aren't otherwise trained + in spell attack rolls or spell DCs. If your proficiency in + spell attack rolls or spell DCs is expert or better, apply + that proficiency to your innate spells, too." + */ + if(sheetSpellType === 'INNATE'){ + let trainingProf = getProfNumber(1, g_character.level); + spellAttack = (trainingProf > spellAttack) ? trainingProf : spellAttack; + spellDC = (trainingProf > spellDC) ? trainingProf : spellDC; + } + + let abilityMod = getModOfValue(spellKeyAbility); + spellAttack += abilityMod; + spellDC += abilityMod; + + spellAttack = signNumber(spellAttack); + spellDC += 10; + + if(sheetSpellType === 'CORE' || sheetSpellType === 'FOCUS' || sheetSpellType === 'INNATE') { + if(spellUsed){ + qContent.append(''); + } else { + qContent.append(''); + } + } + + qContent.append('
                      Attack
                      DC
                      '); + qContent.append('

                      '+spellAttack+'

                      '+spellDC+'

                      '); + if(typeof gOption_hasDiceRoller !== 'undefined' && gOption_hasDiceRoller) { refreshStatRollButtons(); } + + qContent.append('
                      '); + + if(sheetSpellType === 'CORE') { + $('#spellCastSpellBtn').click(function(){ + if(spellDataStruct.Spell.level == 0) { + closeQuickView(); + } else { + data.SheetData.Slot.used = true; + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + data.SheetData.Slot); + let spellSlotsArray = g_spellSlotsMap.get(spellSRC); + if(spellSlotsArray != null){ + spellSlotsArray = updateSlotUsed(spellSlotsArray, data.SheetData.Slot.slotID, true); + } + g_spellSlotsMap.set(spellSRC, spellSlotsArray); + displaySpellsAndSlots(); + closeQuickView(); + } + }); + + $('#spellUnCastSpellBtn').click(function(){ + data.SheetData.Slot.used = false; + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + data.SheetData.Slot); + let spellSlotsArray = g_spellSlotsMap.get(spellSRC); + if(spellSlotsArray != null){ + spellSlotsArray = updateSlotUsed(spellSlotsArray, data.SheetData.Slot.slotID, false); + } + g_spellSlotsMap.set(spellSRC, spellSlotsArray); + displaySpellsAndSlots(); + closeQuickView(); + }); + } + + if(sheetSpellType === 'FOCUS') { + $('#spellCastSpellBtn').click(function(){ + if(spellDataStruct.Spell.level != 0) { + displayFocusCastingsSet('ADD'); + } + closeQuickView(); + }); + + $('#spellUnCastSpellBtn').click(function(){ + displayFocusCastingsSet('REMOVE'); + closeQuickView(); + }); + } + + if(sheetSpellType === 'INNATE') { + $('#spellCastSpellBtn').click(function(){ + if(spellDataStruct.Spell.level == 0) { + closeQuickView(); + } else { + let innateSpellIndex = g_innateSpellArray.indexOf(data.SheetData.InnateSpell); + let newTimesCast = data.SheetData.InnateSpell.TimesCast+1; + socket.emit("requestInnateSpellCastingUpdate", + cloneObj(data.SheetData.InnateSpell), + newTimesCast); + data.SheetData.InnateSpell.TimesCast = newTimesCast; + g_innateSpellArray[innateSpellIndex] = data.SheetData.InnateSpell; + displaySpellsInnate(); + closeQuickView(); + } + }); + + $('#spellUnCastSpellBtn').click(function(){ + let innateSpellIndex = g_innateSpellArray.indexOf(data.SheetData.InnateSpell); + let newTimesCast = data.SheetData.InnateSpell.TimesCast-1; + socket.emit("requestInnateSpellCastingUpdate", + cloneObj(data.SheetData.InnateSpell), + newTimesCast); + data.SheetData.InnateSpell.TimesCast = newTimesCast; + g_innateSpellArray[innateSpellIndex] = data.SheetData.InnateSpell; + displaySpellsInnate(); + closeQuickView(); + }); + } + + } + + let rarity = spellDataStruct.Spell.rarity; + let tagsInnerHTML = ''; + switch(rarity) { + case 'UNCOMMON': tagsInnerHTML += ''; + break; + case 'RARE': tagsInnerHTML += ''; + break; + case 'UNIQUE': tagsInnerHTML += ''; + break; + default: break; + } + + spellDataStruct.Tags = spellDataStruct.Tags.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + for(const tag of spellDataStruct.Tags){ + let tagDescription = tag.description; + if(tagDescription.length > g_tagStringLengthMax){ + tagDescription = tagDescription.substring(0, g_tagStringLengthMax); + tagDescription += '...'; + } + tagsInnerHTML += ''; + } + + if(tagsInnerHTML != ''){ + qContent.append('
                      '+tagsInnerHTML+'
                      '); + qContent.append('
                      '); + } + + $('.tagButton').click(function(){ + let tagName = $(this).text(); + openQuickView('tagView', { + TagName : tagName, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + + // Traditions + if(data.SheetData == null){ + let traditionsString = ''; + let spellTraditions = JSON.parse(spellDataStruct.Spell.traditions); + for(let tradition of spellTraditions){ + traditionsString += tradition+', '; + } + traditionsString = traditionsString.slice(0, -2);// Trim off that last ', ' + if(traditionsString != '') { + qContent.append('

                      Traditions '+traditionsString+'

                      '); + } + } + + // Cast + let castActions = null; + let wrapComponents = false; + switch(spellDataStruct.Spell.cast) { + case 'FREE_ACTION': castActions = '[free-action]'; break; + case 'REACTION': castActions = '[reaction]'; break; + case 'ACTION': castActions = '[one-action]'; break; + case 'TWO_ACTIONS': castActions = '[two-actions]'; break; + case 'THREE_ACTIONS': castActions = '[three-actions]'; break; + case 'ONE_TO_THREE_ACTIONS': castActions = '[one-action] to [three-actions]'; break; + case 'ONE_TO_TWO_ACTIONS': castActions = '[one-action] to [two-actions]'; break; + case 'TWO_TO_THREE_ACTIONS': castActions = '[two-actions] to [three-actions]'; break; + case 'TWO_TO_TWO_ROUNDS': castActions = '[two-actions] to 2 rounds'; break; + case 'TWO_TO_THREE_ROUNDS': castActions = '[two-actions] to 3 rounds'; break; + case 'THREE_TO_TWO_ROUNDS': castActions = '[three-actions] to 2 rounds'; break; + case 'THREE_TO_THREE_ROUNDS': castActions = '[three-actions] to 3 rounds'; break; + case 'TWO_ROUNDS': castActions = '2 rounds'; wrapComponents = true; break; + case 'THREE_ROUNDS': castActions = '3 rounds'; wrapComponents = true; break; + case 'ONE_MINUTE': castActions = '1 minute'; wrapComponents = true; break; + case 'FIVE_MINUTES': castActions = '5 minutes'; wrapComponents = true; break; + case 'TEN_MINUTES': castActions = '10 minutes'; wrapComponents = true; break; + case 'THIRTY_MINUTES': castActions = '30 minutes'; wrapComponents = true; break; + case 'ONE_HOUR': castActions = '1 hour'; wrapComponents = true; break; + case 'EIGHT_HOURS': castActions = '8 hours'; wrapComponents = true; break; + case 'ONE_DAY': castActions = '24 hours'; wrapComponents = true; break; + default: break; + } + + let componentsString = ''; + let spellComponents = JSON.parse(spellDataStruct.Spell.castingComponents); + for(let components of spellComponents){ + componentsString += components+', '; + } + componentsString = componentsString.slice(0, -2);// Trim off that last ', ' + if(wrapComponents && componentsString != ''){ + componentsString = '('+componentsString+')'; + } + componentsString = componentsString.replace(`somatic`, `(trait: somatic)`); + componentsString = componentsString.replace(`verbal`, `(trait: verbal)`); + componentsString = componentsString.replace(`material`, `(trait: material)`); + componentsString = componentsString.replace(`focus`, `(trait: focus)`); + if(typeof g_allTags !== 'undefined' && g_allTags != null) { + componentsString = componentsString.replace(regexTraitLink, handleTraitLink);// From text-processing.js + } else { + componentsString = componentsString.replace(regexTraitLink, '$2'); + } + + qContent.append('

                      Cast '+castActions+' '+componentsString+'

                      '); + + // Cost // Trigger // Requirements // + let ctrString = ''; + + let spellCost = ''; + if(spellDataStruct.Spell.cost != null){ + spellCost = 'Cost '+removePeriodAtEndOfStr(spellDataStruct.Spell.cost)+'; '; + } + ctrString += spellCost; + + let spellTrigger = ''; + if(spellDataStruct.Spell.trigger != null){ + spellTrigger = 'Trigger '+removePeriodAtEndOfStr(spellDataStruct.Spell.trigger)+'; '; + } + ctrString += spellTrigger; + + let spellRequirements = ''; + if(spellDataStruct.Spell.requirements != null){ + spellRequirements = 'Requirements '+removePeriodAtEndOfStr(spellDataStruct.Spell.requirements)+'; '; + } + ctrString += spellRequirements; + ctrString = ctrString.slice(0, -2);// Trim off that last '; ' + if(ctrString != '') {ctrString += '.';}// Add period at end. + + qContent.append('

                      '+ctrString+'

                      '); + + + // Range // Area // Targets // + let ratString = ''; + + let spellRange = ''; + if(spellDataStruct.Spell.range != null){ + spellRange = 'Range '+spellDataStruct.Spell.range+'; '; + } + ratString += spellRange; + + let spellArea = ''; + if(spellDataStruct.Spell.area != null){ + spellArea = 'Area '+spellDataStruct.Spell.area+'; '; + } + ratString += spellArea; + + let spellTargets = ''; + if(spellDataStruct.Spell.targets != null){ + spellTargets = 'Targets '+spellDataStruct.Spell.targets+'; '; + } + ratString += spellTargets; + ratString = ratString.slice(0, -2);// Trim off that last '; ' + + qContent.append('

                      '+ratString+'

                      '); + + // Saving Throw // Duration // + let sdString = ''; + + let savingThrowType = null; + switch(spellDataStruct.Spell.savingThrow) { + case 'FORT': savingThrowType = 'Fortitude'; break; + case 'REFLEX': savingThrowType = 'Reflex'; break; + case 'WILL': savingThrowType = 'Will'; break; + case 'BASIC_FORT': savingThrowType = 'basic Fortitude'; break; + case 'BASIC_REFLEX': savingThrowType = 'basic Reflex'; break; + case 'BASIC_WILL': savingThrowType = 'basic Will'; break; + default: break; + } + if(savingThrowType != null){ + sdString += 'Saving Throw '+savingThrowType+'; '; + } + + let spellDuration = ''; + if(spellDataStruct.Spell.duration != null){ + spellDuration = 'Duration '+spellDataStruct.Spell.duration+'; '; + } + sdString += spellDuration; + sdString = sdString.slice(0, -2);// Trim off that last '; ' + + qContent.append('

                      '+sdString+'

                      '); + + qContent.append('
                      '); + + let spellDescription = spellDataStruct.Spell.description;// Let heighten potentially modify spellDescription + qContent.append('
                      '); + + spellDescription = pre_spellModTextProcessor(spellDescription); + + if(spellDataStruct.Spell.heightenedOneVal != null || spellDataStruct.Spell.heightenedTwoVal != null || spellDataStruct.Spell.heightenedThreeVal != null) { + + let autoHeightenSpells = false; + if(isSheetPage()){ autoHeightenSpells = gOption_hasAutoHeightenSpells; } + if(true){ // !autoHeightenSpells || spellHeightenLevel == null + + let hOneText = null; + if(spellDataStruct.Spell.heightenedOneVal != null){ + let heightenedTextName = getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedOneVal); + let hText; + if(heightenedTextName === "CUSTOM"){ + hText = 'Heightened '+spellDataStruct.Spell.heightenedOneText; + } else { + hText = 'Heightened ('+heightenedTextName+') '+spellDataStruct.Spell.heightenedOneText; + } + hText = pre_spellModTextProcessor(hText); + + // Auto Heighten Spell + if(autoHeightenSpells && spellHeightenLevel != null){ + let heightenedOneCount = getHeightenedCount(spellDataStruct.Spell.level, spellHeightenLevel, spellDataStruct.Spell.heightenedOneVal); + hText = getAutoHeightenedSpellText(heightenedOneCount, spellDataStruct.Spell.heightenedOneText, heightenedTextName); + } + hOneText = hText; + + } + + let hTwoText = null; + if(spellDataStruct.Spell.heightenedTwoVal != null){ + let hText = 'Heightened ('+getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedTwoVal)+') '+spellDataStruct.Spell.heightenedTwoText; + hText = pre_spellModTextProcessor(hText); + + // Auto Heighten Spell + if(autoHeightenSpells && spellHeightenLevel != null){ + let heightenedTwoCount = getHeightenedCount(spellDataStruct.Spell.level, spellHeightenLevel, spellDataStruct.Spell.heightenedTwoVal); + hText = getAutoHeightenedSpellText(heightenedTwoCount, spellDataStruct.Spell.heightenedTwoText, getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedTwoVal)); + } + hTwoText = hText; + + } + + let hThreeText = null; + if(spellDataStruct.Spell.heightenedThreeVal != null){ + let hText = 'Heightened ('+getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedThreeVal)+') '+spellDataStruct.Spell.heightenedThreeText; + hText = pre_spellModTextProcessor(hText); + + // Auto Heighten Spell + if(autoHeightenSpells && spellHeightenLevel != null){ + let heightenedThreeCount = getHeightenedCount(spellDataStruct.Spell.level, spellHeightenLevel, spellDataStruct.Spell.heightenedThreeVal); + hText = getAutoHeightenedSpellText(heightenedThreeCount, spellDataStruct.Spell.heightenedThreeText, getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedThreeVal)); + } + hThreeText = hText; + + } + + let hFourText = null; + if(spellDataStruct.Spell.heightenedFourVal != null){ + let hText = 'Heightened ('+getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedFourVal)+') '+spellDataStruct.Spell.heightenedFourText; + hText = pre_spellModTextProcessor(hText); + + // Auto Heighten Spell + if(autoHeightenSpells && spellHeightenLevel != null){ + let heightenedFourCount = getHeightenedCount(spellDataStruct.Spell.level, spellHeightenLevel, spellDataStruct.Spell.heightenedFourVal); + hText = getAutoHeightenedSpellText(heightenedFourCount, spellDataStruct.Spell.heightenedFourText, getHeightenedTextFromCodeName(spellDataStruct.Spell.heightenedFourVal)); + } + hFourText = hText; + + } + + // Auto Heighten Spell + if(autoHeightenSpells && spellHeightenLevel != null){ + // Apply heighten changes to spell + let spellData = { + spellDescription, + spellRange: $('#qContent-spell-range').html(), + spellArea: $('#qContent-spell-area').html(), + spellTargets: $('#qContent-spell-targets').html(), + spellDuration: $('#qContent-spell-duration').html(), + }; + if(hFourText != null){ + spellData = modifySpellByHeighten(spellData, hFourText); + hFourText = spellData.hText; + } + if(hThreeText != null){ + spellData = modifySpellByHeighten(spellData, hThreeText); + hThreeText = spellData.hText; + } + if(hTwoText != null){ + spellData = modifySpellByHeighten(spellData, hTwoText); + hTwoText = spellData.hText; + } + if(hOneText != null){ + spellData = modifySpellByHeighten(spellData, hOneText); + hOneText = spellData.hText; + } + spellDescription = spellData.spellDescription; + $('#qContent-spell-range').html(processTextOnlyVariablesAndTooltips(spellData.spellRange)); + $('#qContent-spell-area').html(processTextOnlyVariablesAndTooltips(spellData.spellArea)); + $('#qContent-spell-targets').html(processTextOnlyVariablesAndTooltips(spellData.spellTargets)); + $('#qContent-spell-duration').html(processTextOnlyVariablesAndTooltips(spellData.spellDuration)); + } + + // Display hText + if(hOneText != null && hOneText != ''){ + hOneText = post_spellModTextProcessor(hOneText); + qContent.append('
                      '); + qContent.append('
                      '+processText(hOneText, true, true, 'MEDIUM')+'
                      '); + } + if(hTwoText != null && hTwoText != ''){ + hTwoText = post_spellModTextProcessor(hTwoText); + qContent.append('
                      '); + qContent.append('
                      '+processText(hTwoText, true, true, 'MEDIUM')+'
                      '); + } + if(hThreeText != null && hThreeText != ''){ + hThreeText = post_spellModTextProcessor(hThreeText); + qContent.append('
                      '); + qContent.append('
                      '+processText(hThreeText, true, true, 'MEDIUM')+'
                      '); + } + if(hFourText != null && hFourText != ''){ + hFourText = post_spellModTextProcessor(hFourText); + qContent.append('
                      '); + qContent.append('
                      '+processText(hFourText, true, true, 'MEDIUM')+'
                      '); + } + + } + + } + + + spellDescription = post_spellModTextProcessor(spellDescription); + $('#qContent-spell-description').append(processText(spellDescription, true, true, 'MEDIUM')); + +} + +/// + +function pre_spellModTextProcessor(text){ + if(!isSheetPage()) { return text; } + if(g_spellView_spellKeyAbility == null) { return text; } + + text = text.replace('plus your spellcasting modifier', '+ SPELL_MODIFIER'); + text = text.replace('plus your spellcasting ability modifier', '+ SPELL_MODIFIER'); + + text = text.replace('equal to your spellcasting ability modifier', 'SPELL_MODIFIER'); + text = text.replace('your spellcasting ability modifier', 'SPELL_MODIFIER'); + + return text; +} + +function post_spellModTextProcessor(text){ + if(!isSheetPage()) { return text; } + if(g_spellView_spellKeyAbility == null) { return text; } + + text = text.replace('SPELL_MODIFIER', '{pre_'+g_spellView_spellKeyAbility+'_MOD|'+lengthenAbilityType(g_spellView_spellKeyAbility)+' Modifier}'); + + return text; +} + +/// + +function modifySpellByHeighten(spellData, hText){ + + let spellDescription = spellData.spellDescription; + let spellRange = spellData.spellRange; + let spellArea = spellData.spellArea; + let spellTargets = spellData.spellTargets; + let spellDuration = spellData.spellDuration; + + // Increase Damage + if(hText.toLowerCase().includes('damage') && (hText.toLowerCase().includes('increase ') || hText.toLowerCase().includes('increases '))){ + + ///////// + let increaseDamageByProcessor = function(match, overrideExisting=false) { + + ///////// + let findDamageInSpell = function(spellDescription, match, overrideExisting){ + + ///////// + let handleDamageReplacement = function(sub_match, startOfStr, dieNum, dieTypeStr, dieTypeNum, spellModStr, endOfStr, damageType) { + let newDamage = ''; + let extraDamageModStr = ''; + + if(dieTypeStr != ''){// There are dice + + if(overrideExisting){ + newDamage = match[4]+match[5]; + } else { + newDamage = (parseInt(dieNum)+parseInt(match[4]))+match[5]; + } + if(match[7] != ''){ + // Because this mod will be displayed in a tooltip, if SPELL_MODIFIER, find mod now and bake into string + if(match[7] == ' + SPELL_MODIFIER'){ + let sheetVar = acquireSheetVariable('pre_'+g_spellView_spellKeyAbility+'_MOD'); + newDamage += ' + '+sheetVar; + } else { + newDamage += match[7]; + } + } else { + extraDamageModStr = spellModStr; + } + + return startOfStr+('{cyan:'+newDamage+'|Heighten: '+dieNum+dieTypeStr+' ➙ '+newDamage.replace(/ /g,'')+'}')+extraDamageModStr+endOfStr; + + } else {// No dice, just flat number + + newDamage = match[4]+match[5]; + + // Convert SPELL_MODIFIER to actual number + let spellModStrConverted; + if(spellModStr == 'SPELL_MODIFIER'){ + let sheetVar = acquireSheetVariable('pre_'+g_spellView_spellKeyAbility+'_MOD'); + spellModStrConverted = sheetVar; + } else if (spellModStr != '') { + spellModStrConverted = spellModStr; + } else if (dieNum != ''){ + spellModStrConverted = dieNum; + } + + let bonusDamage = spellModStrConverted; + + // If the heighten is also adding flat damage or SPELL_MODIFIER, add it to newDamage as well + if(match[7] != ''){ + // Because this mod will be displayed in a tooltip, if SPELL_MODIFIER, find mod now and bake into string + if(match[7] == ' + SPELL_MODIFIER'){ + let sheetVar = acquireSheetVariable('pre_'+g_spellView_spellKeyAbility+'_MOD'); + bonusDamage += ' + '+sheetVar; + } else { + bonusDamage += match[7]; + } + } + + try { + bonusDamage = parseInt(math.evaluate(bonusDamage))+''; + } catch (err) {} + + // If not overriding, add original bonusDamage to newDamage + if(!overrideExisting){ + newDamage += ' + '+bonusDamage; + } + + try { + newDamage = parseInt(math.evaluate(newDamage))+''; + } catch (err) {} + + return startOfStr+('{cyan:'+newDamage+'|Heighten: '+spellModStrConverted+' ➙ '+newDamage.replace(/ /g,'')+'}')+endOfStr; + + } + }; + ///////// + + let damageType = match[2].toLowerCase().replace(/[().]/g, ''); + + // Check if word before damage can be located in spellDesc (Ex. splash damage) + // Ex. Find 'XdX splash (?) damage' + // Double escape because string will remove an escape before regex applies + let newSpellDescription = spellDescription.replace( + new RegExp('()(\\d+)(d(\\d+)|)( \\+ SPELL_MODIFIER|)( '+damageType+' ([^ \\n]+) damage)', 'g'), handleDamageReplacement); + + // Else try find 'XdX (?) damage' + if(newSpellDescription == spellDescription){ + newSpellDescription = spellDescription.replace(/()(\d+)(d(\d+)|)( \+ SPELL_MODIFIER|)( ([^ \n]+) damage)/g, handleDamageReplacement); + } + + // Else try find 'XdX damage' + if(newSpellDescription == spellDescription){ + newSpellDescription = spellDescription.replace(/()(\d+)(d(\d+)|)( \+ SPELL_MODIFIER|)( ()damage)/g, handleDamageReplacement); + } + + // Else try find 'equal to XdX.' + if(newSpellDescription == spellDescription){ + newSpellDescription = spellDescription.replace(/(equal to )(\d+)(d(\d+)|)( \+ SPELL_MODIFIER|)([.,;]|$)/g, handleDamageReplacement); + } + + // Else try to find 'SPELL_MODIFIER splash (?) damage' + if(newSpellDescription == spellDescription){ + newSpellDescription = spellDescription.replace( + new RegExp('()()(())(SPELL_MODIFIER)( '+damageType+' ([^ \\n]+) damage)', 'g'), handleDamageReplacement); + } + + // Else try to find 'SPELL_MODIFIER (?) damage' + if(newSpellDescription == spellDescription){ + newSpellDescription = spellDescription.replace(/()()(())(SPELL_MODIFIER)( ([^ \n]+) damage)/g, handleDamageReplacement); + } + + return newSpellDescription; + + }; + ///////// + + let newSpellDescription = findDamageInSpell(spellDescription, match, overrideExisting); + if(newSpellDescription == spellDescription){ + + // Can it find without tooltips (aka, has it already been found) + newSpellDescription = findDamageInSpell(processTextRemoveTooltips(spellDescription), match, overrideExisting); + + if(newSpellDescription == spellDescription){ + // Can't find at all, failed + let newMatch0 = match[0].replace(match[4]+match[5]+match[7], '{red_underline:'+match[4]+match[5]+'|Failed to update damage in spell}'+match[7]); + hText = hText.replace(match[0], newMatch0); + } else { + // Already found, okay + let newMatch0 = match[0].replace(match[4]+match[5]+match[7], '{normal:'+match[4]+match[5]+'|Overridden}'+match[7]); + hText = hText.replace(match[0], newMatch0); + } + + } else { + // Found, okay + let newMatch0 = match[0].replace(match[4]+match[5]+match[7], '{cyan_underline:'+match[4]+match[5]+'|Applied to spell}'+match[7]); + hText = hText.replace(match[0], newMatch0); + + spellDescription = newSpellDescription; + } + + }; + ///////// + + if(hText.includes('damage by')){ + let matches = hText.matchAll(getHeightenDamageRegex('damage by')); + for(let match of matches){ + if(match[11] != null && damageInvalidEndWordList().includes(match[11].trim())) { continue; } + increaseDamageByProcessor(match); + } + } + + if(hText.includes('damage increases by')){ + let matches = hText.matchAll(getHeightenDamageRegex('damage increases by')); + for(let match of matches){ + if(match[11] != null && damageInvalidEndWordList().includes(match[11].trim())) { continue; } + increaseDamageByProcessor(match); + } + } else if(hText.includes('increases by')){ + let matches = hText.matchAll(getHeightenDamageRegex('increases by')); + for(let match of matches){ + if(match[11] != null && damageInvalidEndWordList().includes(match[11].trim())) { continue; } + increaseDamageByProcessor(match); + } + } + + if(hText.includes('damage on a critical hit by')){ + let matches = hText.matchAll(getHeightenDamageRegex('damage on a critical hit by')); + for(let match of matches){ + if(match[11] != null && damageInvalidEndWordList().includes(match[11].trim())) { continue; } + increaseDamageByProcessor(match); + } + } + + if(hText.includes('damage to')){ + let matches = hText.matchAll(getHeightenDamageRegex('damage to')); + for(let match of matches){ + if(match[11] != null && damageInvalidEndWordList().includes(match[11].trim())) { continue; } + increaseDamageByProcessor(match, true); + } + } + + if(hText.includes('damage increases to')){ + let matches = hText.matchAll(getHeightenDamageRegex('damage increases to')); + for(let match of matches){ + if(match[11] != null && damageInvalidEndWordList().includes(match[11].trim())) { continue; } + increaseDamageByProcessor(match, true); + } + } else if(hText.includes('increases by')){ + let matches = hText.matchAll(getHeightenDamageRegex('increases to')); + for(let match of matches){ + if(match[11] != null && damageInvalidEndWordList().includes(match[11].trim())) { continue; } + increaseDamageByProcessor(match, true); + } + } + + } + + // Hardness + if(hText.toLowerCase().includes('hardness')){ + let hardnessMatches = hText.matchAll(/has hardness (\d+)/ig); + for(let match of hardnessMatches){ + + ///////// + let findHardnessInSpell = function(spellDescription, match){ + + let newSpellDescription = spellDescription.replace(/(Hardness )(\d+)/i, '$1{cyan:'+match[1]+'|Heighten: $2 ➙ '+match[1]+'}'); + return newSpellDescription; + + }; + ///////// + + let newSpellDescription = findHardnessInSpell(spellDescription, match); + if(newSpellDescription == spellDescription){ + + // Can it find without tooltips (aka, has it already been found) + newSpellDescription = findHardnessInSpell(processTextRemoveTooltips(spellDescription), match); + + if(newSpellDescription == spellDescription){ + // Can't find at all, failed + let newMatch0 = match[0].replace(match[1], '{red_underline:'+match[1]+'|Failed to update hardness in spell}'); + hText = hText.replace(match[0], newMatch0); + } else { + // Already found, okay + let newMatch0 = match[0].replace(match[1], '{normal:'+match[1]+'|Overridden}'); + hText = hText.replace(match[0], newMatch0); + } + + } else { + // Found, okay + let newMatch0 = match[0].replace(match[1], '{cyan_underline:'+match[1]+'|Applied to spell}'); + hText = hText.replace(match[0], newMatch0); + + spellDescription = newSpellDescription; + } + + } + } + + // Target + if(spellTargets != null && hText.includes('target')){ + + ///////// + let updateTargetsProcessor = function(match) { + // Skip if match ends with number, + if(match[1].match(/[0-9]$/) != null) { return; } + // Skip if match does not contain a number or 'any number of' + if(match[1].match(/[0-9]|any number of/i) == null) { return; } + + let spellTargetsCleaned = processTextRemoveTooltips(spellTargets); + if(spellTargetsCleaned != spellTargets){ + // Already found, okay + let newMatch0 = match[0].replace(match[1], '{normal:'+match[1]+'|Overridden}'); + hText = hText.replace(match[0], newMatch0); + } else { + // Found, okay + let newMatch0 = match[0].replace(match[1], '{cyan_underline:'+match[1]+'|Applied to spell}'); + hText = hText.replace(match[0], newMatch0); + + spellTargets = '{cyan:'+match[1]+'|Heightened from \''+spellTargets+'\'}'; + } + }; + + let targetMatches = hText.matchAll(/you can target ([^.,;\n]+)/gi); + for(let match of targetMatches){ + updateTargetsProcessor(match); + } + + let targetMatches2 = hText.matchAll(/the spell can target ([^.,;\n]+)/gi); + for(let match of targetMatches2){ + updateTargetsProcessor(match); + } + + } + + // Range + if(spellRange != null && hText.includes('range')){ + + ///////// + let updateRangeProcessor = function(match) { + // Skip if match ends with number, + if(match[2].match(/[0-9]$/) != null) { return; } + + let spellRangeCleaned = processTextRemoveTooltips(spellRange); + if(spellRangeCleaned != spellRange){ + // Already found, okay + let newMatch0 = match[0].replace(match[1]+match[2], '{normal:'+match[1]+match[2]+'|Overridden}'); + hText = hText.replace(match[0], newMatch0); + } else { + // Found, okay + let newMatch0 = match[0].replace(match[1]+match[2], '{cyan_underline:'+match[1]+match[2]+'|Applied to spell}'); + hText = hText.replace(match[0], newMatch0); + + spellRange = '{cyan:'+match[1]+match[2]+'|Heightened from \''+spellRange+'\'}'; + } + }; + + let rangeMatches = hText.matchAll(/range increases to (\d+)([^.,;\n]+)/gi); + for(let match of rangeMatches){ + updateRangeProcessor(match); + } + + } + + // Duration + if(spellDuration != null && hText.includes('duration')){ + + ///////// + let updateDurationProcessor = function(match) { + // Skip if match ends with number, + if(match[2].match(/[0-9]$/) != null) { return; } + + let spellDurationCleaned = processTextRemoveTooltips(spellDuration); + if(spellDurationCleaned != spellDuration){ + // Already found, okay + let newMatch0 = match[0].replace(match[2], '{normal:'+match[2]+'|Overridden}'); + hText = hText.replace(match[0], newMatch0); + } else { + // Found, okay + let newMatch0 = match[0].replace(match[2], '{cyan_underline:'+match[2]+'|Applied to spell}'); + hText = hText.replace(match[0], newMatch0); + + spellDuration = '{cyan:'+match[2]+'|Heightened from \''+spellDuration+'\'}'; + } + }; + + let durationMatches = hText.matchAll(/(duration is |duration increases to |duration of the spell is |duration becomes |duration lasts |the duration to |duration you can Sustain the Spell increases to )([^.,;\n]+)/gi); + for(let match of durationMatches){ + updateDurationProcessor(match); + } + + } + + // Area + if(spellArea != null && hText.includes('area')){ + + ///////// + let updateAreaProcessor = function(match) { + // Skip if match ends with number, + if(match[2].match(/[0-9]$/) != null) { return; } + + let spellAreaCleaned = processTextRemoveTooltips(spellArea); + if(spellAreaCleaned != spellArea){ + // Already found, okay + let newMatch0 = match[0].replace(match[2], '{normal:'+match[2]+'|Overridden}'); + hText = hText.replace(match[0], newMatch0); + } else { + // Found, okay + let newMatch0 = match[0].replace(match[2], '{cyan_underline:'+match[2]+'|Applied to spell}'); + hText = hText.replace(match[0], newMatch0); + + spellArea = '{cyan:'+match[2]+'|Heightened from \''+spellArea+'\'}'; + } + }; + + let areaMatches = hText.matchAll(/(area increases to a )([^.,;\n]+)/gi); + for(let match of areaMatches){ + updateAreaProcessor(match); + } + + } + + /* + // General purpose applying + let hTextParts = hText.split(/[~,.;]/); + for(let i = 0; i < hTextParts.length; i++){ + if(i == 0) { continue; } + let hTextPart = hTextParts[i]; + if(hTextPart == '') { continue; } + // If there are already tooltips, skip + if(hTextPart != processTextRemoveTooltips(hTextPart)){ continue; } + + console.log(hTextPart); + } + */ + + spellData.spellDescription = spellDescription; + spellData.spellRange = spellRange; + spellData.spellArea = spellArea; + spellData.spellTargets = spellTargets; + spellData.spellDuration = spellDuration; + spellData.hText = hText; + + return spellData; +} + +function getHeightenDamageRegex(textBefore){ + // Double escape because string will remove an escape before regex applies + return new RegExp('( |^)([^ \\n]*)( |^)'+textBefore+' (\\d+)(d(\\d+)|)(( \\+ |\\+)(SPELL_MODIFIER|\\d+)|)([ .,;]|$)([^ .,;\\n]*|$)', 'g'); +} +function damageInvalidEndWordList(){ + return ['feet']; +} + +let g_tempAutoHeightenCount = null; +function getAutoHeightenedSpellText(hCount, hText, hVal){ + if(hCount <= 0){ return ''; } + hText = pre_spellModTextProcessor(hText); + g_tempAutoHeightenCount = hCount; + + let text = hText; + text = text.replace(/by (\d+)d(\d+)([ .,;]|$)/g, handleSpellAutoHeightenedIncrease); + text = text.replace(/by (\d+)d(\d+)\+(\d+)([ .,;]|$)/g, handleSpellAutoHeightenedIncreaseBonus); + text = text.replace(/by (\d+)([ .,;]|$)/g, handleSpellAutoHeightenedIncreaseAnyNumber); + + if(text === hText){ + text = ''; + for (let i = 0; i < hCount; i++) { + text += '~ : '+hText; + } + } else { + text = '~ : '+text; + } + + g_tempAutoHeightenCount = null; + + let finalHeightenText = '\n**Heightened'+((hVal !== 'CUSTOM') ? ' ('+hVal+')' : '')+'**'; + if(hCount > 1) { + finalHeightenText += ' Improved '+hCount+' times'; + } + return finalHeightenText+'\n'+text; + +} + +function handleSpellAutoHeightenedIncrease(match, dieAmount, dieType, endingChar){ + dieAmount = dieAmount*g_tempAutoHeightenCount; + return 'by '+dieAmount+'d'+dieType+''+endingChar; +} + +function handleSpellAutoHeightenedIncreaseBonus(match, dieAmount, dieType, bonusAmount, endingChar){ + dieAmount = dieAmount*g_tempAutoHeightenCount; + bonusAmount = bonusAmount*g_tempAutoHeightenCount; + return 'by '+dieAmount+'d'+dieType+'+'+bonusAmount+''+endingChar; +} + +function handleSpellAutoHeightenedIncreaseAnyNumber(match, numAmount, endingChar){ + numAmount = numAmount*g_tempAutoHeightenCount; + return 'by '+numAmount+''+endingChar; +} + +// Spell Utils // +function getHeightenedTextFromCodeName(codeName){ + switch(codeName) { + case "PLUS_ONE": return "+1"; + case "PLUS_TWO": return "+2"; + case "PLUS_THREE": return "+3"; + case "PLUS_FOUR": return "+4"; + case "LEVEL_2": return "2nd"; + case "LEVEL_3": return "3rd"; + case "LEVEL_4": return "4th"; + case "LEVEL_5": return "5th"; + case "LEVEL_6": return "6th"; + case "LEVEL_7": return "7th"; + case "LEVEL_8": return "8th"; + case "LEVEL_9": return "9th"; + case "LEVEL_10": return "10th"; + case "CUSTOM": return "CUSTOM"; + default: return codeName; + } +} + +function getHeightenedCount(spellLevel, spellHeightenLevel, heightenName){ + if(spellHeightenLevel == -1) { return 0; } + if(spellLevel === 0){ spellLevel = 1; } // Cantrips are treated as 1st level + switch(heightenName) { + case "PLUS_ONE": return Math.floor(spellHeightenLevel-spellLevel); + case "PLUS_TWO": return Math.floor((spellHeightenLevel-spellLevel)/2); + case "PLUS_THREE": return Math.floor((spellHeightenLevel-spellLevel)/3); + case "PLUS_FOUR": return Math.floor((spellHeightenLevel-spellLevel)/4); + case "LEVEL_2": return (spellHeightenLevel >= 2) ? 1 : 0; + case "LEVEL_3": return (spellHeightenLevel >= 3) ? 1 : 0; + case "LEVEL_4": return (spellHeightenLevel >= 4) ? 1 : 0; + case "LEVEL_5": return (spellHeightenLevel >= 5) ? 1 : 0; + case "LEVEL_6": return (spellHeightenLevel >= 6) ? 1 : 0; + case "LEVEL_7": return (spellHeightenLevel >= 7) ? 1 : 0; + case "LEVEL_8": return (spellHeightenLevel >= 8) ? 1 : 0; + case "LEVEL_9": return (spellHeightenLevel >= 9) ? 1 : 0; + case "LEVEL_10": return (spellHeightenLevel >= 10) ? 1 : 0; + case "CUSTOM": return 1; + default: return 0; + } +} + +function removePeriodAtEndOfStr(str){ + if(str.endsWith('.')) { + return str.substring(0, str.length - 1); + } else { + return str; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/tag-view.js b/client/vue-src/legacy-js/sheet/quickviews/tag-view.js new file mode 100644 index 00000000..ef2c6b1c --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/tag-view.js @@ -0,0 +1,40 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* + Use this for more than just traits +*/ +let g_tagViewMapper = new Map(); +g_tagViewMapper.set('somatic', 'Spell Component'); +g_tagViewMapper.set('verbal', 'Spell Component'); +g_tagViewMapper.set('material', 'Spell Component'); +g_tagViewMapper.set('focus', 'Spell Component'); + +function openTagQuickview(data) { + addBackFunctionality(data); + + let tagType = g_tagViewMapper.get(data.TagName.toLowerCase()); + if(tagType == null) { tagType = 'Trait'; } + + $('#quickViewTitle').html(tagType+' - '+capitalizeFirstLetterOfWord(data.TagName)); + + let tag = g_allTags.find(tag => { + return tag.name.toUpperCase() === data.TagName.toUpperCase(); + }); + + if(tag != null){ + + addContentSource(tag.id, null, tag.homebrewID); + + let qContent = $('#quickViewContent'); + qContent.append(processText(tag.description, true, true, 'MEDIUM')); + + } else { + + let qContent = $('#quickViewContent'); + qContent.append('

                      Unknown trait!

                      '); + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/quickviews/warnings-view.js b/client/vue-src/legacy-js/sheet/quickviews/warnings-view.js new file mode 100644 index 00000000..aebf1f9e --- /dev/null +++ b/client/vue-src/legacy-js/sheet/quickviews/warnings-view.js @@ -0,0 +1,49 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openWarningsQuickview(data) { + + $('#quickViewTitle').html('Warnings '); + let qContent = $('#quickViewContent'); + + let sortedUnselectedDataArray = g_unselectedDataArray.sort( + function(a, b) { + let aData = JSON.parse(a.value); + let bData = JSON.parse(b.value); + if(aData.STATE != bData.STATE){ + return aData.STATE > bData.STATE ? 1 : -1; + } else { + return aData.sourceName > bData.sourceName ? 1 : -1; + } + } + ); + + for(let unselectedDataStruct of sortedUnselectedDataArray){ + + let unselectedData = JSON.parse(unselectedDataStruct.value); + + let unselectedSymbol = ''; + if(unselectedData.STATE == 'UNSELECTED'){ + unselectedSymbol = ''; + } else if(unselectedData.STATE == 'INCORRECT'){ + unselectedSymbol = ''; + } + + qContent.append(` +
                      +
                      + ${unselectedSymbol} +
                      +
                      + + ${unselectedData.details} + - ${unselectedData.sourceName} + +
                      +
                      + `); + + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/tabs/_tabs.js b/client/vue-src/legacy-js/sheet/tabs/_tabs.js new file mode 100644 index 00000000..0320618a --- /dev/null +++ b/client/vue-src/legacy-js/sheet/tabs/_tabs.js @@ -0,0 +1,41 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + +}); + +function changeTab(type, data) { + + $('#tabContent').html(''); + + $('#actionsTab').parent().removeClass("is-active"); + $('#weaponsTab').parent().removeClass("is-active"); + $('#spellsTab').parent().removeClass("is-active"); + $('#inventoryTab').parent().removeClass("is-active"); + $('#companionsTab').parent().removeClass("is-active"); + $('#detailsTab').parent().removeClass("is-active"); + $('#notesTab').parent().removeClass("is-active"); + + $('#'+type).parent().addClass("is-active"); + g_selectedTabID = type; + + if(type == 'actionsTab'){ + openActionsTab(data); + } else if(type == 'weaponsTab'){ + openWeaponsTab(data); + } else if(type == 'spellsTab'){ + openSpellTab(data); + } else if(type == 'inventoryTab'){ + openInventoryTab(data); + } else if(type == 'companionsTab'){ + openCompanionTab(data); + } else if(type == 'detailsTab'){ + openDetailsTab(data); + } else if(type == 'notesTab'){ + openNotesTab(data); + } + +} diff --git a/client/vue-src/legacy-js/sheet/tabs/actions-tab.js b/client/vue-src/legacy-js/sheet/tabs/actions-tab.js new file mode 100644 index 00000000..0c4716fb --- /dev/null +++ b/client/vue-src/legacy-js/sheet/tabs/actions-tab.js @@ -0,0 +1,567 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openActionsTab(data) { + + $('#tabContent').append(''); + + let actionsCount = 3; + if(hasCondition(26)) { // Hardcoded - Quickened condition ID + actionsCount++; + } + let slowedCondition = getCondition(29); // Hardcoded - Slowed condition ID + if(slowedCondition != null){ + actionsCount -= slowedCondition.Value; + } + actionsCount = (actionsCount < 0) ? 0 : actionsCount; + + let skillsOptionsHTML = ` + + + `; + let foundLore = false; + for(const [skillName, skillData] of data.SkillMap.entries()){ + if(skillData.Skill.name == 'Lore'){ + if(foundLore) { + continue; + } else { + foundLore = true; + } + } + skillsOptionsHTML += ``; + } + + $('#tabContent').append(` +

                      ${actionsCount} Actions per Turn

                      +
                      + +
                      +

                      Filter

                      +
                      + +
                      + +
                      +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      +

                      + + + + +

                      +
                      + `); + + $('#tabContent').append('
                      '); + + + $('#actionTabEncounter').click(function(){ + changeActionTab('actionTabEncounter', data); + }); + + $('#actionTabExploration').click(function(){ + changeActionTab('actionTabExploration', data); + }); + + $('#actionTabDowntime').click(function(){ + changeActionTab('actionTabDowntime', data); + }); + + + $('#actionsTabCheckBox-Basic, #actionsTabCheckBox-Feats, #actionsTabCheckBox-Items, #actionsTabCheckBox-Skills').change(function(event, loadActionTab){ + if ($(this).is(':checked')) { + $(this).removeClass('is-dark'); + $(this).addClass('is-info'); + $(this).blur(); + + if($(this).prop('id') == 'actionsTabCheckBox-Skills'){ + g_selectedAction_SkillsEnabled = true; + $('#actionFilterSelectBySkill').parent().removeClass('is-hidden'); + } else if($(this).prop('id') == 'actionsTabCheckBox-Basic'){ + g_selectedAction_BasicEnabled = true; + } else if($(this).prop('id') == 'actionsTabCheckBox-Feats'){ + g_selectedAction_FeatsEnabled = true; + } else if($(this).prop('id') == 'actionsTabCheckBox-Items'){ + g_selectedAction_ItemsEnabled = true; + } + + if(loadActionTab == null || loadActionTab){ + changeActionTab(g_selectedActionSubTabID, data); + } + } else { + $(this).removeClass('is-info'); + $(this).addClass('is-dark'); + $(this).blur(); + + if($(this).prop('id') == 'actionsTabCheckBox-Skills'){ + g_selectedAction_SkillsEnabled = false; + g_selectedAction_SkillOption = 'chooseDefault'; + $('#actionFilterSelectBySkill').parent().addClass('is-hidden'); + } else if($(this).prop('id') == 'actionsTabCheckBox-Basic'){ + g_selectedAction_BasicEnabled = false; + } else if($(this).prop('id') == 'actionsTabCheckBox-Feats'){ + g_selectedAction_FeatsEnabled = false; + } else if($(this).prop('id') == 'actionsTabCheckBox-Items'){ + g_selectedAction_ItemsEnabled = false; + } + + if(loadActionTab == null || loadActionTab){ + changeActionTab(g_selectedActionSubTabID, data); + } + } + }); + + $('#'+g_selectedActionSubTabID).click(); + +} + + + + + + + +// Action Tabs // +function changeActionTab(type, data){ + if(!g_selectedSubTabLock) {g_selectedSubTabID = type;} + g_selectedActionSubTabID = type; + + $('#actionFilterSelectByAction').off('change'); + $('#actionFilterSelectBySkill').off('change'); + $('#actionFilterSearch').off('change'); + + $('#actionFilterSelectBySkill').val(g_selectedAction_SkillOption); + $('#actionFilterSelectByAction').val(g_selectedAction_ActionOption); + $('#actionFilterSearch').val(g_selectedAction_SearchText); + + $('#actionsTabCheckBox-Basic').prop('checked', g_selectedAction_BasicEnabled) + .trigger("change", [false]); + $('#actionsTabCheckBox-Feats').prop('checked', g_selectedAction_FeatsEnabled) + .trigger("change", [false]); + $('#actionsTabCheckBox-Items').prop('checked', g_selectedAction_ItemsEnabled) + .trigger("change", [false]); + $('#actionsTabCheckBox-Skills').prop('checked', g_selectedAction_SkillsEnabled) + .trigger("change", [false]); + + $('#actionTabContent').html(''); + + $('#actionTabEncounter').parent().removeClass("is-active"); + $('#actionTabExploration').parent().removeClass("is-active"); + $('#actionTabDowntime').parent().removeClass("is-active"); + + $('#'+type).parent().addClass("is-active"); + + + let actionFilterSelectByAction = $('#actionFilterSelectByAction'); + actionFilterSelectByAction.blur(); + + let actionFilterSelectBySkill = $('#actionFilterSelectBySkill'); + actionFilterSelectBySkill.blur(); + + let actionFilterSearch = $('#actionFilterSearch'); + if(actionFilterSearch.val() == ""){ + actionFilterSearch.removeClass('is-info'); + } else { + actionFilterSearch.addClass('is-info'); + } + + $('#actionFilterSelectByAction').change(function(){ + actionFilterSearch.val(''); + g_selectedAction_ActionOption = $(this).val(); + changeActionTab(type, data); + }); + + $('#actionFilterSelectBySkill').change(function(){ + actionFilterSearch.val(''); + g_selectedAction_SkillOption = $(this).val(); + changeActionTab(type, data); + }); + + $('#actionFilterSearch').change(function(){ + g_selectedAction_SearchText = $(this).val(); + changeActionTab(type, data); + }); + + + if(type != 'actionTabEncounter') { + $('#stateNumberOfActions').addClass('is-hidden'); + actionFilterSelectByAction.parent().addClass('is-hidden'); + } else { + $('#stateNumberOfActions').removeClass('is-hidden'); + actionFilterSelectByAction.parent().removeClass('is-hidden'); + } + + let featStructArray = null; + switch(type) { + case 'actionTabEncounter': featStructArray = cloneObj(data.EncounterFeatStructArray); break; + case 'actionTabExploration': featStructArray = cloneObj(data.ExplorationFeatStructArray); break; + case 'actionTabDowntime': featStructArray = cloneObj(data.DowntimeFeatStructArray); break; + default: break; + } + + filterActionArray(data, featStructArray, type); + +} + +function filterActionArray(data, featStructArray, tabType){ + + // Add class, acnestry, etc feats to featStructArray, if enabled + if(g_selectedAction_FeatsEnabled){ + for(const feat of g_featChoiceArray){ + if(feat.value == null) { continue; } + let featStruct = g_featMap.get(feat.value.id+""); + if(featStruct == null) { continue; } + + // Hardcoded Exploration and Downtime Tag IDs + let explorationTag = featStruct.Tags.find(tag => {return tag.id === 15;}); + let downtimeTag = featStruct.Tags.find(tag => {return tag.id === 218;}); + + if(tabType == 'actionTabExploration' && explorationTag != null){ + featStructArray.push(featStruct); + } else if(tabType == 'actionTabDowntime' && downtimeTag != null){ + featStructArray.push(featStruct); + } else if(tabType == 'actionTabEncounter' && feat.value.actions != 'NONE'){ + featStructArray.push(featStruct); + } + } + } + + // Convert featStructArray to actionStructArray + let actionStructArray = []; + for(const featStruct of featStructArray){ + if(featStruct.Feat.isArchived === 1){continue;} + + actionStructArray.push({ + name: featStruct.Feat.name, + actions: featStruct.Feat.actions, + Tags: featStruct.Tags, + + skillID: featStruct.Feat.skillID, + genericType: featStruct.Feat.genericType, + rarity: featStruct.Feat.rarity, + level: featStruct.Feat.level, + isCore: featStruct.Feat.isCore, + Feat: featStruct.Feat, + InvItem: null, + Item: null, + }); + + } + + // Add itemActionStructArray to actionStructArray + if(g_selectedAction_ItemsEnabled && tabType == 'actionTabEncounter'){ + let itemActionStructArray = findItemActionsFromInvItems(); + + for(let itemActionStruct of itemActionStructArray){ + + let free_action = itemActionStruct.Actions.free_action; + if(free_action != null){ + actionStructArray.push({ + name: itemActionStruct.Name, + actions: free_action.actions, + Tags: free_action.traits, + + skillID: null, + genericType: null, + rarity: null, + Feat: null, + InvItem: itemActionStruct.InvItem, + Item: itemActionStruct.Item, + }); + } + + let reaction = itemActionStruct.Actions.reaction; + if(reaction != null){ + actionStructArray.push({ + name: itemActionStruct.Name, + actions: reaction.actions, + Tags: reaction.traits, + + skillID: null, + genericType: null, + rarity: null, + Feat: null, + InvItem: itemActionStruct.InvItem, + Item: itemActionStruct.Item, + }); + } + + let one_action = itemActionStruct.Actions.one_action; + if(one_action != null){ + actionStructArray.push({ + name: itemActionStruct.Name, + actions: one_action.actions, + Tags: one_action.traits, + + skillID: null, + genericType: null, + rarity: null, + Feat: null, + InvItem: itemActionStruct.InvItem, + Item: itemActionStruct.Item, + }); + } + + let two_actions = itemActionStruct.Actions.two_actions; + if(two_actions != null){ + actionStructArray.push({ + name: itemActionStruct.Name, + actions: two_actions.actions, + Tags: two_actions.traits, + + skillID: null, + genericType: null, + rarity: null, + Feat: null, + InvItem: itemActionStruct.InvItem, + Item: itemActionStruct.Item, + }); + } + + let three_actions = itemActionStruct.Actions.three_actions; + if(three_actions != null){ + actionStructArray.push({ + name: itemActionStruct.Name, + actions: three_actions.actions, + Tags: three_actions.traits, + + skillID: null, + genericType: null, + rarity: null, + Feat: null, + InvItem: itemActionStruct.InvItem, + Item: itemActionStruct.Item, + }); + } + + } + + } + + // Sort actions by name + actionStructArray = actionStructArray.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + let actionCount = 0; + for(const actionStruct of actionStructArray){ + + let willDisplay = true; + + // Filter by Action + let actionFilterSelectByAction = $('#actionFilterSelectByAction'); + if(actionFilterSelectByAction.val() != "chooseDefault" && actionFilterSelectByAction.is(":visible")){ + if(actionFilterSelectByAction.val() == "OneAction"){ + if(actionStruct.actions != 'ACTION'){ + willDisplay = false; + } + } else if(actionFilterSelectByAction.val() == "OneAction"){ + if(actionStruct.actions != 'ACTION'){ + willDisplay = false; + } + } else if(actionFilterSelectByAction.val() == "TwoActions"){ + if(actionStruct.actions != 'TWO_ACTIONS'){ + willDisplay = false; + } + } else if(actionFilterSelectByAction.val() == "ThreeActions"){ + if(actionStruct.actions != 'THREE_ACTIONS'){ + willDisplay = false; + } + } else if(actionFilterSelectByAction.val() == "FreeAction"){ + if(actionStruct.actions != 'FREE_ACTION'){ + willDisplay = false; + } + } else if(actionFilterSelectByAction.val() == "Reaction"){ + if(actionStruct.actions != 'REACTION'){ + willDisplay = false; + } + } + } + + // Filter by Skill + let actionFilterSelectBySkill = $('#actionFilterSelectBySkill'); + if(actionFilterSelectBySkill.is(":visible")) { + let filterVal = actionFilterSelectBySkill.val(); + if(filterVal != "chooseDefault"){ + if(actionStruct.skillID != filterVal){ + willDisplay = false; + } + } else { + // Hide none-Core Exploration and Downtime activities unless a skill is picked + if(tabType == 'actionTabExploration' || tabType == 'actionTabDowntime'){ + if(actionStruct.isCore != null && !actionStruct.isCore){ + willDisplay = false; + } + } + } + } else { + // If skill selection is hidden, hide all skill actions + /* + if(actionStruct.skillID != null){ + willDisplay = false; + } + */ + if(!g_selectedAction_SkillsEnabled){ + // If it's skill related and isn't a skill feat + if(actionStruct.skillID != null && actionStruct.genericType != 'SKILL-FEAT'){ + willDisplay = false; + } + } + } + + // Filter by is Basic + if(actionStruct.genericType == 'BASIC-ACTION' && !g_selectedAction_BasicEnabled) { + willDisplay = false; + } + + let actionFilterSearch = $('#actionFilterSearch'); + if(actionFilterSearch.val() != ''){ + let actionSearchInput = actionFilterSearch.val().toLowerCase(); + let actionName = actionStruct.name.toLowerCase(); + if(!actionName.includes(actionSearchInput)){ + let nameOfTag = actionStruct.Tags.find(tag => { + return tag.name.toLowerCase().includes(actionSearchInput); + }); + if(nameOfTag == null){ + willDisplay = false; + } + } + } + + if(willDisplay){ + displayAction(actionStruct, actionCount, data.SkillMap); + } + + actionCount++; + } + +} + +function displayAction(actionStruct, actionCount, skillMap) { + + let actionID = 'actionLink-C'+actionCount; + + let actionNameInnerHTML = ''+actionStruct.name+''; + + let actionActionInnerHTML = ''; + switch(actionStruct.actions) { + case 'FREE_ACTION': actionActionInnerHTML += '
                      [free-action]
                      '; break; + case 'REACTION': actionActionInnerHTML += '
                      [reaction]
                      '; break; + case 'ACTION': actionActionInnerHTML += '
                      [one-action]
                      '; break; + case 'TWO_ACTIONS': actionActionInnerHTML += '
                      [two-actions]
                      '; break; + case 'THREE_ACTIONS': actionActionInnerHTML += '
                      [three-actions]
                      '; break; + default: break; + } + + let actionTagsInnerHTML = '
                      '; + switch(actionStruct.rarity) { + case 'UNCOMMON': actionTagsInnerHTML += ''; + break; + case 'RARE': actionTagsInnerHTML += ''; + break; + case 'UNIQUE': actionTagsInnerHTML += ''; + break; + default: break; + } + if(actionStruct.skillID != null){ + let skill = null; + for(const [skillName, skillData] of skillMap.entries()){ + if(skillData.Skill.id == actionStruct.skillID) { + skill = skillData.Skill; + break; + } + } + if(skill){ + actionTagsInnerHTML += ''; + } + } + + actionStruct.Tags = actionStruct.Tags.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + for(const tag of actionStruct.Tags){ + if(actionStruct.level == -1 && tag.name == 'General'){ continue; } + actionTagsInnerHTML += ''; + } + actionTagsInnerHTML += '
                      '; + + + $('#actionTabContent').append('
                      '+actionActionInnerHTML+'

                      '+actionNameInnerHTML+'

                      '+actionTagsInnerHTML+'

                      '); + + if(actionStruct.Feat != null){ + $('#'+actionID).click(function(){ + openQuickView('featView', { + Feat : actionStruct.Feat, + Tags : actionStruct.Tags + }); + }); + } else if(actionStruct.Item != null){ + $('#'+actionID).click(function(){ + openQuickView('invItemView', { + InvItem : actionStruct.InvItem, + Item : actionStruct.Item, + InvData : null, + ExtraData : {} + }); + }); + } + + $('#'+actionID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+actionID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/tabs/companions-tab.js b/client/vue-src/legacy-js/sheet/tabs/companions-tab.js new file mode 100644 index 00000000..1cf060e6 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/tabs/companions-tab.js @@ -0,0 +1,135 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openCompanionTab(data) { + + $('#tabContent').html('
                      '); + + + for(let charAnimalComp of g_companionData.AnimalCompanions){ + if(charAnimalComp == null) { continue; } + + let charAnimalCompEntryID = 'charAnimalComp'+charAnimalComp.id; + + let imageURL = charAnimalComp.imageURL; + if(imageURL.match(/\.(jpeg|jpg|gif|png|webp)$/) == null){ + imageURL = '/images/paw_icon.png'; + } + + initAnimalSpecializationArray(charAnimalComp); + let maxHP = getAnimalCompanionMaxHealth(charAnimalComp); + let currentHP = charAnimalComp.currentHP; + if(currentHP == -1){ currentHP = maxHP; } + + let bulmaTextColor = getBulmaTextColorFromCurrentHP(currentHP, maxHP); + + $('#companionsContent').append('

                      '+charAnimalComp.name+'

                      '+currentHP+' / '+maxHP+'

                      Animal Companion

                      '); + + $('#'+charAnimalCompEntryID).click(function(){ + openQuickView('animalCompanionView', { + CharAnimalComp: charAnimalComp + }); + }); + + $('#'+charAnimalCompEntryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+charAnimalCompEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + + for(let charFamiliar of g_companionData.Familiars){ + if(charFamiliar == null) { continue; } + + let charFamiliarEntryID = 'charFamiliar'+charFamiliar.id; + processFamiliarAbilities(charFamiliar); + + let imageURL = charFamiliar.imageURL; + if(imageURL.match(/\.(jpeg|jpg|gif|png|webp)$/) == null){ + imageURL = '/images/paw_icon.png'; + } + + let maxHP = getFamiliarMaxHealth(charFamiliar); + let currentHP = charFamiliar.currentHP; + if(currentHP == -1){ currentHP = maxHP; } + + let bulmaTextColor = getBulmaTextColorFromCurrentHP(currentHP, maxHP); + + $('#companionsContent').append('

                      '+charFamiliar.name+'

                      '+currentHP+' / '+maxHP+'

                      Familiar

                      '); + + $('#'+charFamiliarEntryID).click(function(){ + openQuickView('familiarView', { + CharFamiliar: charFamiliar + }); + }); + + $('#'+charFamiliarEntryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+charFamiliarEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + + + $('#companionsContent').append('
                      '); + + + + // Add Animal Companion // + $('#selectAnimalCompanion').append(''); + $('#selectAnimalCompanion').append(''); + + for(let animalComp of g_companionData.AllAnimalCompanions){ + $('#selectAnimalCompanion').append(''); + } + + $('#addAnimalCompanion').click(function() { + let animalCompID = $('#selectAnimalCompanion').val(); + if(animalCompID != "chooseDefault"){ + $(this).addClass('is-loading'); + socket.emit("requestAddAnimalCompanion", + getCharIDFromURL(), + animalCompID); + } + }); + + + // Add Familiar // + $('#selectFamiliar').append(''); + + for(let specificFamiliar of g_companionData.AllSpecificFamiliars) { + $('#selectFamiliar').append(''); + } + + $('#addFamiliar').click(function() { + let specificType = $('#selectFamiliar').val(); + $(this).addClass('is-loading'); + if(specificType == 'Familiar'){ + socket.emit("requestAddFamiliar", + getCharIDFromURL()); + } else { + let specificStruct = getFamiliarSpecificStruct(specificType); + if(specificStruct != null){ + socket.emit("requestAddSpecificFamiliar", + getCharIDFromURL(), + specificStruct); + } + } + }); + +} + +socket.on("returnAddAnimalCompanion", function(charAnimalComp){ + g_companionData.AnimalCompanions.push(charAnimalComp); + openCompanionTab(); +}); + +socket.on("returnAddFamiliar", function(charFamiliar){ + g_companionData.Familiars.push(charFamiliar); + openCompanionTab(); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/tabs/details-tab.js b/client/vue-src/legacy-js/sheet/tabs/details-tab.js new file mode 100644 index 00000000..1c29af6c --- /dev/null +++ b/client/vue-src/legacy-js/sheet/tabs/details-tab.js @@ -0,0 +1,593 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openDetailsTab(data){ + + $('#tabContent').append(''); + + $('#tabContent').append('
                      '); + + $('#detailsTabFeats').click(function(){ + changeDetailsTab('detailsTabFeats', data); + }); + + $('#detailsTabAbilities').click(function(){ + changeDetailsTab('detailsTabAbilities', data); + }); + + $('#detailsTabDescription').click(function(){ + changeDetailsTab('detailsTabDescription', data); + }); + + $('#'+g_selectedDetailsSubTabID).click(); + +} + +// Details Tabs // +function changeDetailsTab(type, data){ + if(!g_selectedSubTabLock) {g_selectedSubTabID = type;} + g_selectedDetailsSubTabID = type; + + $('#detailsTabContent').html(''); + + $('#detailsTabFeats').parent().removeClass("is-active"); + $('#detailsTabAbilities').parent().removeClass("is-active"); + $('#detailsTabDescription').parent().removeClass("is-active"); + + $('#'+type).parent().addClass("is-active"); + + switch(type) { + case 'detailsTabFeats': displayFeatsSection(data); break; + case 'detailsTabAbilities': displayAbilitiesSection(data); break; + case 'detailsTabDescription': displayDescriptionSection(data); break; + default: break; + } + +} + + +function displayFeatsSection(data) { + + $('#detailsTabContent').append('

                      '); + + $('#featsFilterByType').val(g_selectedDetailsOptionValue); + displayFeatContent(data); + +} + +function displayFeatContent(data){ + + $('#featsFilterByType').off('change'); + $('#featsSearch').off('change'); + + $('#featsContent').html(''); + + let featsFilterByType = $('#featsFilterByType'); + if(featsFilterByType.val() == "All"){ + featsFilterByType.parent().removeClass('is-info'); + } else { + featsFilterByType.parent().addClass('is-info'); + } + featsFilterByType.blur(); + + let featsSearch = $('#featsSearch'); + let featsSearchValue = (featsSearch.val() === "") ? null : featsSearch.val(); + if(featsSearchValue == null){ + featsSearch.removeClass('is-info'); + } else { + featsSearch.addClass('is-info'); + } + + $('#featsFilterByType').change(function(){ + g_selectedDetailsOptionValue = $(this).val(); + displayFeatContent(data); + }); + + $('#featsSearch').change(function(){ + displayFeatContent(data); + }); + + let selectedFeatFilter = $('#featsFilterByType').val(); + if(selectedFeatFilter === "All"){ + displayClassFeats(data, featsSearchValue, false); + displayAncestryFeats(data, featsSearchValue, false); + displaySkillFeats(data, featsSearchValue, false); + displayOtherFeats(data, featsSearchValue, false); + } else if(selectedFeatFilter === "Class"){ + displayClassFeats(data, featsSearchValue); + } else if(selectedFeatFilter === "Ancestry"){ + displayAncestryFeats(data, featsSearchValue); + } else if(selectedFeatFilter === "Skill"){ + displaySkillFeats(data, featsSearchValue); + } else if(selectedFeatFilter === "Other"){ + displayOtherFeats(data, featsSearchValue); + } + +} + +function displayClassFeats(data, featsSearchValue, displayIfNoResults=true){ + $('#featsContent').append('

                      Class

                      '); + $('#featsContent').append('
                      '); + let displayedFeat = featDisplayByType(data, [data.ClassDetails.Class.name], featsSearchValue); + + if(!displayIfNoResults && !displayedFeat){ + $('#featsContent-classFeats').addClass('is-hidden'); + $('#featsContent-classFeats-hr').addClass('is-hidden'); + } + +} + +function displayAncestryFeats(data, featsSearchValue, displayIfNoResults=true){ + $('#featsContent').append('

                      Ancestry

                      '); + $('#featsContent').append('
                      '); + let displayedFeat = featDisplayByType(data, cloneObj(g_charTagsArray), featsSearchValue); + + if(!displayIfNoResults && !displayedFeat){ + $('#featsContent-ancestryFeats').addClass('is-hidden'); + $('#featsContent-ancestryFeats-hr').addClass('is-hidden'); + } + +} + +function displaySkillFeats(data, featsSearchValue, displayIfNoResults=true){ + $('#featsContent').append('

                      Skill

                      '); + $('#featsContent').append('
                      '); + let displayedFeat = featDisplayByType(data, ['Skill'], featsSearchValue); + + if(!displayIfNoResults && !displayedFeat){ + $('#featsContent-skillFeats').addClass('is-hidden'); + $('#featsContent-skillFeats-hr').addClass('is-hidden'); + } + +} + +function displayOtherFeats(data, featsSearchValue, displayIfNoResults=true){ + $('#featsContent').append('

                      Other

                      '); + $('#featsContent').append('
                      '); + let displayedFeat = featDisplayByType(data, null, featsSearchValue); + + if(!displayIfNoResults && !displayedFeat){ + $('#featsContent-otherFeats').addClass('is-hidden'); + $('#featsContent-otherFeats-hr').addClass('is-hidden'); + } + +} + +function featDisplayByType(data, sortingTagNameArray, featsSearchValue){ + + let displayedFeat = false; + let featCount = 0; + for(const feat of data.FeatChoiceArray){ + if(feat.value == null) { continue; } + let featData = data.FeatMap.get(feat.value.id+""); + if(featData == null) { continue; } + if(isFeatConcealed(feat.value.name)){ continue; } + let featTags = featData.Tags; + let didDisplay = false; + if(sortingTagNameArray == null){ + // Is Other, display if feat is NOT ancestry, class, or skill + let sortingTagNameArray = cloneObj(g_charTagsArray); + sortingTagNameArray.push(data.ClassDetails.Class.name); + sortingTagNameArray.push('Skill'); + let tag = featTags.find(tag => { + return sortingTagNameArray.includes(tag.name); + }); + if(tag == null){ + didDisplay = filterFeatsThroughSearch(feat, featTags, featCount, featsSearchValue); + } + } else { + let tag = featTags.find(tag => { + return sortingTagNameArray.includes(tag.name); + }); + if(tag != null){ + didDisplay = filterFeatsThroughSearch(feat, featTags, featCount, featsSearchValue); + } + } + if(didDisplay){ + displayedFeat = true; + } + featCount++; + } + + return displayedFeat; + +} + +function filterFeatsThroughSearch(featData, featTags, featCount, featsSearchValue){ + + let willDisplay = false; + if(featsSearchValue != null){ + let featName = featData.value.name.toLowerCase(); + if(!featName.includes(featsSearchValue)){ + willDisplay = false; + } else { + willDisplay = true; + } + } else { + willDisplay = true; + } + + if(willDisplay) { + displayFeat(featData, featTags, featCount); + } + + return willDisplay; + +} + +function displayFeat(featData, featTags, featCount){ + + let feat = featData.value; + let featID = 'featDetailsEntry'+feat.id+"C"+featCount; + + let featNameInnerHTML = ''; + if(feat.level > 9){ + featNameInnerHTML += ''+feat.level+' - '; + } else if(feat.level > 0){ + featNameInnerHTML += ''+feat.level+' - '; + } else { + featNameInnerHTML += ''; + } + + featNameInnerHTML += ''+feat.name+''; + + switch(feat.actions) { + case 'FREE_ACTION': featNameInnerHTML += '[free-action]'; break; + case 'REACTION': featNameInnerHTML += '[reaction]'; break; + case 'ACTION': featNameInnerHTML += '[one-action]'; break; + case 'TWO_ACTIONS': featNameInnerHTML += '[two-actions]'; break; + case 'THREE_ACTIONS': featNameInnerHTML += '[three-actions]'; break; + default: break; + } + + if(feat.isArchived === 1){ + featNameInnerHTML += '(archived)'; + } + + let featTagsInnerHTML = '
                      '; + switch(feat.rarity) { + case 'UNCOMMON': featTagsInnerHTML += ''; + break; + case 'RARE': featTagsInnerHTML += ''; + break; + case 'UNIQUE': featTagsInnerHTML += ''; + break; + default: break; + } + + if(feat.skillID != null){ + let skill = null; + for(const [skillName, skillData] of g_skillMap.entries()){ + if(skillData.Skill.id == feat.skillID) { + skill = skillData.Skill; + break; + } + } + featTagsInnerHTML += ''; + } + + for(const tag of featTags){ + if(feat.level == -1 && tag.name == 'General'){ continue; } + featTagsInnerHTML += ''; + } + featTagsInnerHTML += '
                      '; + + $('#featsContent').append('

                      '+featNameInnerHTML+'

                      '+featTagsInnerHTML+'

                      '); + + $('#'+featID).click(function(){ + openQuickView('featView', { + Feat : feat, + Tags : featTags, + SrcStruct : featData, + }); + }); + + $('#'+featID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+featID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + +} + + + + + +function displayAbilitiesSection(data) { + + $('#detailsTabContent').append('

                      '); + + if(g_selectedDetailsOptionValue === 'Skill'){ + $('#abilitiesFilterByType').val('All'); + } else { + $('#abilitiesFilterByType').val(g_selectedDetailsOptionValue); + } + displayAbilitiesContent(data); + +} + +function displayAbilitiesContent(data){ + + $('#abilitiesFilterByType').off('change'); + $('#abilitiesSearch').off('change'); + + $('#abilitiesContent').html(''); + + let abilitiesFilterByType = $('#abilitiesFilterByType'); + if(abilitiesFilterByType.val() == "All"){ + abilitiesFilterByType.parent().removeClass('is-info'); + } else { + abilitiesFilterByType.parent().addClass('is-info'); + } + abilitiesFilterByType.blur(); + + let abilitiesSearch = $('#abilitiesSearch'); + let abilitiesSearchValue = (abilitiesSearch.val() === "") ? null : abilitiesSearch.val(); + if(abilitiesSearchValue == null){ + abilitiesSearch.removeClass('is-info'); + } else { + abilitiesSearch.addClass('is-info'); + } + + $('#abilitiesFilterByType').change(function(){ + g_selectedDetailsOptionValue = $(this).val(); + displayAbilitiesContent(data); + }); + + $('#abilitiesSearch').change(function(){ + displayAbilitiesContent(data); + }); + + let selectedAbilityFilter = $('#abilitiesFilterByType').val(); + if(selectedAbilityFilter === "All"){ + displayClassAbilities(data, abilitiesSearchValue, false); + displayAncestryAbilities(data, abilitiesSearchValue, false); + displayOtherAbilities(data, abilitiesSearchValue, false); + } else if(selectedAbilityFilter === "Class"){ + displayClassAbilities(data, abilitiesSearchValue); + } else if(selectedAbilityFilter === "Ancestry"){ + displayAncestryAbilities(data, abilitiesSearchValue); + } else if(selectedAbilityFilter === "Other"){ + displayOtherAbilities(data, abilitiesSearchValue); + } + +} + +function displayClassAbilities(data, abilitiesSearchValue, displayIfNoResults=true){ + $('#abilitiesContent').append('

                      Class

                      '); + $('#abilitiesContent').append('
                      '); + + let displayedAbility = false; + let abilCount = 0; + if(g_classArchetype != null){ + let archetypeAbil = { + name: g_classArchetype.name, + description: g_classArchetype.replacementCode.initial.archetypeText, + level: 0, + }; + let didDisplay = filterAbilitiesThroughSearch(archetypeAbil, 'Class'+abilCount, abilitiesSearchValue); + if(didDisplay){ + displayedAbility = true; + } + abilCount++; + } + + for(let classAbil of data.ClassDetails.Abilities){ + if(classAbil.displayInSheet === 0 || classAbil.selectType == 'SELECT_OPTION' || classAbil.level > g_character.level || classAbil.level == -1){ continue; } + let didDisplay = filterAbilitiesThroughSearch(classAbil, 'Class'+abilCount, abilitiesSearchValue); + if(didDisplay){ + displayedAbility = true; + } + abilCount++; + } + + if(!displayIfNoResults && !displayedAbility){ + $('#abilitiesContent-classAbilities').addClass('is-hidden'); + $('#abilitiesContent-classAbilities-hr').addClass('is-hidden'); + } + +} + +function displayAncestryAbilities(data, abilitiesSearchValue, displayIfNoResults=true){ + $('#abilitiesContent').append('

                      Ancestry

                      '); + $('#abilitiesContent').append('
                      '); + + let displayedAbility = false; + let abilCount = 0; + for(let phyFeat of data.PhyFeats){ + if(phyFeat.sourceType != 'ancestry'){ continue; } + if(phyFeat.value == null) { continue; } + let phyFeatAbil = { + name: phyFeat.value.name, + description: phyFeat.value.description, + level: 1, + }; + let didDisplay = filterAbilitiesThroughSearch(phyFeatAbil, 'AncestryPhyFeat'+abilCount, abilitiesSearchValue); + if(didDisplay){ + displayedAbility = true; + } + abilCount++; + } + + if(!displayIfNoResults && !displayedAbility){ + $('#abilitiesContent-ancestryAbilities').addClass('is-hidden'); + $('#abilitiesContent-ancestryAbilities-hr').addClass('is-hidden'); + } + +} + +function displayOtherAbilities(data, abilitiesSearchValue, displayIfNoResults=true){ + $('#abilitiesContent').append('

                      Other

                      '); + $('#abilitiesContent').append('
                      '); + + let displayedAbility = false; + let abilCount = 0; + for(let extraClassAbil of g_extraClassAbilities){ + let srcStruct = cloneObj(extraClassAbil); srcStruct.value = null; + extraClassAbil.value.srcStruct = srcStruct; + let didDisplay = filterAbilitiesThroughSearch(extraClassAbil.value, 'ExtraClass'+abilCount, abilitiesSearchValue); + if(didDisplay){ + displayedAbility = true; + } + abilCount++; + } + for(let heritageEffect of g_heritageEffects){ + let ability = cloneObj(heritageEffect.value); + ability.level = heritageEffect.sourceLevel; + ability.name = 'Heritage Benefits - '+ability.name; + let didDisplay = filterAbilitiesThroughSearch(ability, 'ExtraClass'+abilCount, abilitiesSearchValue); + if(didDisplay){ + displayedAbility = true; + } + abilCount++; + } + + if(!displayIfNoResults && !displayedAbility){ + $('#abilitiesContent-otherAbilities').addClass('is-hidden'); + $('#abilitiesContent-otherAbilities-hr').addClass('is-hidden'); + } + +} + +function filterAbilitiesThroughSearch(ability, abilIdentifier, abilitiesSearchValue){ + + let willDisplay = false; + if(abilitiesSearchValue != null){ + let abilityName = ability.name.toLowerCase(); + if(!abilityName.includes(abilitiesSearchValue)){ + willDisplay = false; + } else { + willDisplay = true; + } + } else { + willDisplay = true; + } + + if(willDisplay) { + displayAbility(ability, abilIdentifier); + } + + return willDisplay; + +} + +function displayAbility(ability, abilIdentifier){ + + let abilityID = 'abilityDetailsEntry'+abilIdentifier; + + let abilityName = ability.name; + if(ability.selectType == "SELECTOR"){ + for(let classAbilChoice of g_classDetails.AbilityChoices){ + if(classAbilChoice.SelectorID == ability.id){ + + // If has srcStruct (is extra class feature), confirm it's the correct one + if(ability.srcStruct != null){ + if(!hasSameSrc(ability.srcStruct, classAbilChoice)){ continue; } + } + + // Find ability option + let abilityOption = g_allClassAbilityOptions.find(abil => { + return abil.id == classAbilChoice.OptionID; + }); + if(abilityOption != null){ abilityName += ' - '+abilityOption.name+''; } + break; + } + } + } + + let abilityNameInnerHTML = ''+abilityName+''; + let abilityLevelInnerHTML = (ability.level == 0 || ability.level == null) ? '' : 'Level '+ability.level+''; + + $('#abilitiesContent').append('

                      '+abilityNameInnerHTML+'

                      '+abilityLevelInnerHTML+'

                      '); + + $('#'+abilityID).click(function(){ + openQuickView('abilityView', { + Ability : ability + }); + }); + + $('#'+abilityID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+abilityID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + +} + + + + +function displayDescriptionSection(data){ + $('#detailsTabContent').append('
                      '); + + $('#descriptionContent').append('

                      Background - '+data.Background.name+'

                      '); + $('#descriptionContent').append('
                      '); + + $('#descriptionContent').append('
                      '+processText(data.Background.description, true, true, 'SMALL')+'
                      '); + + // Add Text Statements + processAddText(data.Background.code, 'descriptionContent'); + + // Note Field Statements + let srcStructBackground = { // Hardcoded - same srcStruct as in char-builder-3.js + sourceType: 'background', + sourceLevel: 1, + sourceCode: 'background', + sourceCodeSNum: 'a', + }; + displayNotesField($('#descriptionContent'), srcStructBackground, 2); + + if(data.Heritage != null){ + + $('#descriptionContent').append('

                      Heritage - '+data.Heritage.name+'

                      '); + $('#descriptionContent').append('
                      '); + + $('#descriptionContent').append('
                      '+processText(data.Heritage.description, true, true, 'SMALL')+'
                      '); + + // Add Text Statements + processAddText(data.Heritage.code, 'descriptionContent'); + + // Note Field Statements + let srcStructHeritage = { // Hardcoded - same srcStruct as in char-builder-2.js + sourceType: 'ancestry', + sourceLevel: 1, + sourceCode: 'heritage', + sourceCodeSNum: 'a', + }; + displayNotesField($('#descriptionContent'), srcStructHeritage, 2); + + } + + $('#descriptionContent').append('

                      Other Information

                      '); + $('#descriptionContent').append('
                      '); + + let charHistoryAreaID = "charHistoryArea"; + let charHistoryAreaControlShellID = "charHistoryAreaControlShell"; + + $('#descriptionContent').append('
                      '); + + $("#"+charHistoryAreaID).val(data.Character.details); + + $("#"+charHistoryAreaID).blur(function(){ + if(data.Character.details != $(this).val()) { + + $("#"+charHistoryAreaControlShellID).addClass("is-loading"); + + socket.emit("requestDetailsSave", + getCharIDFromURL(), + $(this).val()); + + data.Character.details = $(this).val(); + + } + }); + +} + +socket.on("returnDetailsSave", function(){ + $("#charHistoryAreaControlShell").removeClass("is-loading"); +}); diff --git a/client/vue-src/legacy-js/sheet/tabs/inventory-tab.js b/client/vue-src/legacy-js/sheet/tabs/inventory-tab.js new file mode 100644 index 00000000..f9588831 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/tabs/inventory-tab.js @@ -0,0 +1,688 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openInventoryTab(data){ + + $('#tabContent').append('

                      Total Bulk

                      '+g_bulkAndCoinsStruct.TotalBulk+' / '+g_bulkAndCoinsStruct.WeightEncumbered+'

                      (Limit '+g_bulkAndCoinsStruct.WeightMax+')

                      Total Coins

                      '+g_bulkAndCoinsStruct.PlatinumCoins+'

                      '+g_bulkAndCoinsStruct.GoldCoins+'

                      '+g_bulkAndCoinsStruct.SilverCoins+'

                      '+g_bulkAndCoinsStruct.CopperCoins+'

                      '); + + $('#tabContent').append(` +
                      +
                      +

                      +
                      +
                      + Add Items +
                      +
                      +
                      +
                      +
                      +

                      Name

                      +
                      +
                      +

                      Qty

                      +
                      +
                      +

                      Bulk

                      +
                      +
                      +

                      Health

                      +
                      +
                      +

                      Tags

                      +
                      +
                      +
                      +
                      +
                      + `); + + if(g_bulkAndCoinsStruct.CantMove) { + $('#bulkTotal').addClass('has-text-black'); + $('#bulkTotal').addClass('has-text-weight-bold'); + $('#bulkTotal').addClass('has-background-danger'); + $('#bulkMax').addClass('has-text-black'); + $('#bulkMax').addClass('has-text-weight-bold'); + $('#bulkMax').addClass('has-background-danger'); + } else if(g_bulkAndCoinsStruct.IsEncumbered){ + $('#bulkTotal').addClass('has-text-danger'); + $('#bulkTotal').addClass('has-text-weight-bold'); + } + + let foundCoins = false; + if(g_bulkAndCoinsStruct.CopperCoins > 0){ + foundCoins = true; + $('#coinsCopperSection').removeClass('is-hidden'); + } else { + $('#coinsCopperSection').addClass('is-hidden'); + } + if(g_bulkAndCoinsStruct.SilverCoins > 0){ + foundCoins = true; + $('#coinsSilverSection').removeClass('is-hidden'); + } else { + $('#coinsSilverSection').addClass('is-hidden'); + } + if(g_bulkAndCoinsStruct.GoldCoins > 0){ + foundCoins = true; + $('#coinsGoldSection').removeClass('is-hidden'); + } else { + $('#coinsGoldSection').addClass('is-hidden'); + } + if(g_bulkAndCoinsStruct.PlatinumCoins > 0){ + foundCoins = true; + $('#coinsPlatinumSection').removeClass('is-hidden'); + } else { + $('#coinsPlatinumSection').addClass('is-hidden'); + } + + if(!foundCoins){ + $('#coinsMessage').append(' None'); + } + + displayInventorySection(data); + + $("#inventoryContent").scrollTop(g_inventoryTabScroll); + + $('#invAddItems').click(function(){ + openQuickView('addItemView', { + ItemMap : g_itemMap, + InvID : g_invStruct.Inventory.id, + Data : data + }); + }); + +} + + + + + + + + +// Inventory // + +function displayInventorySection(data){ + + $('#inventorySearch').off('change'); + + let openBagItemArray = []; + for(const invItem of g_invStruct.InvItems){ + const item = g_itemMap.get(invItem.itemID+""); + if(item != null){ + if(item.StorageData != null && invItem.bagInvItemID == null){ + openBagItemArray.push({InvItem: invItem, Item: item}); + } + } + } + + let inventorySearch = $('#inventorySearch'); + let invSearchInput = null; + if(inventorySearch.val() != ''){ + invSearchInput = inventorySearch.val().toLowerCase(); + inventorySearch.addClass('is-info'); + } else { + inventorySearch.removeClass('is-info'); + } + + $('#inventorySearch').change(function(){ + displayInventorySection(data); + }); + + $('#inventoryContent').html(''); + + let itemDisplayed = false; + for(const invItem of g_invStruct.InvItems){ + const item = g_itemMap.get(invItem.itemID+""); + if(item == null) { continue; } + + let willDisplay = true; + if(invItem.bagInvItemID != null){ + willDisplay = false; + } + + if(isUnarmedAttack(item) || item.Item.id == IMPROVISED_ITEM_ID){ + willDisplay = false; + } + + if(invSearchInput == 'weapons'){ + let item = g_itemMap.get(invItem.itemID+""); + if(item != null && item.Item.itemType == 'WEAPON'){ + willDisplay = true; + } else { + willDisplay = false; + } + + } else if(invSearchInput == 'armor'){ + let item = g_itemMap.get(invItem.itemID+""); + if(item != null && item.Item.itemType == 'ARMOR'){ + willDisplay = true; + } else { + willDisplay = false; + } + + } else if(invSearchInput == 'coins' || invSearchInput == 'money' || invSearchInput == 'currency'){ + let item = g_itemMap.get(invItem.itemID+""); + if(item != null && item.Item.itemType == 'CURRENCY'){ + willDisplay = true; + } else { + willDisplay = false; + } + + } else { + + if(invSearchInput != null){ + let itemName = invItem.name.toLowerCase(); + if(!itemName.includes(invSearchInput)){ + willDisplay = false; + } else { + willDisplay = true; + } + } + + } + + if(willDisplay) { + itemDisplayed = true; + displayInventoryItem(invItem, item, openBagItemArray, data); + } + + } + + handleArmorEquip(g_invStruct.Inventory.id); + handleShieldEquip(g_invStruct.Inventory.id); + + if(!itemDisplayed){ + // Empty Inventory + } + +} + +function displayInventoryItem(invItem, item, openBagItemArray, data) { + + let itemTagArray = getItemTraitsArray(item, invItem); + + let itemIsStorage = (g_bulkAndCoinsStruct.BagBulkMap.get(invItem.id) != null); + let itemIsStorageAndEmpty = false; + let itemStorageBulkAmt = null; + + let invItemSectionID = 'invItemSection'+invItem.id; + let invItemNameID = 'invItemName'+invItem.id; + let invItemQtyID = 'invItemQty'+invItem.id; + let invItemBulkID = 'invItemBulk'+invItem.id; + let invItemHealthID = 'invItemHealth'+invItem.id; + let invItemShoddyTagID = 'invItemShoddyTag'+invItem.id; + let invItemBrokenTagID = 'invItemBrokenTag'+invItem.id; + let invItemInvestedTagID = 'invItemInvestedTag'+invItem.id; + let invItemNotInvestedTagID = 'invItemNotInvestedTag'+invItem.id; + + // Halve maxHP if it's shoddy + let maxHP = (invItem.isShoddy == 1) ? Math.floor(invItem.hitPoints/2) : invItem.hitPoints; + + // Halve brokenThreshold if it's shoddy + let brokenThreshold = (invItem.isShoddy == 1) ? Math.floor(invItem.brokenThreshold/2) : invItem.brokenThreshold; + + // Reduce currentHP if it's over maxHP + invItem.currentHitPoints = (invItem.currentHitPoints > maxHP) ? maxHP : invItem.currentHitPoints; + + if(itemIsStorage) { + + let invItemStorageViewButtonID = 'invItemStorageViewButton'+invItem.id; + let invItemStorageSectionID = 'invItemStorageSection'+invItem.id; + let invItemStorageBulkAmountID = 'invItemStorageBulkAmount'+invItem.id; + + $('#inventoryContent').append(` +
                      +
                      +

                      + Open +

                      +
                      +
                      +

                      +
                      +
                      +

                      +
                      +
                      +

                      +
                      +
                      +
                      + Shoddy + Broken + Invested + Not Invested +
                      +
                      +
                      + `); + + $('#inventoryContent').append(''); + + let bulkIgnored = (item.StorageData != null) ? item.StorageData.bulkIgnored : 0; + let bagBulk = g_bulkAndCoinsStruct.BagBulkMap.get(invItem.id); + if(bagBulk == null) { + bagBulk = 0; + } else { + bagBulk += bulkIgnored; + } + let maxBagBulk = invItem.itemStorageMaxBulk; + if(maxBagBulk == null){ + maxBagBulk = (item.StorageData != null) ? item.StorageData.maxBulkStorage : -1; + } + let bulkIgnoredMessage = ""; + if(bulkIgnored != 0.0){ + if(bulkIgnored == maxBagBulk){ + bulkIgnoredMessage = "Items don’t count towards your Total Bulk."; + } else { + bulkIgnoredMessage = "The first "+bulkIgnored+" Bulk of items don’t count towards your Total Bulk."; + } + } + let roundedBagBulk = round(bagBulk, 2); + itemStorageBulkAmt = round(bagBulk-bulkIgnored, 2); + if(maxBagBulk >= 0){ + $('#'+invItemStorageSectionID).append('

                      Bulk '+roundedBagBulk+' / '+maxBagBulk+'

                      '+bulkIgnoredMessage+'

                      '); + } + + let isOverBulk = false; + if(maxBagBulk == 0) { + isOverBulk = roundedBagBulk > maxBagBulk; + } else { + isOverBulk = bagBulk > maxBagBulk; + } + + if(!gOption_hasIgnoreBulk && isOverBulk){ + $('#'+invItemStorageBulkAmountID).removeClass('has-txt-noted'); + $('#'+invItemStorageBulkAmountID).addClass('has-text-danger'); + $('#'+invItemStorageBulkAmountID).addClass('has-text-weight-bold'); + } + + let foundBaggedItem = false; + for(const baggedInvItem of g_invStruct.InvItems){ + if(baggedInvItem.bagInvItemID == invItem.id){ + + let baggedItem = g_itemMap.get(baggedInvItem.itemID+""); + if(baggedItem == null) { + continue; + } else { + foundBaggedItem = true; + } + + let baggedItemTagArray = getItemTraitsArray(baggedItem, baggedInvItem); + + let baggedItemIsStorage = (g_bulkAndCoinsStruct.BagBulkMap.get(baggedInvItem.id) != null); + + let baggedInvItemSectionID = 'baggedInvItemSection'+baggedInvItem.id; + let baggedInvItemIndentID = 'baggedInvItemIndent'+baggedInvItem.id; + let baggedInvItemNameID = 'baggedInvItemName'+baggedInvItem.id; + let baggedInvItemQtyID = 'baggedInvItemQty'+baggedInvItem.id; + let baggedInvItemBulkID = 'baggedInvItemBulk'+baggedInvItem.id; + let baggedInvItemHealthID = 'baggedInvItemHealth'+baggedInvItem.id; + let baggedInvItemShoddyTagID = 'baggedInvItemShoddyTag'+baggedInvItem.id; + let baggedInvItemBrokenTagID = 'baggedInvItemBrokenTag'+baggedInvItem.id; + let baggedInvItemInvestedTagID = 'baggedInvItemInvestedTag'+baggedInvItem.id; + let baggedInvItemNotInvestedTagID = 'baggedInvItemNotInvestedTag'+baggedInvItem.id; + + + // Halve maxHP if it's shoddy + let baggedInvItemMaxHP = (baggedInvItem.isShoddy == 1) ? Math.floor(baggedInvItem.hitPoints/2) : baggedInvItem.hitPoints; + + // Halve brokenThreshold if it's shoddy + let baggedInvItemBrokenThreshold = (baggedInvItem.isShoddy == 1) ? Math.floor(baggedInvItem.brokenThreshold/2) : baggedInvItem.brokenThreshold; + + // Reduce currentHP if it's over maxHP + baggedInvItem.currentHitPoints = (baggedInvItem.currentHitPoints > baggedInvItemMaxHP) ? baggedInvItemMaxHP : baggedInvItem.currentHitPoints; + + $('#'+invItemStorageSectionID).append(` +
                      +
                      +
                      +

                      +
                      +
                      +

                      +
                      +
                      +

                      +
                      +
                      +

                      +
                      +
                      +
                      + Shoddy + Broken + Invested + Not Invested +
                      +
                      +
                      + `); + + $('#'+baggedInvItemNameID).html(getItemIcon(baggedItem, baggedInvItem)+baggedInvItem.name); + + if(baggedItem.WeaponData != null){ + let calcStruct = getAttackAndDamage(baggedItem, baggedInvItem); + + let attackHasConditionals = (calcStruct.WeapStruct.attack.conditionals != null && calcStruct.WeapStruct.attack.conditionals.size != 0); + let damageHasConditionals = ((calcStruct.WeapStruct.damage.conditionals != null && calcStruct.WeapStruct.damage.conditionals.size != 0) || calcStruct.WeapStruct.damage.modifications.on_hit_other.length != 0); + + let weapDamageMod = ''; + for(const onHitDmgMod of calcStruct.WeapStruct.damage.modifications.on_hit_damage){ + let modification = onHitDmgMod.mod; + if(modification.startsWith('-')){ + modification = modification.slice(1); + weapDamageMod += ` - ${modification}`; + } else { + weapDamageMod += ` + ${modification}`; + } + } + + $('#'+baggedInvItemNameID).append(''+calcStruct.AttackBonus+((attackHasConditionals) ? '*' : '')+''+calcStruct.Damage+weapDamageMod+((damageHasConditionals) ? '*' : '')+''); + } + + if(baggedItem.Item.hasQuantity == 1){ + $('#'+baggedInvItemQtyID).html(baggedInvItem.quantity); + } else { + $('#'+baggedInvItemQtyID).html('-'); + } + + let bulk = determineItemBulk(g_charSize, baggedInvItem.size, baggedInvItem.bulk); + bulk = getWornArmorBulkAdjustment(baggedInvItem, bulk); + bulk = getBulkFromNumber(bulk); + $('#'+baggedInvItemBulkID).html(bulk); + + if(baggedInvItem.currentHitPoints == baggedInvItemMaxHP) { + $('#'+baggedInvItemHealthID).html('-'); + } else { + $('#'+baggedInvItemHealthID).html(baggedInvItem.currentHitPoints+'/'+baggedInvItemMaxHP); + } + + if(baggedInvItem.isShoddy == 0){ + $('#'+baggedInvItemShoddyTagID).addClass('is-hidden'); + } else { + $('#'+baggedInvItemShoddyTagID).removeClass('is-hidden'); + } + + let notBroken = (baggedInvItem.currentHitPoints > baggedInvItemBrokenThreshold); + if(doesntHaveItemHealth(baggedInvItem)) {notBroken = true;} + if(notBroken){ + $('#'+baggedInvItemBrokenTagID).addClass('is-hidden'); + } else { + $('#'+baggedInvItemBrokenTagID).removeClass('is-hidden'); + } + + let investTag = baggedItemTagArray.find(tag => { + return tag.id === 235; // Hardcoded Invested Tag ID + }); + if(investTag != null){ + if(baggedInvItem.isInvested == 1){ + $('#'+baggedInvItemInvestedTagID).removeClass('is-hidden'); + $('#'+baggedInvItemNotInvestedTagID).addClass('is-hidden'); + } else { + $('#'+baggedInvItemInvestedTagID).addClass('is-hidden'); + $('#'+baggedInvItemNotInvestedTagID).removeClass('is-hidden'); + } + } else { + $('#'+baggedInvItemInvestedTagID).addClass('is-hidden'); + $('#'+baggedInvItemNotInvestedTagID).addClass('is-hidden'); + } + + $('#'+baggedInvItemSectionID).click(function(){ + openQuickView('invItemView', { + InvItem : baggedInvItem, + Item : baggedItem, + InvData : { + OpenBagItemArray : openBagItemArray, + ItemIsStorage : baggedItemIsStorage, + ItemIsStorageAndEmpty : true + }, + ExtraData : {} + }); + }); + + $('#'+baggedInvItemSectionID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+baggedInvItemSectionID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + } + + if(!foundBaggedItem){ + $('#'+invItemStorageSectionID).append('

                      Empty

                      '); + itemIsStorageAndEmpty = true; + } + + $('#'+invItemStorageViewButtonID).click(function(event){ + event.stopImmediatePropagation(); + if($('#'+invItemStorageSectionID).is(":visible")){ + $('#'+invItemStorageSectionID).addClass('is-hidden'); + $('#'+invItemStorageViewButtonID).html('Open'); + $('#'+invItemStorageViewButtonID).removeClass('has-text-white'); + $('#'+invItemStorageViewButtonID).addClass('is-outlined'); + + g_openBagsSet.delete(invItem.id); + } else { + $('#'+invItemStorageSectionID).removeClass('is-hidden'); + $('#'+invItemStorageViewButtonID).html('Close'); + $('#'+invItemStorageViewButtonID).addClass('has-text-white'); + $('#'+invItemStorageViewButtonID).removeClass('is-outlined'); + + g_openBagsSet.add(invItem.id); + } + }); + + if(g_openBagsSet.has(invItem.id)){ + $('#'+invItemStorageViewButtonID).click(); + } + + } else { + $('#inventoryContent').append(` +
                      +
                      +

                      +
                      +
                      +

                      +
                      +
                      +

                      +
                      +
                      +

                      +
                      +
                      +
                      + Shoddy + Broken + Invested + Not Invested +
                      +
                      +
                      + `); + } + + + + $('#'+invItemNameID).prepend(getItemIcon(item, invItem)+invItem.name); + + if(item.WeaponData != null){ + let calcStruct = getAttackAndDamage(item, invItem); + + let attackHasConditionals = (calcStruct.WeapStruct.attack.conditionals != null && calcStruct.WeapStruct.attack.conditionals.size != 0); + let damageHasConditionals = ((calcStruct.WeapStruct.damage.conditionals != null && calcStruct.WeapStruct.damage.conditionals.size != 0) || calcStruct.WeapStruct.damage.modifications.on_hit_other.length != 0); + + let weapDamageMod = ''; + for(const onHitDmgMod of calcStruct.WeapStruct.damage.modifications.on_hit_damage){ + let modification = onHitDmgMod.mod; + if(modification.startsWith('-')){ + modification = modification.slice(1); + weapDamageMod += ` - ${modification}`; + } else { + weapDamageMod += ` + ${modification}`; + } + } + + $('#'+invItemNameID).append(''+calcStruct.AttackBonus+((attackHasConditionals) ? '*' : '')+''+calcStruct.Damage+weapDamageMod+((damageHasConditionals) ? '*' : '')+''); + } + + if(item.ArmorData != null){ + $('#'+invItemNameID).append(''); + } + + if(item.ShieldData != null){ + let notBroken = (invItem.currentHitPoints > brokenThreshold); + if(doesntHaveItemHealth(invItem)) {notBroken = true;} + if(notBroken){ + $('#'+invItemNameID).append(''); + } else { + $('#'+invItemNameID).append(''); + } + } + + + if(item.Item.hasQuantity == 1){ + $('#'+invItemQtyID).html(invItem.quantity); + } else { + $('#'+invItemQtyID).html('-'); + } + + let bulk = determineItemBulk(g_charSize, invItem.size, invItem.bulk); + bulk = getWornArmorBulkAdjustment(invItem, bulk); + if(item.StorageData != null && item.StorageData.ignoreSelfBulkIfWearing == 1){ + bulk = 0; + } + if(itemStorageBulkAmt != null && itemStorageBulkAmt > 0) { + bulk += itemStorageBulkAmt; + } + bulk = getBulkFromNumber(bulk); + if(invItem.isDropped == 1) { bulk = 'Dropped'; } + $('#'+invItemBulkID).html(bulk); + + if(invItem.currentHitPoints == maxHP) { + $('#'+invItemHealthID).html('-'); + } else { + $('#'+invItemHealthID).html(invItem.currentHitPoints+'/'+maxHP); + } + + if(invItem.isShoddy == 0){ + $('#'+invItemShoddyTagID).addClass('is-hidden'); + } else { + $('#'+invItemShoddyTagID).removeClass('is-hidden'); + } + + let notBroken = (invItem.currentHitPoints > brokenThreshold); + if(doesntHaveItemHealth(invItem)) {notBroken = true;} + if(notBroken){ + $('#'+invItemBrokenTagID).addClass('is-hidden'); + } else { + $('#'+invItemBrokenTagID).removeClass('is-hidden'); + } + + let investTag = itemTagArray.find(tag => { + return tag.id === 235; // Hardcoded Invested Tag ID + }); + if(investTag != null){ + if(invItem.isInvested == 1){ + $('#'+invItemInvestedTagID).removeClass('is-hidden'); + $('#'+invItemNotInvestedTagID).addClass('is-hidden'); + } else { + $('#'+invItemInvestedTagID).addClass('is-hidden'); + $('#'+invItemNotInvestedTagID).removeClass('is-hidden'); + } + } else { + $('#'+invItemInvestedTagID).addClass('is-hidden'); + $('#'+invItemNotInvestedTagID).addClass('is-hidden'); + } + + $('#'+invItemSectionID).click(function(){ + openQuickView('invItemView', { + InvItem : invItem, + Item : item, + InvData : { + OpenBagItemArray : openBagItemArray, + ItemIsStorage : itemIsStorage, + ItemIsStorageAndEmpty : itemIsStorageAndEmpty + }, + ExtraData : {} + }); + }); + + $('#'+invItemSectionID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+invItemSectionID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + +} + +function handleArmorEquip(invID){ + $('.equipArmorButton').each(function(i, obj) { + let invItemID = $(this).attr('data-invItemID'); + let armorCategory = $(this).attr('data-category'); + if(g_equippedArmorInvItemID == invItemID) { + $(this).removeClass('is-outlined'); + $(this).click(function(event){ + event.stopImmediatePropagation(); + g_equippedArmorInvItemID = null; + g_equippedArmorCategory = null; + reloadCharSheet(); + updateInventoryBackend(invID); + }); + } else { + $(this).addClass('is-outlined'); + $(this).click(function(event){ + event.stopImmediatePropagation(); + g_equippedArmorInvItemID = invItemID; + g_equippedArmorCategory = armorCategory; + reloadCharSheet(); + updateInventoryBackend(invID); + }); + } + }); +} + +function handleShieldEquip(invID){ + $('.equipShieldButton').each(function(i, obj) { + let invItemID = $(this).attr('name'); + if(g_equippedShieldInvItemID == invItemID) { + $(this).removeClass('is-outlined'); + $(this).click(function(event){ + event.stopImmediatePropagation(); + g_equippedShieldInvItemID = null; + reloadCharSheet(); + updateInventoryBackend(invID); + }); + } else { + $(this).addClass('is-outlined'); + $(this).click(function(event){ + event.stopImmediatePropagation(); + g_equippedShieldInvItemID = invItemID; + reloadCharSheet(); + updateInventoryBackend(invID); + }); + } + }); +} + +let isUpdateInventoryAvailable = true; +function updateInventoryBackend(invID){ + if(isUpdateInventoryAvailable){ + isUpdateInventoryAvailable = false; + setTimeout(function(){ + socket.emit("requestUpdateInventory", + invID, + g_equippedArmorInvItemID, + g_equippedShieldInvItemID, + g_equippedArmorCategory); + isUpdateInventoryAvailable = true; + }, 5000); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/tabs/notes-tab.js b/client/vue-src/legacy-js/sheet/tabs/notes-tab.js new file mode 100644 index 00000000..a9a67e9f --- /dev/null +++ b/client/vue-src/legacy-js/sheet/tabs/notes-tab.js @@ -0,0 +1,248 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_notesPageArray = null; +let g_currentNotePageID = null; + +// ~~~~~~~~~~~~~~ // Run on Load // ~~~~~~~~~~~~~~ // +$(function () { + + $('#note-page-more-modal-background,#note-page-more-modal-close').click(function() { + $('#note-page-more-modal').removeClass('is-active'); + $('html').removeClass('is-clipped'); + $('#note-page-more-modal').attr('data-page-id', ''); + }); + + + $('#note-page-more-modal-page-name').blur(function(){ + let newPageName = $(this).val(); + let pageID = $('#note-page-more-modal').attr('data-page-id'); + let page = g_notesPageArray.find(page => { + return page.id == pageID; + }); + + if(page != null && page.name != newPageName){ + page.name = newPageName; + saveNotePages(); + loadNotesPages(); + } + }); + + $('#note-page-more-modal-page-color').change(function(){ + let newPageColor = $(this).val(); + let pageID = $('#note-page-more-modal').attr('data-page-id'); + let page = g_notesPageArray.find(page => { + return page.id == pageID; + }); + + if(page != null && page.color != newPageColor){ + page.color = newPageColor; + saveNotePages(); + loadNotesPages(); + } + }); + + $('#note-page-more-modal-page-delete').click(function() { + new ConfirmMessage('Delete Page', 'Are you sure you want to delete this page?', 'Delete', 'note-page-more-delete-page-modal', 'note-page-more-delete-page-modal-del-btn'); + $('#note-page-more-delete-page-modal-del-btn').click(function() { + + let pageID = $('#note-page-more-modal').attr('data-page-id'); + let newNotesPageArray = []; + for(let page of g_notesPageArray){ + if(page.id != pageID){ + newNotesPageArray.push(page); + } + } + g_notesPageArray = newNotesPageArray; + + saveNotePages(); + loadNotesPages(); + $('#note-page-more-modal-close').trigger('click'); + + }); + }); + +}); + +function openNotesTab(data) { + + /* + [{ + id: pageID + name: pageName + color: pageColor + data: pageData + }, ..] + */ + try { + g_notesPageArray = JSON.parse(g_character.notes); + } catch (error) { + g_notesPageArray = [ + { + id: 0, + name: 'General', + color: 'is-info', + data: g_character.notes, + } + ]; + } + if(g_notesPageArray == null){ + g_notesPageArray = [ + { + id: 0, + name: 'General', + color: 'is-info', + data: '', + } + ]; + } + + loadNotesPages(); + +} + +function loadNotesPages(){ + + $('#tabContent').html('
                      '); + + for(let page of g_notesPageArray){ + $('#notesPageSection').append('
                      '+page.name+'
                      '); + } + + $('#notesPageSection').append(''); + + if(g_notesPageArray.length > 0){ + if(g_currentNotePageID != null) { + let page = g_notesPageArray.find(page => { + return page.id == g_currentNotePageID; + }); + if(page != null){ + openNotesPage(page); + } else { + openNotesPage(g_notesPageArray[0]); + } + } else { + openNotesPage(g_notesPageArray[0]); + } + } + + $('.pageOpenBtn').click(function() { + let pageID = $(this).parent().parent().attr('data-page-id'); + let page = g_notesPageArray.find(page => { + return page.id == pageID; + }); + openNotesPage(page); + }); + + $('.pageMoreBtn').click(function() { + let pageID = $(this).parent().parent().attr('data-page-id'); + let page = g_notesPageArray.find(page => { + return page.id == pageID; + }); + openPageMore(page); + }); + + $('#notesAddNewPageBtn').click(function() { + let newPage = { + id: getNewNotesPageID(), + name: 'New Page', + color: 'is-info', + data: '', + }; + g_notesPageArray.push(newPage); + loadNotesPages(); + openNotesPage(newPage); + saveNotePages(); + }); + +} + +function getNewNotesPageID(){ + let highestID = 0; + for(let page of g_notesPageArray){ + if(page.id > highestID) { highestID = page.id; } + } + return highestID+1; +} + +function openNotesPage(page){ + if(page == null) { return; } + g_currentNotePageID = page.id; + $('.pageOpenBtn').addClass('is-outlined'); + $('#notesPageTab-'+page.id).find('.pageOpenBtn').removeClass('is-outlined'); + loadNotesArea(page.id, page.data); +} + +function openPageMore(page){ + if(page == null) { return; } + + $('#note-page-more-modal-page-name').val(page.name); + $('#note-page-more-modal-page-color').val(page.color); + + $('#note-page-more-modal').attr('data-page-id', page.id); + $('#note-page-more-modal').addClass('is-active'); + $('html').addClass('is-clipped'); +} + +function loadNotesArea(pageID, pageNotesData){ + + let notesAreaID = "notesArea"; + let notesAreaControlShellID = "notesAreaControlShell"; + + $('#notesAreaSection').html('
                      '+pageNotesData+'
                      '); + + // Init Quill + let Font = Quill.import('formats/font'); + Font.whitelist = ['proza-libre', 'nanum-gothic', 'handwriting', 'dethek', 'iokharic', 'druidic']; + Quill.register(Font, true); + + let quill = new Quill('#'+notesAreaID, { + modules: { + toolbar: [ + ['bold', 'italic', 'underline', 'strike'], + [{ 'align': [] }, 'blockquote'], + + [{ 'color': [] }, { 'background': [] }], + + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + + [{ 'header': [1, 2, 3, 4, 5, 6, false] }], + [{ 'font': [false, 'proza-libre', 'nanum-gothic', 'handwriting', 'dethek', 'iokharic', 'druidic'] }], + ] + }, + placeholder: 'Feel free to write information here about your character, campaign, or anything else you\'d like!', + theme: 'snow' + }); + + quill.root.setAttribute('spellcheck', false); + + /// /// + + quill.root.addEventListener('blur', function () { + if(pageNotesData != quill.container.innerHTML) { + + $("#"+notesAreaControlShellID).addClass("is-loading"); + + let page = g_notesPageArray.find(page => { + return page.id == pageID; + }); + page.data = quill.container.innerHTML; + saveNotePages(); + + } + }); + +} + +function saveNotePages(){ + let charNotesJSON = JSON.stringify(g_notesPageArray); + g_character.notes = charNotesJSON; + socket.emit("requestNotesSave", + getCharIDFromURL(), + charNotesJSON); +} + +socket.on("returnNotesSave", function(){ + $("#notesAreaControlShell").removeClass("is-loading"); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/tabs/spells-tab.js b/client/vue-src/legacy-js/sheet/tabs/spells-tab.js new file mode 100644 index 00000000..2deff075 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/tabs/spells-tab.js @@ -0,0 +1,1201 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function openSpellTab(data) { + + $('#tabContent').append(''); + + $('#tabContent').append('
                      '); + + let sourceCount = 0; + if(g_spellSlotsMap.size != 0){ + $('#spellsTabCore').click(function(){ + changeSpellsTab('spellsTabCore'); + }); + sourceCount++; + } else { + $('#spellsTabCore').addClass('is-hidden'); + } + + if(g_focusSpellMap.size != 0){ + $('#spellsTabFocus').click(function(){ + changeSpellsTab('spellsTabFocus'); + }); + sourceCount++; + } else { + $('#spellsTabFocus').addClass('is-hidden'); + } + + if(g_innateSpellArray.length != 0){ + $('#spellsTabInnate').click(function(){ + changeSpellsTab('spellsTabInnate'); + }); + sourceCount++; + } else { + $('#spellsTabInnate').addClass('is-hidden'); + } + + if(sourceCount === 1){ + $('#spellsTabs').addClass('is-hidden'); + } + + if(g_selectedSpellSubTabID == null){ + if(g_spellSlotsMap.size != 0){ + $('#spellsTabCore').click(); + } else if(g_focusSpellMap.size != 0){ + $('#spellsTabFocus').click(); + } else { + $('#spellsTabInnate').click(); + } + } else { + $('#'+g_selectedSpellSubTabID).click(); + } + +} + +// Spells Tabs // +function changeSpellsTab(type){ + if(!g_selectedSubTabLock) {g_selectedSubTabID = type;} + g_selectedSpellSubTabID = type; + + $('#spellsTabContent').html(''); + + $('#spellsTabCore').parent().removeClass("is-active"); + $('#spellsTabFocus').parent().removeClass("is-active"); + $('#spellsTabInnate').parent().removeClass("is-active"); + + $('#'+type).parent().addClass("is-active"); + + switch(type) { + case 'spellsTabCore': displaySpellsCore(); break; + case 'spellsTabFocus': displaySpellsFocus(); break; + case 'spellsTabInnate': displaySpellsInnate(); break; + default: break; + } + +} + + +// Core Spells // + +function displaySpellsCore() { + + $('#spellsTabContent').append(` +
                      +
                      +

                      + + +

                      +
                      +
                      + +
                      +
                      +
                      +
                      + `); + + displaySpellsAndSlots(); + +} + + +function displaySpellsAndSlots(){ + + let data = { + ArcaneSpellAttack : getStatTotal(VARIABLE.ARCANE_SPELL_ATTACK), + OccultSpellAttack : getStatTotal(VARIABLE.OCCULT_SPELL_ATTACK), + PrimalSpellAttack : getStatTotal(VARIABLE.PRIMAL_SPELL_ATTACK), + DivineSpellAttack : getStatTotal(VARIABLE.DIVINE_SPELL_ATTACK), + ArcaneSpellDC : getStatTotal(VARIABLE.ARCANE_SPELL_DC), + OccultSpellDC : getStatTotal(VARIABLE.OCCULT_SPELL_DC), + PrimalSpellDC : getStatTotal(VARIABLE.PRIMAL_SPELL_DC), + DivineSpellDC : getStatTotal(VARIABLE.DIVINE_SPELL_DC), + SpellSlotsMap : g_spellSlotsMap, + SpellMap : g_spellMap, + }; + + $('#manageSpellsBtn').off('click'); + $('#manageSpellsBtn').click(function(){ + openManageSpellsModal(data); + }); + + //// + + let spellsSearch = $('#spellsSearch'); + let spellsSearchInput = null; + if(spellsSearch.val() != ''){ + spellsSearchInput = spellsSearch.val().toLowerCase(); + spellsSearch.addClass('is-info'); + } else { + spellsSearch.removeClass('is-info'); + } + + $('#spellsSearch').off('change'); + $('#spellsSearch').change(function(){ + displaySpellsAndSlots(data); + }); + + $('#spellsCoreContent').html(''); + + let count = 0; + for(let spellBook of g_spellBookArray){ + if(spellBook.IsFocus) { continue; } + count++; + + let spellBookSectionID = 'spellBookSection-'+count; + let spellBookSectionTitleID = 'spellBookSection-title-'+count; + $('#spellsCoreContent').append(` +
                      +

                      + ${capitalizeWords(spellBook.SpellSRC)} +

                      +
                      + `); + + const slotArray = data.SpellSlotsMap.get(spellBook.SpellSRC); + if(slotArray == null) {continue;} + for(let slot of slotArray){ + slot.SpellSRC = spellBook.SpellSRC; + } + + let numDisplays = 0; + if(spellBook.SpellCastingType == 'PREPARED-BOOK' || spellBook.SpellCastingType == 'PREPARED-FAMILIAR' || spellBook.SpellCastingType == 'PREPARED-LIST'){ + + let foundKeytermInSearch = false; + if(spellsSearchInput != null){ + if(spellsSearchInput === 'cantrip' || spellsSearchInput === 'cantrips') { + let spellBookLevelSectionID = spellBookSectionID+'-lvl-0'; + $('#'+spellBookSectionID).append('
                      '); + numDisplays += displaySpellsInLevelPrepared(spellBook, 0, slotArray, spellBookLevelSectionID, data, null); + foundKeytermInSearch = true; + } else { + const foundStruct = spellsSearchInput.match(/^(level|lvl) ([0-9]|10)\s*$/); + if(foundStruct != null){ + let level = parseInt(foundStruct[2]); + let spellBookLevelSectionID = spellBookSectionID+'-lvl-'+level; + $('#'+spellBookSectionID).append('
                      '); + numDisplays += displaySpellsInLevelPrepared(spellBook, level, slotArray, spellBookLevelSectionID, data, null); + foundKeytermInSearch = true; + } + } + } + if(!foundKeytermInSearch) { + for (let i = 0; i <= 10; i++) { + let spellBookLevelSectionID = spellBookSectionID+'-lvl-'+i; + $('#'+spellBookSectionID).append('
                      '); + numDisplays += displaySpellsInLevelPrepared(spellBook, i, slotArray, spellBookLevelSectionID, data, spellsSearchInput); + } + } + + } else if (spellBook.SpellCastingType == 'SPONTANEOUS-REPERTOIRE' || spellBook.SpellCastingType == 'FLEXIBLE-COLLECTION') { + + let foundKeytermInSearch = false; + if(spellsSearchInput != null){ + if(spellsSearchInput === 'cantrip' || spellsSearchInput === 'cantrips') { + let spellBookLevelSectionID = spellBookSectionID+'-lvl-0'; + $('#'+spellBookSectionID).append('
                      '); + numDisplays += displaySpellsInLevelSpontaneous(spellBook, 0, slotArray, spellBookLevelSectionID, data, null); + foundKeytermInSearch = true; + } else { + const foundStruct = spellsSearchInput.match(/^(level|lvl) ([0-9]|10)\s*$/); + if(foundStruct != null){ + let level = parseInt(foundStruct[2]); + let spellBookLevelSectionID = spellBookSectionID+'-lvl-'+level; + $('#'+spellBookSectionID).append('
                      '); + numDisplays += displaySpellsInLevelSpontaneous(spellBook, level, slotArray, spellBookLevelSectionID, data, null); + foundKeytermInSearch = true; + } + } + } + if(!foundKeytermInSearch) { + for (let i = 0; i <= 10; i++) { + let spellBookLevelSectionID = spellBookSectionID+'-lvl-'+i; + $('#'+spellBookSectionID).append('
                      '); + numDisplays += displaySpellsInLevelSpontaneous(spellBook, i, slotArray, spellBookLevelSectionID, data, spellsSearchInput); + } + } + + } + + if(numDisplays === 0){ // Hide title (and entire section) if nothing was displayed + $('#'+spellBookSectionTitleID).addClass('is-hidden'); + } + + } + + if(count === 1){ // Hide title if there's just one displayed spell SRC + $('#spellBookSection-title-1').addClass('is-hidden'); + } + +} + + +function displaySpellsInLevelPrepared(spellBook, level, slotArray, spellBookSectionID, data, spellsSearchInput) { + + let sectionName = (level == 0) ? 'Cantrips' : 'Level '+level; + let spellBookTitleSectionID = spellBookSectionID+'-title'; + $('#'+spellBookSectionID).append('
                      '); + + let didDisplaySpellAtLevel = false; + for(let slot of slotArray){ + if(slot.slotLevel != level) { continue; } + + let spellSlotID = 'preparedSpellSlot'+slot.slotID; + + let spellDataStruct = data.SpellMap.get(slot.spellID+""); + + /// Filter Thru Search /// + let willDisplay = true; + if(spellsSearchInput != null){ + if(spellDataStruct != null) { + let spellName = spellDataStruct.Spell.name.toLowerCase(); + if(!spellName.includes(spellsSearchInput)){ + willDisplay = false; + } + } else { + willDisplay = false; + } + } + if(!willDisplay){continue;} + didDisplaySpellAtLevel = true; + + + /// Display Spell Listing /// + if(spellDataStruct != null) { + + // SpellBookSpell Data + let spellData = spellBook.SpellBook.find(spellData => { + return spellData.SpellID == slot.spellID; + }); + + + // Name // + let spellName = spellDataStruct.Spell.name; + + if(spellData != null){ + // Get color from spellBookSpell + let bulmaColor = getSpellTypeBulmaColor(spellData.SpellType); + if(bulmaColor != '' && bulmaColor != 'has-text-info'){ + spellName += ''; + } else { + + // Get color from spell slot + bulmaColor = getSpellTypeBulmaColor(slot.type); + if(bulmaColor != '' && bulmaColor != 'has-text-info'){ + spellName += ''; + } + + } + } + + + let spellNameHTML = ''+spellName+''; + + if(spellDataStruct.Spell.isArchived === 1){ + spellNameHTML += '(archived)'; + } + + // Cast Actions // + let spellCast = null; + switch(spellDataStruct.Spell.cast) { + case 'FREE_ACTION': spellCast = '[free-action]'; break; + case 'REACTION': spellCast = '[reaction]'; break; + case 'ACTION': spellCast = '[one-action]'; break; + case 'TWO_ACTIONS': spellCast = '[two-actions]'; break; + case 'THREE_ACTIONS': spellCast = '[three-actions]'; break; + case 'ONE_TO_THREE_ACTIONS': spellCast = '[one-action] to [three-actions]'; break; + case 'ONE_TO_TWO_ACTIONS': spellCast = '[one-action] to [two-actions]'; break; + case 'TWO_TO_THREE_ACTIONS': spellCast = '[two-actions] to [three-actions]'; break; + case 'TWO_TO_TWO_ROUNDS': spellCast = '[two-actions] to 2 rounds'; break; + case 'TWO_TO_THREE_ROUNDS': spellCast = '[two-actions] to 3 rounds'; break; + case 'THREE_TO_TWO_ROUNDS': spellCast = '[three-actions] to 2 rounds'; break; + case 'THREE_TO_THREE_ROUNDS': spellCast = '[three-actions] to 3 rounds'; break; + case 'TWO_ROUNDS': spellCast = '2 rounds'; break; + case 'THREE_ROUNDS': spellCast = '3 rounds'; break; + case 'ONE_MINUTE': spellCast = '1 minute'; break; + case 'FIVE_MINUTES': spellCast = '5 minutes'; break; + case 'TEN_MINUTES': spellCast = '10 minutes'; break; + case 'THIRTY_MINUTES': spellCast = '30 minutes'; break; + case 'ONE_HOUR': spellCast = '1 hour'; break; + case 'EIGHT_HOURS': spellCast = '8 hours'; break; + case 'ONE_DAY': spellCast = '24 hours'; break; + default: spellCast = 'see spell'; break; + } + + // Save // + let spellSave = null; + switch(spellDataStruct.Spell.savingThrow) { + case 'WILL': spellSave = 'Will'; break; + case 'BASIC_WILL': spellSave = 'Will'; break; + case 'FORT': spellSave = 'Fort.'; break; + case 'BASIC_FORT': spellSave = 'Fort.'; break; + case 'REFLEX': spellSave = 'Reflex'; break; + case 'BASIC_REFLEX': spellSave = 'Reflex'; break; + default: spellSave = '-'; break; + } + + // Range // + let spellRange = (spellDataStruct.Spell.range != null) ? spellDataStruct.Spell.range : '-'; + + // Tags // + let tagsInnerHTML = '
                      '; + for(const tag of spellDataStruct.Tags){ + tagsInnerHTML += ''; + } + tagsInnerHTML += '
                      '; + + $('#'+spellBookSectionID).append(` +
                      +
                      +

                      ${spellNameHTML}

                      +
                      +
                      +

                      ${spellCast}

                      +
                      +
                      +

                      ${spellSave}

                      +
                      +
                      +

                      ${spellRange}

                      +
                      +
                      +

                      ${tagsInnerHTML}

                      +
                      +
                      + `); + + $('#'+spellSlotID).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + SheetData: { + Slot: slot, + Data: data}, + }); + }); + + if(slot.used) { + $('#'+spellSlotID).addClass('has-empty-slot-background'); + $('#'+spellSlotID).find(".has-txt-listing").removeClass("has-txt-listing").addClass("has-txt-noted"); + } + + } else { + + // Get color from spell slot + let slotColorHTML = ''; + let bulmaColor = getSpellTypeBulmaColor(slot.type); + if(bulmaColor != '' && bulmaColor != 'has-text-info'){ + slotColorHTML = ''; + } + + $('#'+spellBookSectionID).append(` +
                      +
                      +

                      -${slotColorHTML}

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      + `); + } + + $('#'+spellSlotID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+spellSlotID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + + if(didDisplaySpellAtLevel){ + $('#'+spellBookTitleSectionID).append('

                      '+sectionName+'

                      '); + $('#'+spellBookTitleSectionID).append(` +
                      +
                      +

                      Name

                      +
                      +
                      +

                      Cast

                      +
                      +
                      +

                      Save

                      +
                      +
                      +

                      Range

                      +
                      +
                      +

                      Traits

                      +
                      +
                      +
                      + `); + } + + return (didDisplaySpellAtLevel) ? 1 : 0; +} + + + +function displaySpellsInLevelSpontaneous(spellBook, level, slotArray, spellBookSectionID, data, spellsSearchInput) { + + let filteredSlotArray = []; + for(let slot of slotArray){ + if(slot.slotLevel == level) { + filteredSlotArray.push(slot); + } + } + filteredSlotArray = filteredSlotArray.sort( + function(a, b) { + return (a.used && !b.used) ? -1 : 1; + } + ); + + // If a level has no spell slots, don't display anything for that level + let hasSlotsAtLevel = (filteredSlotArray.length > 0); + if(!hasSlotsAtLevel) {return 0;} + + let sectionName = (level == 0) ? 'Cantrips' : 'Level '+level; + let spellBookTitleSectionID = spellBookSectionID+'-title'; + $('#'+spellBookSectionID).append('
                      '); + + let spellListingSponClass = spellBookSectionID+'-spellSponListingClass'+level; + let spellListingCount = 0; + let didDisplaySpellAtLevel = false; + for(let spellData of spellBook.SpellBook){ + if(spellData.SpellLevel != level){continue;} + + let spellSponListingID = spellBookSectionID+'-spellSponListing'+spellListingCount+'L'+level; + + let spellDataStruct = data.SpellMap.get(spellData.SpellID+""); + + /// Filter Thru Search /// + let willDisplay = true; + if(spellsSearchInput != null){ + if(spellDataStruct != null) { + let spellName = spellDataStruct.Spell.name.toLowerCase(); + if(!spellName.includes(spellsSearchInput)){ + willDisplay = false; + } + } else { + willDisplay = false; + } + } + if(!willDisplay){continue;} + didDisplaySpellAtLevel = true; + + /// Display Spell Listing /// + if(spellDataStruct != null) { + + // Name // + let spellName = spellDataStruct.Spell.name; + + let bulmaColor = getSpellTypeBulmaColor(spellData.SpellType); + if(bulmaColor != '' && bulmaColor != 'has-text-info'){ + spellName += ''; + } + + + let spellNameHTML = ''+spellName+''; + + if(spellDataStruct.Spell.isArchived === 1){ + spellNameHTML += '(archived)'; + } + + // Cast Actions // + let spellCast = null; + switch(spellDataStruct.Spell.cast) { + case 'FREE_ACTION': spellCast = '[free-action]'; break; + case 'REACTION': spellCast = '[reaction]'; break; + case 'ACTION': spellCast = '[one-action]'; break; + case 'TWO_ACTIONS': spellCast = '[two-actions]'; break; + case 'THREE_ACTIONS': spellCast = '[three-actions]'; break; + case 'ONE_TO_THREE_ACTIONS': spellCast = '[one-action] to [three-actions]'; break; + case 'ONE_TO_TWO_ACTIONS': spellCast = '[one-action] to [two-actions]'; break; + case 'TWO_TO_THREE_ACTIONS': spellCast = '[two-actions] to [three-actions]'; break; + case 'TWO_TO_TWO_ROUNDS': spellCast = '[two-actions] to 2 rounds'; break; + case 'TWO_TO_THREE_ROUNDS': spellCast = '[two-actions] to 3 rounds'; break; + case 'THREE_TO_TWO_ROUNDS': spellCast = '[three-actions] to 2 rounds'; break; + case 'THREE_TO_THREE_ROUNDS': spellCast = '[three-actions] to 3 rounds'; break; + case 'TWO_ROUNDS': spellCast = '2 rounds'; break; + case 'THREE_ROUNDS': spellCast = '3 rounds'; break; + case 'ONE_MINUTE': spellCast = '1 minute'; break; + case 'FIVE_MINUTES': spellCast = '5 minutes'; break; + case 'TEN_MINUTES': spellCast = '10 minutes'; break; + case 'THIRTY_MINUTES': spellCast = '30 minutes'; break; + case 'ONE_HOUR': spellCast = '1 hour'; break; + case 'EIGHT_HOURS': spellCast = '8 hours'; break; + case 'ONE_DAY': spellCast = '24 hours'; break; + default: spellCast = 'see spell'; break; + } + + // Save // + let spellSave = null; + switch(spellDataStruct.Spell.savingThrow) { + case 'WILL': spellSave = 'Will'; break; + case 'BASIC_WILL': spellSave = 'Will'; break; + case 'FORT': spellSave = 'Fort.'; break; + case 'BASIC_FORT': spellSave = 'Fort.'; break; + case 'REFLEX': spellSave = 'Reflex'; break; + case 'BASIC_REFLEX': spellSave = 'Reflex'; break; + default: spellSave = '-'; break; + } + + // Range // + let spellRange = (spellDataStruct.Spell.range != null) ? spellDataStruct.Spell.range : '-'; + + // Tags // + let tagsInnerHTML = '
                      '; + for(const tag of spellDataStruct.Tags){ + tagsInnerHTML += ''; + } + tagsInnerHTML += '
                      '; + + $('#'+spellBookSectionID).append(` +
                      +
                      +

                      ${spellNameHTML}

                      +
                      +
                      +

                      ${spellCast}

                      +
                      +
                      +

                      ${spellSave}

                      +
                      +
                      +

                      ${spellRange}

                      +
                      +
                      +

                      ${tagsInnerHTML}

                      +
                      +
                      + `); + + let unusedSlot = filteredSlotArray.find(slot => { + return slot.used === false; + }); + if(unusedSlot == null && filteredSlotArray.length > 0){ + unusedSlot = filteredSlotArray[0]; + } + if(unusedSlot != null){ + $('#'+spellSponListingID).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + SheetData: { + Slot: unusedSlot, + Data: data}, + }); + }); + } + + } else { + $('#'+spellBookSectionID).append(` +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      + `); + } + + $('#'+spellSponListingID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+spellSponListingID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + spellListingCount++; + + } + + + + // Display Empty Slot Entry, If No Spells at Level (but not if using a search) // + if(!didDisplaySpellAtLevel && spellsSearchInput == null){ + let spellSponListingID = spellBookSectionID+'-spellSponListingNoSpellsL'+level; + $('#'+spellBookSectionID).append(` +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      +

                      -

                      +
                      +
                      + `); + $('#'+spellSponListingID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+spellSponListingID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + } + + // Display Title and Casting Set // + if(didDisplaySpellAtLevel || (!didDisplaySpellAtLevel && spellsSearchInput == null)){ + let spellSponCastingSetID = spellBookSectionID+'-spellSponCastingSet'+level; + $('#'+spellBookTitleSectionID).append('

                      '+sectionName+'

                      '); + $('#'+spellBookTitleSectionID).append(` +
                      +
                      +

                      Name

                      +
                      +
                      +

                      Cast

                      +
                      +
                      +

                      Save

                      +
                      +
                      +

                      Range

                      +
                      +
                      +

                      Traits

                      +
                      +
                      +
                      + `); + if(level != 0){ + displaySpontaneousCastingsSet(spellSponCastingSetID, filteredSlotArray, spellListingSponClass); + } + } + + return (didDisplaySpellAtLevel) ? 1 : 0; +} + +function displaySpontaneousCastingsSet(locationID, slotsArray, spellListingSponClass){ + + let castingButtonsClass = 'castingSpontaneousBtns-'+locationID; + let slotsUsedCount = 0; + let spellCastingsHTML = ''; + for(let slot of slotsArray){ + if(slot.used){ + slotsUsedCount++; + spellCastingsHTML += ''; + } else { + spellCastingsHTML += ''; + } + } + $('#'+locationID).html(spellCastingsHTML); + + if(slotsUsedCount === slotsArray.length) { + $('.'+spellListingSponClass).addClass('has-empty-slot-background'); + $('.'+spellListingSponClass).find(".has-txt-listing").removeClass("has-txt-listing").addClass("has-txt-noted"); + } else { + $('.'+spellListingSponClass).removeClass('has-empty-slot-background'); + $('.'+spellListingSponClass).find(".has-txt-noted").removeClass("has-txt-noted").addClass("has-txt-listing"); + } + + $('.'+castingButtonsClass).off('click'); + $('.'+castingButtonsClass).click(function(){ + event.stopImmediatePropagation(); + let slotID = $(this).attr('name'); + let slot = slotsArray.find(slot => { + return slot.slotID == slotID; + }); + + slot.used = !slot.used; + socket.emit("requestSpellSlotUpdate", + getCharIDFromURL(), + slot); + let spellSlotsArray = g_spellSlotsMap.get(slot.SpellSRC); + if(spellSlotsArray != null){ + spellSlotsArray = updateSlotUsed(spellSlotsArray, slot.slotID, slot.used); + } + g_spellSlotsMap.set(slot.SpellSRC, spellSlotsArray); + closeQuickView(); + displaySpellsAndSlots(); + }); + +} + + + + + +// Focus Spells // +let g_focusOpenPoint = false; + +function displaySpellsFocus() { + + let data = { + ArcaneSpellAttack : getStatTotal(VARIABLE.ARCANE_SPELL_ATTACK), + OccultSpellAttack : getStatTotal(VARIABLE.OCCULT_SPELL_ATTACK), + PrimalSpellAttack : getStatTotal(VARIABLE.PRIMAL_SPELL_ATTACK), + DivineSpellAttack : getStatTotal(VARIABLE.DIVINE_SPELL_ATTACK), + ArcaneSpellDC : getStatTotal(VARIABLE.ARCANE_SPELL_DC), + OccultSpellDC : getStatTotal(VARIABLE.OCCULT_SPELL_DC), + PrimalSpellDC : getStatTotal(VARIABLE.PRIMAL_SPELL_DC), + DivineSpellDC : getStatTotal(VARIABLE.DIVINE_SPELL_DC), + }; + + $('#spellsTabContent').append('
                      '); + + let isFirstLevel = true; + let sourceCount = 0; + let focusSpellCount = 0; + for(const [spellSRC, focusSpellDataArray] of g_focusSpellMap.entries()){ + let prevLevel = -100; + $('#spellsFocusContent').append(''); + + let sortedFocusSpellDataArray = focusSpellDataArray.sort( + function(a, b) { + let aSpellData = g_spellMap.get(a.SpellID+""); + let bSpellData = g_spellMap.get(b.SpellID+""); + if(aSpellData == null || bSpellData == null){ + return -1; + } else { + if (aSpellData.Spell.level === bSpellData.Spell.level) { + // Name is only important when levels are the same + return aSpellData.Spell.name > bSpellData.Spell.name ? 1 : -1; + } + return aSpellData.Spell.level - bSpellData.Spell.level; + } + } + ); + + for(let focusSpellData of sortedFocusSpellDataArray){ + focusSpellData.SpellSRC = spellSRC; + let spellDataStruct = g_spellMap.get(focusSpellData.SpellID+""); + if(spellDataStruct == null) { continue; } + + if(spellDataStruct.Spell.level > prevLevel){ + let sectionName = (spellDataStruct.Spell.level == 0) ? 'Cantrips' : 'Level '+spellDataStruct.Spell.level; + if(isFirstLevel){ + $('#spellsFocusContent').append('

                      '+sectionName+'

                      '); + isFirstLevel = false; + } else { + $('#spellsFocusContent').append('

                      '+sectionName+'

                      '); + } + $('#spellsFocusContent').append(` +
                      +
                      +

                      Name

                      +
                      +
                      +

                      Cast

                      +
                      +
                      +

                      Save

                      +
                      +
                      +

                      Range

                      +
                      +
                      +

                      Traits

                      +
                      +
                      +
                      + `); + } + + let spellListingID = 'focusSpellListing'+focusSpellCount; + + // Name // + let spellName = ''+spellDataStruct.Spell.name+''; + + if(spellDataStruct.Spell.isArchived === 1){ + spellName += '(archived)'; + } + + // Cast Actions // + let spellCast = null; + switch(spellDataStruct.Spell.cast) { + case 'FREE_ACTION': spellCast = '[free-action]'; break; + case 'REACTION': spellCast = '[reaction]'; break; + case 'ACTION': spellCast = '[one-action]'; break; + case 'TWO_ACTIONS': spellCast = '[two-actions]'; break; + case 'THREE_ACTIONS': spellCast = '[three-actions]'; break; + case 'ONE_TO_THREE_ACTIONS': spellCast = '[one-action] to [three-actions]'; break; + case 'ONE_TO_TWO_ACTIONS': spellCast = '[one-action] to [two-actions]'; break; + case 'TWO_TO_THREE_ACTIONS': spellCast = '[two-actions] to [three-actions]'; break; + case 'TWO_TO_TWO_ROUNDS': spellCast = '[two-actions] to 2 rounds'; break; + case 'TWO_TO_THREE_ROUNDS': spellCast = '[two-actions] to 3 rounds'; break; + case 'THREE_TO_TWO_ROUNDS': spellCast = '[three-actions] to 2 rounds'; break; + case 'THREE_TO_THREE_ROUNDS': spellCast = '[three-actions] to 3 rounds'; break; + case 'TWO_ROUNDS': spellCast = '2 rounds'; break; + case 'THREE_ROUNDS': spellCast = '3 rounds'; break; + case 'ONE_MINUTE': spellCast = '1 minute'; break; + case 'FIVE_MINUTES': spellCast = '5 minutes'; break; + case 'TEN_MINUTES': spellCast = '10 minutes'; break; + case 'THIRTY_MINUTES': spellCast = '30 minutes'; break; + case 'ONE_HOUR': spellCast = '1 hour'; break; + case 'EIGHT_HOURS': spellCast = '8 hours'; break; + case 'ONE_DAY': spellCast = '24 hours'; break; + default: spellCast = 'see spell'; break; + } + + // Save // + let spellSave = null; + switch(spellDataStruct.Spell.savingThrow) { + case 'WILL': spellSave = 'Will'; break; + case 'BASIC_WILL': spellSave = 'Will'; break; + case 'FORT': spellSave = 'Fort.'; break; + case 'BASIC_FORT': spellSave = 'Fort.'; break; + case 'REFLEX': spellSave = 'Reflex'; break; + case 'BASIC_REFLEX': spellSave = 'Reflex'; break; + default: spellSave = '-'; break; + } + + // Range // + let spellRange = (spellDataStruct.Spell.range != null) ? spellDataStruct.Spell.range : '-'; + + // Tags // + let tagsInnerHTML = '
                      '; + for(const tag of spellDataStruct.Tags){ + tagsInnerHTML += ''; + } + tagsInnerHTML += '
                      '; + + let focusListingClass = (spellDataStruct.Spell.level != 0) ? 'focusSpellListingClass' : 'focusCantripListingClass'; + $('#spellsFocusContent').append(` +
                      +
                      +

                      ${spellName}

                      +
                      +
                      +

                      ${spellCast}

                      +
                      +
                      +

                      ${spellSave}

                      +
                      +
                      +

                      ${spellRange}

                      +
                      +
                      +

                      ${tagsInnerHTML}

                      +
                      +
                      + `); + + + $('#'+spellListingID).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + SheetData: {FocusSpell: focusSpellData, Data: data}, + }); + }); + + $('#'+spellListingID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+spellListingID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + prevLevel = spellDataStruct.Spell.level; + focusSpellCount++; + } + sourceCount++; + } + + if(sourceCount > 1){ + $('.focusSpellSourceTitle').removeClass('is-hidden'); + } + + displayFocusCastingsSet('NONE'); + +} + +function displayFocusCastingsSet(changeType){ + + let performedChange = false; + for(let focusPointData of g_focusPointArray){ + if(changeType !== 'NONE' && !performedChange){ + if(changeType === 'ADD' && focusPointData.value == 1){ + focusPointData.value = 0; + socket.emit("requestFocusPointUpdate", + getCharIDFromURL(), + focusPointData, + focusPointData.value); + performedChange = true; + } else if(changeType === 'REMOVE' && focusPointData.value == 0){ + focusPointData.value = 1; + socket.emit("requestFocusPointUpdate", + getCharIDFromURL(), + focusPointData, + focusPointData.value); + performedChange = true; + } + } + } + + g_focusPointArray = g_focusPointArray.sort( + function(a, b) { + return (a.value == 0 && b.value == 1) ? 1 : -1; + } + ); + + let pointsButtonsClass = 'castingFocusPointsBtns'; + + g_focusOpenPoint = false; + let spellCastingsHTML = ''; + for (let i = 0; i < g_focusPointArray.length; i++) { + if(i < 3){ + let focusPointData = g_focusPointArray[i]; + if(focusPointData.value == 0) { + spellCastingsHTML += ''; + } else { + g_focusOpenPoint = true; + spellCastingsHTML += ''; + } + } + } + $('#focusPointsCastingSet').html(spellCastingsHTML); + + + if(g_focusOpenPoint) { + $('.focusSpellListingClass').removeClass('has-empty-slot-background'); + $('.focusSpellListingClass').find(".has-txt-noted").removeClass("has-txt-noted").addClass("has-txt-listing"); + } else { + $('.focusSpellListingClass').addClass('has-empty-slot-background'); + $('.focusSpellListingClass').find(".has-txt-listing").removeClass("has-txt-listing").addClass("has-txt-noted"); + } + + $('.'+pointsButtonsClass).off('click'); + $('.'+pointsButtonsClass).click(function(event){ + event.stopImmediatePropagation(); + let focusPointData = g_focusPointArray[$(this).attr('name')]; + + focusPointData.value = (focusPointData.value == 1) ? 0 : 1; + socket.emit("requestFocusPointUpdate", + getCharIDFromURL(), + focusPointData, + focusPointData.value); + + displayFocusCastingsSet('NONE'); + }); + +} + + + + +// Innate Spells // +function displaySpellsInnate() { + + let data = { + ArcaneSpellAttack : getStatTotal(VARIABLE.ARCANE_SPELL_ATTACK), + OccultSpellAttack : getStatTotal(VARIABLE.OCCULT_SPELL_ATTACK), + PrimalSpellAttack : getStatTotal(VARIABLE.PRIMAL_SPELL_ATTACK), + DivineSpellAttack : getStatTotal(VARIABLE.DIVINE_SPELL_ATTACK), + ArcaneSpellDC : getStatTotal(VARIABLE.ARCANE_SPELL_DC), + OccultSpellDC : getStatTotal(VARIABLE.OCCULT_SPELL_DC), + PrimalSpellDC : getStatTotal(VARIABLE.PRIMAL_SPELL_DC), + DivineSpellDC : getStatTotal(VARIABLE.DIVINE_SPELL_DC), + }; + + let spellMap = g_spellMap; + let innateSpellArray = g_innateSpellArray; + + $('#spellsTabContent').html(''); + $('#spellsTabContent').append('
                      '); + + let isFirstLevel = true; + let prevLevel = -100; + for (let spellIndex = 0; spellIndex < innateSpellArray.length; spellIndex++) { + let innateSpell = innateSpellArray[spellIndex]; + + if(innateSpell.SpellLevel > prevLevel){ + let sectionName = (innateSpell.SpellLevel == 0) ? 'Cantrips' : 'Level '+innateSpell.SpellLevel; + if(isFirstLevel){ + $('#spellsInnateContent').append('

                      '+sectionName+'

                      '); + isFirstLevel = false; + } else { + $('#spellsInnateContent').append('

                      '+sectionName+'

                      '); + } + $('#spellsInnateContent').append(` +
                      +
                      +

                      Name

                      +
                      +
                      +

                      Casts Per Day

                      +
                      +
                      +

                      Cast

                      +
                      +
                      +

                      Range

                      +
                      +
                      +

                      Traits

                      +
                      +
                      +
                      + `); + } + + let spellDataStruct = spellMap.get(innateSpell.SpellID+""); + + /// Display Spell Listing /// + if(spellDataStruct != null) { + + let spellListingID = 'innateSpellListing'+spellIndex; + let spellCastingID = 'innateSpellCastings'+spellIndex; + + // Name // + let spellName = ''+spellDataStruct.Spell.name+''; + + if(spellDataStruct.Spell.isArchived === 1){ + spellName += '(archived)'; + } + + // Cast Actions // + let spellCast = null; + switch(spellDataStruct.Spell.cast) { + case 'FREE_ACTION': spellCast = '[free-action]'; break; + case 'REACTION': spellCast = '[reaction]'; break; + case 'ACTION': spellCast = '[one-action]'; break; + case 'TWO_ACTIONS': spellCast = '[two-actions]'; break; + case 'THREE_ACTIONS': spellCast = '[three-actions]'; break; + case 'ONE_TO_THREE_ACTIONS': spellCast = '[one-action] to [three-actions]'; break; + case 'ONE_TO_TWO_ACTIONS': spellCast = '[one-action] to [two-actions]'; break; + case 'TWO_TO_THREE_ACTIONS': spellCast = '[two-actions] to [three-actions]'; break; + case 'TWO_TO_TWO_ROUNDS': spellCast = '[two-actions] to 2 rounds'; break; + case 'TWO_TO_THREE_ROUNDS': spellCast = '[two-actions] to 3 rounds'; break; + case 'THREE_TO_TWO_ROUNDS': spellCast = '[three-actions] to 2 rounds'; break; + case 'THREE_TO_THREE_ROUNDS': spellCast = '[three-actions] to 3 rounds'; break; + case 'TWO_ROUNDS': spellCast = '2 rounds'; break; + case 'THREE_ROUNDS': spellCast = '3 rounds'; break; + case 'ONE_MINUTE': spellCast = '1 minute'; break; + case 'FIVE_MINUTES': spellCast = '5 minutes'; break; + case 'TEN_MINUTES': spellCast = '10 minutes'; break; + case 'THIRTY_MINUTES': spellCast = '30 minutes'; break; + case 'ONE_HOUR': spellCast = '1 hour'; break; + case 'EIGHT_HOURS': spellCast = '8 hours'; break; + case 'ONE_DAY': spellCast = '24 hours'; break; + default: spellCast = 'see spell'; break; + } + + // Range // + let spellRange = (spellDataStruct.Spell.range != null) ? spellDataStruct.Spell.range : '-'; + + // Tags // + let tagsInnerHTML = '
                      '; + for(const tag of spellDataStruct.Tags){ + tagsInnerHTML += ''; + } + tagsInnerHTML += '
                      '; + + $('#spellsInnateContent').append(` +
                      +
                      +

                      ${spellName}

                      +
                      +
                      +

                      +
                      +
                      +

                      ${spellCast}

                      +
                      +
                      +

                      ${spellRange}

                      +
                      +
                      +

                      ${tagsInnerHTML}

                      +
                      +
                      + `); + + if(spellDataStruct.Spell.level == 0 || innateSpell.TimesPerDay == 0){ + $('#'+spellCastingID).html('Unlimited'); + } else { + displayInnateCastingsSet(spellCastingID, innateSpell, spellIndex, spellListingID); + } + + $('#'+spellListingID).click(function(){ + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + SheetData: {InnateSpell: innateSpell, Data: data}, + }); + }); + + $('#'+spellListingID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+spellListingID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + + } + + prevLevel = innateSpell.SpellLevel; + } + +} + +function displayInnateCastingsSet(locationID, innateSpell, spellIndex, spellListingID){ + + let castingButtonsClass = 'castingInnateBtns'+locationID; + + let spellCastingsHTML = ''; + for (let i = 0; i < innateSpell.TimesPerDay; i++) { + if(innateSpell.TimesCast > i) { + spellCastingsHTML += ''; + } else { + spellCastingsHTML += ''; + } + } + $('#'+locationID).html(spellCastingsHTML); + + if(innateSpell.TimesPerDay === innateSpell.TimesCast) { + $('#'+spellListingID).addClass('has-empty-slot-background'); + $('#'+spellListingID).find(".has-txt-listing").removeClass("has-txt-listing").addClass("has-txt-noted"); + } else { + $('#'+spellListingID).removeClass('has-empty-slot-background'); + $('#'+spellListingID).find(".has-txt-noted").removeClass("has-txt-noted").addClass("has-txt-listing"); + } + + $('.'+castingButtonsClass).off('click'); + $('.'+castingButtonsClass).click(function(){ + event.stopImmediatePropagation(); + let newTimesCast = null; + if($(this).hasClass('isInnateCast')) { + newTimesCast = innateSpell.TimesCast-1; + } else { + newTimesCast = innateSpell.TimesCast+1; + } + socket.emit("requestInnateSpellCastingUpdate", + cloneObj(innateSpell), + newTimesCast); + innateSpell.TimesCast = newTimesCast; + g_innateSpellArray[spellIndex] = innateSpell; + displayInnateCastingsSet(locationID, innateSpell, spellIndex, spellListingID); + }); + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/tabs/weapons-tab.js b/client/vue-src/legacy-js/sheet/tabs/weapons-tab.js new file mode 100644 index 00000000..0bfa7b42 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/tabs/weapons-tab.js @@ -0,0 +1,259 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +const FIST_ITEM_ID = 56; // <- Fist, Hardcoded Item ID +const IMPROVISED_ITEM_ID = 4753; // <- Improvised Weapon, Hardcoded Item ID + +function openWeaponsTab(data) { + + let addWeaponEntry = function(weaponEntryID, item, invItem, extraData) { + let weaponListEntryID = 'weaponListEntry'+weaponEntryID; + + let calcStruct = getAttackAndDamage(item, invItem); + //let itemTagArray = getItemTraitsArray(item, invItem); + + let weaponRange, weaponReload; + if(invItem.itemWeaponRange == null && invItem.itemWeaponReload == null){ + weaponRange = item.WeaponData.rangedRange; + weaponReload = item.WeaponData.rangedReload; + } else { + weaponRange = invItem.itemWeaponRange; + weaponReload = invItem.itemWeaponReload; + } + + for(const weapRangeMod of getWeapMod(invItem.id, 'ADJUST-RANGE')){ + weaponRange += parseInt(weapRangeMod.mod); + } + for(const weapReloadMod of getWeapMod(invItem.id, 'ADJUST-RELOAD')){ + weaponReload += parseInt(weapReloadMod.mod); + } + + if(weaponReload == 0){ weaponReload = '-'; } + if(weaponRange == 0 || (item.WeaponData.isRanged == 0 && weaponRange == 20 && !extraData.IsCustomUnarmedAttack)){ weaponRange = '-'; } else { weaponRange += ' ft'; } + + if(weaponReload == null){ weaponReload = '-'; } + if(weaponRange == null){ weaponRange = '-'; } + + let unarmedIcon = ''; + if(extraData.IsCustomUnarmedAttack) { + unarmedIcon = ''; + } + + let attackHasConditionals = (calcStruct.WeapStruct.attack.conditionals != null && calcStruct.WeapStruct.attack.conditionals.size != 0); + let damageHasConditionals = ((calcStruct.WeapStruct.damage.conditionals != null && calcStruct.WeapStruct.damage.conditionals.size != 0) || calcStruct.WeapStruct.damage.modifications.on_hit_other.length != 0); + + let weapDamageMod = ''; + for(const onHitDmgMod of calcStruct.WeapStruct.damage.modifications.on_hit_damage){ + let modification = onHitDmgMod.mod; + if(modification.startsWith('-')){ + modification = modification.slice(1); + weapDamageMod += ` - ${modification}`; + } else { + weapDamageMod += ` + ${modification}`; + } + } + + $('#weaponsTabContent').append(` +
                      +
                      +

                      ${getItemIcon(item, invItem)+invItem.name+unarmedIcon}

                      +
                      +
                      +

                      + ${calcStruct.AttackBonus+((attackHasConditionals) ? '*' : '')} +

                      +
                      +
                      +

                      + ${calcStruct.Damage+weapDamageMod+((damageHasConditionals) ? '*' : '')} +

                      +
                      +
                      +

                      ${weaponRange}

                      +
                      +
                      +

                      ${weaponReload}

                      +
                      +
                      +
                      + `); + + g_calculatedStats.weapons.push({ + Name: invItem.name, + Bonus: calcStruct.AttackBonus, + Damage: calcStruct.Damage});// Calculated Stat + + $('#'+weaponListEntryID).click(function(){ + openQuickView('invItemView', { + InvItem : invItem, + Item : item, + InvData : null, + ExtraData : extraData + }); + }); + + $('#'+weaponListEntryID).mouseenter(function(){ + $(this).addClass('has-bg-selectable-hover'); + }); + $('#'+weaponListEntryID).mouseleave(function(){ + $(this).removeClass('has-bg-selectable-hover'); + }); + }; + + $('#tabContent').append(` +
                      +
                      +

                      Name

                      +
                      +
                      +

                      Attack

                      +
                      +
                      +

                      Damage

                      +
                      +
                      +

                      Range

                      +
                      +
                      +

                      Reload

                      +
                      +
                      +
                      +
                      + `); + + $('#tabContent').append('
                      '); + + $('#tabContent').append('
                      '); + + $("#addNewUnarmedAttackButton").click(function(){ + openQuickView('addUnarmedAttackView', { + IsCustomize: false, + AddedItemID: FIST_ITEM_ID + }); + }); + + // Physical Features to Unarmed Attacks + let phyFeatWeaponMap = new Map(); + phyFeatWeaponMap.set(0, FIST_ITEM_ID); + phyFeatWeaponMap.set(-1, IMPROVISED_ITEM_ID); + + for(const physicalFeature of g_phyFeatArray){ + if(physicalFeature.value.itemWeaponID != null){ + if(physicalFeature.value.overrides == null){ + if(!phyFeatWeaponMap.has(physicalFeature.value.id)) { + phyFeatWeaponMap.set(physicalFeature.value.id, physicalFeature.value.itemWeaponID); + } + } else { + phyFeatWeaponMap.set(physicalFeature.value.overrides, physicalFeature.value.itemWeaponID); + } + } + } + + let willAddUnarmedAttacks = []; + let willRemoveUnarmedAttacks = []; + + for(const [pfWeaponID, itemWeaponID] of phyFeatWeaponMap.entries()){ + const invItem = g_invStruct.InvItems.find(invItem => { + return invItem.itemID === itemWeaponID; + }); + if(invItem == null){ + willAddUnarmedAttacks.push(itemWeaponID); + } + } + + let checkDuplicateUnarmedAttacks = []; + for(const invItem of g_invStruct.InvItems){ + const item = g_itemMap.get(invItem.itemID+""); // Is Non-Custom Unarmed Attack + if(isUnarmedAttack(item) && item.Item.id != FIST_ITEM_ID && item.Item.id != IMPROVISED_ITEM_ID){ + const itemWeaponID = Array.from(phyFeatWeaponMap.values()).find(itemWeaponID => { + return (itemWeaponID === invItem.itemID); + }); + if(itemWeaponID == null){ + willRemoveUnarmedAttacks.push(invItem.id); + } else { + // If there's a duplicate unarmed attack entry, remove it + if(checkDuplicateUnarmedAttacks.includes(itemWeaponID)){ + willRemoveUnarmedAttacks.push(invItem.id); + } else { + checkDuplicateUnarmedAttacks.push(itemWeaponID); + } + } + } + } + + for(let itemID of willAddUnarmedAttacks) { + + // Normal Fist has qty of 0 to detect that it is the base Fist, hope that makes sense + let qty; + if(itemID == FIST_ITEM_ID || itemID == IMPROVISED_ITEM_ID){ qty = 0; } else { qty = 1; } + socket.emit("requestAddItemToInv", + getCharIDFromURL(), + g_invStruct.Inventory.id, + itemID, + qty); + + } + for(let invItemID of willRemoveUnarmedAttacks) { + + socket.emit("requestRemoveItemFromInv", + invItemID); + + } + + // Display Weapons & Attacks + let weaponEntryID = 0; + for(const invItem of g_invStruct.InvItems){ + let item = g_itemMap.get(invItem.itemID+""); + if(item == null) { continue; } + if(item.WeaponData != null){ + weaponEntryID++; + addWeaponEntry(weaponEntryID, item, invItem, { + IsUnarmedAttack: isUnarmedAttack(item), + IsCustomUnarmedAttack: (isUnarmedAttack(item) && item.Item.id === FIST_ITEM_ID && invItem.quantity !== 0) + }); + } + } + + // If has shield eqipped, + if(g_equippedShieldInvItemID != null){ + weaponEntryID++; + let pwItem = g_itemMap.get(1266+""); // Shield Bash, Hardcoded Item ID + if(pwItem != null) { + let pwInvItem = pwItem.Item; + pwInvItem.currentHitPoints = pwInvItem.hitPoints; + pwInvItem.viewOnly = true; + addWeaponEntry(weaponEntryID, pwItem, pwInvItem, { + IsUnarmedAttack: false, + IsCustomUnarmedAttack: false + }); + } + } + + + + + // Hide Duplicate Fists and Improvised Weapons + let searchFoundFist = false; + let searchFoundImproWeap = false; + $('.weaponEntry').each(function(){ + const itemID = $(this).attr('data-item-id'); + if(itemID == FIST_ITEM_ID){ + if(searchFoundFist){ + //$(this).remove(); + // Custom Unarmed Attacks use the FIST_ITEM_ID + } else { + searchFoundFist = true; + } + } else if(itemID == IMPROVISED_ITEM_ID){ + if(searchFoundImproWeap){ + $(this).remove(); + } else { + searchFoundImproWeap = true; + } + } + }); + + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/animal-comp-utils.js b/client/vue-src/legacy-js/sheet/utils/animal-comp-utils.js new file mode 100644 index 00000000..6a704222 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/animal-comp-utils.js @@ -0,0 +1,438 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getAnimalCompanionMaxHealth(charAnimal){ + + let animal = g_companionData.AllAnimalCompanions.find(animal => { + return animal.id == charAnimal.animalCompanionID; + }); + if(animal == null){ + return -1; + } + + let maxHP = animal.hitPoints; + maxHP += (6+getAnimalModCon(animal, charAnimal))*g_character.level; + + return maxHP; + +} + +//// + +let g_animalSpecialArray = null; +function initAnimalSpecializationArray(charAnimal){ + if(charAnimal.specialization == 'NONE'){ + g_animalSpecialArray = []; + } else { + try { + g_animalSpecialArray = JSON.parse(charAnimal.specialization); + } catch (error) { + g_animalSpecialArray = []; + } + } +} + +function animalHasSpecial(specialName){ + return g_animalSpecialArray.includes(specialName); +} + +function animalHasAnySpecial(){ + return g_animalSpecialArray.length > 0; +} + +//// + +function getAnimalModStr(animal, charAnimal){ + let modStr = animal.modStr; + if(animalHasSpecial('BULLY')){ modStr += 1; } + if(animalHasSpecial('WRECKER')){ modStr += 1; } + switch(charAnimal.age){ + case 'YOUNG': return modStr; + case 'MATURE': return modStr+1; + case 'NIMBLE': return modStr+2; + case 'SAVAGE': return modStr+3; + case 'INDOMITABLE': return modStr+2; + case 'UNSEEN': return modStr+2; + default: return -1; + } +} + +function getAnimalModDex(animal, charAnimal){ + let modDex = animal.modDex; + if(animalHasAnySpecial()){ modDex += 1; } + if(animalHasSpecial('AMBUSHER')){ modDex += 1; } + if(animalHasSpecial('DAREDEVIL')){ modDex += 1; } + switch(charAnimal.age){ + case 'YOUNG': return modDex; + case 'MATURE': return modDex+1; + case 'NIMBLE': return modDex+3; + case 'SAVAGE': return modDex+2; + case 'INDOMITABLE': return modDex+2; + case 'UNSEEN': return modDex+2; + default: return -1; + } +} + +function getAnimalModCon(animal, charAnimal){ + let modCon = animal.modCon; + if(animalHasSpecial('RACER')){ modCon += 1; } + switch(charAnimal.age){ + case 'YOUNG': return modCon; + case 'MATURE': return modCon+1; + case 'NIMBLE': return modCon+2; + case 'SAVAGE': return modCon+2; + case 'INDOMITABLE': return modCon+3; + case 'UNSEEN': return modCon+2; + default: return -1; + } +} + +function getAnimalModInt(animal, charAnimal){ + let modInt = animal.modInt; + if(animalHasAnySpecial()){ modInt += 2; } + switch(charAnimal.age){ + case 'YOUNG': return modInt; + case 'MATURE': return modInt; + case 'NIMBLE': return modInt; + case 'SAVAGE': return modInt; + case 'INDOMITABLE': return modInt; + case 'UNSEEN': return modInt; + default: return -1; + } +} + +function getAnimalModWis(animal, charAnimal){ + let modWis = animal.modWis; + if(animalHasSpecial('TRACKER')){ modWis += 1; } + switch(charAnimal.age){ + case 'YOUNG': return modWis; + case 'MATURE': return modWis+1; + case 'NIMBLE': return modWis+2; + case 'SAVAGE': return modWis+2; + case 'INDOMITABLE': return modWis+2; + case 'UNSEEN': return modWis+3; + default: return -1; + } +} + +function getAnimalModCha(animal, charAnimal){ + let modCha = animal.modCha; + if(animalHasSpecial('BULLY')){ modCha += 3; } + switch(charAnimal.age){ + case 'YOUNG': return modCha; + case 'MATURE': return modCha; + case 'NIMBLE': return modCha; + case 'SAVAGE': return modCha; + case 'INDOMITABLE': return modCha; + case 'UNSEEN': return modCha; + default: return -1; + } +} + +// + +function getAnimalDamageDieNumber(animal, charAnimal){ + if(animalHasAnySpecial()){ + return 3; + } + switch(charAnimal.age){ + case 'YOUNG': return 1; + case 'MATURE': return 2; + case 'NIMBLE': return 2; + case 'SAVAGE': return 2; + case 'INDOMITABLE': return 2; + case 'UNSEEN': return 2; + default: return -1; + } +} + +function getAnimalAdditionalDamage(animal, charAnimal){ + switch(charAnimal.age){ + case 'YOUNG': return 0; + case 'MATURE': return 0; + case 'NIMBLE': + if(animalHasAnySpecial()){ return 4; } + return 2; + case 'SAVAGE': + if(animalHasAnySpecial()){ return 6; } + return 3; + case 'INDOMITABLE': + if(animalHasAnySpecial()){ return 6; } + return 3; + case 'UNSEEN': + if(animalHasAnySpecial()){ return 6; } + return 3; + default: return -1; + } +} + +// + +function hasAnimalAdvancedManeuver(animal, charAnimal){ + switch(charAnimal.age){ + case 'YOUNG': return false; + case 'MATURE': return false; + case 'NIMBLE': return true; + case 'SAVAGE': return true; + case 'INDOMITABLE': return true; + case 'UNSEEN': return true; + default: return false; + } +} + +function hasAnimalMagicalAttacks(animal, charAnimal){ + switch(charAnimal.age){ + case 'YOUNG': return false; + case 'MATURE': return false; + case 'NIMBLE': return true; + case 'SAVAGE': return true; + case 'INDOMITABLE': return true; + case 'UNSEEN': return true; + default: return false; + } +} + +// + +function getAnimalSpecializationArray(charAnimal){ + if(!animalHasAnySpecial()){ + return null; + } + let specializationArray = []; + if(animalHasSpecial('AMBUSHER')){ + specializationArray.push('In your companion’s natural environment, it can use a (action: Sneak) action even if it’s currently observed. It gains a +2 circumstance bonus to initiative rolls using Stealth.'); + } + if(animalHasSpecial('BULLY')){ + // + } + if(animalHasSpecial('DAREDEVIL')){ + specializationArray.push('Your companion gains the deny advantage ability, so it isn’t flat-footed to hidden, undetected, or flanking creatures unless such a creature’s level is greater than yours.'); + } + if(animalHasSpecial('RACER')){ + specializationArray.push('Your companion gains a +10-foot status bonus to its Speed, swim Speed, or fly Speed (your choice).'); + } + if(animalHasSpecial('TRACKER')){ + specializationArray.push('Your companion can move at full Speed while following tracks.'); + } + if(animalHasSpecial('WRECKER')){ + specializationArray.push('Your companion’s unarmed attacks ignore half an object’s Hardness.'); + } + return specializationArray; +} + +// + +function getAnimalUnarmedAttacksNumUps(animal, charAnimal){ + if(animalHasAnySpecial()){ + return 2; + } + switch(charAnimal.age){ + case 'YOUNG': return 1; + case 'MATURE': return 1; + case 'NIMBLE': return 1; + case 'SAVAGE': return 1; + case 'INDOMITABLE': return 1; + case 'UNSEEN': return 1; + default: return -1; + } +} + +function getAnimalUnarmoredDefenseNumUps(animal, charAnimal){ + let cNumUps = 0; + if(animalHasSpecial('AMBUSHER')){ cNumUps += 1; } + if(animalHasSpecial('DAREDEVIL')){ cNumUps += 1; } + if(animalHasSpecial('SHADE')){ cNumUps += 1; } + switch(charAnimal.age){ + case 'YOUNG': return cNumUps+1; + case 'MATURE': return cNumUps+1; + case 'NIMBLE': return cNumUps+2; + case 'SAVAGE': return cNumUps+1; + case 'INDOMITABLE': return cNumUps+1; + case 'UNSEEN': return cNumUps+1; + default: return -1; + } +} + +// + +function getAnimalSize(animal, charAnimal){ + let matureSize = function(size){ + if(size == 'TINY'){ + return 'SMALL'; + } else if(size == 'SMALL' || size == 'SMALL-MED'){ + return 'MEDIUM'; + } else if(size == 'MEDIUM' || size == 'MED-LARGE'){ + return 'LARGE'; + } + return size; + }; + switch(charAnimal.age){ + case 'YOUNG': return animal.size; + case 'MATURE': return matureSize(animal.size); + case 'NIMBLE': return matureSize(animal.size); + case 'SAVAGE': return matureSize(matureSize(animal.size)); + case 'INDOMITABLE': return matureSize(matureSize(animal.size)); + case 'UNSEEN': return matureSize(animal.size); + default: return null; + } +} + +// + +function getAnimalSkillNumUps(animal, charAnimal, skillName){ + switch(skillName){ + case 'intimidation': return getAnimalIntimidationNumUps(animal, charAnimal); + case 'stealth': return getAnimalStealthNumUps(animal, charAnimal); + case 'survival': return getAnimalSurvivalNumUps(animal, charAnimal); + case 'acrobatics': return getAnimalAcrobaticsNumUps(animal, charAnimal); + case 'athletics': return getAnimalAthleticsNumUps(animal, charAnimal); + default: return 1; + } +} + +function getAnimalAcrobaticsNumUps(animal, charAnimal){ + if(animalHasSpecial('DAREDEVIL')){ return 3; } + switch(charAnimal.age){ + case 'YOUNG': return 1; + case 'MATURE': return 1; + case 'NIMBLE': return 2; + case 'SAVAGE': return 1; + case 'INDOMITABLE': return 1; + case 'UNSEEN': return 1; + default: return -1; + } +} + +function getAnimalAthleticsNumUps(animal, charAnimal){ + let cNumUps = 0; + if(animalHasSpecial('WRECKER')){ return 3; } + if(animalHasSpecial('BULLY')){ cNumUps += 1; } + switch(charAnimal.age){ + case 'YOUNG': return cNumUps+1; + case 'MATURE': return cNumUps+1; + case 'NIMBLE': return cNumUps+1; + case 'SAVAGE': return cNumUps+2; + case 'INDOMITABLE': return cNumUps+2; + case 'UNSEEN': return cNumUps+1; + default: return -1; + } +} + +function getAnimalIntimidationNumUps(animal, charAnimal){ + let cNumUps = animal.skills.includes('intimidation') ? 1 : 0; + if(animalHasSpecial('BULLY')){ cNumUps += 1; } + switch(charAnimal.age){ + case 'YOUNG': return cNumUps+0; + case 'MATURE': return cNumUps+1; + case 'NIMBLE': return cNumUps+1; + case 'SAVAGE': return cNumUps+1; + case 'INDOMITABLE': return cNumUps+1; + case 'UNSEEN': return cNumUps+1; + default: return -1; + } +} + +function getAnimalStealthNumUps(animal, charAnimal){ + let cNumUps = animal.skills.includes('stealth') ? 1 : 0; + if(animalHasSpecial('AMBUSHER')){ cNumUps += 1; } + switch(charAnimal.age){ + case 'YOUNG': return cNumUps+0; + case 'MATURE': return cNumUps+1; + case 'NIMBLE': return cNumUps+1; + case 'SAVAGE': return cNumUps+1; + case 'INDOMITABLE': return cNumUps+1; + case 'UNSEEN': return cNumUps+2; + default: return -1; + } +} + +function getAnimalSurvivalNumUps(animal, charAnimal){ + let cNumUps = animal.skills.includes('survival') ? 1 : 0; + if(animalHasSpecial('TRACKER')){ cNumUps += 1; } + switch(charAnimal.age){ + case 'YOUNG': return cNumUps+0; + case 'MATURE': return cNumUps+1; + case 'NIMBLE': return cNumUps+1; + case 'SAVAGE': return cNumUps+1; + case 'INDOMITABLE': return cNumUps+1; + case 'UNSEEN': return cNumUps+1; + default: return -1; + } +} + +// + +function getAnimalPerceptionNumUps(animal, charAnimal){ + if(animalHasAnySpecial()){ + return 3; + } + switch(charAnimal.age){ + case 'YOUNG': return 1; + case 'MATURE': return 2; + case 'NIMBLE': return 2; + case 'SAVAGE': return 2; + case 'INDOMITABLE': return 2; + case 'UNSEEN': return 2; + default: return -1; + } +} + +// + +function getAnimalFortitudeNumUps(animal, charAnimal){ + if(animalHasSpecial('RACER')){ return 4; } + if(animalHasAnySpecial()){ return 3; } + switch(charAnimal.age){ + case 'YOUNG': return 1; + case 'MATURE': return 2; + case 'NIMBLE': return 2; + case 'SAVAGE': return 2; + case 'INDOMITABLE': return 2; + case 'UNSEEN': return 2; + default: return -1; + } +} + +function getAnimalReflexNumUps(animal, charAnimal){ + if(animalHasAnySpecial()){ + return 3; + } + switch(charAnimal.age){ + case 'YOUNG': return 1; + case 'MATURE': return 2; + case 'NIMBLE': return 2; + case 'SAVAGE': return 2; + case 'INDOMITABLE': return 2; + case 'UNSEEN': return 2; + default: return -1; + } +} + +function getAnimalWillNumUps(animal, charAnimal){ + if(animalHasAnySpecial()){ + return 3; + } + switch(charAnimal.age){ + case 'YOUNG': return 1; + case 'MATURE': return 2; + case 'NIMBLE': return 2; + case 'SAVAGE': return 2; + case 'INDOMITABLE': return 2; + case 'UNSEEN': return 2; + default: return -1; + } +} + +// + +function getAnimalExtraText(animal, charAnimal){ + let extraText = ''; + if(animalHasSpecial('SHADE')){ + extraText += '

                      It gains darkvision, resistance 5 to all damage except force, and in areas of dim light or darkness, it can Step 10 feet instead of 5 feet.

                      '; + } + if(charAnimal.age == 'UNSEEN'){ + extraText += '

                      It deals an extra 1d4 precision damage against flat-footed targets.

                      '; + } + return extraText; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/calc-utils.js b/client/vue-src/legacy-js/sheet/utils/calc-utils.js new file mode 100644 index 00000000..708882e2 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/calc-utils.js @@ -0,0 +1,553 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getAttackAndDamage(itemData, invItem){ + + let strMod = getMod(getStatTotal(VARIABLE.SCORE_STR)); + let dexMod = getMod(getStatTotal(VARIABLE.SCORE_DEX)); + let strModDamage = strMod; + let dexModDamage = dexMod; + + let pre_strMod = getMod(g_preConditions_strScore); + let pre_dexMod = getMod(g_preConditions_dexScore); + + // Undo frightened & sickened condition penalty + let frightenedCondition = getCondition(18);// Hardcoded frightened condition ID + if(frightenedCondition != null){ + strModDamage += frightenedCondition.Value; + dexModDamage += frightenedCondition.Value; + } + let sickenedCondition = getCondition(28);// Hardcoded sickened condition ID + if(sickenedCondition != null){ + strModDamage += sickenedCondition.Value; + dexModDamage += sickenedCondition.Value; + } + if(strModDamage > pre_strMod){ + strModDamage = pre_strMod; + } + if(dexModDamage > pre_dexMod){ + dexModDamage = pre_dexMod; + } + + let tagArray = getItemTraitsArray(itemData, invItem); + + const weapStruct = { + attack: { + parts: new Map(), + conditionals: new Map(), + }, + damage: { + parts: new Map(), + conditionals: new Map(), + modifications: { + on_hit_damage: getWeapMod(invItem.id, 'DAMAGE-ON-HIT'), + on_crit_damage: getWeapMod(invItem.id, 'DAMAGE-ON-CRIT'), + on_hit_other: getWeapMod(invItem.id, 'OTHER-ON-HIT'), + on_crit_other: getWeapMod(invItem.id, 'OTHER-ON-CRIT'), + }, + die_type: '', + type: '', + } + }; + + for(const onHitWeapMod of getWeapMod(invItem.id, 'CONDITIONAL-ON-HIT')){ + weapStruct.damage.conditionals.set(onHitWeapMod, { Src: 'WEAP-MOD:ON-HIT' }); + } + for(const onCritWeapMod of getWeapMod(invItem.id, 'CONDITIONAL-ON-CRIT')){ + weapStruct.damage.conditionals.set(onCritWeapMod.mod, { Src: 'WEAP-MOD:ON-CRIT' }); + } + + weapStruct.damage.die_type = invItem.itemWeaponDieType; + if(weapStruct.damage.die_type == null){ + weapStruct.damage.die_type = itemData.WeaponData.dieType; + } + weapStruct.damage.type = invItem.itemWeaponDamageType; + if(weapStruct.damage.type == null){ + weapStruct.damage.type = itemData.WeaponData.damageType; + } + + // Bonuses from weapon custom bonus // + let weapAtkCustomBonus = invItem.itemWeaponAtkBonus; + if(weapAtkCustomBonus == null) { + weapAtkCustomBonus = 0; + } + weapStruct.attack.parts.set('Custom Attacks Bonus', weapAtkCustomBonus); + + let weapDmgCustomBonus = invItem.itemWeaponDmgBonus; + if(weapDmgCustomBonus == null) { + weapDmgCustomBonus = 0; + } + weapStruct.damage.parts.set('Custom Damage Bonus', weapDmgCustomBonus); + + if(itemData.WeaponData.isRanged == 1){/////////////////////////////////////////////////////////////////////////// + + let thrownTag = tagArray.find(tag => { + return 47 <= tag.id && tag.id <= 54; // Hardcoded Thrown Tag ID Range (47-54) + }); + let splashTag = tagArray.find(tag => { + return tag.id == 391; // Hardcoded Splash Tag ID + }); + let propulsiveTag = tagArray.find(tag => { + return tag.id == 653; // Hardcoded Propulsive Tag ID + }); + let brutalTag = tagArray.find(tag => { + return tag.id == 2223; // Hardcoded Brutal Tag ID + }); + + //////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////// Attack Bonus /////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + if(brutalTag != null){ + weapStruct.attack.parts.set('This is your Strength modifier. Because this weapon has the brutal trait, you use your Strength modifier instead of Dexterity on attack rolls.', strMod); + } else { + weapStruct.attack.parts.set('This is your Dexterity modifier. You add your Dexterity modifier to attack rolls with most ranged weapons.', dexMod); + } + + // Proficiency Bonus // + let profNumUps = weaponProfDetermineNumUps(itemData); + let profName = getProfNameFromNumUps(profNumUps); + if(profNumUps === 0 && gState_addLevelToUntrainedWeaponAttack && !gOption_hasProfWithoutLevel) { + let profAttackBonus = g_character.level; // Sheet-State, adds level to untrained weapons + weapStruct.attack.parts.set('This is your proficiency bonus. You are '+profName.toLowerCase()+' in this weapon but have an ability that adds your level ('+g_character.level+') to your proficiency bonus, making it '+signNumber(getBonusFromProfName(profName))+'.', profAttackBonus); + } else { + let profAttackBonus = getProfNumber(profNumUps, g_character.level); + if(gOption_hasProfWithoutLevel){ + weapStruct.attack.parts.set('This is your proficiency bonus. Because you are '+profName.toLowerCase()+' in this weapon, your proficiency bonus is '+signNumber(getBonusFromProfName(profName))+'.', profAttackBonus); + } else { + weapStruct.attack.parts.set('This is your proficiency bonus. Because you are '+profName.toLowerCase()+' in this weapon, your proficiency bonus is equal to your level ('+g_character.level+') plus '+getBonusFromProfName(profName)+'.', profAttackBonus); + } + } + + // Potency Bonus // + let potencyRuneBonus = 0; + if(isWeaponPotencyOne(invItem.fundPotencyRuneID)){ + potencyRuneBonus = 1; + } else if(isWeaponPotencyTwo(invItem.fundPotencyRuneID)){ + potencyRuneBonus = 2; + } else if(isWeaponPotencyThree(invItem.fundPotencyRuneID)){ + potencyRuneBonus = 3; + } else if(isWeaponPotencyFour(invItem.fundPotencyRuneID)){ + potencyRuneBonus = 4; + } + if(gOption_hasAutoBonusProgression){ potencyRuneBonus = 0; } + weapStruct.attack.parts.set('This is the item bonus granted by this weapon\'s potency rune.', potencyRuneBonus); + + // Shoddy Penalty // + let shoddyPenalty = (invItem.isShoddy == 1) ? -2 : 0; + weapStruct.attack.parts.set('This is the item penalty applied due to this weapon being shoddy.', shoddyPenalty); + + // Bonus for - Attacks // + let extraAttackBonus = getStatBonusTotal(VARIABLE.ATTACKS); + if(extraAttackBonus == null) { extraAttackBonus = 0; } + weapStruct.attack.parts.set('This bonus is being added by an effect that adds a bonus to all attacks.', extraAttackBonus); + weapStruct.attack.conditionals = + new Map([...weapStruct.attack.conditionals, ...getConditionalStatMap(VARIABLE.ATTACKS)]); + + // Bonus for - Ranged Attacks // + let extraAttackRangedBonus = getStatBonusTotal(VARIABLE.RANGED_ATTACKS); + if(extraAttackRangedBonus == null) { extraAttackRangedBonus = 0; } + weapStruct.attack.parts.set('This bonus is being added by an effect that adds a bonus to all ranged attacks.', extraAttackRangedBonus); + weapStruct.attack.conditionals = + new Map([...weapStruct.attack.conditionals, ...getConditionalStatMap(VARIABLE.RANGED_ATTACKS)]); + + // User-Added Bonus // + let profData = g_weaponProfMap.get(itemData.WeaponData.profName); + let profUserBonus = null; + if(profData != null){ + profUserBonus = profData.UserBonus; + } else { + profUserBonus = 0; + } + weapStruct.attack.parts.set('This is a custom bonus that\'s been added manually.', profUserBonus); + + + // Totaling Attack Bonus // + let totalAttackBonus = 0; + for(const [source, amount] of weapStruct.attack.parts.entries()){ + totalAttackBonus += amount; + } + let attackBonus = signNumber(totalAttackBonus); + + //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////// Damage ////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + // Number of Dice for Damage // + let diceNum = itemData.WeaponData.diceNum; + if(isStriking(invItem.fundRuneID)){ + diceNum = 2; + } else if(isGreaterStriking(invItem.fundRuneID)){ + diceNum = 3; + } else if(isMajorStriking(invItem.fundRuneID)){ + diceNum = 4; + } + + let overrideAttacksDmgDice = getStatBonusTotal(VARIABLE.ATTACKS_DMG_DICE); + if(overrideAttacksDmgDice != null) { diceNum = overrideAttacksDmgDice; } + let overrideMeleeDmgDice = getStatBonusTotal(VARIABLE.RANGED_ATTACKS_DMG_DICE); + if(overrideMeleeDmgDice != null) { diceNum = overrideMeleeDmgDice; } + + // Ability Score Modifier // + let dmgStrBonus = 0; + if(propulsiveTag != null){ + if(strModDamage >= 0){ + let strAmt = Math.floor(strModDamage/2); + if(strAmt != 0){ + dmgStrBonus = strAmt; + weapStruct.damage.parts.set('This is half of your Strength modifier. Because this weapon has the propulsive trait and you have a positive Strength modifier, you add half of your Strength modifier (rounded down) to the damage.', dmgStrBonus); + } + } else { + dmgStrBonus = strModDamage; + weapStruct.damage.parts.set('This is your Strength modifier. Because this weapon has the propulsive trait and you have a negative Strength modifier, you add your full Strength modifier to the damage.', dmgStrBonus); + } + } + if(thrownTag != null && splashTag == null && strModDamage != 0){ + dmgStrBonus = strModDamage; + weapStruct.damage.parts.set('This is your Strength modifier. Because this is a thrown ranged weapon, you add your Strength modifier to the damage.', dmgStrBonus); + } + + // Weapon Specialization // + if(g_specializationStruct.GreaterWeaponSpecial){ // Hardcoded bonuses + let weapSpecialBonus = 0; + if(profNumUps === 2) { + weapSpecialBonus = 4; + } else if(profNumUps === 3) { + weapSpecialBonus = 6; + } else if(profNumUps === 4) { + weapSpecialBonus = 8; + } + weapStruct.damage.parts.set('This is the extra damage being added due to your Greater Weapon Specialization class feature.', weapSpecialBonus); + } else { + if(g_specializationStruct.WeaponSpecial){ + let weapSpecialBonus = 0; + if(profNumUps === 2) { + weapSpecialBonus = 2; + } else if(profNumUps === 3) { + weapSpecialBonus = 3; + } else if(profNumUps === 4) { + weapSpecialBonus = 4; + } + weapStruct.damage.parts.set('This is the extra damage being added due to your Weapon Specialization class feature.', weapSpecialBonus); + } + } + + // Bonus for - Weapons // + let weapExtraBonus = getStatBonusTotal(VARIABLE.ATTACKS_DMG_BONUS); + if(weapExtraBonus == null) { weapExtraBonus = 0; } + weapStruct.damage.parts.set('This bonus is being added by an effect that adds a bonus to damage with all attacks.', weapExtraBonus); + weapStruct.damage.conditionals = + new Map([...weapStruct.damage.conditionals, ...getConditionalStatMap(VARIABLE.ATTACKS_DMG_BONUS)]); + + // Bonus for - Ranged Weapons // + let weapRangedExtraBonus = getStatBonusTotal(VARIABLE.RANGED_ATTACKS_DMG_BONUS); + if(weapRangedExtraBonus == null) { + weapRangedExtraBonus = 0; + } + weapStruct.damage.parts.set('This bonus is being added by an effect that adds a bonus to damage with all ranged attacks.', weapRangedExtraBonus); + weapStruct.damage.conditionals = + new Map([...weapStruct.damage.conditionals, ...getConditionalStatMap(VARIABLE.RANGED_ATTACKS_DMG_BONUS)]); + + // Totaling Damage // + let totalDamageBonus = 0; + for(const [source, amount] of weapStruct.damage.parts.entries()){ + totalDamageBonus += amount; + } + let totalDamageBonusStr = (totalDamageBonus != 0) ? signNumber(totalDamageBonus) : ''; + + // Finalizing Damage into Display String // + let damage = ''; + let damageDice = ''; + if(weapStruct.damage.die_type != 'NONE') { + let maxDamage = diceNum*dieTypeToNum(weapStruct.damage.die_type)+totalDamageBonus; + if(maxDamage >= 1) { + damage = diceNum+""+weapStruct.damage.die_type+totalDamageBonusStr+" "+weapStruct.damage.type; + } else { + damage = '1 '+weapStruct.damage.type; + } + damageDice = diceNum+''+weapStruct.damage.die_type; + } else { + damage = '-'; + damageDice = '-'; + } + + return { AttackBonus : attackBonus, Damage : damage, DamageDice : damageDice, WeapStruct: weapStruct }; + + } else if(itemData.WeaponData.isMelee == 1){ ////////////////////////////////////////////////////////////// + + let splashTag = tagArray.find(tag => { + return tag.id == 391; // Hardcoded Splash Tag ID + }); + let agileTag = tagArray.find(tag => { + return tag.id == 43; // Hardcoded Agile Tag ID + }); + let finesseTag = tagArray.find(tag => { + return tag.id == 42; // Hardcoded Finesse Tag ID + }); + + //////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////// Attack Bonus /////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + let useDexForAttack = false; + if(finesseTag != null){ + if(dexMod > strMod){ + weapStruct.attack.parts.set('This is your Dexterity modifier. Because this weapon has the finesse trait, you can use your Dexterity modifier instead of Strength on attack rolls.', dexMod); + useDexForAttack = true; + } + // Use preDex mod because Clumsy condition affects ranged attacks but not finesse melee attacks? + } + if(!useDexForAttack){ + weapStruct.attack.parts.set('This is your Strength modifier. You add your Strength modifier to attack rolls with most melee weapons.', strMod); + } + + // Proficiency Bonus // + let profNumUps = weaponProfDetermineNumUps(itemData); + let profName = getProfNameFromNumUps(profNumUps); + if(profNumUps === 0 && gState_addLevelToUntrainedWeaponAttack && !gOption_hasProfWithoutLevel) { + let profAttackBonus = g_character.level; // Sheet-State, adds level to untrained weapons + weapStruct.attack.parts.set('This is your proficiency bonus. You are '+profName.toLowerCase()+' in this weapon but have an ability that adds your level ('+g_character.level+') to your proficiency bonus, making it '+signNumber(getBonusFromProfName(profName)+g_character.level)+'.', profAttackBonus); + } else { + let profAttackBonus = getProfNumber(profNumUps, g_character.level); + if(gOption_hasProfWithoutLevel){ + weapStruct.attack.parts.set('This is your proficiency bonus. Because you are '+profName.toLowerCase()+' in this weapon, your proficiency bonus is '+signNumber(getBonusFromProfName(profName))+'.', profAttackBonus); + } else { + weapStruct.attack.parts.set('This is your proficiency bonus. Because you are '+profName.toLowerCase()+' in this weapon, your proficiency bonus is equal to your level ('+g_character.level+') plus '+getBonusFromProfName(profName)+'.', profAttackBonus); + } + } + + // Potency Bonus // + let potencyRuneBonus = 0; + if(isWeaponPotencyOne(invItem.fundPotencyRuneID)){ + potencyRuneBonus = 1; + } else if(isWeaponPotencyTwo(invItem.fundPotencyRuneID)){ + potencyRuneBonus = 2; + } else if(isWeaponPotencyThree(invItem.fundPotencyRuneID)){ + potencyRuneBonus = 3; + } else if(isWeaponPotencyFour(invItem.fundPotencyRuneID)){ + potencyRuneBonus = 4; + } + if(gOption_hasAutoBonusProgression){ potencyRuneBonus = 0; } + weapStruct.attack.parts.set('This is the item bonus granted by this weapon\'s potency rune.', potencyRuneBonus); + + // Shoddy Penalty // + let shoddyPenalty = (invItem.isShoddy == 1) ? -2 : 0; + weapStruct.attack.parts.set('This is the item penalty applied due to this weapon being shoddy.', shoddyPenalty); + + // Bonus for - Attacks // + let extraAttackBonus = getStatBonusTotal(VARIABLE.ATTACKS); + if(extraAttackBonus == null) { extraAttackBonus = 0; } + weapStruct.attack.parts.set('This bonus is being added by an effect that adds a bonus to all attacks.', extraAttackBonus); + weapStruct.attack.conditionals = + new Map([...weapStruct.attack.conditionals, ...getConditionalStatMap(VARIABLE.ATTACKS)]); + + // Bonus for - Melee Attacks // + let extraAttackMeleeBonus = getStatBonusTotal(VARIABLE.MELEE_ATTACKS); + if(extraAttackMeleeBonus == null) { extraAttackMeleeBonus = 0; } + weapStruct.attack.parts.set('This bonus is being added by an effect that adds a bonus to all melee attacks.', extraAttackMeleeBonus); + weapStruct.attack.conditionals = + new Map([...weapStruct.attack.conditionals, ...getConditionalStatMap(VARIABLE.MELEE_ATTACKS)]); + + // User-Added Bonus // + let profData = g_weaponProfMap.get(itemData.WeaponData.profName); + let profUserBonus = null; + if(profData != null){ + profUserBonus = profData.UserBonus; + } else { + profUserBonus = 0; + } + weapStruct.attack.parts.set('This is a custom bonus that\'s been added manually.', profUserBonus); + + // Improvised Weapon, take -2 item penalty + if(itemData.Item.id == IMPROVISED_ITEM_ID && !gState_improvisedWeaponNoPenalty){ + weapStruct.attack.parts.set('This item penalty occurs when attacking with an improvised weapon.', -2); + } + + // Totaling Attack Bonus // + let totalAttackBonus = 0; + for(const [source, amount] of weapStruct.attack.parts.entries()){ + totalAttackBonus += amount; + } + let attackBonus = signNumber(totalAttackBonus); + + //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////// Damage ////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + // Number of Dice for Damage // + let diceNum = itemData.WeaponData.diceNum; + if(isStriking(invItem.fundRuneID)){ + diceNum = 2; + } else if(isGreaterStriking(invItem.fundRuneID)){ + diceNum = 3; + } else if(isMajorStriking(invItem.fundRuneID)){ + diceNum = 4; + } + + let overrideAttacksDmgDice = getStatBonusTotal(VARIABLE.ATTACKS_DMG_DICE); + if(overrideAttacksDmgDice != null) { diceNum = overrideAttacksDmgDice; } + let overrideMeleeDmgDice = getStatBonusTotal(VARIABLE.MELEE_ATTACKS_DMG_DICE); + if(overrideMeleeDmgDice != null) { diceNum = overrideMeleeDmgDice; } + + // Ability Score Modifier // + let dmgStrBonus = 0; + if(gState_hasFinesseMeleeUseDexDamage && finesseTag != null){ + if(dexModDamage > strModDamage) { + if(dexModDamage != 0){ + dmgStrBonus = dexModDamage; + weapStruct.damage.parts.set('This is your Dexterity modifier. You\'re adding Dexterity instead of Strength to your weapon\'s damage, because this weapon has the finesse trait and you have an ability that allows you to use your Dexterity modifier instead of Strength for damage with finesse weapons.', dmgStrBonus); + } + } else { + if(strModDamage != 0){ + dmgStrBonus = strModDamage; + weapStruct.damage.parts.set('This is your Strength modifier. You have an ability that allows you to use your Dexterity modifier instead of Strength for damage with finesse weapons. However, your Strength modifier is greater than your Dexterity so it is being used instead.', dmgStrBonus); + } + } + } else { + if(splashTag == null && strModDamage != 0){ + dmgStrBonus = strModDamage; + weapStruct.damage.parts.set('This is your Strength modifier. You generally add your Strength modifier to damage with melee weapons.', dmgStrBonus); + } + } + + // Weapon Specialization // + if(g_specializationStruct.GreaterWeaponSpecial){ // Hardcoded bonuses + let weapSpecialBonus = 0; + if(profNumUps === 2) { + weapSpecialBonus = 4; + } else if(profNumUps === 3) { + weapSpecialBonus = 6; + } else if(profNumUps === 4) { + weapSpecialBonus = 8; + } + weapStruct.damage.parts.set('This is the extra damage being added due to your Greater Weapon Specialization class feature.', weapSpecialBonus); + } else { + if(g_specializationStruct.WeaponSpecial){ + let weapSpecialBonus = 0; + if(profNumUps === 2) { + weapSpecialBonus = 2; + } else if(profNumUps === 3) { + weapSpecialBonus = 3; + } else if(profNumUps === 4) { + weapSpecialBonus = 4; + } + weapStruct.damage.parts.set('This is the extra damage being added due to your Weapon Specialization class feature.', weapSpecialBonus); + } + } + + // Bonus for - Weapons // + let weapExtraBonus = getStatBonusTotal(VARIABLE.ATTACKS_DMG_BONUS); + if(weapExtraBonus == null) { weapExtraBonus = 0; } + weapStruct.damage.parts.set('This bonus is being added by an effect that adds a bonus to damage with all attacks.', weapExtraBonus); + weapStruct.damage.conditionals = + new Map([...weapStruct.damage.conditionals, ...getConditionalStatMap(VARIABLE.ATTACKS_DMG_BONUS)]); + + // Bonus for - Melee Weapons // + let weapMeleeExtraBonus = getStatBonusTotal(VARIABLE.MELEE_ATTACKS_DMG_BONUS); + if(weapMeleeExtraBonus == null) { + weapMeleeExtraBonus = 0; + } + weapStruct.damage.parts.set('This bonus is being added by an effect that adds a bonus to damage with all melee attacks.', weapMeleeExtraBonus); + weapStruct.damage.conditionals = + new Map([...weapStruct.damage.conditionals, ...getConditionalStatMap(VARIABLE.MELEE_ATTACKS_DMG_BONUS)]); + + // Bonus for - Agile Melee Weapons // + let weapMeleeAgileExtraBonus = getStatBonusTotal(VARIABLE.AGILE_MELEE_ATTACKS_DMG_BONUS); + let weapMeleeNonAgileExtraBonus = getStatBonusTotal(VARIABLE.NON_AGILE_MELEE_ATTACKS_DMG_BONUS); + if(agileTag != null){ + if(weapMeleeAgileExtraBonus == null) { + weapMeleeAgileExtraBonus = 0; + } + weapStruct.damage.parts.set('This bonus is being added by an effect that adds a bonus to damage with all agile, melee attacks.', weapMeleeAgileExtraBonus); + weapStruct.damage.conditionals = + new Map([...weapStruct.damage.conditionals, ...getConditionalStatMap(VARIABLE.AGILE_MELEE_ATTACKS_DMG_BONUS)]); + } else { + if(weapMeleeNonAgileExtraBonus == null) { + weapMeleeNonAgileExtraBonus = 0; + } + weapStruct.damage.parts.set('This bonus is being added by an effect that adds a bonus to damage with all non-agile, melee attacks.', weapMeleeNonAgileExtraBonus); + weapStruct.damage.conditionals = + new Map([...weapStruct.damage.conditionals, ...getConditionalStatMap(VARIABLE.NON_AGILE_MELEE_ATTACKS_DMG_BONUS)]); + } + + // Totaling Damage // + let totalDamageBonus = 0; + for(const [source, amount] of weapStruct.damage.parts.entries()){ + totalDamageBonus += amount; + } + let totalDamageBonusStr = (totalDamageBonus != 0) ? signNumber(totalDamageBonus) : ''; + + // Finalizing Damage into Display String // + let damage = ''; + let damageDice = ''; + if(weapStruct.damage.die_type != 'NONE') { + let maxDamage = diceNum*dieTypeToNum(weapStruct.damage.die_type)+totalDamageBonus; + if(maxDamage >= 1) { + damage = diceNum+""+weapStruct.damage.die_type+totalDamageBonusStr+" "+weapStruct.damage.type; + } else { + damage = '1 '+weapStruct.damage.type; + } + damageDice = diceNum+''+weapStruct.damage.die_type; + } else { + damage = '-'; + damageDice = '-'; + } + + return { AttackBonus : attackBonus, Damage : damage, DamageDice : damageDice, WeapStruct: weapStruct }; + + } else { + return { AttackBonus : null, Damage : null, WeapStruct: null }; + } + +} + + +// MAP Calc // +function generateMAP(attackBonus, itemTagArray) { + + attackBonus = parseInt(attackBonus); + let agileTag = itemTagArray.find(tag => { + return tag.id == 43; // Hardcoded Agile Tag ID + }); + + if(gState_MAP == 'TIER_1'){ + if(agileTag == null){ + return {one:signNumber(attackBonus),two:signNumber(attackBonus-5),three:signNumber(attackBonus-10)}; + } else { + return {one:signNumber(attackBonus),two:signNumber(attackBonus-4),three:signNumber(attackBonus-8)}; + } + } else if(gState_MAP == 'TIER_2'){ + if(agileTag == null){ + return {one:signNumber(attackBonus),two:signNumber(attackBonus-4),three:signNumber(attackBonus-8)}; + } else { + return {one:signNumber(attackBonus),two:signNumber(attackBonus-3),three:signNumber(attackBonus-6)}; + } + } else if(gState_MAP == 'TIER_2_AGILE'){ + if(agileTag == null){ + return {one:signNumber(attackBonus),two:signNumber(attackBonus-5),three:signNumber(attackBonus-10)}; + } else { + return {one:signNumber(attackBonus),two:signNumber(attackBonus-3),three:signNumber(attackBonus-6)}; + } + } else if(gState_MAP == 'TIER_3'){ + if(agileTag == null){ + return {one:signNumber(attackBonus),two:signNumber(attackBonus-3),three:signNumber(attackBonus-6)}; + } else { + return {one:signNumber(attackBonus),two:signNumber(attackBonus-2),three:signNumber(attackBonus-4)}; + } + } else if(gState_MAP == 'TIER_4'){ + if(agileTag == null){ + return {one:signNumber(attackBonus),two:signNumber(attackBonus-2),three:signNumber(attackBonus-4)}; + } else { + return {one:signNumber(attackBonus),two:signNumber(attackBonus-1),three:signNumber(attackBonus-2)}; + } + } + +} + +function generateStringMAP(attackBonus, itemTagArray){ + + let map = generateMAP(attackBonus, itemTagArray); + return `${map.one}/${map.two}/${map.three}`; + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/dice-roller.js b/client/vue-src/legacy-js/sheet/utils/dice-roller.js new file mode 100644 index 00000000..457cae91 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/dice-roller.js @@ -0,0 +1,132 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_rollHistory = []; + +function initDiceRoller(){ + + if(gOption_hasDiceRoller){ + // Stat Roller Btns // + refreshStatRollButtons(); + + // Dice Notation Btns // + refreshDiceNotationButtons(); + } + +} + +function refreshStatRollButtons() { + window.setTimeout(() => { + $('.stat-roll-btn').removeClass('pr-1'); + $('.stat-roll-btn').addClass('button is-outlined is-info is-small'); + $('.stat-roll-btn').click(function() { + let bonus = parseInt($(this).text()); + makeDiceRoll(1, 20, bonus, diceRoller_getQuickViewLabel()); + }); + + $('.damage-roll-btn').addClass('button is-outlined is-info is-small mb-05'); + $('.damage-roll-btn').click(function() { + let damageText = $(this).text(); + let match = damageText.match(/(^| )(\d+)+d(\d+)((\s*[+-]\s*\d+)*)/m); + if(match != null){ + + let diceNum = parseInt(match[2]); + let dieSize = parseInt(match[3]); + let bonus = parseInt(math.evaluate(match[4])); + let endStr = damageText.replace(match[0], '').trim(); + let doubleResult = $(this).hasClass('damage-roll-double-result'); + makeDiceRoll(diceNum, dieSize, bonus, diceRoller_getQuickViewLabel(), endStr, doubleResult); + + } + }); + }, 100); +} + + +function refreshDiceNotationButtons(){ + window.setTimeout(() => { + $('.dice-roll-btn').off(); + $('.dice-roll-btn').click(function() { + let diceNum = $(this).attr('data-dice-num'); + let diceType = $(this).attr('data-dice-type'); + let bonus = parseInt(math.evaluate($(this).attr('data-dice-bonus').replace(/[^(\d|\W)]/g,''))); + let endStr = $(this).attr('data-dice-dmg-type'); if(endStr == null){ endStr = ''; } + + makeDiceRoll(diceNum, diceType, bonus, diceRoller_getQuickViewLabel(), endStr); + $(this).blur(); + }); + }, 100); +} + +function processDiceNotation(text){ + + text = processTextBakeSheetVariables(text); + text = processTextRemoveTooltips(text, /((\d+)+d(\d+)|\+(\d+)|\+ (\d+))/g); + + let notationDmgTypeRegex = /(^| )(\d+)+d(\d+)((\s*[+-]\s*\d+)*)( ([^ \n]+) damage)/g; + text = text.replace(notationDmgTypeRegex, function(match, startSpace, diceNum, diceType, bonus, endBonus, endStr, dmgType) { + return `${startSpace}${endStr}`; + }); + + let notationRegex = /(^| )(\d+)+d(\d+)((\s*[+-]\s*\d+)*)/g; + text = text.replace(notationRegex, function(match, startSpace, diceNum, diceType, bonus) { + return `${startSpace}`; + }); + + return text; + +} + + +function makeDiceRoll(diceNum, dieType, bonus, label, resultSuffix='', doubleResult=false){ + let rollStruct = diceRoller_getDiceRoll(diceNum, dieType, bonus, label, resultSuffix, doubleResult); + g_rollHistory.push(rollStruct); + openLeftQuickView('Dice Roller'); + + let rollHistoryJSON = JSON.stringify(g_rollHistory); + + socket.emit("requestRollHistorySave", + getCharIDFromURL(), + rollHistoryJSON); + sendOutUpdateToGM('roll-history', rollHistoryJSON); +} + +//// Math Rands //// +function diceRoller_getDiceRoll(diceNum, dieType, bonus, label, resultSuffix='', doubleResult=false){ + if(bonus == null || isNaN(bonus)) { bonus = 0; } + let rollStruct = {Total: null, ResultData: null, RollData: {DiceNum: diceNum, DieType: dieType, Bonus: bonus} }; + let total = 0; let resultData = []; + for (let i = 0; i < diceNum; i++) { + let result = diceRoller_getRandomNumber(dieType); + resultData.push(result); + total += result; + } + total += bonus; + rollStruct.Total = total; + rollStruct.ResultData = resultData; + rollStruct.Label = { Name: label }; + rollStruct.DoubleResult = doubleResult; + rollStruct.ResultSuffix = resultSuffix; + + let currentDate = new Date(); + rollStruct.Timestamp = { + Date: currentDate.toLocaleDateString(), + Time: currentDate.toLocaleTimeString(), + UTC_Time: currentDate.toUTCString(), + }; + + return rollStruct; +} + +function diceRoller_getRandomNumber(max) { + return Math.floor(Math.random()*Math.floor(max))+1; +} + +function diceRoller_getQuickViewLabel(){ + let label = null; + if($('#quickviewDefault').hasClass('is-active')){ + label = $('#quickViewTitle').html().split('<')[0]; + } + return label; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/familiar-utils.js b/client/vue-src/legacy-js/sheet/utils/familiar-utils.js new file mode 100644 index 00000000..517e72e6 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/familiar-utils.js @@ -0,0 +1,295 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_familiarAbilitiesMap = new Map(); + +function processFamiliarAbilities(charFamiliar){ + if(charFamiliar.abilitiesJSON == null) { return; } + let abilitiesArray = []; + let abilityNamesArray = JSON.parse(charFamiliar.abilitiesJSON); + for(let abilityName of abilityNamesArray) { + let famAbility = g_companionData.AllFamiliarAbilities.find(famAbility => { + return famAbility.name === abilityName; + }); + if(famAbility != null){ + abilitiesArray.push(famAbility); + } + } + g_familiarAbilitiesMap.set(charFamiliar.id, abilitiesArray); + processFamiliarAbilityCode(charFamiliar.id, abilitiesArray); +} + +// Familiar Abilities - Code // +let g_familiarSpeedsMap = new Map(); +let g_familiarSensesMap = new Map(); +let g_familiarHPMap = new Map(); + +let temp_charFamiliarID = null; +function processFamiliarAbilityCode(charFamiliarID, abilitiesArray){ + temp_charFamiliarID = charFamiliarID; + + g_familiarSpeedsMap.set(temp_charFamiliarID, []); + g_familiarSensesMap.set(temp_charFamiliarID, []); + g_familiarHPMap.set(temp_charFamiliarID, []); + + for(let ability of abilitiesArray){ + let abilCode = ability.code; + if(abilCode == null) { continue; } + + let regexFamSpeed = /FAMILIAR-GIVE-SPEED=(.+)/ig; // FAMILIAR-GIVE-SPEED=swim 25 + abilCode = abilCode.replace(regexFamSpeed, handleFamiliarSpeed); + + let regexFamSense = /FAMILIAR-GIVE-SENSE=(.+)/ig; // FAMILIAR-GIVE-SENSE=darkvision + abilCode = abilCode.replace(regexFamSense, handleFamiliarSense); + + let regexFamMaxHP = /FAMILIAR-GIVE-MAX-HP=(\d+)/ig; // FAMILIAR-GIVE-MAX-HP=2 + abilCode = abilCode.replace(regexFamMaxHP, handleFamiliarMaxHP); + + processSheetCode(abilCode, { + source: 'Familiar', + sourceName: ability.name+' Familiar Ability', + charFamiliarID: charFamiliarID, + familiarAbilityID: ability.id, + }); + + // Handle NoteField Statements // + let noteFieldSrcStruct = { + sourceType: 'familiar', + sourceLevel: 0, + sourceCode: 'familiarAbility-'+charFamiliarID+'-'+ability.id, + sourceCodeSNum: 'a', + }; + let rNoteField = abilCode.match(/GIVE-NOTES-FIELD=(.+)/i); + if(rNoteField != null){ + socket.emit("requestNotesFieldChange", + getCharIDFromURL(), + noteFieldSrcStruct, + rNoteField[1], + null); + } else { + socket.emit("requestNotesFieldDelete", + getCharIDFromURL(), + noteFieldSrcStruct); + } + + } + +} + +function handleFamiliarSpeed(match, innerText){ + let speedArray = g_familiarSpeedsMap.get(temp_charFamiliarID); + if(speedArray != null){ + speedArray.push(innerText); + g_familiarSpeedsMap.set(temp_charFamiliarID, speedArray); + } + return ''; +} + +function handleFamiliarSense(match, innerText){ + let senseArray = g_familiarSensesMap.get(temp_charFamiliarID); + if(senseArray != null){ + senseArray.push(innerText); + g_familiarSensesMap.set(temp_charFamiliarID, senseArray); + } + return ''; +} + +function handleFamiliarMaxHP(match, innerText){ + let hpArray = g_familiarHPMap.get(temp_charFamiliarID); + if(hpArray != null){ + hpArray.push(parseInt(innerText)); + g_familiarHPMap.set(temp_charFamiliarID, hpArray); + } + return ''; +} + +//// + +function getFamiliarMaxHealth(charFamiliar){ + let hpArray = g_familiarHPMap.get(charFamiliar.id); + let hpIncrease = 5; + if(hpArray != null){ + for(let hp of hpArray){ + hpIncrease += hp; + } + } + return g_character.level * hpIncrease; +} + +//// + +function getFamiliarAC(){ + // Remove circumstance or status bonuses / penalties + /* + CIRCUM_BONUS, STATUS_BONUS, CIRCUM_PENALTY, STATUS_PENALTY + */ + let totalAC = g_calculatedStats.totalAC; + let statMap = getStatMap(VARIABLE.AC); + + let removalMod = 0; + + let stat_circumBonus = statMap.get('CIRCUM_BONUS'); + if(stat_circumBonus != null) { removalMod += stat_circumBonus.Value; } + + let stat_statusBonus = statMap.get('STATUS_BONUS'); + if(stat_statusBonus != null) { removalMod += stat_statusBonus.Value; } + + let stat_circumPenalty = statMap.get('CIRCUM_PENALTY'); + if(stat_circumPenalty != null) { removalMod += stat_circumPenalty.Value; } + + let stat_statusPenalty = statMap.get('STATUS_PENALTY'); + if(stat_statusPenalty != null) { removalMod += stat_statusPenalty.Value; } + + // Account for clumsy condition which could lower AC + let dexModChange = 0; + if(getStatTotal(VARIABLE.SCORE_DEX) != g_preConditions_dexScore){ + let dexCap = getStatBonusTotal(VARIABLE.DEX_CAP); + + let pre_dexMod = getMod(g_preConditions_dexScore); + let pre_dexModCapped = (dexCap != null) ? ((pre_dexMod > dexCap) ? dexCap : pre_dexMod) : pre_dexMod; + + let dexMod = getMod(getStatTotal(VARIABLE.SCORE_DEX)); + let dexModCapped = (dexCap != null) ? ((dexMod > dexCap) ? dexCap : dexMod) : dexMod; + + dexModChange = pre_dexModCapped - dexModCapped; + } + + return totalAC - removalMod + dexModChange; +} + +function getFamiliarSpellBonus(){ + let levelBonus = g_character.level; + if(gOption_hasProfWithoutLevel) { levelBonus = 0; } + if(g_spellBookArray != null && g_spellBookArray.length > 0){ + let spellKeyAbility = g_spellBookArray[0].SpellKeyAbility; + if(spellKeyAbility == 'STR'){ + return levelBonus + getMod(g_preConditions_strScore); + } else if(spellKeyAbility == 'DEX'){ + return levelBonus + getMod(g_preConditions_dexScore); + } else if(spellKeyAbility == 'CON'){ + return levelBonus + getMod(g_preConditions_conScore); + } else if(spellKeyAbility == 'INT'){ + return levelBonus + getMod(g_preConditions_intScore); + } else if(spellKeyAbility == 'WIS'){ + return levelBonus + getMod(g_preConditions_wisScore); + } else if(spellKeyAbility == 'CHA'){ + return levelBonus + getMod(g_preConditions_chaScore); + } + } + return levelBonus + getMod(g_preConditions_chaScore); +} + +function getFamiliarMiscBonus(){ + if(gOption_hasProfWithoutLevel) { + return 0; + } else { + return g_character.level; + } +} + +function getFamiliarFortBonus(){ + return getStatTotal(VARIABLE.SAVE_FORT); +} +function getFamiliarReflexBonus(){ + return getStatTotal(VARIABLE.SAVE_REFLEX); +} +function getFamiliarWillBonus(){ + return getStatTotal(VARIABLE.SAVE_WILL); +} + +function getFamiliarPerception(){ + return getFamiliarSpellBonus(); +} + +function getFamiliarAcrobatics(){ + return getFamiliarSpellBonus(); +} + +function getFamiliarStealth(){ + return getFamiliarSpellBonus(); +} + +//// + +function getFamiliarSize(){ + return 'TINY'; +} + +function getFamiliarSense(charFamiliar){ + let senseArray = g_familiarSensesMap.get(charFamiliar.id); + let senseText = 'low-light vision, empathy (1 mile, only to you)'; + if(senseArray != null){ + for(let sense of senseArray){ + sense = sense.toLowerCase(); + if(sense.includes('vision')) { + senseText = senseText.replace('low-light vision, ', sense+', '); + } else { + senseText += ', '+sense; + } + } + } + return senseText; +} + +function getFamiliarSpeed(charFamiliar){ + let speedArray = g_familiarSpeedsMap.get(charFamiliar.id); + let speedText = '25'; + if(speedArray != null){ + for(let speed of speedArray){ + speedText += ', '+speed; + } + } + return speedText; +} + + + +function getFamiliarSpecificStruct(specificType){ + + let familiarStruct = g_companionData.AllSpecificFamiliars.find(struct => { + return struct.specificType === specificType; + }); + if(familiarStruct == null) {return null;} + + return { + SpecificType: familiarStruct.specificType, + Name: familiarStruct.name, + Alignment: familiarStruct.alignment, + Tags: JSON.parse(familiarStruct.tagsJSON), + Description: familiarStruct.description, + NumAbils: familiarStruct.numAbils, + AbilsJSON: familiarStruct.abilsJSON, + ExtraAbils: JSON.parse(familiarStruct.extraAbils) + }; + +} + +function displayFamiliarTraits(content, specificStruct){ + if(specificStruct == null) {return;} + let tagsInnerHTML = '
                      '; + for(const tag of specificStruct.Tags){ + tagsInnerHTML += ''; + } + tagsInnerHTML += '
                      '; + content.append(tagsInnerHTML); +} + +function displayFamiliarAlignment(content, specificStruct){ + if(specificStruct == null || specificStruct.Alignment == null) {return;} + content.append('
                      '); + content.append('

                      Alignment '+specificStruct.Alignment+'

                      '); +} + +function displayFamiliarReqAbils(content, specificStruct){ + if(specificStruct == null) {return;} + content.append('

                      Required Number of Abilities '+specificStruct.NumAbils+'

                      '); +} + +function displayFamiliarExtraAbils(content, specificStruct){ + if(specificStruct == null) {return;} + for(let extraAbil of specificStruct.ExtraAbils){ + content.append('
                      '); + content.append('
                      '+processText(extraAbil, true, true, 'MEDIUM')+'
                      '); + } +} diff --git a/client/vue-src/legacy-js/sheet/utils/item-actions-generator.js b/client/vue-src/legacy-js/sheet/utils/item-actions-generator.js new file mode 100644 index 00000000..81701ed6 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/item-actions-generator.js @@ -0,0 +1,114 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function findItemActionsFromInvItems(){ + let itemActions = []; + for(const invItem of g_invStruct.InvItems){ + if(invItem.description == null){ continue; } + + let actionsStruct = getActionsInText(invItem.description); + if(actionsStruct != null){ + itemActions.push({ + InvItem: invItem, + Item: g_itemMap.get(invItem.itemID+""), + Name: invItem.name, + Actions: actionsStruct, + }); + } + + } + return itemActions; +} + +function getActionsInText(text){ + + let textToTraits = function(text){ + let traitsArray = []; + if(text == null){ return traitsArray; } + + let actionsRegex = text.match(/^(.+?)(;|\*\*|$)/); + if(actionsRegex == null){ return traitsArray; } + + let textParts = actionsRegex[1].split(','); + for(let textPart of textParts){ + textPart = textPart.toLowerCase(); + if(textPart.includes('(action: interact') || textPart.includes('(action:interact')){ + traitsArray.push({ name: 'Manipulate' }); + } else if(textPart.includes('(action: strike') || textPart.includes('(action:strike')){ + traitsArray.push({ name: 'Attack' }); + } else if(textPart.includes('command')){ + traitsArray.push({ name: 'Auditory' }); + traitsArray.push({ name: 'Concentrate' }); + } else if(textPart.includes('envision')){ + traitsArray.push({ name: 'Concentrate' }); + } else if(textPart.includes('(trait:')){ + traitsArray.push({ name: + capitalizeFirstLetterOfWord(textPart.replace('(trait:','').replace(/\W/g,'').trim()) }); + } + } + + return traitsArray; + }; + + + let actions = { + free_action: null, + reaction: null, + one_action: null, + two_actions: null, + three_actions: null, + }; + let foundActions = false; + + let freeAction = text.match(/FREE-ACTION( (.+)(;|\n))?/); + if(freeAction != null){ + foundActions = true; + actions.free_action = { + actions: 'FREE_ACTION', + traits: textToTraits(freeAction[2]), + }; + } + + let reaction = text.match(/REACTION( (.+)(;|\n))?/); + if(reaction != null){ + foundActions = true; + actions.one_action = { + actions: 'REACTION', + traits: textToTraits(reaction[2]), + }; + } + + let oneAction = text.match(/ONE-ACTION( (.+)(;|\n))?/); + if(oneAction != null){ + foundActions = true; + actions.one_action = { + actions: 'ACTION', + traits: textToTraits(oneAction[2]), + }; + } + + let twoActions = text.match(/TWO-ACTIONS( (.+)(;|\n))?/); + if(twoActions != null){ + foundActions = true; + actions.two_actions = { + actions: 'TWO_ACTIONS', + traits: textToTraits(twoActions[2]), + }; + } + + let threeActions = text.match(/THREE-ACTIONS( (.+)(;|\n))?/); + if(threeActions != null){ + foundActions = true; + actions.three_actions = { + actions: 'THREE_ACTIONS', + traits: textToTraits(threeActions[2]), + }; + } + + if(foundActions){ + return actions; + } else { + return null; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/item-utils.js b/client/vue-src/legacy-js/sheet/utils/item-utils.js new file mode 100644 index 00000000..5d65966a --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/item-utils.js @@ -0,0 +1,427 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function doesntHaveItemHealth(invItem){ + return (invItem.hitPoints == 0); +} + +function getBulkFromNumber(bulkNumber){ + switch(bulkNumber) { + case 0: return '-'; + case 0.1: return 'L'; + case 0.01: return 'L / 10'; + default: return ''+round(bulkNumber, 2); + } +} + +function getHandsToString(hands){ + switch(hands) { + case "NONE": + return "-"; + case "ONE": + return "1"; + case "ONE_PLUS": + return "1+"; + case "TWO": + return "2"; + default: + return hands; + } +} + + +/* Coins */ +function getCoinToString(price) { + + if(price == 0){return "-";} + + let priceObj = {Value: price}; + let cStr = ""; let sStr = ""; let gStr = ""; let pStr = ""; + + if(price == 10){ + sStr = processSilver(priceObj); + } else if(price == 100){ + gStr = processGold(priceObj); + } else if(price == 1000){ + //pStr = processPlatinum(priceObj); + gStr = processGold(priceObj); + } else { + if(price < 100) { // 99 or less + cStr = processCopper(priceObj); + } else if(100 <= price && price < 1000) { // 100 thru 999 + sStr = processSilver(priceObj); + cStr = processCopper(priceObj); + } else if(1000 <= price && price < 999999) { // 1000 thru 999,999 + gStr = processGold(priceObj); + sStr = processSilver(priceObj); + cStr = processCopper(priceObj); + } else { // 1,000,000 or greater + pStr = processPlatinum(priceObj); + gStr = processGold(priceObj); + sStr = processSilver(priceObj); + cStr = processCopper(priceObj); + } + } + + let cStr_sStr_ouput = reduceCoinStr(cStr, sStr); + cStr = cStr_sStr_ouput.current; sStr = cStr_sStr_ouput.upper; + + let sStr_gStr_ouput = reduceCoinStr(sStr, gStr); + sStr = sStr_gStr_ouput.current; gStr = sStr_gStr_ouput.upper; + + /*let gStr_pStr_ouput = reduceCoinStr(gStr, pStr); // Don't convert down to platinum // + gStr = gStr_pStr_ouput.current; pStr = gStr_pStr_ouput.upper;*/ + + // Add on currency type + if(pStr!='') {pStr += ' pp';} + if(gStr!='') {gStr += ' gp';} + if(sStr!='') {sStr += ' sp';} + if(cStr!='') {cStr += ' cp';} + + let str = numberWithCommas(pStr); + if(str != "" && gStr != ""){str += ", ";} + str += numberWithCommas(gStr); + if(str != "" && sStr != ""){str += ", ";} + str += sStr; + if(str != "" && cStr != ""){str += ", ";} + str += cStr; + + return str; + +} + +function processCopper(priceObj) { + if(priceObj.Value == 0){return '';} + let copperCount = Math.floor(priceObj.Value / 1); + priceObj.Value -= copperCount; + return copperCount+''; +} + +function processSilver(priceObj) { + if(priceObj.Value == 0){return '';} + let silverCount = Math.floor(priceObj.Value / 10); + priceObj.Value -= silverCount*10; + return silverCount+''; +} + +function processGold(priceObj) { + if(priceObj.Value == 0){return '';} + let goldCount = Math.floor(priceObj.Value / 100); + priceObj.Value -= goldCount*100; + return goldCount+''; +} + +function processPlatinum(priceObj) { + if(priceObj.Value == 0){return '';} + let platinumCount = Math.floor(priceObj.Value / 1000); + priceObj.Value -= platinumCount*1000; + return platinumCount+''; +} + +function reduceCoinStr(currentCoinStr, upperCoinStr){ + let currentCoin = parseInt(currentCoinStr); if(isNaN(currentCoin)){ currentCoin = 0; } + let upperCoin = parseInt(upperCoinStr); if(isNaN(upperCoin)){ upperCoin = 0; } + if(currentCoin !== 0 && currentCoin % 10 === 0){ + upperCoinStr = (upperCoin+(currentCoin/10))+''; + currentCoinStr = ''; + } + return { current: currentCoinStr, upper: upperCoinStr }; +} + +function numberWithCommas(x) { + return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); +} + +/* Worn Armor Bulk Adjustment */ +function getWornArmorBulkAdjustment(invItem, currentBulk){ + if(g_equippedArmorInvItemID != null && g_equippedArmorInvItemID == invItem.id){ + return currentBulk; + } else { + let item = g_itemMap.get(invItem.itemID+""); + if(item != null && item.ArmorData != null){ + if(currentBulk == 0.1){ + return 1; + } else if (currentBulk >= 1){ + return currentBulk + 1; + } + } + return currentBulk; + } +} + +/* Size Conversions */ +function bulkIsLight(bulk){ + return bulk === 0.1; +} +function bulkIsNegligible(bulk){ + return bulk === 0 || bulk === 0.001; +} + + +function getBulkLimitModifierForSize(creatureSize){ + switch(creatureSize) { + case "TINY": return 0.5; + case "SMALL": return 1; + case "MEDIUM": return 1; + case "LARGE": return 2; + case "HUGE": return 4; + case "GARGANTUAN": return 8; + default: return 1; + } +} + +function determineItemBulk(creatureSize, itemSize, itemBulk){ + if(itemBulk == -1){ return 0; } + let newItemBulk = convertItemTreatedBulkForCreature(creatureSize, itemBulk); + return getConvertedBulkForSize(itemSize, newItemBulk); +} + +function convertItemTreatedBulkForCreature(creatureSize, itemBulk){ + switch(creatureSize) { + case "TINY": + if(itemBulk >= 0 && itemBulk <= 0.1) { return 0.1; } + return itemBulk; + case "SMALL": + return itemBulk; + case "MEDIUM": + return itemBulk; + case "LARGE": + if(itemBulk <= 0.1) { return 0; } + return itemBulk*0.1; + case "HUGE": + if(itemBulk <= 1) { return 0; } + return itemBulk*0.05; + case "GARGANTUAN": + if(itemBulk <= 2) { return 0; } + return itemBulk*0.025; + default: return itemBulk; + } +} + +function getConvertedBulkForSize(itemSize, bulk){ + switch(itemSize) { + case "TINY": + if(bulk == 0) { + bulk = 0; + } else if(bulk <= 0.1){ + bulk = 0; + } else { + bulk = bulk/2; + if(bulk < 1){ + bulk = 0.1; + } + } + return bulk; + case "SMALL": + return bulk; + case "MEDIUM": + return bulk; + case "LARGE": + if(bulk == 0) { + bulk = 0.1; + } else if(bulk <= 0.1){ + bulk = 1; + } else { + bulk = bulk*2; + } + return bulk; + case "HUGE": + if(bulk == 0) { + bulk = 1; + } else if(bulk <= 0.1){ + bulk = 2; + } else { + bulk = bulk*4; + } + return bulk; + case "GARGANTUAN": + if(bulk == 0) { + bulk = 2; + } else if(bulk <= 0.1){ + bulk = 4; + } else { + bulk = bulk*8; + } + return bulk; + default: + return bulk; + } +} + +function getConvertedPriceForSize(itemSize, price){ + switch(itemSize) { + case "TINY": + return price; + case "SMALL": + return price; + case "MEDIUM": + return price; + case "LARGE": + return price*2; + case "HUGE": + return price*4; + case "GARGANTUAN": + return price*8; + default: + return price; + } +} + +//////// + +function getItemTraitsArray(item, invItem){ + let tagArray; + try { + tagArray = []; + let tagIDArray = JSON.parse(invItem.itemTags); + for(let tag of g_allTags){ + if(tagIDArray.includes(tag.id+"")){ + tagArray.push(tag); + } + } + } catch (err) { + tagArray = item.TagArray; + } + + // Added traits from attached items + for(const weapTraitMod of getWeapMod(invItem.id, 'ADD-TRAIT')){ + let addedTag = g_allTags.find(tag => { + return tag.name.toUpperCase() === weapTraitMod.mod.toUpperCase(); + }); + if(addedTag != null){ + tagArray.push(addedTag); + } else { + displayError('DEFAULT-ADD-TRAIT statement attempting to add trait to '+invItem.name+' that doesn\'t exist ('+weapTraitMod.mod+')!'); + } + } + + // If item has a potency rune and is not magical, add magical trait and evocation trait + if(invItem.fundPotencyRuneID != null){ + let magical = tagArray.find(tag => { + // Hardcoded - Magical Trait ID 41; + // Primal Trait ID 304; Occult Trait ID 500; Divine Trait ID 265; Arcane Trait ID 2; + return tag.id == 41 || tag.id == 304 || tag.id == 500 || tag.id == 265 || tag.id == 2; + }); + if(magical == null){ + tagArray.push({ + id: 41, + name: 'Magical', + description: 'Something with the magical trait is imbued with magical energies not tied to a specific tradition of magic. A magical item radiates a magic aura infused with its dominant school of magic.' + }); + tagArray.push({ + id: 231, + name: 'Evocation', + description: 'Effects and magic items with this trait are associated with the evocation school of magic, typically involving energy and elemental forces.' + }); + } + } + + tagArray = tagArray.sort( + function(a, b) { + return a.name > b.name ? 1 : -1; + } + ); + + return tagArray; +} + +//////// + +function getItemIcon(item, invItem){ + + let fa_icon = null; + + if(item.Item.itemType != null){ + let itemType = capitalizeWords(item.Item.itemType); + + if(itemType === 'Adjustment'){ fa_icon = 'fas fa-tools'; } + if(itemType === 'Artifact'){ fa_icon = 'fas fa-star-christmas'; } + if(itemType === 'Ammunition'){ fa_icon = 'fad fa-bow-arrow'; } + if(itemType === 'Armor'){ fa_icon = 'fas fa-tshirt'; } + if(itemType === 'Belt'){ fa_icon = 'fas fa-circle-notch'; } + if(itemType === 'Bomb'){ fa_icon = 'fas fa-bomb'; } + if(itemType === 'Book'){ fa_icon = 'fas fa-book'; } + if(itemType === 'Boots'){ fa_icon = 'fas fa-boot'; } + // Bracers + if(itemType === 'Catalyst'){ fa_icon = 'fad fa-certificate'; } + // Circlet + if(itemType === 'Cloak'){ fa_icon = 'fas fa-hood-cloak'; } + if(itemType === 'Companion'){ fa_icon = 'fas fa-paw'; } + if(itemType === 'Currency'){ fa_icon = 'fas fa-coins'; } + if(itemType === 'Drug'){ fa_icon = 'fas fa-cannabis'; } + if(itemType === 'Elixir'){ fa_icon = 'fas fa-flask'; } + if(itemType === 'Eyepiece'){ fa_icon = 'far fa-glasses-alt'; } + if(itemType === 'Fulu'){ fa_icon = 'fas fa-tag'; } + if(itemType === 'Gadget'){ fa_icon = 'fas fa-cog'; } + if(itemType === 'Gift'){ fa_icon = 'fas fa-gift'; } + if(itemType === 'Gloves'){ fa_icon = 'fad fa-boxing-glove'; } + if(itemType === 'Grimoire'){ fa_icon = 'fas fa-book-spells'; } + if(itemType === 'Hat'){ fa_icon = 'fas fa-hat-witch'; } + if(itemType === 'Ingredient'){ fa_icon = 'fad fa-cauldron'; } + if(itemType === 'Instrument'){ fa_icon = 'fas fa-mandolin'; } + if(itemType === 'Kit'){ fa_icon = 'fas fa-briefcase'; } + if(itemType === 'Mask'){ fa_icon = 'fas fa-mask'; } + // Necklace + if(itemType === 'Oil'){ fa_icon = 'fas fa-jug'; } + if(itemType === 'Poison'){ fa_icon = 'fas fa-flask-poison'; } + if(itemType === 'Potion'){ fa_icon = 'fas fa-flask-potion'; } + if(itemType === 'Ring'){ fa_icon = 'fas fa-ring'; } + if(itemType === 'Rod'){ fa_icon = 'far fa-window-minimize'; } + if(itemType === 'Rune'){ fa_icon = 'fas fa-tombstone-alt'; } + if(itemType === 'Scroll'){ fa_icon = 'fas fa-scroll-old'; } + if(itemType === 'Shield'){ fa_icon = 'far fa-shield-alt'; } + // Siege + if(itemType === 'Spellheart'){ fa_icon = 'fas fa-heart'; } + if(itemType === 'Staff'){ fa_icon = 'far fa-staff'; } + if(itemType === 'Storage'){ fa_icon = 'fas fa-backpack'; } + if(itemType === 'Structure'){ fa_icon = 'fas fa-home-alt'; } + if(itemType === 'Talisman'){ fa_icon = 'fas fa-ornament'; } + if(itemType === 'Tattoo'){ fa_icon = 'far fa-signature'; } + // Tool (probably don't want to set one) + if(itemType === 'Wand'){ fa_icon = 'fas fa-wand'; } + // Weapon (don't want to set one) + // Other (probably don't want to set one) + + } + + + if(item.WeaponData != null){ + let weaponType = (item.WeaponData.isRanged == 1) ? item.WeaponData.rangedWeaponType : item.WeaponData.meleeWeaponType; + weaponType = capitalizeWords(weaponType); + + if(weaponType === 'Bomb'){ fa_icon = 'fas fa-bomb'; } + if(weaponType === 'Bow'){ fa_icon = 'fas fa-bow-arrow'; } + if(weaponType === 'Brawling'){ fa_icon = 'fas fa-fist-raised'; } + if(weaponType === 'Club'){ fa_icon = 'fas fa-mace'; } + // Dart + // Firearm + if(weaponType === 'Flail'){ fa_icon = 'fad fa-mace'; } + if(weaponType === 'Hammer'){ fa_icon = 'fas fa-hammer-war'; } + if(weaponType === 'Knife'){ fa_icon = 'fas fa-dagger'; } + // Pick + if(weaponType === 'Polearm'){ fa_icon = 'fas fa-scythe'; } + if(weaponType === 'Shield'){ fa_icon = 'far fa-shield-alt'; } + // Sling + if(weaponType === 'Spear'){ fa_icon = 'far fa-slash'; } + if(weaponType === 'Sword'){ fa_icon = 'fas fa-sword'; } + if(weaponType === 'Axe'){ fa_icon = 'fas fa-axe'; } + + } + + + // For if someone adds a trait to a custom item, it'll override it to be accurate + if(invItem != null){ + let tagArray = getItemTraitsArray(item, invItem); + if(tagArray.find(tag => { return tag.name === 'Wand'; }) != null){ fa_icon = 'fas fa-wand'; } + if(tagArray.find(tag => { return tag.name === 'Staff'; }) != null){ fa_icon = 'far fa-staff'; } + } + + + if(fa_icon != null){ + return ``; + } else { + return ''; + } + +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/material-utils.js b/client/vue-src/legacy-js/sheet/utils/material-utils.js new file mode 100644 index 00000000..deb5040c --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/material-utils.js @@ -0,0 +1,23 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_materialsMap = new Map(); + +g_materialsMap.set('ABYSIUM', {Name: 'Abysium', Description: 'A blue-green metal with an eerie green luminescence, abysium radiates power that’s inimical to life. Careless exposure to the material can lead to long-term damage to the immune system; as such, mining abysium is hazardous, as large quantities of the metal in an area cause all nearby creatures to become sick. A creature carrying an abysium object is sickened 1 for a standard-grade object of light Bulk, sickened 2 for a standard-grade object of 1 Bulk or more or a high-grade object of light Bulk, or sickened 3 for a high-grade object of 1 Bulk or more. This and all other sickening effects of abysium are poison effects. Crafters can use 1 abysium chunk to create up to 6 doses of poisonous abysium powder. Unscrupulous smiths have harnessed abysium’s toxic properties to create noxious weapons and deadly substances. All objects crafted from abysium shed dim light in a 10-foot radius. See more on Lost Omens Grand Bazaar pg. 96.'}); +g_materialsMap.set('ADAMANTINE', {Name: 'Adamantine', Description: 'Mined from rocks that fell from the heavens, adamantine is one of the hardest metals known. It has a shiny, black appearance, and it is prized for its amazing resiliency and ability to hold an incredibly sharp edge. See more on page 578.'}); +g_materialsMap.set('COLD IRON', {Name: 'Cold Iron', Description: 'Weapons made from cold iron are deadly to demons and fey alike. Cold iron looks like normal iron but is mined from particularly pure sources and shaped with little or no heat. This process is extremely difficult, especially for high-grade cold iron items. See more on page 578.'}); +g_materialsMap.set('DARKWOOD', {Name: 'Darkwood', Description: 'Darkwood is a very lightweight wood found primarily in old-growth forests; it is dark as ebony but has a slight purple tint. A darkwood item’s Bulk is reduced by 1 (or to light Bulk if its normal Bulk is 1, with no effect on an item that normally has light Bulk). See more on page 578.'}); +g_materialsMap.set('DJEZET', {Name: 'Djezet', Description: 'This rust red metal is liquid at room temperature, making it challenging for all but the most skilled metallurgists to craft with and earning it the name “quickiron” in some places. Djezet is also extremely reactive to magic, even in its solid, workable alloyed form. It glows when targeted by magic, and objects crafted with djezet alloys glow with scarlet striations, which lead some smiths to nickname it “tiger iron.” When targeted by spells, objects crafted from djezet alloys exhibit these glowing red markings that last for 1 round or the duration of the spell, whichever is longer. A djezet mass contains enough djezet to refine into up to two djezet doses (pg. 98). See more on Lost Omens Grand Bazaar pg. 97.'}); +g_materialsMap.set('DRAGONHIDE', {Name: 'Dragonhide', Description: 'Dragonhide varies in color from blue to glittering gold, depending on the dragon it came from. Due to the scales’ resiliency, it can also be used to Craft armor usually made out of metal plates (such as a breastplate, half plate, and full plate), allowing such armor to be made without metal. Dragonhide objects are immune to one damage type, depending on the type of dragon. See more on page 579.'}); +g_materialsMap.set('GRISANTIAN PELT', {Name: 'Grisantian Pelt', Description: 'Highly desired for the prestige, the pelt of the grogrisant also has invaluable properties. Standard-grade items can be made from the pelt of a grisantian lion, but high-grade items require the pelt of the grogrisant itself. This supernaturally tough animal skin is gold and shines in sunlight. It can be used to make any item usually made of cloth, leather, or hide. This material is immune to fire, and its Hardness is doubled against piercing or slashing damage. Up to 4 Bulk of grisantian pelt can be harvested from a single creature (this is usually more than enough for 4 suits of standard grade armor or 2 suit of high-grade armor).'}); +g_materialsMap.set('INUBRIX', {Name: 'Inubrix', Description: 'This pale, malleable metal’s unusual molecular structure allows it to partially pass through iron and steel without touching them. While this property is useful for making weapons that bypass metal armor, inubrix is barely sturdier than lead. Even in an alloyed state, this skymetal is so fragile that it’s difficult to use in crafting reliable shields and less than ideal for crafting armor. See more on Lost Omens Grand Bazaar pg. 98.'}); +g_materialsMap.set('MITHRAL', {Name: 'Mithral', Description: 'Mithral is renowned for its lightness, durability, and effectiveness against a range of creatures including devils and lycanthropes. It has the same sheen as silver but a slightly lighter hue. Mithral weapons and armor are treated as if they were silver for the purpose of damaging creatures with weakness to silver. A metal item made of mithral is lighter than one made of iron or steel: the item’s Bulk is reduced by 1 (reduced to light Bulk if its normal Bulk is 1, with no effect on an item that normally has light Bulk). See more on page 579.'}); +g_materialsMap.set('NOQUAL', {Name: 'Noqual', Description: 'Light and strong, noqual also demonstrates a powerful resistance to magic. A side effect of this resistance is that making magical weapons out of noqual requires complex and expensive alchemical treatments. Kevoth-Kul, the Black Sovereign of Numeria, has developed an alloy of noqual and cold iron known as sovereign steel to help mitigate this property. The metal’s crystalline appearance might suggest that it’s fragile, but the pale-green material can be worked similarly to iron. Objects made of noqual have a +4 circumstance bonus on saves against magic that the item attempts and grant their bonus to saves the owner makes specifically to protect the item from magic (such as against the rusting grasp spell). See more on Lost Omens Grand Bazaar pg. 99.'}); +g_materialsMap.set('ORICHALCUM', {Name: 'Orichalcum', Description: 'The most rare and valuable skymetal, orichalcum is coveted for its incredible time-related magical properties. This dull, coppery metal isn’t as physically sturdy as adamantine, but orichalcum’s time-bending properties protect it, granting it greater Hardness and Hit Points. If an orichalcum item takes damage but isn’t destroyed, it repairs itself completely 24 hours later. See more on page 579.'}); +g_materialsMap.set('PEACHWOOD', {Name: 'Peachwood', Description: 'Peachwood, often cultivated by Pharasma priests, can ward against undead—even incorporeal ones. However, the wood loses its magical properties when it comes in contact with metal, requiring advanced carpentry to make full use of it.'}); +g_materialsMap.set('SICCATITE', {Name: 'Siccatite', Description: 'In its raw state, this silvery ore is either scalding hot or freezing cold. Metallurgists disagree over whether siccatite is two related substances or one substance that determines its temperature output via some unknown process. Whatever the reason, the extreme temperature of the material means it must be handled carefully. Hot siccatite can easily ignite flammables such as paper and dry brush, and cold siccatite left in moist areas quickly surrounds itself with a thick layer of ice. A creature that comes into physical contact with a significant amount of siccatite takes 1 energy damage for each round of continued contact (either fire or cold damage, for hot and cold siccatite respectively). See more on Lost Omens Grand Bazaar pg. 100.'}); +g_materialsMap.set('SILVER', {Name: 'Silver', Description: 'Silver weapons are a bane to creatures ranging from devils to werewolves. Silver items are less durable than steel items, and low-grade silver items are usually merely silver-plated. See more on page 579.'}); +g_materialsMap.set('SISTERSTONE', {Name: 'Sisterstone', Description: 'Sisterstone is a term used for two closely related ores infused by the spiritual runoff in the Field of Maidens, dusk sisterstone and scarlet sisterstone. They have the same physical properties except for color—dusk sisterstone is a pale orange while scarlet sisterstone is orange-red. When near an object made of the other type of sisterstone, they both begin exuding spiritual energy that repels undead. \n When an object made of dusk sisterstone is within 15 feet of an object made of scarlet sisterstone of the same grade, they create a reciprocal field. Any undead creature adjacent to one of the objects when the field is formed, or who moves adjacent to one while the field is active, becomes enfeebled 1 unless it succeeds at a DC 15 Fortitude save. This lasts until the undead creature is no longer adjacent to either of the items or until the field\'s removed (typically by the objects ceasing to be within 15 feet of one another). The DC increases to 22 if both items are standard grade or better, and to 33 if they\'re both high grade. Unworked chunks and ingots don\'t create a reciprocal field. A single object can\'t be made of both types of sisterstone.'}); +g_materialsMap.set('SOVEREIGN STEEL', {Name: 'Sovereign Steel', Description: 'This unique alloy of cold iron and the skymetal noqual can provide protection from magical assault. The process of cold-forging the two materials together is quite complicated and precise. All sovereign steel items have a +4 circumstance bonus on saves against magic that the item makes, and grant their bonus to saves the owner makes specifically to protect the item from magic.'}); +g_materialsMap.set('WARPGLASS', {Name: 'Warpglass', Description: 'This bizarre substance is fashioned from the raw, chaotic quintessence of the Maelstrom. It can be fashioned into weapons and items, but is too unstable to make into useful armor or shields. Raw warpglass is an opalescent glassy material with surprising strength. When worked, it changes its appearance - though not its properties - to appear as random striations of other metals and types of stone.'}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/prof-map-utils.js b/client/vue-src/legacy-js/sheet/utils/prof-map-utils.js new file mode 100644 index 00000000..048c10a7 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/prof-map-utils.js @@ -0,0 +1,382 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function findItemDataByName(itemMap, profItemName, type){ + for(const [itemID, itemData] of itemMap.entries()){ + if(type == 'WEAPON' && itemData.WeaponData != null){ + if(itemData.WeaponData.profName.toUpperCase() == profItemName){ + return itemData; + } + } else if(type == 'ARMOR' && itemData.ArmorData != null){ + if(itemData.ArmorData.profName.toUpperCase() == profItemName){ + return itemData; + } + } + } + return null; +} + +function hasFamiliarityReduceProf(itemData){ + for(let weaponFamiliarity of g_weaponFamiliaritiesArray){ + let traitName = weaponFamiliarity.value+' - ITEM'; + + let tag = itemData.TagArray.find(tag => { + return tag.name.toUpperCase() == traitName; + }); + if(tag != null){ + return true; + } + } + return false; +} + +function buildWeaponProfMap(){ + + let weaponProfMap = new Map(); // Key: ItemID Value: { NumUps, UserBonus } + + for(const [profName, profDataArray] of g_profMap.entries()){ + const finalProfData = getFinalProf(profDataArray); + if(finalProfData.For == "Attack"){ + + if(profName == 'Simple_Weapons'){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.WeaponData != null && itemData.WeaponData.category == "SIMPLE"){ + + let prevWeapData = weaponProfMap.get(itemData.WeaponData.profName); + if(prevWeapData == null){ prevWeapData = { NumUps: null, UserBonus: null }; } + + weaponProfMap.set(itemData.WeaponData.profName, { + NumUps : greaterProfValue(prevWeapData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevWeapData.UserBonus,finalProfData.UserBonus), + }); + } + } + } else if(profName == 'Martial_Weapons'){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.WeaponData != null && itemData.WeaponData.category == "MARTIAL"){ + + let prevWeapData = weaponProfMap.get(itemData.WeaponData.profName); + if(prevWeapData == null){ prevWeapData = { NumUps: null, UserBonus: null }; } + + let numUps = finalProfData.NumUps; + if(hasFamiliarityReduceProf(itemData)){ + let reducedProfData = getFinalProf(g_profMap.get('Simple_Weapons')); + if(reducedProfData != null){ + numUps = reducedProfData.NumUps; + } else { + numUps = 0; + } + } + + weaponProfMap.set(itemData.WeaponData.profName, { + NumUps : greaterProfValue(prevWeapData.NumUps,numUps), + UserBonus : greaterProfValue(prevWeapData.UserBonus,finalProfData.UserBonus), + }); + } + } + } else if(profName == 'Advanced_Weapons'){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.WeaponData != null && itemData.WeaponData.category == "ADVANCED"){ + + let prevWeapData = weaponProfMap.get(itemData.WeaponData.profName); + if(prevWeapData == null){ prevWeapData = { NumUps: null, UserBonus: null }; } + + let numUps = finalProfData.NumUps; + if(hasFamiliarityReduceProf(itemData)){ + let reducedProfData = getFinalProf(g_profMap.get('Martial_Weapons')); + if(reducedProfData != null){ + numUps = reducedProfData.NumUps; + } else { + numUps = 0; + } + } + + weaponProfMap.set(itemData.WeaponData.profName, { + NumUps : greaterProfValue(prevWeapData.NumUps,numUps), + UserBonus : greaterProfValue(prevWeapData.UserBonus,finalProfData.UserBonus), + }); + } + } + } else if(profName == 'Unarmed_Attacks'){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.WeaponData != null && itemData.WeaponData.category == "UNARMED"){ + + let prevWeapData = weaponProfMap.get(itemData.WeaponData.profName); + if(prevWeapData == null){ prevWeapData = { NumUps: null, UserBonus: null }; } + + weaponProfMap.set(itemData.WeaponData.profName, { + NumUps : greaterProfValue(prevWeapData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevWeapData.UserBonus,finalProfData.UserBonus), + }); + } + } + } else { + let dProfName = profName.toUpperCase().replace(/_/g,' '); + const itemData = findItemDataByName(g_itemMap, dProfName, 'WEAPON'); + if(itemData != null && itemData.WeaponData != null){ + + let prevWeapData = weaponProfMap.get(itemData.WeaponData.profName); + if(prevWeapData == null){ prevWeapData = { NumUps: null, UserBonus: null }; } + + let numUps = finalProfData.NumUps; + if(hasFamiliarityReduceProf(itemData)){ + let reducedProfData = null; + if(itemData.WeaponData.category == "MARTIAL"){ + reducedProfData = getFinalProf(g_profMap.get('Simple_Weapons')); + } else if (itemData.WeaponData.category == "ADVANCED"){ + reducedProfData = getFinalProf(g_profMap.get('Martial_Weapons')); + } else { + reducedProfData = finalProfData; + } + + let famNumUps = 0; + if(reducedProfData != null){ + famNumUps = reducedProfData.NumUps; + } + if(famNumUps > numUps){ numUps = famNumUps; } + } + + weaponProfMap.set(itemData.WeaponData.profName, { + NumUps : greaterProfValue(prevWeapData.NumUps,numUps), + UserBonus : greaterProfValue(prevWeapData.UserBonus,finalProfData.UserBonus), + }); + } + } + + } else if(finalProfData.For == "Group"){ + + let groupName = profName.toUpperCase(); + + let isSimple = false; + let isMartial = false; + let isAdvanced = false; + let isUnarmed = false; + if(groupName.startsWith('SIMPLE_')){ + groupName = groupName.replace('SIMPLE_', ''); + isSimple = true; + } + if(groupName.startsWith('MARTIAL_')){ + groupName = groupName.replace('MARTIAL_', ''); + isMartial = true; + } + if(groupName.startsWith('ADVANCED_')){ + groupName = groupName.replace('ADVANCED_', ''); + isAdvanced = true; + } + if(groupName.startsWith('UNARMED_')){ + groupName = groupName.replace('UNARMED_', ''); + isUnarmed = true; + } + + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.WeaponData != null){ + if((itemData.WeaponData.isMelee == 1 && itemData.WeaponData.meleeWeaponType == groupName) || (itemData.WeaponData.isRanged == 1 && itemData.WeaponData.rangedWeaponType == groupName)){ + if(!isSimple && !isMartial && !isAdvanced && !isUnarmed){ + + let prevWeapData = weaponProfMap.get(itemData.WeaponData.profName); + if(prevWeapData == null){ prevWeapData = { NumUps: null, UserBonus: null }; } + + weaponProfMap.set(itemData.WeaponData.profName, { + NumUps : greaterProfValue(prevWeapData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevWeapData.UserBonus,finalProfData.UserBonus), + }); + } else if((isSimple && itemData.WeaponData.category == "SIMPLE") || (isMartial && itemData.WeaponData.category == "MARTIAL") || (isAdvanced && itemData.WeaponData.category == "ADVANCED") || (isUnarmed && itemData.WeaponData.category == "UNARMED")) { + + let prevWeapData = weaponProfMap.get(itemData.WeaponData.profName); + if(prevWeapData == null){ prevWeapData = { NumUps: null, UserBonus: null }; } + + weaponProfMap.set(itemData.WeaponData.profName, { + NumUps : greaterProfValue(prevWeapData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevWeapData.UserBonus,finalProfData.UserBonus), + }); + } + } + } + } + } else if(finalProfData.For == "Trait"){ + + let traitName = profName.toUpperCase().replace(/_/g,' ').trim(); + + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.WeaponData != null){ + + let trait = itemData.TagArray.find(trait => { + return trait.name.toUpperCase() == traitName; + }); + + if(trait != null){ + let prevWeapData = weaponProfMap.get(itemData.WeaponData.profName); + if(prevWeapData == null){ prevWeapData = { NumUps: null, UserBonus: null }; } + + weaponProfMap.set(itemData.WeaponData.profName, { + NumUps : greaterProfValue(prevWeapData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevWeapData.UserBonus,finalProfData.UserBonus), + }); + } + + } + } + } + } + + return weaponProfMap; +} + +function weaponProfDetermineNumUps(itemData){ + + let profNumUps = 0; + let profData = g_weaponProfMap.get(itemData.WeaponData.profName); + if(profData != null){ + profNumUps = profData.NumUps; + } + + if(hasFamiliarityReduceProf(itemData)){ + let reducedProfData = null; + if(itemData.WeaponData.category == "MARTIAL"){ + reducedProfData = getFinalProf(g_profMap.get('Simple_Weapons')); + } else if (itemData.WeaponData.category == "ADVANCED"){ + reducedProfData = getFinalProf(g_profMap.get('Martial_Weapons')); + } else { + reducedProfData = profData; + } + + if(reducedProfData != null){ + profNumUps = (reducedProfData.NumUps > profNumUps) ? reducedProfData.NumUps : profNumUps; + } + } + + return profNumUps; + +} + +function buildArmorProfMap(){ + + let armorProfMap = new Map(); // Key: ItemID Value: { NumUps, UserBonus } + + for(const [profName, profDataArray] of g_profMap.entries()){ + const finalProfData = getFinalProf(profDataArray); + if(finalProfData.For == "Defense"){ + + if(profName == 'Light_Armor'){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.ArmorData != null && itemData.ArmorData.category == "LIGHT"){ + + let prevArmorData = armorProfMap.get(itemData.ArmorData.profName); + if(prevArmorData == null){ prevArmorData = { NumUps: null, UserBonus: null }; } + + armorProfMap.set(itemData.ArmorData.profName, { + NumUps : greaterProfValue(prevArmorData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevArmorData.UserBonus,finalProfData.UserBonus), + }); + } + } + } else if(profName == 'Medium_Armor'){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.ArmorData != null && itemData.ArmorData.category == "MEDIUM"){ + + let prevArmorData = armorProfMap.get(itemData.ArmorData.profName); + if(prevArmorData == null){ prevArmorData = { NumUps: null, UserBonus: null }; } + + armorProfMap.set(itemData.ArmorData.profName, { + NumUps : greaterProfValue(prevArmorData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevArmorData.UserBonus,finalProfData.UserBonus), + }); + } + } + } else if(profName == 'Heavy_Armor'){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.ArmorData != null && itemData.ArmorData.category == "HEAVY"){ + + let prevArmorData = armorProfMap.get(itemData.ArmorData.profName); + if(prevArmorData == null){ prevArmorData = { NumUps: null, UserBonus: null }; } + + armorProfMap.set(itemData.ArmorData.profName, { + NumUps : greaterProfValue(prevArmorData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevArmorData.UserBonus,finalProfData.UserBonus), + }); + } + } + } else if(profName == 'Unarmored_Defense'){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.ArmorData != null && itemData.ArmorData.category == "UNARMORED"){ + + let prevArmorData = armorProfMap.get(itemData.ArmorData.profName); + if(prevArmorData == null){ prevArmorData = { NumUps: null, UserBonus: null }; } + + armorProfMap.set(itemData.ArmorData.profName, { + NumUps : greaterProfValue(prevArmorData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevArmorData.UserBonus,finalProfData.UserBonus), + }); + } + } + } else { + let dProfName = profName.toUpperCase().replace(/_/g,' '); + const itemData = findItemDataByName(g_itemMap, dProfName, 'ARMOR'); + if(itemData != null && itemData.ArmorData != null){ + + let prevArmorData = armorProfMap.get(itemData.ArmorData.profName); + if(prevArmorData == null){ prevArmorData = { NumUps: null, UserBonus: null }; } + + armorProfMap.set(itemData.ArmorData.profName, { + NumUps : greaterProfValue(prevArmorData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevArmorData.UserBonus,finalProfData.UserBonus), + }); + } + } + + } else if(finalProfData.For == "Trait"){ + + let traitName = profName.toUpperCase().replace(/_/g,' ').trim(); + + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.ArmorData != null){ + + let trait = itemData.TagArray.find(trait => { + return trait.name.toUpperCase() == traitName; + }); + + if(trait != null){ + let prevArmorData = armorProfMap.get(itemData.ArmorData.profName); + if(prevArmorData == null){ prevArmorData = { NumUps: null, UserBonus: null }; } + + armorProfMap.set(itemData.ArmorData.profName, { + NumUps : greaterProfValue(prevArmorData.NumUps,finalProfData.NumUps), + UserBonus : greaterProfValue(prevArmorData.UserBonus,finalProfData.UserBonus), + }); + } + + } + } + } + + /* + + else if(finalProfData.For == "Group"){ + for(const [itemID, itemData] of g_itemMap.entries()){ + if(itemData.ArmorData != null){ + if(itemData.ArmorData.armorType == profName.toUpperCase()){ + weaponProfMap.set(itemData.ArmorData.profName, { + NumUps : finalProfData.NumUps, + UserBonus : finalProfData.UserBonus + }); + } + } + } + } + + */ + } + + return armorProfMap; +} + +function greaterProfValue(prevValue, newValue){ + if(prevValue == null || isNaN(prevValue)){ + return newValue; + } else if(prevValue > newValue){ + return prevValue; + } else { + return newValue; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/sheet-reload.js b/client/vue-src/legacy-js/sheet/utils/sheet-reload.js new file mode 100644 index 00000000..57ca1495 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/sheet-reload.js @@ -0,0 +1,19 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_reloadingSheet = false; + +function reloadCharSheet(){ + if(!g_reloadingSheet) { + setDelayToReloadSheet(); + } +} + +function setDelayToReloadSheet(){ + g_reloadingSheet = true; + setTimeout(() => { + loadCharSheet(); + g_reloadingSheet = false; + }, 175); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/spell-utils.js b/client/vue-src/legacy-js/sheet/utils/spell-utils.js new file mode 100644 index 00000000..d5e67604 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/spell-utils.js @@ -0,0 +1,106 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getSpellTypeBulmaColor(typeData){ + let typeColor = getSpellTypeColor(typeData); + let bulmaColor; + switch(typeColor){ + case 'R': bulmaColor = 'has-text-danger'; break; + case 'G': bulmaColor = 'has-text-success'; break; + case 'B': bulmaColor = 'has-text-link'; break; + case 'RG': bulmaColor = 'has-text-brown'; break; + case 'GB': bulmaColor = 'has-text-turquoise'; break; + case 'RB': bulmaColor = 'has-text-purple'; break; + case 'RGB': bulmaColor = 'has-text-gold'; break; + case '': bulmaColor = 'has-text-info'; break; + default: bulmaColor = ''; break; + } + return bulmaColor; +} + +function getSpellTypeBulmaColor_SlotFilled(typeData){ + let typeColor = getSpellTypeColor(typeData); + let bulmaColor; + switch(typeColor){ + case 'R': bulmaColor = 'is-filled-red-spell-slot'; break; + case 'G': bulmaColor = 'is-filled-green-spell-slot'; break; + case 'B': bulmaColor = 'is-filled-blue-spell-slot'; break; + case 'RG': bulmaColor = 'is-filled-brown-spell-slot'; break; + case 'GB': bulmaColor = 'is-filled-turquoise-spell-slot'; break; + case 'RB': bulmaColor = 'is-filled-purple-spell-slot'; break; + case 'RGB': bulmaColor = 'is-filled-multiple-spell-slot'; break; + case '': bulmaColor = 'is-filled-spell-slot'; break; + default: bulmaColor = ''; break; + } + return bulmaColor; +} + +function getSpellTypeBulmaColor_SlotEmpty(typeData){ + let typeColor = getSpellTypeColor(typeData); + let bulmaColor; + switch(typeColor){ + case 'R': bulmaColor = 'is-empty-red-spell-slot'; break; + case 'G': bulmaColor = 'is-empty-green-spell-slot'; break; + case 'B': bulmaColor = 'is-empty-blue-spell-slot'; break; + case 'RG': bulmaColor = 'is-empty-brown-spell-slot'; break; + case 'GB': bulmaColor = 'is-empty-turquoise-spell-slot'; break; + case 'RB': bulmaColor = 'is-empty-purple-spell-slot'; break; + case 'RGB': bulmaColor = 'is-empty-multiple-spell-slot'; break; + case '': bulmaColor = 'is-empty-spell-slot'; break; + default: bulmaColor = ''; break; + } + return bulmaColor; +} + + +function getSpellTypeColor(typeData) { + let typeStruct = getSpellTypeStruct(typeData); + let colorType = ''; + if(typeStruct.Red){ + colorType += 'R'; + } + if(typeStruct.Green){ + colorType += 'G'; + } + if(typeStruct.Blue){ + colorType += 'B'; + } + return colorType; +} + + +// Spell Color-Types // + +function getSpellTypeStruct(typeData){ + let isRedType, isGreenType, isBlueType; + if(typeData == '' || typeData == null){ + isRedType = false; + isGreenType = false; + isBlueType = false; + } else { + let slotTypeDataSections = typeData.split(','); + isRedType = (slotTypeDataSections[0] == 'R:1'); + isGreenType = (slotTypeDataSections[1] == 'G:1'); + isBlueType = (slotTypeDataSections[2] == 'B:1'); + } + return {Red: isRedType, Green: isGreenType, Blue: isBlueType}; +} + +function getSpellTypeData(typeStruct){ + let redPart = (typeStruct.Red) ? 'R:1' : 'R:0'; + let greenPart = (typeStruct.Green) ? 'G:1' : 'G:0'; + let bluePart = (typeStruct.Blue) ? 'B:1' : 'B:0'; + return redPart+','+greenPart+','+bluePart; +} + +function updateSpellBookSpellType(spellBookSpellID, spellType){ + for(let spellBook of g_spellBookArray){ + for(let spellBookSpell of spellBook.SpellBook){ + if(spellBookSpell.SpellBookSpellID == spellBookSpellID){ + spellBookSpell.SpellType = spellType; + return; + } + } + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/sheet/utils/struct-utils.js b/client/vue-src/legacy-js/sheet/utils/struct-utils.js new file mode 100644 index 00000000..86664c32 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/struct-utils.js @@ -0,0 +1,4 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + diff --git a/client/vue-src/legacy-js/sheet/utils/utils.js b/client/vue-src/legacy-js/sheet/utils/utils.js new file mode 100644 index 00000000..2e07a571 --- /dev/null +++ b/client/vue-src/legacy-js/sheet/utils/utils.js @@ -0,0 +1,79 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function getCharIDFromURL(){ + return window.location.pathname.split("characters/")[1]; +} + +function hasEnabledSource(codeName){ + const source = g_enabledSources.find(source => { + return source.codeName != null && source.codeName == codeName; + }); + return source != null; +} + +function getBulmaTextColorFromCurrentHP(currentHP, maxHP) { + if(currentHP >= maxHP*0.8){ + return "has-text-success"; + } else if(currentHP >= maxHP*0.5){ + return "has-text-warning"; + } else { + return "has-text-danger"; + } +} +function getAnimationDelayFromCurrentHP(currentHP, maxHP) { + let value = currentHP*(100/maxHP); + return `-${Math.floor(value-0.0001)}s`; +} + +function dieTypeToNum(dieType){ + switch(dieType) { + case '': + return 1; + case 'd2': + return 2; + case 'd4': + return 4; + case 'd6': + return 6; + case 'd8': + return 8; + case 'd10': + return 10; + case 'd12': + return 12; + case 'd20': + return 20; + default: + return 0; + } +} + +function textContainsWords(text, wordArray){ + if(text == null || wordArray.length == 0) {return false;} + text = text.toUpperCase(); + + // If words are in quotes, treat as a singular word. + let firstLetter = wordArray[0].slice(0,1); + let lastLetter = wordArray[wordArray.length-1].slice(-1); + if(firstLetter == '\'' || firstLetter == '"' || firstLetter == '`'){ + if(firstLetter === lastLetter){ + let oneWord = ''; + for(let word of wordArray){ + if(oneWord != '') { oneWord += ' '; } + oneWord += word; + } + oneWord = oneWord.substring(1); // Remove first character + oneWord = oneWord.substring(0, oneWord.length-1); // Remove last character + wordArray = [oneWord]; + } + } + + for(let word of wordArray){ + if(!text.includes(word)){ + return false; + } + } + return true; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/show-more.js b/client/vue-src/legacy-js/show-more.js new file mode 100644 index 00000000..c97197ca --- /dev/null +++ b/client/vue-src/legacy-js/show-more.js @@ -0,0 +1,48 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + + +$(function () { + setInterval(() => { + showMoreCheck(); + }, 1000);// Every 1 second +}); + +function showMoreCheck(){ + $('.reveal-container-text').each(function() { + + //if(!$(this).hasClass('is-event-binded')){ + //$(this).addClass('is-event-binded'); + + let revealText = $(this); + let fadeContainer = $(this).parent().find('.fading-reveal-container'); + + if(hasGreaterHeight(fadeContainer, 380)) { + + revealText.removeClass('is-hidden'); + fadeContainer.addClass('is-enabled'); + + revealText.off('click'); + revealText.click(function() { + if(fadeContainer.hasClass('is-active')) { + fadeContainer.removeClass('is-active'); + $(this).text('Show Less'); + } else { + fadeContainer.addClass('is-active'); + $(this).text('Show More'); + fadeContainer[0].scrollIntoView(); + } + }); + + } else { + + revealText.addClass('is-hidden'); + fadeContainer.removeClass('is-enabled'); + + } + + //} + + }); +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/add-text-processing.js b/client/vue-src/legacy-js/wsc/add-text-processing.js new file mode 100644 index 00000000..e17022ea --- /dev/null +++ b/client/vue-src/legacy-js/wsc/add-text-processing.js @@ -0,0 +1,188 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function processAddText(code, locationID, centerText=false){ + if(code == null || locationID == null) {return;} + + let allStatements = code.split(/\n/); + for(let statementRaw of allStatements){ + processStatement_AddText(statementRaw, locationID, centerText); + } + +} + +function processStatement_AddText(statementRaw, locationID, centerText){ + if(statementRaw.includes("ADD-TEXT=")){ // ADD-TEXT=Anything, will be parsed like a description field + + let statement = null; + + if(typeof testExpr == "function"){ + + // Test/Check Statement for Expressions // + statement = testExpr(statementRaw); + if(statement === null) {return false;} + if(!statement.includes("ADD-TEXT=")){return false;} + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + let text = statement.split('=')[1]; + let centerStyle = ''; + if(centerText) { centerStyle = 'has-text-center-justified'; } + $('#'+locationID).append('
                      '+processText(text, false, true, 'MEDIUM')+'
                      '); + + } else { + + const exprData = readExpr(statementRaw); + + let expression = exprData.expression; + + expression = expression.replace(/-/g, ' '); + expression = expression.toLowerCase(); + + expression = exp_cleaner(expression); + + if (exprData.statement != null && exprData.statement.includes("ADD-TEXT=")){ + statement = exprData.statement; + expression = 'If '+expression; + } else if(exprData.elseStatement != null && exprData.elseStatement.includes("ADD-TEXT=")){ + statement = exprData.elseStatement; + expression = 'If not '+expression; + } + + let text = statement.split('=')[1]; + let centerStyle = ''; + if(centerText) { centerStyle = 'has-text-center-justified'; } + + $('#'+locationID).append(` +
                      +

                      ${expression}:

                      +
                      +
                      ${processText(text, false, true, 'MEDIUM')}
                      +
                      + `); + + } + + if(centerText) { + $('#'+locationID).find('.has-text-left').removeClass('has-text-left'); + } + + return true; + + } else { + + return false; + + } +} + +function exp_cleaner(expression){ + + expression = expression.replace('class ability', 'class feature'); + + expression = exp_convertLevelTextToNumRange(expression); + + expression = expression.replace(/\s*&&\s*/g, ' and '); + expression = expression.replace(/\s*==\s*/g, ' equal to '); + expression = expression.replace(/\s*!=\s*/g, ' not equal to '); + expression = expression.replace(/\s*>=\s*/g, ' greater than or equal to '); + expression = expression.replace(/\s*<=\s*/g, ' lesser than or equal to '); + + expression = exp_makeClassFeaturePretty(expression); + + return expression; +} + + +function exp_convertLevelTextToNumRange(expression){ + + // Hardcoded - Min and max character levels + let lowerBound = 1; + let upperBound = 20; + + if(expression.includes('&&')){ + // Multi condition + + // Is num range, + let expressionParts = expression.split('&&'); + if(expressionParts.length != 2) { return expression; } + if(expressionParts[0].trim().startsWith('has level') && expressionParts[1].trim().startsWith('has level')){ + } else { return expression; } + + // Convert, + let expr0 = expressionParts[0].replace('has level', ''); + let expr1 = expressionParts[1].replace('has level', ''); + let expr0Num = 0; + let expr1Num = 0; + + if(expr0.includes('>=')){ + expr0 = expr0.replace('>=','').trim(); + expr0Num = parseInt(expr0); + } + if(expr1.includes('>=')){ + expr1 = expr1.replace('>=','').trim(); + expr1Num = parseInt(expr1); + } + + if(expr0.includes('<=')){ + expr0 = expr0.replace('<=','').trim(); + expr0Num = parseInt(expr0); + } + if(expr1.includes('<=')){ + expr1 = expr1.replace('<=','').trim(); + expr1Num = parseInt(expr1); + } + + if(expr0.includes('==')){ + expr0 = expr0.replace('==','').trim(); + expr0Num = parseInt(expr0); + } + if(expr1.includes('==')){ + expr1 = expr1.replace('==','').trim(); + expr1Num = parseInt(expr1); + } + + lowerBound = (expr0 < expr1) ? expr0 : expr1; + upperBound = (expr0 < expr1) ? expr1 : expr0; + + if(lowerBound == upperBound) { return `is level ${lowerBound}`; } + return `is level ${lowerBound} - ${upperBound}`; + + } else { + // Single condition + + // Is num range, + if(expression.startsWith('has level')){ + } else { return expression; } + if(expression.includes('==')){ + return expression; + } + + // Convert, + expression = expression.replace('has level', ''); + + if(expression.includes('>=')){ + expression = expression.replace('>=','').trim(); + lowerBound = parseInt(expression); + } + + if(expression.includes('<=')){ + expression = expression.replace('<=','').trim(); + upperBound = parseInt(expression); + } + + if(lowerBound == upperBound) { return `is level ${lowerBound}`; } + return `is level ${lowerBound} - ${upperBound}`; + } + +} + +function exp_makeClassFeaturePretty(expression){ + + if(expression.startsWith('has class feature equal to')){ + expression = expression.replace('has class feature equal to', ''); + return `has ${capitalizeWords(expression)} class feature`; + } + + return expression; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/default-statement-processing.js b/client/vue-src/legacy-js/wsc/default-statement-processing.js new file mode 100644 index 00000000..eb4ee105 --- /dev/null +++ b/client/vue-src/legacy-js/wsc/default-statement-processing.js @@ -0,0 +1,168 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_defaultItemPropRuneSlotNum = null; +function processDefaultItemRuneSheetCode(wscCode, itemID, invItemID){ + if(wscCode == null) {return false;} + + // Process Variables + wscCode = processVariables(wscCode, `itemDefault-${invItemID}`); + + wscCode = wscCode.toUpperCase(); + let wscStatements = wscCode.split(/\n/); + + const runeData = g_runeDataStruct; + + g_defaultItemPropRuneSlotNum = 0; + let success = true; + for(const wscStatementRaw of wscStatements) { + // Test/Check Statement for Expressions // + let wscStatement = testExpr(wscStatementRaw); + if(wscStatement == null) {continue;} + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + if(wscStatement.includes("DEFAULT-WEAPON-RUNE")){ + // DEFAULT-WEAPON-RUNE=+1 Weapon Potency + + let data = wscStatement.split('='); + defaultSetWeaponRunes(invItemID, data[1], runeData); + + continue; + } + + if(wscStatement.includes("DEFAULT-ARMOR-RUNE")){ + // DEFAULT-ARMOR-RUNE=+3 Armor Potency + + let data = wscStatement.split('='); + defaultSetArmorRunes(invItemID, data[1], runeData); + + continue; + } + + if(wscStatement.includes("DEFAULT-ADD-ITEM-TO-BAG")){ + // DEFAULT-ADD-ITEM-TO-BAG=Bedroll + // DEFAULT-ADD-ITEM-TO-BAG=Torch~5 + + let itemName, itemQty; + let data = wscStatement.split('='); + let dataSplit = data[1].split('~'); + if(dataSplit[1] != null){ + itemName = dataSplit[0]; + itemQty = dataSplit[1]; + } else { + itemName = data[1]; + itemQty = null; + } + + defaultAddItemToBag(itemID, invItemID, itemName, itemQty); + + continue; + } + + } + + return success; + +} + + +function defaultAddItemToBag(bagItemID, bagInvItemID, itemToAddName, itemToAddQty){ + + let bagItemDataStruct = g_itemMap.get(bagItemID+""); + if(bagItemDataStruct.StorageData == null) {return;} + + let itemToAddDataStruct = null; + for(const [itemID, itemDataStruct] of g_itemMap.entries()){ + if(itemToAddName == itemDataStruct.Item.name.toUpperCase()){ + itemToAddDataStruct = itemDataStruct; + break; + } + } + if(itemToAddDataStruct == null) {return;} + + if(itemToAddQty == null){itemToAddQty = itemToAddDataStruct.Item.quantity;} + socket.emit("requestAddItemToBag", + itemToAddDataStruct.Item.id, + itemToAddQty, + bagInvItemID); + + window.setTimeout(() => { + socket.emit("requestInvUpdate", + getCharIDFromURL()); + }, 1000); + +} + + +function defaultSetWeaponRunes(invItemID, runeCodeName, runeData){ + runeCodeName = runeCodeName.replace(/_/g," "); + runeCodeName = runeCodeName.replace(/’/g,"'"); + + let rune = findWeaponRuneByName(runeCodeName, runeData); + if(rune != null){ + if(rune.RuneData.isFundamental == 1) { + socket.emit("requestAddFundamentalRune", + invItemID, + rune.RuneData.id); + } else { + g_defaultItemPropRuneSlotNum++; + socket.emit("requestAddPropertyRune", + invItemID, + rune.RuneData.id, + g_defaultItemPropRuneSlotNum); + } + } else { + console.error('Failed to find weapon rune with name: '+runeCodeName); + } + +} + +function findWeaponRuneByName(runeCodeName, runeData){ + for(let weapRune of runeData.WeaponArray){ + if(weapRune != null) { + let weapRuneName = runestoneNameToRuneName(weapRune.Item.name).toUpperCase(); + if(weapRuneName === runeCodeName){ + return weapRune; + } + } + } + return null; +} + + + +function defaultSetArmorRunes(invItemID, runeCodeName, runeData){ + runeCodeName = runeCodeName.replace(/_/g," "); + runeCodeName = runeCodeName.replace(/’/g,"'"); + + let rune = findArmorRuneByName(runeCodeName, runeData); + if(rune != null){ + if(rune.RuneData.isFundamental == 1) { + socket.emit("requestAddFundamentalRune", + invItemID, + rune.RuneData.id); + } else { + g_defaultItemPropRuneSlotNum++; + socket.emit("requestAddPropertyRune", + invItemID, + rune.RuneData.id, + g_defaultItemPropRuneSlotNum); + } + } else { + console.error('Failed to find armor rune with name: '+runeCodeName); + } + +} + +function findArmorRuneByName(runeCodeName, runeData){ + for(let weapRune of runeData.ArmorArray){ + if(weapRune != null) { + let weapRuneName = runestoneNameToRuneName(weapRune.Item.name).toUpperCase(); + if(weapRuneName === runeCodeName){ + return weapRune; + } + } + } + return null; +} diff --git a/client/vue-src/legacy-js/wsc/docs-page.js b/client/vue-src/legacy-js/wsc/docs-page.js new file mode 100644 index 00000000..0d09a4cf --- /dev/null +++ b/client/vue-src/legacy-js/wsc/docs-page.js @@ -0,0 +1,32 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +$(function () { + + // ~ Remove Footer ~ // + $('#wanderers-guide-footer').addClass('is-hidden'); + $('#main-container').addClass('is-paddingless'); + // ~~~~~~~~~~~~~~~~~ // + + $(".text-processing").each(function(){ + $(this).html(processText($(this).text(), false, false, 'MEDIUM', false)); + }); + + updateHideables(); + + $(window).on('hashchange', function(e){ + updateHideables(); + }); + +}); + +function updateHideables(){ + $('.isHideable').each(function(){ + $(this).addClass('is-hidden'); + }); + if(window.location.hash != ''){ + $(window.location.hash).removeClass('is-hidden'); + $(window.location.hash+'>div.is-hidden').removeClass("is-hidden"); + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/errorHandling.js b/client/vue-src/legacy-js/wsc/errorHandling.js new file mode 100644 index 00000000..4f98844b --- /dev/null +++ b/client/vue-src/legacy-js/wsc/errorHandling.js @@ -0,0 +1,44 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let errorMessages = []; + +function displayError(message){ + console.warn('Traced Error: '+message); + console.error('Traced Error: '+message); +} + +function processError(message){ + errorMessages.push(message); + reloadErrorMessages(); +} + +console.error = (message) => { + processError(message); +} +window.onerror = function(e, url, line) { + processError(`${e} (${url}:${line})`); +}; + +function clearErrorMessages() { + errorMessages = []; +} + +function reloadErrorMessages(){ + if(errorMessages.length > 0) { + let errorHTML = '

                      Errors

                      '; + for(let errMsg of errorMessages){ + errorHTML += '

                      '+errMsg+'

                      '; + } + $('#errorMessage').html(errorHTML); + $('#errorDisplay').removeClass('is-hidden'); + } else { + $('#errorMessage').html(''); + $('#errorDisplay').addClass('is-hidden'); + } +} + +socket.on("returnErrorMessage", function(message){ + displayError(message); +}); \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/expression-processing.js b/client/vue-src/legacy-js/wsc/expression-processing.js new file mode 100644 index 00000000..2bee9d40 --- /dev/null +++ b/client/vue-src/legacy-js/wsc/expression-processing.js @@ -0,0 +1,699 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_profConversionMap = new Map(); + +g_profConversionMap.set(VARIABLE.LIGHT_ARMOR, {Name: 'Light_Armor', Category: 'Defense', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.MEDIUM_ARMOR, {Name: 'Medium_Armor', Category: 'Defense', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.HEAVY_ARMOR, {Name: 'Heavy_Armor', Category: 'Defense', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.UNARMORED_DEFENSE, {Name: 'Unarmored_Defense', Category: 'Defense', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('LIGHTARMOR', {Name: 'Light_Armor', Category: 'Defense'}); +g_profConversionMap.set('MEDIUMARMOR', {Name: 'Medium_Armor', Category: 'Defense'}); +g_profConversionMap.set('HEAVYARMOR', {Name: 'Heavy_Armor', Category: 'Defense'}); +g_profConversionMap.set('UNARMOREDDEFENSE', {Name: 'Unarmored_Defense', Category: 'Defense'}); + +g_profConversionMap.set(VARIABLE.SIMPLE_WEAPONS, {Name: 'Simple_Weapons', Category: 'Attack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.MARTIAL_WEAPONS, {Name: 'Martial_Weapons', Category: 'Attack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.ADVANCED_WEAPONS, {Name: 'Advanced_Weapons', Category: 'Attack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.UNARMED_ATTACKS, {Name: 'Unarmed_Attacks', Category: 'Attack', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('SIMPLEWEAPONS', {Name: 'Simple_Weapons', Category: 'Attack'}); +g_profConversionMap.set('MARTIALWEAPONS', {Name: 'Martial_Weapons', Category: 'Attack'}); +g_profConversionMap.set('ADVANCEDWEAPONS', {Name: 'Advanced_Weapons', Category: 'Attack'}); +g_profConversionMap.set('UNARMEDATTACKS', {Name: 'Unarmed_Attacks', Category: 'Attack'}); + +g_profConversionMap.set(VARIABLE.SAVE_FORT, {Name: 'Fortitude', Category: 'Save', AbilScore: 'CON'}); +g_profConversionMap.set(VARIABLE.SAVE_REFLEX, {Name: 'Reflex', Category: 'Save', AbilScore: 'DEX'}); +g_profConversionMap.set(VARIABLE.SAVE_WILL, {Name: 'Will', Category: 'Save', AbilScore: 'WIS'}); + +// Old +g_profConversionMap.set('FORTITUDE', {Name: 'Fortitude', Category: 'Save'}); +g_profConversionMap.set('REFLEX', {Name: 'Reflex', Category: 'Save'}); +g_profConversionMap.set('WILL', {Name: 'Will', Category: 'Save'}); + +g_profConversionMap.set(VARIABLE.PERCEPTION, {Name: 'Perception', Category: 'Perception', AbilScore: 'WIS'}); + +// Old +g_profConversionMap.set('PERCEPTION', {Name: 'Perception', Category: 'Perception'}); + +g_profConversionMap.set(VARIABLE.CLASS_DC, {Name: 'Class_DC', Category: 'Class_DC', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('CLASSDC', {Name: 'Class_DC', Category: 'Class_DC'}); + +g_profConversionMap.set(VARIABLE.ARCANE_SPELL_ATTACK, {Name: 'ArcaneSpellAttacks', Category: 'SpellAttack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.OCCULT_SPELL_ATTACK, {Name: 'OccultSpellAttacks', Category: 'SpellAttack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.PRIMAL_SPELL_ATTACK, {Name: 'PrimalSpellAttacks', Category: 'SpellAttack', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.DIVINE_SPELL_ATTACK, {Name: 'DivineSpellAttacks', Category: 'SpellAttack', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('ARCANESPELLATTACKS', {Name: 'ArcaneSpellAttacks', Category: 'SpellAttack'}); +g_profConversionMap.set('OCCULTSPELLATTACKS', {Name: 'OccultSpellAttacks', Category: 'SpellAttack'}); +g_profConversionMap.set('PRIMALSPELLATTACKS', {Name: 'PrimalSpellAttacks', Category: 'SpellAttack'}); +g_profConversionMap.set('DIVINESPELLATTACKS', {Name: 'DivineSpellAttacks', Category: 'SpellAttack'}); + +g_profConversionMap.set(VARIABLE.ARCANE_SPELL_DC, {Name: 'ArcaneSpellDCs', Category: 'SpellDC', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.OCCULT_SPELL_DC, {Name: 'OccultSpellDCs', Category: 'SpellDC', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.PRIMAL_SPELL_DC, {Name: 'PrimalSpellDCs', Category: 'SpellDC', AbilScore: 'NONE'}); +g_profConversionMap.set(VARIABLE.DIVINE_SPELL_DC, {Name: 'DivineSpellDCs', Category: 'SpellDC', AbilScore: 'NONE'}); + +// Old +g_profConversionMap.set('ARCANESPELLDCS', {Name: 'ArcaneSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('OCCULTSPELLDCS', {Name: 'OccultSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('PRIMALSPELLDCS', {Name: 'PrimalSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('DIVINESPELLDCS', {Name: 'DivineSpellDCs', Category: 'SpellDC'}); + +g_profConversionMap.set('ARCANESPELLDC', {Name: 'ArcaneSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('OCCULTSPELLDC', {Name: 'OccultSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('PRIMALSPELLDC', {Name: 'PrimalSpellDCs', Category: 'SpellDC'}); +g_profConversionMap.set('DIVINESPELLDC', {Name: 'DivineSpellDCs', Category: 'SpellDC'}); + +g_profConversionMap.set(VARIABLE.SKILL_ACROBATICS, {Name: 'Acrobatics', Category: 'Skill', AbilScore: 'DEX'}); +g_profConversionMap.set(VARIABLE.SKILL_ARCANA, {Name: 'Arcana', Category: 'Skill', AbilScore: 'INT'}); +g_profConversionMap.set(VARIABLE.SKILL_ATHLETICS, {Name: 'Athletics', Category: 'Skill', AbilScore: 'STR'}); +g_profConversionMap.set(VARIABLE.SKILL_CRAFTING, {Name: 'Crafting', Category: 'Skill', AbilScore: 'INT'}); +g_profConversionMap.set(VARIABLE.SKILL_DECEPTION, {Name: 'Deception', Category: 'Skill', AbilScore: 'CHA'}); +g_profConversionMap.set(VARIABLE.SKILL_DIPLOMACY, {Name: 'Diplomacy', Category: 'Skill', AbilScore: 'CHA'}); +g_profConversionMap.set(VARIABLE.SKILL_INTIMIDATION, {Name: 'Intimidation', Category: 'Skill', AbilScore: 'CHA'}); +g_profConversionMap.set(VARIABLE.SKILL_MEDICINE, {Name: 'Medicine', Category: 'Skill', AbilScore: 'WIS'}); +g_profConversionMap.set(VARIABLE.SKILL_NATURE, {Name: 'Nature', Category: 'Skill', AbilScore: 'WIS'}); +g_profConversionMap.set(VARIABLE.SKILL_OCCULTISM, {Name: 'Occultism', Category: 'Skill', AbilScore: 'INT'}); +g_profConversionMap.set(VARIABLE.SKILL_PERFORMANCE, {Name: 'Performance', Category: 'Skill', AbilScore: 'CHA'}); +g_profConversionMap.set(VARIABLE.SKILL_RELIGION, {Name: 'Religion', Category: 'Skill', AbilScore: 'WIS'}); +g_profConversionMap.set(VARIABLE.SKILL_SOCIETY, {Name: 'Society', Category: 'Skill', AbilScore: 'INT'}); +g_profConversionMap.set(VARIABLE.SKILL_STEALTH, {Name: 'Stealth', Category: 'Skill', AbilScore: 'DEX'}); +g_profConversionMap.set(VARIABLE.SKILL_SURVIVAL, {Name: 'Survival', Category: 'Skill', AbilScore: 'WIS'}); +g_profConversionMap.set(VARIABLE.SKILL_THIEVERY, {Name: 'Thievery', Category: 'Skill', AbilScore: 'DEX'}); + +// Old +g_profConversionMap.set('ACROBATICS', {Name: 'Acrobatics', Category: 'Skill'}); +g_profConversionMap.set('ARCANA', {Name: 'Arcana', Category: 'Skill'}); +g_profConversionMap.set('ATHLETICS', {Name: 'Athletics', Category: 'Skill'}); +g_profConversionMap.set('CRAFTING', {Name: 'Crafting', Category: 'Skill'}); +g_profConversionMap.set('DECEPTION', {Name: 'Deception', Category: 'Skill'}); +g_profConversionMap.set('DIPLOMACY', {Name: 'Diplomacy', Category: 'Skill'}); +g_profConversionMap.set('INTIMIDATION', {Name: 'Intimidation', Category: 'Skill'}); +g_profConversionMap.set('MEDICINE', {Name: 'Medicine', Category: 'Skill'}); +g_profConversionMap.set('NATURE', {Name: 'Nature', Category: 'Skill'}); +g_profConversionMap.set('OCCULTISM', {Name: 'Occultism', Category: 'Skill'}); +g_profConversionMap.set('PERFORMANCE', {Name: 'Performance', Category: 'Skill'}); +g_profConversionMap.set('RELIGION', {Name: 'Religion', Category: 'Skill'}); +g_profConversionMap.set('SOCIETY', {Name: 'Society', Category: 'Skill'}); +g_profConversionMap.set('STEALTH', {Name: 'Stealth', Category: 'Skill'}); +g_profConversionMap.set('SURVIVAL', {Name: 'Survival', Category: 'Skill'}); +g_profConversionMap.set('THIEVERY', {Name: 'Thievery', Category: 'Skill'}); + +function profConversion_convertOldNameToVarName(profName){ + + let convertProfName = profConversion_convertOldName(profName); + switch(convertProfName){ + case 'LIGHTARMOR': return VARIABLE.LIGHT_ARMOR; + case 'MEDIUMARMOR': return VARIABLE.MEDIUM_ARMOR; + case 'HEAVYARMOR': return VARIABLE.HEAVY_ARMOR; + case 'UNARMOREDDEFENSE': return VARIABLE.UNARMORED_DEFENSE; + + case 'SIMPLEWEAPONS': return VARIABLE.SIMPLE_WEAPONS; + case 'MARTIALWEAPONS': return VARIABLE.MARTIAL_WEAPONS; + case 'ADVANCEDWEAPONS': return VARIABLE.ADVANCED_WEAPONS; + case 'UNARMEDATTACKS': return VARIABLE.UNARMED_ATTACKS; + + case 'FORTITUDE': return VARIABLE.SAVE_FORT; + case 'REFLEX': return VARIABLE.SAVE_REFLEX; + case 'WILL': return VARIABLE.SAVE_WILL; + + case 'PERCEPTION': return VARIABLE.PERCEPTION; + + case 'CLASSDC': return VARIABLE.CLASS_DC; + + case 'ARCANESPELLATTACKS': return VARIABLE.ARCANE_SPELL_ATTACK; + case 'OCCULTSPELLATTACKS': return VARIABLE.OCCULT_SPELL_ATTACK; + case 'PRIMALSPELLATTACKS': return VARIABLE.PRIMAL_SPELL_ATTACK; + case 'DIVINESPELLATTACKS': return VARIABLE.DIVINE_SPELL_ATTACK; + + case 'ARCANESPELLDCS': return VARIABLE.ARCANE_SPELL_DC; + case 'OCCULTSPELLDCS': return VARIABLE.OCCULT_SPELL_DC; + case 'PRIMALSPELLDCS': return VARIABLE.PRIMAL_SPELL_DC; + case 'DIVINESPELLDCS': return VARIABLE.DIVINE_SPELL_DC; + case 'ARCANESPELLDC': return VARIABLE.ARCANE_SPELL_DC; + case 'OCCULTSPELLDC': return VARIABLE.OCCULT_SPELL_DC; + case 'PRIMALSPELLDC': return VARIABLE.PRIMAL_SPELL_DC; + case 'DIVINESPELLDC': return VARIABLE.DIVINE_SPELL_DC; + + case 'ACROBATICS': return VARIABLE.SKILL_ACROBATICS; + case 'ARCANA': return VARIABLE.SKILL_ARCANA; + case 'ATHLETICS': return VARIABLE.SKILL_ATHLETICS; + case 'CRAFTING': return VARIABLE.SKILL_CRAFTING; + case 'DECEPTION': return VARIABLE.SKILL_DECEPTION; + case 'DIPLOMACY': return VARIABLE.SKILL_DIPLOMACY; + case 'INTIMIDATION': return VARIABLE.SKILL_INTIMIDATION; + case 'MEDICINE': return VARIABLE.SKILL_MEDICINE; + case 'NATURE': return VARIABLE.SKILL_NATURE; + case 'OCCULTISM': return VARIABLE.SKILL_OCCULTISM; + case 'PERFORMANCE': return VARIABLE.SKILL_PERFORMANCE; + case 'RELIGION': return VARIABLE.SKILL_RELIGION; + case 'SOCIETY': return VARIABLE.SKILL_SOCIETY; + case 'STEALTH': return VARIABLE.SKILL_STEALTH; + case 'SURVIVAL': return VARIABLE.SKILL_SURVIVAL; + case 'THIEVERY': return VARIABLE.SKILL_THIEVERY; + + case 'ADDLORE': return VARIABLE.ADD_LORE; + + default: break; // Break to below + } + + if(convertProfName.endsWith('LORE')){ + console.log(`SKILL_${convertProfName.slice(0, -4)}_LORE`); + return `SKILL_${convertProfName.slice(0, -4)}_LORE`; + } else { + console.error('Failed to convert variable '+convertProfName); + return ''; + } + +} + +function profConversion_convertOldName(profName){ + return profName.replace(/\s+/g,'').replace(/_/g,'').toUpperCase(); +} + +let g_expr_hasInit = false; +let g_expr_level, g_expr_focusPoints, g_expr_profMap, g_expr_senseArray, + g_expr_heritage, g_expr_classAbilityArray, g_expr_featDataMap, g_expr_featNameArray = null; + +function initExpressionProcessor(expDataStruct){ + + g_expr_level = expDataStruct.ChoiceStruct.Character.level; + g_expr_profMap = objToMap(expDataStruct.ChoiceStruct.ProfObject); + g_expr_heritage = expDataStruct.ChoiceStruct.Heritage; + g_expr_focusPoints = expDataStruct.ChoiceStruct.FocusPointArray.length; + g_expr_senseArray = expDataStruct.ChoiceStruct.SenseArray; + + if(expDataStruct.ChoiceStruct.ClassDetails != null){ + g_expr_classAbilityArray = []; + if(expDataStruct.ChoiceStruct.ClassDetails.Abilities != null){ + for(let classAbility of expDataStruct.ChoiceStruct.ClassDetails.Abilities){ + if(classAbility.level == -1) {continue;} + if(classAbility.level <= g_expr_level) { + if(classAbility.selectType != 'SELECT_OPTION'){ + g_expr_classAbilityArray.push(classAbility.name.toUpperCase().replace(/\(|\)/g,"")); + } else { + let choiceData = expDataStruct.ChoiceStruct.ChoiceArray.find(choiceData => { + return classAbility.id == choiceData.OptionID; + }); + if(choiceData != null){ + g_expr_classAbilityArray.push(classAbility.name.toUpperCase().replace(/\(|\)/g,"")); + } + } + } + } + for(let classAbility of expDataStruct.ChoiceStruct.ExtraClassFeaturesArray){ + if(classAbility.value != null && classAbility.value.name != null){ + g_expr_classAbilityArray.push(classAbility.value.name.toUpperCase().replace(/\(|\)/g,"")); + } + } + } + } + + if(expDataStruct.ChoiceStruct.FeatArray != null){ + g_expr_featNameArray = []; + g_expr_featDataMap = new Map(); + for(let feat of expDataStruct.ChoiceStruct.FeatArray){ + if(feat.value != null){ + let featName = feat.value.name.toUpperCase(); + g_expr_featNameArray.push(featName); + g_expr_featDataMap.set(featName, feat); + } + } + } + + g_expr_hasInit = true; + +} + +function updateExpressionProcessor(expDataStruct){ + initExpressionProcessor(expDataStruct); +} + + +function testExpr(wscCode, srcStruct=null){ + if(!g_expr_hasInit) { + displayError("Expression Processor has not been init!"); + return null; + } + + const exprStruct = readExpr(wscCode); + if(exprStruct == null) { return wscCode; } + + let expression = exprStruct.expression; + let statement = exprStruct.statement; + let elseStatement = exprStruct.elseStatement; + + // If not on the character sheet, treat expression as true + if(exprStruct.isSheetOnly && !isSheetPage()){ return statement; } + + if(expression.includes(' && ')){ + let expParts = expression.split(' && '); + + let allTrue = true; + for(let expPart of expParts){ + let resultStatement = expHandleExpression(expPart, statement, elseStatement, srcStruct); + if(resultStatement != statement){ + allTrue = false; + } + } + + if(allTrue) { + return statement; + } else { + return elseStatement; + } + + } else { + + let result = expHandleExpression(expression, statement, elseStatement, srcStruct); + if(result != -1){ + return result; + } else { + displayError("Unknown expression: \'"+expression+"\'"); + return null; + } + + } + +} + +function expHandleExpression(expression, statement, elseStatement, srcStruct){ + + if(expression.includes('HAS-LEVEL')){ // HAS-LEVEL==13 + return expHasLevel(expression, statement, elseStatement); + } + + if(expression.includes('HAS-FOCUS-POINTS')){ // HAS-FOCUS-POINTS==3 + return expHasFocusPoints(expression, statement, elseStatement); + } + + if(expression.includes('HAS-HERITAGE')){ // HAS-HERITAGE==Treedweller + return expHasHeritage(expression, statement, elseStatement); + } + + if(expression.includes('HAS-CLASS-ABILITY')){ // HAS-CLASS-ABILITY==Cloistered Cleric + return expHasClassAbility(expression, statement, elseStatement); + } + + if(expression.includes('HAS-FEAT')){ // HAS-FEAT==Specialty Crafting + return expHasFeat(expression, statement, elseStatement, srcStruct); + } + + if(expression.includes('HAS-PROF')){ // HAS-PROF==Arcana:T + return expHasProf(expression, statement, elseStatement, srcStruct); + } + + if(expression.includes('HAS-VISION')){ // HAS-VISION==Darkvision + return expHasVision(expression, statement, elseStatement, srcStruct); + } + + if(expression.includes('HAS-ENABLED-SOURCE')){ // HAS-ENABLED-SOURCE==Advanced Player's Guide + return expHasSource(expression, statement, elseStatement); + } + + let variableExprMatch = expression.match(/IS-VARIABLE\(([\w]+)\)/); + if(variableExprMatch != null){ // IS-VARIABLE(SCORE_INT)>=25 + return expIsVariable(expression, variableExprMatch[1], statement, elseStatement); + } + + /* Sheet-Only Expressions */ + if(expression.includes('IS-UNARMORED')){ // IS-UNARMORED + return expIsUnarmored(expression, statement, elseStatement); + } + + if(expression.includes('IS-TOGGLED')){ // IS-TOGGLED==Rage + return expIsToggled(expression, statement, elseStatement); + } + + return -1; + +} + +function expHasLevel(expression, statement, elseStatement){ + return expHasNumberCompare(g_expr_level, expression, statement, elseStatement); +} + +function expHasFocusPoints(expression, statement, elseStatement){ + return expHasNumberCompare(g_expr_focusPoints, expression, statement, elseStatement); +} + +function expIsVariable(expression, variableName, statement, elseStatement){ + let variable = g_variableMap.get(variableName); + if(variable == null) { + displayError("Expression Processing: Unknown variable \'"+variableName+"\'!"); + return elseStatement; + } + + if(variable.Type == VAR_TYPE.INTEGER){ + return expHasNumberCompare(variables_getTotal(variableName), expression, statement, elseStatement); + } else if(variable.Type == VAR_TYPE.STRING){ + return expHasStringCompare(variable.Value, expression, statement, elseStatement); + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + return expHasNumberCompare(variables_getTotal(variableName), expression, statement, elseStatement); + } else if(variable.Type == VAR_TYPE.LIST){ + return expHasStringCompare(variable.Value+'', expression, statement, elseStatement); + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + return expHasStringCompare(variables_getFinalRank(variableName), expression, statement, elseStatement); + } else { + displayError("Expression Processing: Unknown variable type \'"+variable.Type+"\'!"); + return elseStatement; + } + +} + +function expHasNumberCompare(charVarNumber, expression, statement, elseStatement){ + if(expression.includes('==')){ + let inputValue = expression.split('==')[1]; + let number = parseInt(inputValue); + if(!isNaN(number)){ + if(charVarNumber == number){ + return statement; + } else { + return elseStatement; + } + } else { + let varValue = getVariableValue(inputValue, false); + if(charVarNumber == varValue){ + return statement; + } else { + return elseStatement; + } + } + } else if(expression.includes('>=')){ + let inputValue = expression.split('>=')[1]; + let number = parseInt(inputValue); + if(!isNaN(number)){ + if(charVarNumber >= number){ + return statement; + } else { + return elseStatement; + } + } else { + let varValue = getVariableValue(inputValue, false); + if(charVarNumber >= varValue){ + return statement; + } else { + return elseStatement; + } + } + } else if(expression.includes('<=')){ + let inputValue = expression.split('<=')[1]; + let number = parseInt(inputValue); + if(!isNaN(number)){ + if(charVarNumber <= number){ + return statement; + } else { + return elseStatement; + } + } else { + let varValue = getVariableValue(inputValue, false); + if(charVarNumber <= varValue){ + return statement; + } else { + return elseStatement; + } + } + } else if(expression.includes('!=')){ + let inputValue = expression.split('!=')[1]; + let number = parseInt(inputValue); + if(!isNaN(number)){ + if(charVarNumber != number){ + return statement; + } else { + return elseStatement; + } + } else { + let varValue = getVariableValue(inputValue, false); + if(charVarNumber != varValue){ + return statement; + } else { + return elseStatement; + } + } + } + return null; +} + +function expHasStringCompare(charVarString, expression, statement, elseStatement){ + if(expression.includes('==')){ + let string = expression.split('==')[1]; + if(string != null){ + if(charVarString == string){ + return statement; + } else { + return elseStatement; + } + } + } else if(expression.includes('!=')){ + let string = expression.split('!=')[1]; + if(string != null){ + if(charVarString != string){ + return statement; + } else { + return elseStatement; + } + } + } + return null; +} + +function expHasHeritage(expression, statement, elseStatement){ + if(g_expr_heritage == null) { return elseStatement; } + if(expression.includes('==')){ + let heritageName = expression.split('==')[1].toUpperCase(); + let currentHeritageName = g_expr_heritage.name.toUpperCase(); + if(currentHeritageName.startsWith(heritageName)){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let heritageName = expression.split('!=')[1].toUpperCase(); + let currentHeritageName = g_expr_heritage.name.toUpperCase(); + if(!currentHeritageName.startsWith(heritageName)){ + return statement; + } else { + return elseStatement; + } + } +} + +function expHasClassAbility(expression, statement, elseStatement){ + if(expression.includes('==')){ + let classAbilityName = expression.split('==')[1].toUpperCase(); + classAbilityName = classAbilityName.replace(/_/g," "); + if(g_expr_classAbilityArray == null){ return statement; } + if(g_expr_classAbilityArray.includes(classAbilityName)){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let classAbilityName = expression.split('!=')[1].toUpperCase(); + classAbilityName = classAbilityName.replace(/_/g," "); + if(g_expr_classAbilityArray == null){ return elseStatement; } + if(!g_expr_classAbilityArray.includes(classAbilityName)){ + return statement; + } else { + return elseStatement; + } + } +} + +function expHasFeat(expression, statement, elseStatement, srcStruct){ + if(expression.includes('==')){ + let featName = expression.split('==')[1].toUpperCase(); + featName = featName.replace(/_/g," "); + if(g_expr_featNameArray.includes(featName) && !hasSameSrc(srcStruct, g_expr_featDataMap.get(featName))){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let featName = expression.split('!=')[1].toUpperCase(); + featName = featName.replace(/_/g," "); + if(!g_expr_featNameArray.includes(featName)){ + return statement; + } else { + return elseStatement; + } + } +} + +function expHasSource(expression, statement, elseStatement){ + if(expression.includes('==')){ + let sourceName = expression.split('==')[1].toUpperCase().trim(); + let source = g_enabledSources.find(source => { + return source.name.toUpperCase().trim() == sourceName; + }); + if(source != null){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let sourceName = expression.split('!=')[1].toUpperCase().trim(); + let source = g_enabledSources.find(source => { + return source.name.toUpperCase().trim() == sourceName; + }); + if(source != null){ + return elseStatement; + } else { + return statement; + } + } +} + +function expHasVision(expression, statement, elseStatement, srcStruct){ + if(expression.includes('==')){ + let visionName = expression.split('==')[1].toUpperCase(); + visionName = visionName.replace(/_/g," "); + let vision = g_expr_senseArray.find(senseData => { + if(senseData.value != null && !hasSameSrc(srcStruct, senseData)){ + return visionName === senseData.value.name.toUpperCase(); + } else { + return false; + } + }); + if(vision != null){ + return statement; + } else { + return elseStatement; + } + } else if(expression.includes('!=')){ + let visionName = expression.split('!=')[1].toUpperCase(); + visionName = visionName.replace(/_/g," "); + let vision = g_expr_senseArray.find(senseData => { + if(senseData.value != null && !hasSameSrc(srcStruct, senseData)){ + return visionName === senseData.value.name.toUpperCase(); + } else { + return false; + } + }); + if(vision == null){ + return statement; + } else { + return elseStatement; + } + } +} + +function expHasProf(expression, statement, elseStatement, srcStruct){ + let data; + let boolOp; + if(expression.includes('==')){ + data = expression.split('==')[1]; + boolOp = 'EQUALS'; + } else if(expression.includes('>=')){ + data = expression.split('>=')[1]; + boolOp = 'GREATER-EQUALS'; + } else if(expression.includes('<=')){ + data = expression.split('<=')[1]; + boolOp = 'LESSER-EQUALS'; + } else if(expression.includes('!=')){ + data = expression.split('!=')[1]; + boolOp = 'NOT-EQUALS'; + } else { + return null; + } + + let segments = data.split(':'); + + let profName = segments[0]; + let profType = segments[1]; + + profName = profName.replace(/_|\s+/g,""); + let profData = g_profConversionMap.get(profName); + + let numUps = profToNumUp(profType); + if(numUps === -1){return null;} + + let foundProf = false; + for(const [profMapName, profMapDataArray] of g_expr_profMap.entries()){ + const finalProfData = getFinalProf(cleanProfDataArrayOfStatementProfs(profMapDataArray, srcStruct)); + if(finalProfData == null) { continue; } + if(profData == null){ + let tempSkillName = finalProfData.Name.toUpperCase(); + tempSkillName = tempSkillName.replace(/_|\s+/g,""); + if(tempSkillName === profName.toUpperCase()) { + foundProf = true; + if(expHasProfNumUpsCompare(finalProfData.NumUps, boolOp, numUps)) { + return statement; + } + } + } else { + if(finalProfData.Name === profData.Name) { + foundProf = true; + if (expHasProfNumUpsCompare(finalProfData.NumUps, boolOp, numUps)){ + return statement; + } + } + } + } + if(numUps === 0 && !foundProf){ return statement; } + + return elseStatement; +} + +function expHasProfNumUpsCompare(numUpsOne, boolOp, numUpsTwo){ + switch(boolOp) { + case 'EQUALS': return numUpsOne == numUpsTwo; + case 'NOT-EQUALS': return numUpsOne != numUpsTwo; + case 'GREATER-EQUALS': return numUpsOne >= numUpsTwo; + case 'LESSER-EQUALS': return numUpsOne <= numUpsTwo; + default: return false; + } +} + +function cleanProfDataArrayOfStatementProfs(profDataArray, srcStruct){ + if(srcStruct == null) {return profDataArray;} + let newProfDataArray = []; + for(let profData of profDataArray) { + if(!hasSameSrc(srcStruct, profData)){ + newProfDataArray.push(profData); + } + } + return newProfDataArray; +} + + +/*~ Sheet-Only Expressions ~*/ + +function expIsUnarmored(expression, statement, elseStatement) { + if (typeof g_equippedArmorCategory !== 'undefined') { + return (g_equippedArmorCategory == null || g_equippedArmorCategory == 'UNARMORED') ? statement : elseStatement; + } else { + return null; + } +} + +function expIsToggled(expression, statement, elseStatement) { + if(!isSheetPage()) { return null; } + if(expression.includes('==')){ + let sheetStateName = expression.split('==')[1].toUpperCase(); + let sheetState = getSheetStateByName(sheetStateName); + if(sheetState != null){ + return (isSheetStateActive(sheetState.id)) ? statement : elseStatement; + } else { + displayError("Cannot find toggleable '"+sheetStateName+"'!"); + return null; + } + } else if(expression.includes('!=')){ + let sheetStateName = expression.split('!=')[1].toUpperCase(); + let sheetState = getSheetStateByName(sheetStateName); + if(sheetState != null){ + return (isSheetStateActive(sheetState.id)) ? elseStatement : statement; + } else { + displayError("Cannot find toggleable '"+sheetStateName+"'!"); + return null; + } + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/expression-utils.js b/client/vue-src/legacy-js/wsc/expression-utils.js new file mode 100644 index 00000000..94b3e997 --- /dev/null +++ b/client/vue-src/legacy-js/wsc/expression-utils.js @@ -0,0 +1,31 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +function readExpr(wscCode){ + // IF(*){*} or IF(*){*}ELSE{*} + let rMatchIf = wscCode.match(/^\s*IF\s*\((.*?)\)\s*\{(.*?)\}\s*$/); + let rMatchIfElse = wscCode.match(/^\s*IF\s*\((.*?)\)\s*\{(.*?)\}\s*ELSE\s*\{(.*?)\}\s*$/); + let rMatchIfSheet = wscCode.match(/^\s*IF-SHEET\s*\((.*?)\)\s*\{(.*?)\}\s*$/); + if(rMatchIf == null && rMatchIfElse == null && rMatchIfSheet == null) { return null; } + + let expression; + let statement; + let elseStatement; + let isSheetOnly = false; + if(rMatchIfElse != null){ + expression = rMatchIfElse[1]; + statement = rMatchIfElse[2]; + elseStatement = rMatchIfElse[3]; + } else if(rMatchIf != null){ + expression = rMatchIf[1]; + statement = rMatchIf[2]; + elseStatement = null; + } else if(rMatchIfSheet != null){ + expression = rMatchIfSheet[1]; + statement = rMatchIfSheet[2]; + elseStatement = null; + isSheetOnly = true; + } + return {expression, statement, elseStatement, isSheetOnly}; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/misc-feat-processing.js b/client/vue-src/legacy-js/wsc/misc-feat-processing.js new file mode 100644 index 00000000..0844c445 --- /dev/null +++ b/client/vue-src/legacy-js/wsc/misc-feat-processing.js @@ -0,0 +1,124 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +let g_concealedFeatNames = []; +let g_overrideFeatLevelMap = new Map(); + +function processMiscFeatStatements(code) { + if (code == null) { return; } + + let allStatements = code.split(/\n/); + + let success = allStatements.length > 0; + for (let statementRaw of allStatements) { + // Test/Check Statement for Expressions // + let wscStatement = testExpr(statementRaw); + if (wscStatement == null) { continue; } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + let wscStatementUpper = wscStatement.toUpperCase(); + + if (wscStatementUpper.includes("UNHIDE-FEAT-NAME=")) { // UNHIDE-FEAT-NAME=Counterspell + + let featName = wscStatementUpper.split('=')[1]; + // Do nothing + + continue; + } + + if (wscStatementUpper.includes("HIDE-FEAT-NAME=")) { // HIDE-FEAT-NAME=Counterspell + + let featName = wscStatementUpper.split('=')[1]; + removalFeat(featName, null, null); + + continue; + } + + if (wscStatementUpper.includes("OVERRIDE-FEAT-LEVEL=")) { // OVERRIDE-FEAT-LEVEL=Counterspell:2 + + let data = wscStatementUpper.split('=')[1]; + let dataParts = data.split(':'); + g_overrideFeatLevelMap.set(dataParts[0].toUpperCase(), parseInt(dataParts[1])); + g_featMap = updateFeatMapWithMiscs(g_featMap); + + continue; + } + + if (wscStatementUpper.includes("SHEET-CONCEAL-FEAT-NAME=")) { // SHEET-CONCEAL-FEAT-NAME=Counterspell + + let featName = wscStatementUpper.split('=')[1]; + g_concealedFeatNames.push(featName.toUpperCase()); + + continue; + } + + // Could not identify wsc statement + success = false; + } + return success; +} + +// For new processor +function runMiscFeatStatements(wscStatement, wscStatementUpper) { + + if (wscStatementUpper.startsWith("UNHIDE-FEAT-NAME=")) { // UNHIDE-FEAT-NAME=Counterspell + + let featName = wscStatementUpper.split('=')[1]; + // Do nothing + + return PROCESS_RETURN.NEXT; + } + + if (wscStatementUpper.startsWith("HIDE-FEAT-NAME=")) { // HIDE-FEAT-NAME=Counterspell + + let featName = wscStatementUpper.split('=')[1]; + removalFeat(featName, null, null); + + return PROCESS_RETURN.NEXT; + } + + if (wscStatementUpper.startsWith("OVERRIDE-FEAT-LEVEL=")) { // OVERRIDE-FEAT-LEVEL=Counterspell:2 + + let data = wscStatementUpper.split('=')[1]; + let dataParts = data.split(':'); + g_overrideFeatLevelMap.set(dataParts[0].toUpperCase(), parseInt(dataParts[1])); + g_featMap = updateFeatMapWithMiscs(g_featMap); + + return PROCESS_RETURN.NEXT; + } + + if (wscStatementUpper.startsWith("SHEET-CONCEAL-FEAT-NAME=")) { // SHEET-CONCEAL-FEAT-NAME=Counterspell + + let featName = wscStatementUpper.split('=')[1]; + g_concealedFeatNames.push(featName.toUpperCase()); + + return PROCESS_RETURN.NEXT; + } + + return PROCESS_RETURN.UNKNOWN; +} + +function isFeatConcealed(featName) { + return g_concealedFeatNames.includes(featName.toUpperCase()); +} + +function getFeatLevelOverride(featName) { + return g_overrideFeatLevelMap.get(featName.toUpperCase()); +} + +function updateFeatMapWithMiscs(featMap) { + let newFeatMap = new Map(); + for (const [featID, featStruct] of featMap.entries()) { + if (featStruct.Feat != null) { + let newFeatStruct = featStruct; + let newLevel = getFeatLevelOverride(featStruct.Feat.name); + if (newLevel != null) { + newFeatStruct.Feat.level = newLevel; + } + newFeatMap.set(featID, newFeatStruct); + } else { + newFeatMap.set(featID, featStruct); + } + } + return newFeatMap; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/removal-processing.js b/client/vue-src/legacy-js/wsc/removal-processing.js new file mode 100644 index 00000000..6ca966ef --- /dev/null +++ b/client/vue-src/legacy-js/wsc/removal-processing.js @@ -0,0 +1,172 @@ +/* Copyright (C) 2022, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +/* Requires: + + g_featMap + g_spellMap + g_itemMap + + g_classMap || (g_classDetails.Abilities && g_allClassAbilityOptions && g_extraClassAbilities) + +*/ + +function processRemovalStatements(code, codeName, bundleID){ + if(code == null) {return;} + + let allStatements = code.split(/\n/); + + let success = allStatements.length > 0; + for(let statementRaw of allStatements){ + // Test/Check Statement for Expressions // + let wscStatement = testExpr(statementRaw); + if(wscStatement == null) {continue;} + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + let wscStatementUpper = wscStatement.toUpperCase(); + + if(wscStatementUpper.includes("REMOVAL-FEAT-NAME=")){ + + let name = wscStatementUpper.split('=')[1].trim(); + removalFeat(name, codeName, bundleID); + + continue; + } + + if(wscStatementUpper.includes("REMOVAL-ITEM-NAME=")){ + + let name = wscStatementUpper.split('=')[1].trim(); + removalItem(name, codeName, bundleID); + + continue; + } + + if(wscStatementUpper.includes("REMOVAL-SPELL-NAME=")){ + + let name = wscStatementUpper.split('=')[1].trim(); + removalSpell(name, codeName, bundleID); + + continue; + } + + if(wscStatementUpper.includes("REMOVAL-CLASS-FEATURE-NAME=")){ + + let name = wscStatementUpper.split('=')[1].trim(); + removalClassFeature(name, codeName, bundleID); + + continue; + } + + // Could not identify wsc statement + success = false; + } + return success; +} + +function removalFeat(name, codeName, bundleID){ + + for(const [featID, featStruct] of g_featMap.entries()){ + if(featStruct?.Feat?.name?.toUpperCase().trim() === name){ + + if(bundleID){ + if(featStruct.Feat.homebrewID+'' !== bundleID+''){ + g_featMap.delete(featID); + } + } else { + if(featStruct.Feat.contentSrc !== codeName){ + g_featMap.delete(featID); + } + } + + } + } + +} + +function removalSpell(name, codeName, bundleID){ + + for(const [spellID, spellStruct] of g_spellMap.entries()){ + if(spellStruct?.Spell?.name?.toUpperCase().trim() === name){ + + if(bundleID){ + if(spellStruct.Spell.homebrewID+'' !== bundleID+''){ + g_spellMap.delete(spellID); + } + } else { + if(spellStruct.Spell.contentSrc !== codeName){ + g_spellMap.delete(spellID); + } + } + + } + } + +} + +function removalItem(name, codeName, bundleID){ + + for(const [itemID, itemStruct] of g_itemMap.entries()){ + if(itemStruct?.Item?.name?.toUpperCase().trim() === name){ + + if(bundleID){ + if(itemStruct.Item.homebrewID+'' !== bundleID+''){ + g_itemMap.delete(itemID); + } + } else { + if(itemStruct.Item.contentSrc !== codeName){ + g_itemMap.delete(itemID); + } + } + + } + } + +} + +function removalClassFeature(name, codeName, bundleID){ + + let searchAndRemoveClassFeature = function(abilityArray, insideValue=false){ + if(abilityArray == null) { return; } + for(let i = 0; i < abilityArray.length; i++){ + let classFeature = abilityArray[i]; + if(insideValue){ + classFeature = classFeature.value; + } + + if(classFeature?.name?.toUpperCase().trim() === name){ + + if(bundleID){ + if(classFeature.homebrewID+'' !== bundleID+''){ + abilityArray.splice(i, 1); + } + } else { + if(classFeature.contentSrc !== codeName){ + abilityArray.splice(i, 1); + } + } + + } + + } + }; + + + if(isSheetPage()){ + + searchAndRemoveClassFeature(g_classDetails.Abilities); + searchAndRemoveClassFeature(g_allClassAbilityOptions); + searchAndRemoveClassFeature(g_extraClassAbilities, true); + + } else { + + for(const [classID, classStruct] of g_classMap.entries()){ + searchAndRemoveClassFeature(classStruct.Abilities); + } + + } + +} + + + + diff --git a/client/vue-src/legacy-js/wsc/statement-processing.js b/client/vue-src/legacy-js/wsc/statement-processing.js new file mode 100644 index 00000000..2d6550ed --- /dev/null +++ b/client/vue-src/legacy-js/wsc/statement-processing.js @@ -0,0 +1,585 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ========================================================================================= // +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Wanderer's Guide Code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // +// ========================================================================================= // + +function testSheetCode(wscCode){ + return processSheetCode(wscCode, { source: 'TEST' }, true); +} + +function processSheetCode(wscCode, extraData=null, isTest=false){ + if(wscCode == null) {return false;} + if(extraData == null){ extraData = {source: 'Unknown', sourceName: ''}; } + + // Process Variables + let varUniqueID = `sheetCode-${extraData.source}-`; + if(extraData.source == 'ClassAbility' || extraData.source == 'ClassAbilityOption'){ + varUniqueID += extraData.abilityID; + } else if(extraData.source == 'Feat'){ + if(extraData.srcStructKey != null){ + varUniqueID += extraData.featID+'-'+extraData.srcStructKey; + } else { + varUniqueID += extraData.featID; + } + } else { + varUniqueID += extraData.sourceName; + } + wscCode = processVariables(wscCode, varUniqueID); + + let wscStatements = wscCode.split(/\n/); + + let success = true; + for(const wscStatementRaw of wscStatements) { + // Test/Check Statement for Expressions // + let wscStatement = testExpr(wscStatementRaw); + if(wscStatement == null) {continue;} + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + let wscStatementUpper = wscStatement.toUpperCase(); + + // If it's a removal statement, continue + if(wscStatementUpper.startsWith('REMOVAL-')){ + continue; + } + + if(wscStatementUpper.startsWith("ADD-TEXT=")){ + continue; // Ignore ADD-TEXT statements, they're processed separately + } + + if(wscStatementUpper.startsWith("GIVE-CONDITION=")){ // GIVE-CONDITION=Clumsy:1 OR GIVE-CONDITION=Clumsy + if(isTest) {continue;} + + let conditionName = wscStatement.split('=')[1]; + let conditionValue = null; + if(wscStatement.includes(":")){ + let conditionNameData = conditionName.split(":"); + conditionName = conditionNameData[0]; + conditionValue = parseInt(conditionNameData[1]); + } + + let conditionID = getConditionFromName(conditionName).id; + let conditionParentID = getCurrentConditionIDFromName(extraData.sourceName); + addCondition(conditionID+'', conditionValue, extraData.sourceName, conditionParentID); + + continue; + } + + if(wscStatementUpper.startsWith("REMOVE-CONDITION=")){ // REMOVE-CONDITION=Clumsy + if(isTest) {continue;} + + let conditionName = wscStatement.split('=')[1]; + + let conditionID = getConditionFromName(conditionName).id; + removeCondition(conditionID); + + continue; + } + + if(wscStatementUpper.startsWith("CONDITIONAL-INCREASE-")){ + if(isTest) {continue;} + // Ex. CONDITIONAL-INCREASE-PERCEPTION=2~status bonus to checks for initiative + + let adjustmentData = (wscStatement.split('-')[2]).split('='); + let adjustmentTowards = adjustmentData[0]; + let adjustmentNumInfoData = (adjustmentData[1]).split('~'); + let adjustmentNum = getSheetProcNumber(adjustmentNumInfoData[0], extraData.sourceName); + let adjustmentCondition = adjustmentNumInfoData[1]; + addConditionalStat(adjustmentTowards, signNumber(adjustmentNum)+' '+adjustmentCondition, extraData.sourceName); + + continue; + } + + if(wscStatementUpper.startsWith("CONDITIONAL-DECREASE-")){ + if(isTest) {continue;} + // Ex. CONDITIONAL-DECREASE-PERCEPTION=2~status penalty to checks for initiative + + let adjustmentData = (wscStatement.split('-')[2]).split('='); + let adjustmentTowards = adjustmentData[0]; + let adjustmentNumInfoData = (adjustmentData[1]).split('~'); + let adjustmentNum = getSheetProcNumber(adjustmentNumInfoData[0], extraData.sourceName); + let adjustmentCondition = adjustmentNumInfoData[1]; + addConditionalStat(adjustmentTowards, signNumber(-1*adjustmentNum)+' '+adjustmentCondition, extraData.sourceName); + + continue; + } + + if(wscStatementUpper.startsWith("CONDITIONAL-")){ + if(isTest) {continue;} + // Ex. CONDITIONAL-SAVE_FORT=When you roll a success, you get a critical success instead. + + let dataSplit = wscStatement.split('='); + + let adjustmentTowards = dataSplit[0].split('-')[1]; + let adjustmentInfo = dataSplit[1]; + addConditionalStat(adjustmentTowards, adjustmentInfo, extraData.sourceName); + + continue; + } + + if(wscStatementUpper.startsWith("INCREASE-")){ + if(isTest) {continue;} + // INCREASE-X=5 (Ex. INCREASE-SCORE_STR=2, INCREASE-SPEED=10-STATUS) + + let adjValData = wscStatement.split('-'); + let adjustmentData = adjValData[1].split('='); + let adjustmentTowards = adjustmentData[0]; + + let adjustmentNum = getSheetProcNumber(adjustmentData[1], extraData.sourceName); + let adjustmentSource = 'OTHER-'+extraData.sourceName; + if(adjValData[2] != null) { + adjustmentSource = adjValData[2]; + } + + if(!adjustmentSource.endsWith('_BONUS') && !adjustmentSource.endsWith('_PENALTY')){ + adjustmentSource += '_BONUS'; + } + + addStatAndSrc(adjustmentTowards, adjustmentSource, adjustmentNum, extraData.sourceName); + + continue; + } + + if(wscStatementUpper.startsWith("DECREASE-")){ + if(isTest) {continue;} + // DECREASE-X=5 (Ex. DECREASE-SCORE_STR=2, DECREASE-SPEED=10-STATUS) + + let adjValData = wscStatement.split('-'); + let adjustmentData = adjValData[1].split('='); + let adjustmentTowards = adjustmentData[0]; + + let adjustmentNum = getSheetProcNumber(adjustmentData[1], extraData.sourceName); + let adjustmentSource = 'OTHER-'+extraData.sourceName; + if(adjValData[2] != null) { + adjustmentSource = adjValData[2]; + } + + if(!adjustmentSource.endsWith('_BONUS') && !adjustmentSource.endsWith('_PENALTY')){ + adjustmentSource += '_PENALTY'; + } + + addStatAndSrc(adjustmentTowards, adjustmentSource, -1*adjustmentNum, extraData.sourceName); + + continue; + } + + if(wscStatementUpper.startsWith("OVERRIDE-") && !wscStatementUpper.startsWith("OVERRIDE-FEAT-LEVEL=")){ + if(isTest) {continue;} + // OVERRIDE-X=5 (Ex. OVERRIDE-PERCEPTION=10-MODIFIER) + + let adjValData = wscStatement.split('-'); + let overrideData = adjValData[1].split('='); + + let overrideTowards = overrideData[0]; + let overrideSource = adjValData[2]; + if(overrideSource == null) { overrideSource = ''; } + + let overrideNum = getSheetProcNumber(overrideData[1], extraData.sourceName); + + if(overrideTowards.endsWith('_PENALTY')){ + overrideNum = -1*overrideNum; + } + + addStat(overrideTowards, overrideSource, overrideNum); + + continue; + } + + if(wscStatementUpper.startsWith("SET-APEX-ABILITY-SCORE=")){ + if(isTest) {continue;} + // SET-APEX-ABILITY-SCORE=X (Ex. SET-APEX-ABILITY-SCORE=DEX) + + let adjustmentData = wscStatement.split('='); + let abilityScore = adjustmentData[1]; + + let baseStat = variables_getValue('SCORE_'+abilityScore).Score; + if(baseStat >= 18){ + g_variableMap.get('SCORE_'+abilityScore).Value.Score = baseStat+2; + } else { + g_variableMap.get('SCORE_'+abilityScore).Value.Score = 18; + } + + continue; + } + + if(wscStatementUpper.startsWith("SET-SIZE=")){ + if(isTest) {continue;} + + // SET-SIZE=X (Ex. SET-SIZE=SMALL) + let sizeData = wscStatementUpper.split('='); + let newSize = sizeData[1]; + + if(newSize == 'TINY' || newSize == 'SMALL' || newSize == 'MEDIUM' || newSize == 'LARGE' || newSize == 'HUGE' || newSize == 'GARGANTUAN'){ + g_charSize = newSize; + } else { + displayError('Attempted to set character size to unknown value "'+newSize+'"'); + } + + continue; + } + + if(wscStatementUpper.startsWith("SET-MAP=")){ + if(isTest) {continue;} + // TIER_1 = (5/10 or 4/8 agile) + // TIER_2 = (4/8 or 3/6 agile) + // TIER_3 = (3/6 or 2/4 agile) + // TIER_4 = (2/4 or 1/2 agile) + let mapTier = wscStatementUpper.split('=')[1]; + + if(mapTier == 'TIER_1' || mapTier == 'TIER_2' || mapTier == 'TIER_2_AGILE' || mapTier == 'TIER_3' || mapTier == 'TIER_4'){ + gState_MAP = mapTier; + } else { + displayError('Attempted to set multiple attack penalty to unknown tier "'+mapTier+'"'); + } + + continue; + } + + + if(wscStatementUpper.startsWith("DEFAULT-ON-HIT-DAMAGE=")){ + if(isTest) {continue;} //DEFAULT-ON-HIT-DAMAGE=+5d6+6 fire + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-HIT-DAMAGE" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'DAMAGE-ON-HIT', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'DAMAGE-ON-HIT', 'AttachedItem'); + } + + continue; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-CRIT-DAMAGE=")){ + if(isTest) {continue;} //DEFAULT-ON-CRIT-DAMAGE=+5d6+6 fire + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-CRIT-DAMAGE" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'DAMAGE-ON-CRIT', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'DAMAGE-ON-CRIT', 'AttachedItem'); + } + + continue; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-HIT-OTHER=")){ + if(isTest) {continue;} //DEFAULT-ON-HIT-OTHER=Flat-footed until next turn + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-HIT-OTHER" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'OTHER-ON-HIT', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'OTHER-ON-HIT', 'AttachedItem'); + } + + continue; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-CRIT-OTHER=")){ + if(isTest) {continue;} //DEFAULT-ON-CRIT-OTHER=Flat-footed forever + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-CRIT-OTHER" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'OTHER-ON-CRIT', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'OTHER-ON-CRIT', 'AttachedItem'); + } + + continue; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-HIT-CONDITIONAL=")){ + if(isTest) {continue;} //DEFAULT-ON-HIT-CONDITIONAL=Flat-footed only at dawn + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-HIT-CONDITIONAL" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'CONDITIONAL-ON-HIT', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'CONDITIONAL-ON-HIT', 'AttachedItem'); + } + + continue; + } + + if(wscStatementUpper.startsWith("DEFAULT-ON-CRIT-CONDITIONAL=")){ + if(isTest) {continue;} //DEFAULT-ON-CRIT-CONDITIONAL=Flat-footed forever only at dawn + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ON-CRIT-CONDITIONAL" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'CONDITIONAL-ON-CRIT', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'CONDITIONAL-ON-CRIT', 'AttachedItem'); + } + + continue; + } + + if(wscStatementUpper.startsWith("DEFAULT-ADJUST-RANGE=")){ + if(isTest) {continue;} //DEFAULT-ADJUST-RANGE=+30 + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ADJUST-RANGE" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'ADJUST-RANGE', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'ADJUST-RANGE', 'AttachedItem'); + } + + continue; + } + + if(wscStatementUpper.startsWith("DEFAULT-ADJUST-RELOAD=")){ + if(isTest) {continue;} //DEFAULT-ADJUST-RELOAD=-1 + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ADJUST-RELOAD" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + addWeapMod(invItemID, dataParts[1], 'ADJUST-RELOAD', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'ADJUST-RELOAD', 'AttachedItem'); + } + + continue; + } + + if(wscStatementUpper.startsWith("DEFAULT-ADD-TRAIT=")){ + if(isTest) {continue;} //DEFAULT-ADD-TRAIT=Deadly d8 + + let invItemID = null; + if(extraData.source == 'InvItem' || extraData.source == 'PropertyRune'){ + invItemID = extraData.invItemID; + } else { + displayError('Attempted to execute "DEFAULT-ADD-TRAIT" from a non-item source'); + continue; + } + + let modInfo = extraData.source; + if(extraData.source == 'PropertyRune'){ + modInfo = extraData.sourceName; + } + + let dataParts = wscStatement.split('='); + //addWeapMod(invItemID, dataParts[1], 'ADD-TRAIT', modInfo); + if(extraData.bagInvItemID != null){ + addWeapMod(extraData.bagInvItemID, dataParts[1], 'ADD-TRAIT', 'AttachedItem'); + } + + continue; + } + + + if(wscStatementUpper == "SET-FINESSE-MELEE-USE-DEX-DAMAGE"){ + if(isTest) {continue;} + + gState_hasFinesseMeleeUseDexDamage = true; + + continue; + } + + if(wscStatementUpper == "SET-ARMORED-STEALTH"){ + if(isTest) {continue;} + + gState_armoredStealth = true; + + continue; + } + + if(wscStatementUpper == "SET-MIGHTY-BULWARK"){ + if(isTest) {continue;} + + gState_mightyBulwark = true; + + continue; + } + + if(wscStatementUpper == "SET-UNBURDENED-IRON"){ + if(isTest) {continue;} + + gState_unburdenedIron = true; + + continue; + } + + if(wscStatementUpper == "SET-IMPROVISED-WEAPON-NO-PENALTY"){ + if(isTest) {continue;} + + gState_improvisedWeaponNoPenalty = true; + + continue; + } + + if(wscStatementUpper == "SET-ADD-LEVEL-TO-UNTRAINED-WEAPONS"){ + if(isTest) {continue;} + + gState_addLevelToUntrainedWeaponAttack = true; + + continue; + } + + if(wscStatementUpper == "SET-ADD-LEVEL-TO-UNTRAINED-SKILLS"){ + if(isTest) {continue;} + + gState_addLevelToUntrainedSkill = true; + + continue; + } + + if(wscStatementUpper == "DISPLAY-COMPANION-TAB"){ + if(isTest) {continue;} + + gState_displayCompanionTab = true; + + continue; + } + + // Could not identify wsc statement + success = false; + + } + + // MiscFeats is run even on tests, which is how the code is run for character builder. + // - Probably should change this to a better system in the future. + let miscFeatSuccess = processMiscFeatStatements(wscCode); + if(!success && miscFeatSuccess) { success = true; } + + return success; + +} + + +function getSheetProcNumber(strNum, sourceName){ + if(strNum == null) { + displayError('Incorrect WSC syntax ('+sourceName+')(1-1): NaN error in sheet statement'); + return 0; + } + + strNum = strNum.toUpperCase().trim(); + + if(strNum.includes('HALF_LEVEL')) { + strNum = strNum.replace(/HALF_LEVEL/g, Math.floor(g_character.level/2)+''); + } + if(strNum.includes('LEVEL')) { + strNum = strNum.replace(/LEVEL/g, g_character.level+''); + } + + if(strNum.includes('STR_MOD')) { + strNum = strNum.replace(/STR_MOD/g, getModOfValue('STR')); + } + if(strNum.includes('DEX_MOD')) { + strNum = strNum.replace(/DEX_MOD/g, getModOfValue('DEX')); + } + if(strNum.includes('CON_MOD')) { + strNum = strNum.replace(/CON_MOD/g, getModOfValue('CON')); + } + if(strNum.includes('INT_MOD')) { + strNum = strNum.replace(/INT_MOD/g, getModOfValue('INT')); + } + if(strNum.includes('WIS_MOD')) { + strNum = strNum.replace(/WIS_MOD/g, getModOfValue('WIS')); + } + if(strNum.includes('CHA_MOD')) { + strNum = strNum.replace(/CHA_MOD/g, getModOfValue('CHA')); + } + + try { + return parseInt(math.evaluate(strNum)); + } catch (err) { + displayError('Incorrect WSC syntax ('+sourceName+')(1-2): NaN error in sheet statement'); + return 0; + } +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/text-processing.js b/client/vue-src/legacy-js/wsc/text-processing.js new file mode 100644 index 00000000..d79e7053 --- /dev/null +++ b/client/vue-src/legacy-js/wsc/text-processing.js @@ -0,0 +1,848 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +// ========================================================================================= // +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Wanderer's Guide Code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // +// ========================================================================================= // + +let supportedWebLinks = [ + {Website: '2e.aonprd.com', Title: 'Archives of Nethys - 2e'}, + {Website: 'pf2.easytool.es', Title: 'PF2 EasyTool'}, + {Website: 'pf2easy.com', Title: 'PF2 EasyTool'}, + {Website: 'pathfinder2.dragonlash.com', Title: 'Dragonlash - 2e'}, + {Website: 'pf2srd.com', Title: 'PF2SRD'}, + {Website: 'pf2.d20pfsrd.com', Title: 'Pf2 Srd'}, + {Website: 'youtube.com', Title: 'YouTube'}, + {Website: 'paizo.com', Title: 'Paizo'}, +]; + +let textProcess_warningOnUnknown = false; +function textProcess_canIndex(dataCollection){ + return (typeof dataCollection !== 'undefined' && dataCollection != null); +} + +const regexFeatLinkExt = /\((Feat|Ability|Action|Activity):(lvl-([\-0-9]+):|type-([a-z]+):|)\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; +const regexFeatLink = /\((Feat|Ability|Action|Activity):(lvl-([\-0-9]+):|type-([a-z]+):|)\s*([^(:]+?)\s*\)/ig; +const regexItemLinkExt = /\((Item):\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; +const regexItemLink = /\((Item):\s*([^(:]+?)\s*\)/ig; +const regexSpellLinkExt = /\((Spell):\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; +const regexSpellLink = /\((Spell):\s*([^(:]+?)\s*\)/ig; +const regexLanguageLinkExt = /\((Language):\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; +const regexLanguageLink = /\((Language):\s*([^(:]+?)\s*\)/ig; +const regexTraitLinkExt = /\((Trait):\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; +const regexTraitLink = /\((Trait):\s*([^(:]+?)\s*\)/ig; + +/* +Optional Requirements: + - g_allConditions + - g_allLanguages + - g_allTags + - g_featMap + - g_itemMap + - g_spellMap +*/ +let temp_textProcess_j = ''; +let temp_textProcess_s = ''; + +function processText(text, isSheet, isJustified = false, size = 'MEDIUM', indexConditions = true) { + if(text == null) {return text;} + + let _j; + if(isJustified == null){ + _j = ' has-text-center-justified '; + } else { + _j = (isJustified) ? ' has-text-justified ' : ''; + } + let _s = ''; + + let _incS = ''; + switch(size) { + case 'SMALL': + _s = ' is-size-7 '; _incS = ' is-size-6 '; break; + case 'MEDIUM': + _s = ' is-size-6 '; _incS = ' is-size-5 '; break; + case 'LARGE': + _s = ' is-size-5 '; _incS = ' is-size-4 '; break; + default: + break; + } + + temp_textProcess_j = _j; + temp_textProcess_s = _s; + + // Replace dice notation with roll button + if(typeof gOption_hasDiceRoller !== 'undefined' && gOption_hasDiceRoller){ + text = processDiceNotation(text); + refreshDiceNotationButtons(); + } + + ////////////////////////////// + + // Stage cleaner detection (creates tables that are then processed) + text = text.replace(/(\*\*|)Stage (\d+)(\*\*|) ([^;\n]+.|$)/gm, handleStages); + + // Table detection comes before most, to prevent HTML from existing + text = text.replace(regexTableDetection, handleTableCreation); + + // Wrap in a paragraph + if(text.startsWith('')){ + // Don't wrap if already wrapped + } else { + text = '

                      '+text+'

                      '; + } + + // ---- - Makes horizontal divider + text = text.replace(/\n\s*\-\-\-\-/g, '
                      '); + + // ***word*** - Makes word bigger and bold + text = text.replace(/\*\*\*(.+?)\*\*\*/g, '$1'); + + // **word** - Makes word bold + text = text.replace(/\*\*(.+?)\*\*/g, '$1'); + + // ^^word^^ - Makes word superscript + text = text.replace(/\^\^(.+?)\^\^/g, '$1'); + + // __word__ - Makes word italicized + text = text.replace(/\_\_(.+?)\_\_/g, '$1'); + + // $$grey:word$$ - Makes word italicized + //text = text.replace(/\$\$grey:(.+?)\$\$/gi, '$1'); + + // ~~word~~ - Makes word strikethrough + text = text.replace(/\~\~(.+?)\~\~/g, '$1'); + + // ~ Some Text Here: Other Text + let regexNonBulletList = /[\n]?\~ (.*?)\:/g; + text = text.replace(regexNonBulletList, '

                      $1'); + + // * Some Text Here: Other Text + let regexBulletList = /[\n]?\* (.*?)\:/g; + text = text.replace(regexBulletList, '

                      $1'); + + // :> Some Text + let regexNonBulletSpacedList = /[\n]?\:\> /g; + text = text.replace(regexNonBulletSpacedList, '

                      '); + + // \n -> Newline + text = text.replace(/\n/g, '

                      '); + + // Website Link - [URL] + let regexURL = /\[(.+?)\]/g; + text = text.replace(regexURL, handleLink); + + // Sheet variables & tooltips + // {WIS_MOD} -> Character Wisdom Modifier (unsigned) + // {WIS_MOD|Wisdom Modifier} -> Character Wisdom Modifier (unsigned). Can hover over to reveal text. + // {+WIS_MOD} -> Character Wisdom Modifier (signed) + let regexSheetVariables = /\{(.+?)\}/g; + text = text.replace(regexSheetVariables, handleSheetVariablesAndTooltips); + + // (Feat: Striking | Strike) + // Optional (Feat:lvl-0: Quick Alchemies | Quick Alchemy) + // or + // Optional (Feat:type-companion: Quick Alchemies | Quick Alchemy) + if(typeof g_featMap !== 'undefined' && g_featMap != null) { + text = text.replace(regexFeatLinkExt, handleFeatLinkExt); + } else { + text = text.replace(regexFeatLinkExt, '$5'); + } + + // (Feat: Strike) + // Optional (Feat:lvl-0: Quick Alchemy) + // or + // Optional (Feat:type-companion: Quick Alchemy) + if(typeof g_featMap !== 'undefined' && g_featMap != null) { + text = text.replace(regexFeatLink, handleFeatLink); + } else { + text = text.replace(regexFeatLink, '$5'); + } + + // (Item: Striking | Strike) + if(typeof g_itemMap !== 'undefined' && g_itemMap != null) { + text = text.replace(regexItemLinkExt, handleItemLinkExt); + } else { + text = text.replace(regexItemLinkExt, '$2'); + } + + // (Item: Strike) + if(typeof g_itemMap !== 'undefined' && g_itemMap != null) { + text = text.replace(regexItemLink, handleItemLink); + } else { + text = text.replace(regexItemLink, '$2'); + } + + // (Spell: Striking | Strike) + if(typeof g_spellMap !== 'undefined' && g_spellMap != null) { + text = text.replace(regexSpellLinkExt, handleSpellLinkExt); + } else { + text = text.replace(regexSpellLinkExt, '$2'); + } + + // (Spell: Strike) + if(typeof g_spellMap !== 'undefined' && g_spellMap != null) { + text = text.replace(regexSpellLink, handleSpellLink); + } else { + text = text.replace(regexSpellLink, '$2'); + } + + // (Language: Gnomish-like | Gnomish) + if(typeof g_allLanguages !== 'undefined' && g_allLanguages != null) { + text = text.replace(regexLanguageLinkExt, handleLanguageLinkExt); + } else { + text = text.replace(regexLanguageLinkExt, '$2'); + } + + // (Language: Gnomish) + if(typeof g_allLanguages !== 'undefined' && g_allLanguages != null) { + text = text.replace(regexLanguageLink, handleLanguageLink); + } else { + text = text.replace(regexLanguageLink, '$2'); + } + + // (Trait: Infusing | Infused) + if(typeof g_allTags !== 'undefined' && g_allTags != null) { + text = text.replace(regexTraitLinkExt, handleTraitLinkExt); + } else { + text = text.replace(regexTraitLinkExt, '$2'); + } + + // (Trait: Infused) + if(typeof g_allTags !== 'undefined' && g_allTags != null) { + text = text.replace(regexTraitLink, handleTraitLink); + } else { + text = text.replace(regexTraitLink, '$2'); + } + + // Conditions Search and Replace + if(typeof g_allConditions !== 'undefined' && g_allConditions != null && indexConditions) { + text = handleIndexConditions(text); + } + + // FREE-ACTION + // REACTION + // ONE-ACTION + // TWO-ACTIONS + // THREE-ACTIONS + text = text.replace(/FREE-ACTION/g, '[free-action]'); + text = text.replace(/REACTION/g, '[reaction]'); + text = text.replace(/ONE-ACTION/g, '[one-action]'); + text = text.replace(/TWO-ACTIONS/g, '[two-actions]'); + text = text.replace(/THREE-ACTIONS/g, '[three-actions]'); + + + // Critical Success:text + // Success:text + // Failure:text + // Critical Failure:text + text = text.replace('Critical Success:','

                      Critical Success'); + text = text.replace('Success:','

                      Success'); + text = text.replace('Critical Failure:','

                      Critical Failure'); + text = text.replace('Failure:','

                      Failure'); + + // page ### -> Core Rulebook Link + let regexCoreRules = /page\s+(\d+)/g; + text = text.replace(regexCoreRules, 'page $1'); + + // Bestiary pg. ### -> Bestiary Link + let regexBestiary = /Bestiary pg\.\s+(\d+)/g; + text = text.replace(regexBestiary, 'Bestiary $1'); + + // Clean up any random spaces that were created... + text = text.replaceAll('

                      ', ''); + + return text; + +} + +function processTextRemoveIndexing(text) { + if(text == null) {return text;} + + // ~ : Some Text + let regexNonBullet = /\~\s*:/g; + text = text.replace(regexNonBullet, ''); + + // * : Some Text + let regexBullet = /\*\s*:/g; + text = text.replace(regexBullet, '•'); + + // :> Some Text + let regexNonBulletSpaced = /:\>/g; + text = text.replace(regexNonBulletSpaced, ''); + + + + // (Feat: Striking | Strike) + // Optional (Feat:lvl-0: Quick Alchemies | Quick Alchemy) + // or + // Optional (Feat:type-companion: Quick Alchemies | Quick Alchemy) + let regexFeatLinkExt = /\((Feat|Ability|Action|Activity):(lvl-([\-0-9]+):|type-([a-z]+):|)\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; + text = text.replace(regexFeatLinkExt, '$4'); + + // (Feat: Strike) + // Optional (Feat:lvl-0: Quick Alchemy) + // or + // Optional (Feat:type-companion: Quick Alchemy) + let regexFeatLink = /\((Feat|Ability|Action|Activity):(lvl-([\-0-9]+):|type-([a-z]+):|)\s*([^(:]+?)\s*\)/ig; + text = text.replace(regexFeatLink, '$4'); + + // (Item: Striking | Strike) + let regexItemLinkExt = /\((Item):\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; + text = text.replace(regexItemLinkExt, '$2'); + + // (Item: Strike) + let regexItemLink = /\((Item):\s*([^(:]+?)\s*\)/ig; + text = text.replace(regexItemLink, '$2'); + + // (Spell: Striking | Strike) + let regexSpellLinkExt = /\((Spell):\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; + text = text.replace(regexSpellLinkExt, '$2'); + + // (Spell: Strike) + let regexSpellLink = /\((Spell):\s*([^(:]+?)\s*\)/ig; + text = text.replace(regexSpellLink, '$2'); + + // (Language: Gnomish-like | Gnomish) + let regexLanguageLinkExt = /\((Language):\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; + text = text.replace(regexLanguageLinkExt, '$2'); + + // (Language: Gnomish) + let regexLanguageLink = /\((Language):\s*([^(:]+?)\s*\)/ig; + text = text.replace(regexLanguageLink, '$2'); + + // (Trait: Infusing | Infused) + let regexTraitLinkExt = /\((Trait):\s*([^(:]+?)\s*\|\s*(.+?)\s*\)/ig; + text = text.replace(regexTraitLinkExt, '$2'); + + // (Trait: Infused) + let regexTraitLink = /\((Trait):\s*([^(:]+?)\s*\)/ig; + text = text.replace(regexTraitLink, '$2'); + + return text; +} + +///// + +const regexTableDetection = /((^((.+)\|(.+))$)(\n|$)){3,}/igm; +function handleTableCreation(match) { + + let rows = match.split(/\n/); + + // Verify table + let validTable = true; + let prevColumnNum = -1; + for (let i = 0; i < rows.length; i++) { + let row = rows[i]; + if(row == '') { continue; } + + // Check alignment row + if(i == 1){ + let columns = row.split(/\|/g); + for(let column of columns){ + let columnTrimmed = column.trim(); + if(columnTrimmed != ':--' && columnTrimmed != ':-:' && columnTrimmed != '--:'){ + validTable = false; + break; + } + } + } + + let columnNum = row.split(/\|/g).length; + if(prevColumnNum != -1){ + if(prevColumnNum != columnNum){ + validTable = false; + break; + } + } else { + prevColumnNum = columnNum; + } + } + if(prevColumnNum == -1){ + validTable = false; + } + + if(!validTable){ + return match; + } + + // Construct table + let tableAlignMap = new Map(); + let tableHTML = '

                      '; + for (let i = 0; i < rows.length; i++) { + let row = rows[i]; + if(row == '') { continue; } + + let columns = row.split(/\|/g); + + if(i == 1){ + + tableAlignMap.clear(); + for (let j = 0; j < columns.length; j++) { + let column = columns[j].trim(); + if(column == ':--'){ + tableAlignMap.set(j, 'has-text-left'); + } else if(column == ':-:'){ + tableAlignMap.set(j, 'has-text-centered'); + } else if(column == '--:'){ + tableAlignMap.set(j, 'has-text-right'); + } + } + + } + + if(i == 0){ + + tableHTML += ''; + for (let j = 0; j < columns.length; j++) { + let column = columns[j].trim(); + tableHTML += ''; + } + tableHTML += ''; + + } else if(i != 1) { + + let rowBackgroundClass = (i % 2 == 0) ? 'table-row-a' : 'table-row-b'; + tableHTML += ''; + for (let j = 0; j < columns.length; j++) { + let column = columns[j].trim(); + let textAlignClass = tableAlignMap.get(j); + tableHTML += ''; + } + tableHTML += ''; + + } + + } + tableHTML += '
                      '+column+'
                      '+column+'

                      '; + + return tableHTML; +} + +///// + +function handleFeatLink(match, linkName, limitation, limitLvl, limitType, innerTextName) { + return handleFeatLinkExt(match, linkName, limitation, limitLvl, limitType, innerTextName, innerTextName); +} + +function handleFeatLinkExt(match, linkName, limitation, limitLvl, limitType, innerTextDisplay, innerTextName) { + + let isLevelLimit = limitation.toLowerCase().startsWith('lvl-'); + let isTypeLimit = limitation.toLowerCase().startsWith('type-'); + let requiredType = null; + if(isTypeLimit){ + switch(limitType.toLowerCase()) { + case 'general': requiredType = 'GENERAL-FEAT'; break; + case 'skill': requiredType = 'SKILL-FEAT'; break; + case 'class': requiredType = 'CLASS-FEAT'; break; + case 'ancestry': requiredType = 'ANCESTRY-FEAT'; break; + case 'archetype': requiredType = 'ARCHETYPE-FEAT'; break; + case 'basic': requiredType = 'BASIC-ACTION'; break; + case 'skillaction': requiredType = 'SKILL-ACTION'; break; + case 'creature': requiredType = 'CREATURE-ACTION'; break; + case 'companion': requiredType = 'COMPANION-ACTION'; break; + + case 'feat': requiredType = 'IS-FEAT'; break; + case 'action': requiredType = 'IS-ACTION'; break; + default: break; + } + } + + let innerTextNameUpper = innerTextName.replace(/’/g,'\'').toUpperCase(); + for(const [featID, featStruct] of g_featMap.entries()){ + + if(isLevelLimit){ + if(featStruct.Feat.level != limitLvl) { continue; } + } else if(isTypeLimit){ + if(requiredType == 'IS-FEAT'){ + if(featStruct.Feat.genericType != null && !featStruct.Feat.genericType.endsWith('-FEAT')) { continue; } + } else if(requiredType == 'IS-ACTION'){ + if(featStruct.Feat.genericType == null || !featStruct.Feat.genericType.endsWith('-ACTION')) { continue; } + } else { + if(featStruct.Feat.genericType != requiredType) { continue; } + } + } + + let featName = featStruct.Feat.name.toUpperCase(); + if(innerTextNameUpper === featName && featStruct.Feat.isArchived == 0) { + let featLinkClass = 'featTextLink'+featStruct.Feat.id; + let featLinkText = ''+innerTextDisplay+''; + setTimeout(function() { + $('.'+featLinkClass).off('click'); + $('.'+featLinkClass).click(function(event){ + if($('#quickviewDefault').hasClass('is-active')) { event.stopImmediatePropagation(); } + openQuickView('featView', { + Feat : featStruct.Feat, + Tags : featStruct.Tags, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + }, 100); + return featLinkText; + } + } + if(typeof isFeatHidden === "function" && isFeatHidden(innerTextNameUpper)){ + return innerTextName; + } else { + if(textProcess_warningOnUnknown) { + return ''+innerTextDisplay+''; + } else { + return 'Unknown '+capitalizeWord(linkName)+''; + } + } +} + + +function handleItemLink(match, linkName, innerTextName) { + return handleItemLinkExt(match, linkName, innerTextName, innerTextName); +} + +function handleItemLinkExt(match, linkName, innerTextDisplay, innerTextName) { + innerTextName = innerTextName.replace(/’/g,'\'').toUpperCase(); + for(const [itemID, itemDataStruct] of g_itemMap.entries()){ + let itemName = itemDataStruct.Item.name.replace(/[\(\)]/g,'').toUpperCase(); + if(innerTextName === itemName && itemDataStruct.Item.isArchived == 0) { + let itemLinkClass = 'itemTextLink'+itemDataStruct.Item.id; + let itemLinkText = ''+innerTextDisplay+''; + setTimeout(function() { + $('.'+itemLinkClass).off('click'); + $('.'+itemLinkClass).click(function(event){ + if($('#quickviewDefault').hasClass('is-active')) { event.stopImmediatePropagation(); } + openQuickView('itemView', { + ItemDataStruct : itemDataStruct, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + }, 100); + return itemLinkText; + } + } + if(textProcess_warningOnUnknown) { + return ''+innerTextDisplay+''; + } else { + return 'Unknown Item'; + } +} + + +function handleSpellLink(match, linkName, innerTextName) { + return handleSpellLinkExt(match, linkName, innerTextName, innerTextName); +} + +function handleSpellLinkExt(match, linkName, innerTextDisplay, innerTextName) { + innerTextName = innerTextName.replace(/’/g,'\'').toUpperCase(); + for(const [spellID, spellDataStruct] of g_spellMap.entries()){ + let spellName = spellDataStruct.Spell.name.toUpperCase(); + if(innerTextName === spellName && spellDataStruct.Spell.isArchived == 0) { + let spellLinkClass = 'spellTextLink'+spellDataStruct.Spell.id; + let spellLinkText = ''+innerTextDisplay+''; + setTimeout(function() { + $('.'+spellLinkClass).off('click'); + $('.'+spellLinkClass).click(function(event){ + if($('#quickviewDefault').hasClass('is-active')) { event.stopImmediatePropagation(); } + openQuickView('spellView', { + SpellDataStruct: spellDataStruct, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + }, 100); + return spellLinkText; + } + } + if(textProcess_warningOnUnknown) { + return ''+innerTextDisplay+''; + } else { + return 'Unknown Spell'; + } +} + + +function handleLanguageLink(match, linkName, innerTextName) { + return handleLanguageLinkExt(match, linkName, innerTextName, innerTextName); +} + +function handleLanguageLinkExt(match, linkName, innerTextDisplay, innerTextName) { + innerTextName = innerTextName.replace(/’/g,'\'').toUpperCase(); + for(const language of g_allLanguages){ + let langName = language.name.toUpperCase(); + if(innerTextName === langName) { + let langLinkClass = 'langTextLink'+language.id; + let langLinkText = ''+innerTextDisplay+''; + setTimeout(function() { + $('.'+langLinkClass).off('click'); + $('.'+langLinkClass).click(function(event){ + if($('#quickviewDefault').hasClass('is-active')) { event.stopImmediatePropagation(); } + openQuickView('languageView', { + Language : language, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + }, 100); + return langLinkText; + } + } + if(textProcess_warningOnUnknown) { + return ''+innerTextDisplay+''; + } else { + return 'Unknown Language'; + } +} + + +function handleTraitLink(match, linkName, innerTextName) { + return handleTraitLinkExt(match, linkName, innerTextName, innerTextName); +} + +function handleTraitLinkExt(match, linkName, innerTextDisplay, innerTextName) { + let traitLinkClass = 'traitTextLink'+(innerTextName.replace(/[' ]/g, '')); + let traitLinkText = ''+innerTextDisplay+''; + setTimeout(function() { + $('.'+traitLinkClass).off('click'); + $('.'+traitLinkClass).click(function(){ + openQuickView('tagView', { + TagName : innerTextName, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + }, 100); + return traitLinkText; +} + +///// + +function handleIndexConditions(text){ + for(const condition of g_allConditions){ + let conditionName = condition.name.toLowerCase(); + let conditionLinkClass = 'conditionTextLink'+conditionName.replace(/ /g,'-'); + let conditionLinkText = ' '+conditionName+''; + let conditionNameRegex = new RegExp('(\\W|^)'+conditionName, "g"); + text = text.replace(conditionNameRegex, '$1'+conditionLinkText); + setTimeout(function() { + $('.'+conditionLinkClass).off('click'); + $('.'+conditionLinkClass).click(function(event){ + if($('#quickviewDefault').hasClass('is-active')) { event.stopImmediatePropagation(); } + openQuickView('conditionView', { + Condition : condition, + _prevBackData: {Type: g_QViewLastType, Data: g_QViewLastData}, + }, $('#quickviewDefault').hasClass('is-active')); + }); + }, 100); + } + return text; +} + +///// + +// Stages Cleaner +function handleStages(match, boldOne, stageNum, boldTwo, text){ + text = text.trim(); + if(text.endsWith(';')){ text = text.slice(0, -1); } + + let tableText = ''; + if(stageNum == 1){ + tableText = '\nStage|Effect\n:-:|:--'; + } + tableText += `\n**${stageNum}**|${text}`; + + return tableText; +} + +///// + +function handleLink(match, innerTextURL) { + let urlObj = null; + try { + urlObj = new URL(innerTextURL); + } catch(err) { + //displayError("Invalid URL: \'"+innerTextURL+"\'"); + return '['+innerTextURL+']'; + } + let websiteName = urlObj.hostname; + if(websiteName.startsWith('www.')){ websiteName = websiteName.substring(4); } + let foundWebsite = supportedWebLinks.find(website => { + return website.Website == websiteName; + }); + if(foundWebsite != null){ + return ''; + } else { + return '['+innerTextURL+']'; + } +} + + +/////////////// SHEET VARIABLES & TOOLTIPS /////////////// +function processTextOnlyVariablesAndTooltips(text){ + if(text == null){ return null; } + + let regexSheetVariables = /\{(.+?)\}/g; + text = text.replace(regexSheetVariables, handleSheetVariablesAndTooltips); + + return text; +} + +function handleSheetVariablesAndTooltips(match, innerText){ + if(innerText.includes("|")){ + let innerTextData = innerText.split("|"); + innerTextVariable = innerTextData[0].replace(/\s/g, "").toUpperCase(); + + let sheetVar = null; + if(isSheetPage()){ + sheetVar = acquireSheetVariable(innerTextVariable); + } + if(sheetVar == null && typeof g_variableMap !== 'undefined'){ + let varValue = getVariableValue(innerTextVariable, false); + if(varValue != 'Error'){ sheetVar = varValue; } + } + if(sheetVar == null){ sheetVar = innerTextData[0]; } + + let bulmaColor = 'has-text-info'; + if(typeof sheetVar === "string"){ + if(sheetVar.toUpperCase().startsWith('NORMAL:')){ + bulmaColor = ''; + sheetVar = sheetVar.replace(/NORMAL:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('BLUE:')){ + bulmaColor = 'has-text-info'; + sheetVar = sheetVar.replace(/BLUE:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('GREEN:')){ + bulmaColor = 'has-text-success'; + sheetVar = sheetVar.replace(/GREEN:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('CYAN:')){ + bulmaColor = 'has-text-cyan'; + sheetVar = sheetVar.replace(/CYAN:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('RED:')){ + bulmaColor = 'has-text-danger'; + sheetVar = sheetVar.replace(/RED:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('YELLOW:')){ + bulmaColor = 'has-text-warning'; + sheetVar = sheetVar.replace(/YELLOW:/i, ''); + } + else if(sheetVar.toUpperCase().startsWith('BLUE_UNDERLINE:')){ + bulmaColor = 'is-underlined-info'; + sheetVar = sheetVar.replace(/BLUE_UNDERLINE:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('GREEN_UNDERLINE:')){ + bulmaColor = 'is-underlined-success'; + sheetVar = sheetVar.replace(/GREEN_UNDERLINE:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('CYAN_UNDERLINE:')){ + bulmaColor = 'is-underlined-cyan'; + sheetVar = sheetVar.replace(/CYAN_UNDERLINE:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('RED_UNDERLINE:')){ + bulmaColor = 'is-underlined-danger'; + sheetVar = sheetVar.replace(/RED_UNDERLINE:/i, ''); + } else if(sheetVar.toUpperCase().startsWith('YELLOW_UNDERLINE:')){ + bulmaColor = 'is-underlined-warning'; + sheetVar = sheetVar.replace(/YELLOW_UNDERLINE:/i, ''); + } + } + return ''+sheetVar+''; + } else { + if(isSheetPage() || typeof g_variableMap !== 'undefined'){ + innerText = innerText.replace(/\s/g, "").toUpperCase(); + let sheetVar = null; + if(isSheetPage()) { + sheetVar = acquireSheetVariable(innerText); + } + if(sheetVar == null && typeof g_variableMap !== 'undefined'){ + let varValue = getVariableValue(innerText, false); + if(varValue != 'Error'){ sheetVar = varValue; } + } + sheetVar = (sheetVar != null) ? sheetVar : 'Unknown Variable'; + return ''+sheetVar+''; + } else { + return innerText; + } + } +} + +// Old system, really need to replace getStatTotal() with getVariableValue() +function acquireSheetVariable(variableName){ + if(variableName.charAt(0) === '+') { + variableName = variableName.substring(1); + if(variableName.slice(-3) === "_DC") { + variableName = variableName.slice(0, -3); + return signNumber(getStatTotal(variableName, false)+10); + } else if(variableName.slice(-4) === "_MOD") { + variableName = variableName.slice(0, -4); + return signNumber(getModOfValue(variableName, false)); + } else { + return null; + } + } else { + if(variableName.slice(-3) === "_DC") { + variableName = variableName.slice(0, -3); + return getStatTotal(variableName, false)+10; + } else if(variableName.slice(-4) === "_MOD") { + variableName = variableName.slice(0, -4); + return getModOfValue(variableName, false); + } else { + return null; + } + } +} + +function processTextBakeSheetVariables(text){ + if(text == null){ return null; } + + let handleVariables = function(match, innerText){ + if(innerText.includes("|")){ + let innerTextData = innerText.split("|"); + innerTextVariable = innerTextData[0].replace(/\s/g, "").toUpperCase(); + let sheetVar = acquireSheetVariable(innerTextVariable); + if(sheetVar == null){ return match; } + return sheetVar; + } else { + innerText = innerText.replace(/\s/g, "").toUpperCase(); + let sheetVar = acquireSheetVariable(innerText); + if(sheetVar == null){ return match; } + return sheetVar; + } + }; + + const regexSheetVariables = /\{(.+?)\}/g; + text = text.replace(regexSheetVariables, handleVariables); + + return text; +} + +function processTextRemoveTooltips(text, removeOnlyIfMatches=null){ + if(text == null){ return null; } + + let handleRemoval = function(match, word, tooltipWords){ + if(removeOnlyIfMatches != null){ + // Doesn't match, don't remove + if(word.match(removeOnlyIfMatches) == null){ + return match; + } + } + + if(word.toUpperCase().startsWith('NORMAL:')){ + word = word.replace(/NORMAL:/i, ''); + } else if(word.toUpperCase().startsWith('BLUE:')){ + word = word.replace(/BLUE:/i, ''); + } else if(word.toUpperCase().startsWith('GREEN:')){ + word = word.replace(/GREEN:/i, ''); + } else if(word.toUpperCase().startsWith('CYAN:')){ + word = word.replace(/CYAN:/i, ''); + } else if(word.toUpperCase().startsWith('RED:')){ + word = word.replace(/RED:/i, ''); + } else if(word.toUpperCase().startsWith('YELLOW:')){ + word = word.replace(/YELLOW:/i, ''); + } + else if(word.toUpperCase().startsWith('BLUE_UNDERLINE:')){ + word = word.replace(/BLUE_UNDERLINE:/i, ''); + } else if(word.toUpperCase().startsWith('GREEN_UNDERLINE:')){ + word = word.replace(/GREEN_UNDERLINE:/i, ''); + } else if(word.toUpperCase().startsWith('CYAN_UNDERLINE:')){ + word = word.replace(/CYAN_UNDERLINE:/i, ''); + } else if(word.toUpperCase().startsWith('RED_UNDERLINE:')){ + word = word.replace(/RED_UNDERLINE:/i, ''); + } else if(word.toUpperCase().startsWith('YELLOW_UNDERLINE:')){ + word = word.replace(/YELLOW_UNDERLINE:/i, ''); + } + return word; + }; + + const regexSheetTooltips = /\{([^\|]+?)\|([^\|]+?)\}/g; + text = text.replace(regexSheetTooltips, handleRemoval); + + return text; +} \ No newline at end of file diff --git a/client/vue-src/legacy-js/wsc/variable-processing.js b/client/vue-src/legacy-js/wsc/variable-processing.js new file mode 100644 index 00000000..56bf6b5f --- /dev/null +++ b/client/vue-src/legacy-js/wsc/variable-processing.js @@ -0,0 +1,1316 @@ +/* Copyright (C) 2021, Wanderer's Guide, all rights reserved. + By Aaron Cassar. +*/ + +const variableProcessingDebug = false; +const variableRegex = /^[\w]+$/; + +/* + (Variable_Name) -> ({ Type: Array, Value: [], }) + Types: INTEGER, STRING, ABILITY_SCORE, LIST, PROFICIENCY +*/ + +let g_variableMap = new Map(); + +const VARIABLE = { + SCORE_STR: 'SCORE_STR', + SCORE_DEX: 'SCORE_DEX', + SCORE_CON: 'SCORE_CON', + SCORE_INT: 'SCORE_INT', + SCORE_WIS: 'SCORE_WIS', + SCORE_CHA: 'SCORE_CHA', + SCORE_NONE: 'SCORE_NONE', + + SAVE_FORT: 'SAVE_FORT', + SAVE_REFLEX: 'SAVE_REFLEX', + SAVE_WILL: 'SAVE_WILL', + + SKILL_ACROBATICS: 'SKILL_ACROBATICS', + SKILL_ARCANA: 'SKILL_ARCANA', + SKILL_ATHLETICS: 'SKILL_ATHLETICS', + SKILL_CRAFTING: 'SKILL_CRAFTING', + SKILL_DECEPTION: 'SKILL_DECEPTION', + SKILL_DIPLOMACY: 'SKILL_DIPLOMACY', + SKILL_INTIMIDATION: 'SKILL_INTIMIDATION', + SKILL_MEDICINE: 'SKILL_MEDICINE', + SKILL_NATURE: 'SKILL_NATURE', + SKILL_OCCULTISM: 'SKILL_OCCULTISM', + SKILL_PERFORMANCE: 'SKILL_PERFORMANCE', + SKILL_RELIGION: 'SKILL_RELIGION', + SKILL_SOCIETY: 'SKILL_SOCIETY', + SKILL_STEALTH: 'SKILL_STEALTH', + SKILL_SURVIVAL: 'SKILL_SURVIVAL', + SKILL_THIEVERY: 'SKILL_THIEVERY', + SKILL_XXX_LORE: 'SKILL_XXX_LORE', + + ADD_LORE: 'ADD_LORE', + + ARCANE_SPELL_ATTACK: 'ARCANE_SPELL_ATTACK', + DIVINE_SPELL_ATTACK: 'DIVINE_SPELL_ATTACK', + OCCULT_SPELL_ATTACK: 'OCCULT_SPELL_ATTACK', + PRIMAL_SPELL_ATTACK: 'PRIMAL_SPELL_ATTACK', + + ARCANE_SPELL_DC: 'ARCANE_SPELL_DC', + DIVINE_SPELL_DC: 'DIVINE_SPELL_DC', + OCCULT_SPELL_DC: 'OCCULT_SPELL_DC', + PRIMAL_SPELL_DC: 'PRIMAL_SPELL_DC', + + LIGHT_ARMOR: 'LIGHT_ARMOR', + MEDIUM_ARMOR: 'MEDIUM_ARMOR', + HEAVY_ARMOR: 'HEAVY_ARMOR', + UNARMORED_DEFENSE: 'UNARMORED_DEFENSE', + + SIMPLE_WEAPONS: 'SIMPLE_WEAPONS', + MARTIAL_WEAPONS: 'MARTIAL_WEAPONS', + ADVANCED_WEAPONS: 'ADVANCED_WEAPONS', + UNARMED_ATTACKS: 'UNARMED_ATTACKS', + + PERCEPTION: 'PERCEPTION', + CLASS_DC: 'CLASS_DC', + LEVEL: 'LEVEL', + + MAX_HEALTH: 'MAX_HEALTH', + MAX_HEALTH_BONUS_PER_LEVEL: 'MAX_HEALTH_BONUS_PER_LEVEL', + HEALTH: 'HEALTH', + TEMP_HEALTH: 'TEMP_HEALTH', + + AC: 'AC', + ARMOR_CHECK_PENALTY: 'ARMOR_CHECK_PENALTY', + ARMOR_SPEED_PENALTY: 'ARMOR_SPEED_PENALTY', + DEX_CAP: 'DEX_CAP', + + SPEED: 'SPEED', + SPEED_XXX: 'SPEED_XXX', + + BULK_LIMIT: 'BULK_LIMIT', + INVEST_LIMIT: 'INVEST_LIMIT', + + ATTACKS: 'ATTACKS', + ATTACKS_DMG_DICE: 'ATTACKS_DMG_DICE', + ATTACKS_DMG_BONUS: 'ATTACKS_DMG_BONUS', + + MELEE_ATTACKS: 'MELEE_ATTACKS', + MELEE_ATTACKS_DMG_DICE: 'MELEE_ATTACKS_DMG_DICE', + MELEE_ATTACKS_DMG_BONUS: 'MELEE_ATTACKS_DMG_BONUS', + AGILE_MELEE_ATTACKS_DMG_BONUS: 'AGILE_MELEE_ATTACKS_DMG_BONUS', + NON_AGILE_MELEE_ATTACKS_DMG_BONUS: 'NON_AGILE_MELEE_ATTACKS_DMG_BONUS', + + RANGED_ATTACKS: 'RANGED_ATTACKS', + RANGED_ATTACKS_DMG_DICE: 'RANGED_ATTACKS_DMG_DICE', + RANGED_ATTACKS_DMG_BONUS: 'RANGED_ATTACKS_DMG_BONUS', + + WEAPON_XXX: 'WEAPON_XXX', + ARMOR_XXX: 'ARMOR_XXX', + + RESISTANCES: 'RESISTANCES', + WEAKNESSES: 'WEAKNESSES', + + LANGUAGES: 'LANGUAGES', + + CLASS_NAME: 'CLASS_NAME', + +}; + +const VAR_TYPE = { + INTEGER: 'INTEGER', + STRING: 'STRING', + ABILITY_SCORE: 'ABILITY_SCORE', + LIST: 'LIST', + PROFICIENCY: 'PROFICIENCY', +}; + +const VAR_NULL = -999; + +///////// + +function initializeVariable(variableName, variableType, value){ + variableName = variableName.replace(/\s/g, "_").toUpperCase(); + + if(variableType == VAR_TYPE.INTEGER){ + variables_addInteger(variableName, value); + } else if(variableType == VAR_TYPE.STRING){ + variables_addString(variableName, value); + } else if(variableType == VAR_TYPE.ABILITY_SCORE){ + variables_addAbilityScore(variableName, value); + } else if(variableType == VAR_TYPE.LIST){ + variables_addList(variableName, value); + } else if(variableType == VAR_TYPE.PROFICIENCY){ + displayError("Variable Initialization: For PROFICIENCY variables, use initializeVariableProf() instead!"); + return; + } else { + displayError("Variable Initialization: Unknown variable type \'"+variableType+"\'!"); + return; + } + +} + +function initializeVariableProf(variableName, abilityScoreName, numUps, profDataArray){ + variableName = variableName.replace(/\s/g, "_").toUpperCase(); + variables_addProficiency(variableName, abilityScoreName, getProfLetterFromNumUps(numUps), profDataArray); +} + +function resettingVariables(enabledSources=null){ + + if(variableProcessingDebug) { console.log(`Initializing predefined variables in builder.`); } + + g_variableMap.clear(); + + // Char Level + variables_addInteger(VARIABLE.LEVEL, g_character.level); + + // Ability Scores + variables_addAbilityScore(VARIABLE.SCORE_STR, 10); + variables_addAbilityScore(VARIABLE.SCORE_DEX, 10); + variables_addAbilityScore(VARIABLE.SCORE_CON, 10); + variables_addAbilityScore(VARIABLE.SCORE_INT, 10); + variables_addAbilityScore(VARIABLE.SCORE_WIS, 10); + variables_addAbilityScore(VARIABLE.SCORE_CHA, 10); + variables_addAbilityScore(VARIABLE.SCORE_NONE, 10); + + // Proficiencies + for(const [variableName, data] of g_profConversionMap.entries()){ + if(data.AbilScore != null){ + variables_addProficiency(variableName, 'SCORE_'+data.AbilScore, 'U'); + } + } + + // Class Name + if(wscChoiceStruct.ClassDetails != null && wscChoiceStruct.ClassDetails.Class != null){ + variables_addString(VARIABLE.CLASS_NAME, wscChoiceStruct.ClassDetails.Class.name); + } + + // Run All SourceBook Code as Sheet Statements // + if(enabledSources != null){ + for(let enabledSource of enabledSources){ + processSheetCode(enabledSource.code, { + source: 'SourceBook', + sourceName: enabledSource.name, + }); + } + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + +} + +function variables_addInteger(variableName, value){ + g_variableMap.set(variableName, { + Type: VAR_TYPE.INTEGER, + Value: value, + Bonuses: new Map(), + Conditionals: new Map() + }); +} +function variables_addString(variableName, value){ + g_variableMap.set(variableName, { + Type: VAR_TYPE.STRING, + Value: value, + Extras: new Map() + }); +} +function variables_addAbilityScore(variableName, value){ + g_variableMap.set(variableName, { + Type: VAR_TYPE.ABILITY_SCORE, + Value: { + Score: value, + Bonuses: new Map(), + Conditionals: new Map() + } + }); +} +function variables_addList(variableName, value){ + g_variableMap.set(variableName, { + Type: VAR_TYPE.LIST, + Value: value + }); +} +function variables_addProficiency(variableName, abilityScoreName, rank, profDataArray=null){ + let rankHistory = new Map(); + if(profDataArray == null){ + if(rank != 'U'){ + console.log('No rank history set for var:'+variableName); + rankHistory.set('Initial', {Rank: rank, SourceName: 'Initial'}); + } else { + // Don't add initial untrained to rank history + } + } else { + for(let profData of profDataArray){ + rankHistory.set(JSON.stringify(parameterizeSrcStruct(profData.source, profData)), {Rank: profData.Prof, SourceName: profData.SourceName}); + } + } + g_variableMap.set(variableName, { + Type: VAR_TYPE.PROFICIENCY, + Value: { + AbilityScore: abilityScoreName, + RankHistory: rankHistory, + Bonuses: new Map(), + Conditionals: new Map() + } + }); +} + +///////// + +function variables_getValue(variableName){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { return null; } + return variable.Value; + +} + +/// + +function variables_addRank(variableName, rank, sourceName, srcStructKey){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { + console.log('Unknown variable '+variableName+', creating new one with SCORE_INT.'); + variables_addProficiency(variableName, VARIABLE.SCORE_INT, 'U'); + variable = g_variableMap.get(variableName); + } + + if(variable.Type != VAR_TYPE.PROFICIENCY){ + displayError("Variable Add Rank: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } + if(rank == 'U' || rank == 'T' || rank == 'E' || rank == 'M' || rank == 'L' || rank == 'UP' || rank == 'DOWN') {} else { + displayError("Variable Add Rank: The value \'"+rank+"\' for \'"+variableName+"\' is not a proficiency rank! (options: U, T, E, M, L, UP, and DOWN)"); + return; + } + + variable.Value.RankHistory.set(srcStructKey, {Rank: rank, SourceName: sourceName}); + +} + +function variables_removeRank(variableName, srcStructKey){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return; } + + if(variable.Type != VAR_TYPE.PROFICIENCY){ + displayError("Variable Remove Rank: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } + + variable.Value.RankHistory.delete(srcStructKey); + +} + +function variables_getFinalRank(variableName){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return; } + + if(variable.Type != VAR_TYPE.PROFICIENCY){ + displayError("Variable Final Rank: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } + + let highestNumUps = 0; + let rankUps = 0; + for(const [srcStructKey, rankData] of variable.Value.RankHistory.entries()){ + if(rankData.Rank == 'UP'){ + rankUps++; + } else if(rankData.Rank == 'DOWN'){ + rankUps--; + } else { + let numUps = profToNumUp(rankData.Rank); + if(numUps > highestNumUps){ highestNumUps = numUps; } + } + } + highestNumUps += rankUps; + + return getProfLetterFromNumUps(highestNumUps); + +} + +/// + +function variables_addToExtras(variableName, value, type, source){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { return; } + + let extrasMap; + if(variable.Type == VAR_TYPE.INTEGER){ + displayError("Variable Add Extra: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.STRING){ + extrasMap = variable.Extras; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + displayError("Variable Add Extra: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Add Extra: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + displayError("Variable Add Extra: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else { + displayError("Variable Add Extra: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + + // ( type ) -> ({ Value: value, Src: source }) + let existingData = extrasMap.get(type); + if(existingData != null){ + console.log(` + Existing extra exists for ${variableName} at ${type}! + Overriding it with '${value}' from ${source}... + `); + } + extrasMap.set(type, {Value: value, Src: source}); + + if(variable.Type == VAR_TYPE.STRING){ + g_variableMap.get(variableName).Value.Extras = extrasMap; + } + +} + +function variables_removeFromExtras(variableName, type){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { return; } + + let extrasMap; + if(variable.Type == VAR_TYPE.INTEGER){ + displayError("Variable Remove Extra: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.STRING){ + extrasMap = variable.Extras; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + displayError("Variable Remove Extra: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Remove Extra: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + displayError("Variable Remove Extra: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else { + displayError("Variable Remove Extra: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + + // ( type ) -> ({ Value: value, Src: source }) + extrasMap.delete(type); + + if(variable.Type == VAR_TYPE.STRING){ + g_variableMap.get(variableName).Value.Extras = extrasMap; + } + +} + +function variables_getFullString(variableName, errorOnFailure=true){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return null; } + + if(variable.Type == VAR_TYPE.INTEGER){ + if(errorOnFailure){ + displayError("Variable Get Full String: Unsupported variable type \'"+variable.Type+"\'!"); + } + return; + } else if(variable.Type == VAR_TYPE.STRING){ + + let str = variable.Value; + for(let [type, valueData] of variable.Extras){ + str += ', '+valueData.Value; + } + return str; + + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + if(errorOnFailure){ + displayError("Variable Get Full String: Unsupported variable type \'"+variable.Type+"\'!"); + } + return; + } else if(variable.Type == VAR_TYPE.LIST){ + if(errorOnFailure){ + displayError("Variable Get Full String: Unsupported variable type \'"+variable.Type+"\'!"); + } + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + if(errorOnFailure){ + displayError("Variable Get Full String: Unsupported variable type \'"+variable.Type+"\'!"); + } + return; + } else { + displayError("Variable Get Full String: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + +} + +function variables_getExtrasMap(variableName){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return null; } + + if(variable.Type == VAR_TYPE.INTEGER){ + displayError("Variable Get Extras Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.STRING){ + return variable.Extras; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + displayError("Variable Get Extras Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Get Extras Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + displayError("Variable Get Extras Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else { + displayError("Variable Get Extras Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } + +} + +/// + +function variables_addToBonuses(variableName, value, type, source){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return; } + + let bonusesMap; + if(variable.Type == VAR_TYPE.INTEGER){ + bonusesMap = variable.Bonuses; + } else if(variable.Type == VAR_TYPE.STRING){ + displayError("Variable Add Bonus: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + bonusesMap = variable.Value.Bonuses; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Add Bonus: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + bonusesMap = variable.Value.Bonuses; + } else { + displayError("Variable Add Bonus: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + + // ( type ) -> ({ Value: value, Src: source }) + + let existingData = bonusesMap.get(type); + if(existingData != null){ + // If both are negative, take the lowest + if(existingData.Value < 0 && value < 0){ + if(existingData.Value < value) { + value = existingData.Value; + source = existingData.Src; + } + } else { + // Take the highest + if(existingData.Value > value) { + value = existingData.Value; + source = existingData.Src; + } + } + } + bonusesMap.set(type, {Value: value, Src: source}); + + if(variable.Type == VAR_TYPE.INTEGER){ + g_variableMap.get(variableName).Bonuses = bonusesMap; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + g_variableMap.get(variableName).Value.Bonuses = bonusesMap; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + g_variableMap.get(variableName).Value.Bonuses = bonusesMap; + } + +} + +function variables_removeFromBonuses(variableName, type){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return; } + + let bonusesMap; + if(variable.Type == VAR_TYPE.INTEGER){ + bonusesMap = variable.Bonuses; + } else if(variable.Type == VAR_TYPE.STRING){ + displayError("Variable Remove Bonus: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + bonusesMap = variable.Value.Bonuses; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Remove Bonus: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + bonusesMap = variable.Value.Bonuses; + } else { + displayError("Variable Remove Bonus: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + + // ( type ) -> ({ Value: value, Src: source }) + bonusesMap.delete(type); + + if(variable.Type == VAR_TYPE.INTEGER){ + g_variableMap.get(variableName).Bonuses = bonusesMap; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + g_variableMap.get(variableName).Value.Bonuses = bonusesMap; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + g_variableMap.get(variableName).Value.Bonuses = bonusesMap; + } + +} + +function variables_getBonus(variableName, type){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return null; } + + let bonusesMap; + if(variable.Type == VAR_TYPE.INTEGER){ + bonusesMap = variable.Bonuses; + } else if(variable.Type == VAR_TYPE.STRING){ + displayError("Variable Get Bonus: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + bonusesMap = variable.Value.Bonuses; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Get Bonus: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + bonusesMap = variable.Value.Bonuses; + } else { + displayError("Variable Get Bonus: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + + return bonusesMap.get(type); + +} + +function variables_getBonusTotal(variableName){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return null; } + + let bonusesMap; + if(variable.Type == VAR_TYPE.INTEGER){ + bonusesMap = variable.Bonuses; + } else if(variable.Type == VAR_TYPE.STRING){ + displayError("Variable Get Bonus Total: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + bonusesMap = variable.Value.Bonuses; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Get Bonus Total: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + bonusesMap = variable.Value.Bonuses; + } else { + displayError("Variable Get Bonus Total: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + if(bonusesMap.size == 0) { return 0; } + + let total = 0; + for(let [type, valueData] of bonusesMap){ + let value = valueData.Value; + if(value === 'LAND_SPEED'){ + value = getStatTotal(VARIABLE.SPEED); + } + // For ability score, only give +1 if over 18. +20 is +2 regardless. + if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + if(value == 2){ + if(variable.Value.Score+total >= 18){ + total += 1; + } else { + total += 2; + } + } else if(value == 20){ + total += 2; + } else { + total += value; + } + } else { + total += value; + } + /* + if(type === 'PROF_BONUS'){ + total += getProfNumber(value, g_character.level); + } else if(type === 'MODIFIER') { + total += getModOfValue(value); + } else { + total += parseInt(value); + }*/ + } + return total; + +} + +function variables_getTotal(variableName, errorOnFailure=true){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return null; } + + let total = 0; + if(variable.Type == VAR_TYPE.INTEGER){ + + let bonusTotal = variables_getBonusTotal(variableName); + if(bonusTotal != null) { total += bonusTotal; } + total += variable.Value; + return parseInt(total); + + } else if(variable.Type == VAR_TYPE.STRING){ + if(errorOnFailure){ + displayError("Variable Get Total: Unsupported variable type \'"+variable.Type+"\'!"); + } + return; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + + let bonusTotal = variables_getBonusTotal(variableName); + if(bonusTotal != null) { total += bonusTotal; } + total += variable.Value.Score; + return total; + + } else if(variable.Type == VAR_TYPE.LIST){ + if(errorOnFailure){ + displayError("Variable Get Total: Unsupported variable type \'"+variable.Type+"\'!"); + } + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + + let bonusTotal = variables_getBonusTotal(variableName); + if(bonusTotal != null) { total += bonusTotal; } + total += getProfNumber(profToNumUp(variables_getFinalRank(variableName)), g_character.level); + total += getMod(variables_getTotal(variable.Value.AbilityScore)); + return total; + + } else { + displayError("Variable Get Total: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + +} + +function variables_getBonusesMap(variableName){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return null; } + + let bonusesMap; + if(variable.Type == VAR_TYPE.INTEGER){ + bonusesMap = variable.Bonuses; + } else if(variable.Type == VAR_TYPE.STRING){ + displayError("Variable Get Bonuses Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + bonusesMap = variable.Value.Bonuses; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Get Bonuses Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + bonusesMap = variable.Value.Bonuses; + } else { + displayError("Variable Get Bonuses Map: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + + return bonusesMap; + +} + +///////// + +function variables_addToConditionals(variableName, condition, source){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return; } + + let conditionalsMap; + if(variable.Type == VAR_TYPE.INTEGER){ + conditionalsMap = variable.Conditionals; + } else if(variable.Type == VAR_TYPE.STRING){ + displayError("Variable Add Bonus: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + conditionalsMap = variable.Value.Conditionals; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Add Bonus: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + conditionalsMap = variable.Value.Conditionals; + } else { + displayError("Variable Add Bonus: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + + // ( type ) -> ({ Condition: condition, Src: source }) + + let existingData = conditionalsMap.get(condition); + if(existingData != null){ + console.log(` + Existing conditional exists for ${variableName}! + Overriding it with '${condition}' from ${source}... + `); + } + conditionalsMap.set(condition, { Src: source }); + + if(variable.Type == VAR_TYPE.INTEGER){ + g_variableMap.get(variableName).Conditionals = conditionalsMap; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + g_variableMap.get(variableName).Value.Conditionals = conditionalsMap; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + g_variableMap.get(variableName).Value.Conditionals = conditionalsMap; + } + +} + +function variables_getConditionalsMap(variableName){ + + let variable = g_variableMap.get(variableName); + if(variable == null) { console.warn('Unknown variable: '+variableName); return null; } + + let conditionalsMap; + if(variable.Type == VAR_TYPE.INTEGER){ + conditionalsMap = variable.Conditionals; + } else if(variable.Type == VAR_TYPE.STRING){ + displayError("Variable Get Conditionals Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + conditionalsMap = variable.Value.Conditionals; + } else if(variable.Type == VAR_TYPE.LIST){ + displayError("Variable Get Conditionals Map: Unsupported variable type \'"+variable.Type+"\'!"); + return; + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + conditionalsMap = variable.Value.Conditionals; + } else { + displayError("Variable Get Conditionals Map: Unknown variable type \'"+variable.Type+"\'!"); + return; + } + + let findHighestMap = new Map(); + for(const [conditional, source] of conditionalsMap.entries()){ + + let bonusMatch = conditional.match(/(\+|\-|)(\d+) (.+)/); + if(bonusMatch != null){ + + let mapEntry = findHighestMap.get(bonusMatch[1]+' '+bonusMatch[3]); + if(mapEntry != null){ + + if(parseInt(bonusMatch[2]) > mapEntry.amount){ + findHighestMap.set(bonusMatch[1]+' '+bonusMatch[3], { + amount: bonusMatch[2], + conditional: conditional, + source: source, + }); + } else { + // Don't insert it + } + + } else { + + findHighestMap.set(bonusMatch[1]+' '+bonusMatch[3], { + amount: bonusMatch[2], + conditional: conditional, + source: source, + }); + + } + + } else { + + findHighestMap.set(conditional, { + conditional: conditional, + source: source, + }); + + } + + } + + let finalConditionalsMap = new Map(); + for(const [key, data] of findHighestMap.entries()){ + finalConditionalsMap.set(data.conditional, data.source); + } + + return finalConditionalsMap; + +} + +function variables_hasConditionals(variableName){ + let map = variables_getConditionalsMap(variableName); + return map != null && map.size > 0; +} + + +/////////////// + +function processVariables(wscCode, uniqueID){ + if(wscCode == null) {return;} + + let wscStatements = wscCode.split(/\n/); + const statementRegex = /([^=]+)=([^:]+):(.+)/; + + let newWscStatements = []; + + let count = 0; + for(let wscStatementRaw of wscStatements) { + + // Test/Check Statement for Expressions // + let wscStatement = testExpr(wscStatementRaw); + if(wscStatement == null) { + newWscStatements.push(wscStatementRaw); + continue; + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + // Replace variable names with their values // + let processedWscStatement = handleVariableText(wscStatement); + wscStatementRaw = wscStatementRaw.replace(wscStatement, processedWscStatement); + wscStatement = processedWscStatement; + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // + + let wscStatementUpper = wscStatement.toUpperCase(); + + if(wscStatementUpper.includes("DEFINE-VARIABLE=")){ // DEFINE-VARIABLE=Crembo:INTEGER + const match = wscStatement.match(statementRegex); + if(match != null){ + + let variableName = match[2]; + if(variableName.match(variableRegex) == null){ + displayError("Variable Processing: Invalid variable name \'"+variableName+"\'! Only letters, numbers, and underscores are allowed."); + continue; + } + if(g_variableMap.get(variableName) != null){ + //displayError("Variable Processing: A variable with the name \'"+variableName+"\' already exists!"); + continue; + } + + let variableType = match[3]; + + let variableTypeUpper = variableType.toUpperCase(); + if(variableTypeUpper == VAR_TYPE.INTEGER){ + + if(variableProcessingDebug) { console.log(`Defining new variable: '${variableName}' as '${VAR_TYPE.INTEGER}'`); } + variables_addInteger(variableName, 0); + + continue; + } else if(variableTypeUpper == VAR_TYPE.STRING){ + + if(variableProcessingDebug) { console.log(`Defining new variable: '${variableName}' as '${VAR_TYPE.STRING}'`); } + variables_addString(variableName, ''); + + continue; + } else if(variableTypeUpper == VAR_TYPE.ABILITY_SCORE){ + + if(variableProcessingDebug) { console.log(`Defining new variable: '${variableName}' as '${VAR_TYPE.ABILITY_SCORE}'`); } + variables_addAbilityScore(variableName, 0); + + continue; + } else if(variableTypeUpper == VAR_TYPE.LIST){ + + if(variableProcessingDebug) { console.log(`Defining new variable: '${variableName}' as '${VAR_TYPE.LIST}'`); } + variables_addList(variableName, []); + + continue; + } else if(variableTypeUpper.startsWith(VAR_TYPE.PROFICIENCY)){ + const typeMatch = variableType.trim().match(/^PROFICIENCY\((.+)\)$/im); + if(typeMatch != null){ + const abilityScoreVariableName = typeMatch[1]; + + let abilityScoreVariable = g_variableMap.get(abilityScoreVariableName); + if(abilityScoreVariable != null && abilityScoreVariable.Type == VAR_TYPE.ABILITY_SCORE){ + + if(variableProcessingDebug) { console.log(`Defining new variable: '${variableName}' as '${VAR_TYPE.PROFICIENCY}'`); } + variables_addProficiency(variableName, abilityScoreVariableName, 'U'); + + } else { + displayError(`Variable Processing: Could not find \'${abilityScoreVariableName}\' as an ${VAR_TYPE.ABILITY_SCORE} variable!`); + continue; + } + } else { + displayError(`Variable Processing: \'${variableType}\' does not follow the following format: PROFICIENCY(Ability Score Variable Name)!`); + continue; + } + } else { + displayError("Variable Processing: \'"+variableType+"\' is not a valid variable type!"); + continue; + } + + continue; + } + } + + if(wscStatementUpper.includes("SET-VARIABLE=")){ // SET-VARIABLE=Crembo:67 + const match = wscStatement.match(statementRegex); + if(match != null){ + + let variableStr = match[2]; + let value = match[3]; + + let variableName = ''; + let methodName = ''; + if(variableStr.includes('.')){ + let parts = variableStr.split('.'); + variableName = parts[0]; + methodName = parts[1]; + } else { + variableName = variableStr; + methodName = 'SET_VALUE'; + } + + let variable = g_variableMap.get(variableName); + if(variable == null){ + displayError("Variable Processing (set): Unknown variable \'"+variableName+"\'!"); + continue; + } + + if(variableProcessingDebug) { console.log(`Setting variable: '${variableName}.${methodName}' to '${value}'`); } + setVariableValueIntoMethod(variable, variableName, methodName, value, uniqueID+'-'+count); + + continue; + } + } + + newWscStatements.push(wscStatementRaw); + + } + + // Assemble new wscCode + let newWscCode = ''; + for(const newWscStatement of newWscStatements){ + newWscCode += newWscStatement+'\n'; + } + newWscCode = newWscCode.slice(0, -1); // Trim off that last '\n' + + return newWscCode; +} + +function handleVariableText(varText, errorOnFailure=true){ + if(!varText.includes('{') || !varText.includes('}')) { return varText; } + + // Validate text // + if(varText.split('{').length !== varText.split('}').length) { + displayError("Variable Processing: Invalid syntax, braces mismatch! \'"+varText+"\'"); + return varText; + } + + // Process text // + let processTopLayerOfPyramid = function(){ + + let lastBrace = null; + for (let i = 0; i < varText.length; i++) { + const char = varText.charAt(i); + + if(lastBrace != null && lastBrace.Type === '{' && char === '}'){ + + console.log(varText.substring(lastBrace.Index, i+1)); + + return varText.replace(varText.substring(lastBrace.Index, i+1), getVariableValue(varText.substring(lastBrace.Index+1, i), errorOnFailure)); + + } else { + if(char === '{' || char === '}'){ + lastBrace = { Type: char, Index: i }; + } + } + + } + + }; + + let count = 0; + while(varText.includes('{')){ + varText = processTopLayerOfPyramid(); + + count++; + if(count > 100) { + displayError("Variable Processing: Unsolvable, braces mismatch! \'"+varText+"\'"); + return varText; + } + } + + return varText; + +} + +function getVariableValue(variableStr, errorOnFailure=true){ + + if(variableStr.includes('.')){ + // Variable with . + + let parts = variableStr.split('.'); + + let variable = g_variableMap.get(parts[0]); + if(variable == null){ + if(errorOnFailure){ + displayError("Variable Processing (2-1): Unknown variable \'"+variableStr+"\'!"); + } + return 'Error'; + } + + return getVariableValueFromMethod(variable, parts[0], parts[1]); + + } else { + + // Might be just a variable + let variable = g_variableMap.get(variableStr); + if(variable != null){ + + return getVariableValueFromMethod(variable, variableStr, 'GET_VALUE'); + + } else { + // Could be just math + + try { + return parseInt(math.evaluate(variableStr)); + } catch (err){ + if(errorOnFailure){ + displayError("Variable Processing (2-0): Error trying to do math \'"+variableStr+"\'!"); + } + //console.error(err); + return 'Error'; + } + + } + + } + +} + +function getVariableValueFromMethod(variable, varName, method) { + let methodUpper = method.toUpperCase(); + + if(variable.Type == VAR_TYPE.INTEGER){ + + if(methodUpper == 'GET_VALUE'){ + return variable.Value; + } else if(methodUpper == 'GET_BONUS_TOTAL'){ + return variables_getBonusTotal(varName); + } else if(methodUpper == 'GET_TOTAL'){ + return variables_getTotal(varName); + } else { + displayError("Variable Processing: Unknown getting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + return 'Error'; + } + + } else if(variable.Type == VAR_TYPE.STRING){ + + if(methodUpper == 'GET_VALUE'){ + return variable.Value; + } else if(methodUpper == 'GET_FULL_STRING'){ + return variables_getFullString(varName); + } else { + displayError("Variable Processing: Unknown getting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + return 'Error'; + } + + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + + // TODO - Doesn't add char_level or account for level-less prof being enabled (untrained is -2) + // temp solution + let rankToValue = function(rank){ + if(rank == 'U'){ return 0; } + if(rank == 'T'){ return 2; } + if(rank == 'E'){ return 4; } + if(rank == 'M'){ return 6; } + if(rank == 'L'){ return 8; } + }; + + if(methodUpper == 'GET_BONUS_TOTAL'){ + return variables_getBonusTotal(varName); + } else if(methodUpper == 'GET_TOTAL'){ + return variables_getTotal(varName); + } else if(methodUpper == 'GET_BONUS_RANK'){ + return rankToValue(variables_getFinalRank(varName)); + } else if(methodUpper == 'GET_BONUS_ABILITY'){ + return getMod(variables_getTotal(variable.Value.AbilityScore)); + } else if(methodUpper == 'GET_ABILITY'){ + return variable.Value.AbilityScore; + } else if(methodUpper == 'GET_VALUE'){ + return variables_getFinalRank(varName); + } else { + displayError("Variable Processing: Unknown getting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + return 'Error'; + } + + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + + if(methodUpper == 'GET_MOD'){ + return getMod(variable.Value.Score); + } else if(methodUpper == 'GET_TOTAL_MOD'){ + return getMod(variables_getTotal(varName)); + } else if(methodUpper == 'GET_BONUS_TOTAL'){ + return variables_getBonusTotal(varName); + } else if(methodUpper == 'GET_TOTAL'){ + return variables_getTotal(varName); + } else if(methodUpper == 'GET_SCORE'){ + return variable.Value.Score; + } else if(methodUpper == 'GET_VALUE'){ + return variable.Value.Score; + } else { + displayError("Variable Processing: Unknown getting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + return 'Error'; + } + + } else if(variable.Type == VAR_TYPE.LIST){ + + if(methodUpper == 'GET_LENGTH'){ + return variable.Value.length; + } else if(methodUpper.match(/^GET_INDEX_(\d+)$/)){ + let digit = parseInt(methodUpper.replace('GET_INDEX_', '')); + return variable.Value[digit]; + } else if(methodUpper == 'GET_VALUE'){ + return ''+variable.Value; + } else { + displayError("Variable Processing: Unknown getting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + return 'Error'; + } + + } else { + displayError("Variable Processing: Unknown variable type \'"+variable.Type+"\'!"); + return 'Error'; + } + +} + +function setVariableValueIntoMethod(variable, varName, method, value, uniqueID=null) { + let methodUpper = method.toUpperCase(); + + if(variable.Type == VAR_TYPE.INTEGER){ + + if(methodUpper == 'SET_VALUE'){ + let intValue = parseInt(value); + if(typeof intValue === 'number' && intValue == value) { + variable.Value = intValue; + } else { + displayError("Variable Processing (set): The value \'"+value+"\' for \'"+varName+"\' is not an integer!"); + } + } else if(methodUpper == 'ADD'){ + let bonusInt; + let bonusType; + if(value.includes(':')){ + let valueParts = value.split(':'); + bonusInt = parseInt(valueParts[0]); + bonusType = valueParts[1]; + } else { + bonusInt = parseInt(value); + bonusType = uniqueID; + } + if(typeof bonusInt === 'number') { + variables_addToBonuses(varName, bonusInt, bonusType, 'WSC Statement'); + } else { + displayError("Variable Processing (set): The value \'"+value+"\' for \'"+varName+"\' is not an integer!"); + } + } else { + displayError("Variable Processing: Unknown setting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + } + + } else if(variable.Type == VAR_TYPE.STRING){ + + if(methodUpper == 'SET_VALUE'){ + if(typeof value === 'string') { + variable.Value = value; + } else { + displayError("Variable Processing (set): The value \'"+value+"\' for \'"+varName+"\' is not a string!"); + } + } else if(methodUpper == 'ADD'){ + let bonusStr; + let bonusType; + if(value.includes(':')){ + let valueParts = value.split(':'); + bonusStr = valueParts[0]; + bonusType = valueParts[1]; + } else { + bonusStr = value; + bonusType = uniqueID; + } + variables_addToExtras(varName, bonusStr, bonusType, 'WSC Statement'); + } else { + displayError("Variable Processing: Unknown setting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + } + + } else if(variable.Type == VAR_TYPE.PROFICIENCY){ + + if(methodUpper == 'SET_ABILITY'){ + let abilityScoreVariable = g_variableMap.get(value); + if(abilityScoreVariable != null && abilityScoreVariable.Type == VAR_TYPE.ABILITY_SCORE){ + variable.Value.AbilityScore = value; + } else { + displayError(`Variable Processing (set): The value \'${value}\' for \'${varName}\' is not an ${VAR_TYPE.ABILITY_SCORE} variable!`); + } + } else if(methodUpper == 'ADD'){ + let bonusInt; + let bonusType; + if(value.includes(':')){ + let valueParts = value.split(':'); + bonusInt = parseInt(valueParts[0]); + bonusType = valueParts[1]; + } else { + bonusInt = parseInt(value); + bonusType = uniqueID; + } + if(typeof bonusInt === 'number') { + variables_addToBonuses(varName, bonusInt, bonusType, 'WSC Statement'); + } else { + displayError("Variable Processing (set): The value \'"+value+"\' for \'"+varName+"\' is not an integer!"); + } + } else if(methodUpper == 'SET_VALUE'){ + variables_addRank(varName, value, 'WSC Statement', uniqueID); + } else { + displayError("Variable Processing: Unknown setting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + } + + } else if(variable.Type == VAR_TYPE.ABILITY_SCORE){ + + if(methodUpper == 'SET_SCORE' || methodUpper == 'SET_VALUE'){ + let intValue = parseInt(value); + if(typeof intValue === 'number' && intValue == value) { + variable.Value.Score = intValue; + } else { + displayError("Variable Processing (set): The value \'"+value+"\' for \'"+varName+"\' is not an integer!"); + } + } else if(methodUpper == 'ADD'){ + let bonusInt; + let bonusType; + if(value.includes(':')){ + let valueParts = value.split(':'); + bonusInt = parseInt(valueParts[0]); + bonusType = valueParts[1]; + } else { + bonusInt = parseInt(value); + bonusType = uniqueID; + } + if(typeof bonusInt === 'number') { + variables_addToBonuses(varName, bonusInt, bonusType, 'WSC Statement'); + } else { + displayError("Variable Processing (set): The value \'"+value+"\' for \'"+varName+"\' is not an integer!"); + } + } else { + displayError("Variable Processing: Unknown setting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + } + + } else if(variable.Type == VAR_TYPE.LIST){ + + if(methodUpper == 'SET_INDEX_NEXT'){ + variable.Value.push(value); + } else if(methodUpper.match(/^SET_INDEX_(\d+)$/)){ + let digit = parseInt(methodUpper.replace('SET_INDEX_', '')); + variable.Value[digit] = value; + } else if(methodUpper == 'SET_VALUE'){ + try { + let newArray = JSON.parse(value); + if(typeof newArray === 'object') { + variable.Value = newArray; + } else { + displayError("Variable Processing (set-1): The value \'"+value+"\' for \'"+varName+"\' is not a list!"); + } + } catch(err){ + displayError("Variable Processing (set-2): The value \'"+value+"\' for \'"+varName+"\' is not a list!"); + console.error(err); + } + } else { + displayError("Variable Processing: Unknown setting method \'"+method+"\' for variable \'"+varName+"\' ("+variable.Type+")!"); + } + + } else { + displayError("Variable Processing: Unknown variable type \'"+variable.Type+"\'!"); + } + +} \ No newline at end of file diff --git a/client/vue-src/main.ts b/client/vue-src/main.ts new file mode 100644 index 00000000..302a9e65 --- /dev/null +++ b/client/vue-src/main.ts @@ -0,0 +1,24 @@ +import { createApp } from "vue"; +import "./style.css"; +import App from "./App.vue"; + +createApp(App).mount("#app"); + +// fetch this from some socket or endpoint: +const enabledLightMode = false; + +// until we have tailwind/better bem, this is our conditional stylesheet imports: +if(enabledLightMode) { + var element = document.createElement("link"); + element.setAttribute("rel", "stylesheet"); + element.setAttribute("type", "text/css"); + element.setAttribute("href", "/css/core/site-themes-light.css"); + document.getElementsByTagName("head")[0].appendChild(element); +} +else{ + var element = document.createElement("link"); + element.setAttribute("rel", "stylesheet"); + element.setAttribute("type", "text/css"); + element.setAttribute("href", "/css/core/site-themes-dark.css"); + document.getElementsByTagName("head")[0].appendChild(element); +} \ No newline at end of file diff --git a/client/vue-src/style.css b/client/vue-src/style.css new file mode 100644 index 00000000..1b024c7c --- /dev/null +++ b/client/vue-src/style.css @@ -0,0 +1 @@ +/* base styles */ \ No newline at end of file diff --git a/client/vue-src/views/dashboard/character-list/character-list.vue b/client/vue-src/views/dashboard/character-list/character-list.vue new file mode 100644 index 00000000..a0a785ce --- /dev/null +++ b/client/vue-src/views/dashboard/character-list/character-list.vue @@ -0,0 +1,450 @@ + + + diff --git a/client/vue-src/vite-env.d.ts b/client/vue-src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/client/vue-src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/package-lock.json b/package-lock.json index 44aa220c..46a7a4f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "wanderers-guide", "version": "0.0.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -32,9 +32,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.64", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.64.tgz", - "integrity": "sha512-2N6bLz//iKv0W8ZBRHIVdbsHXR7mV3yY12ImF5g3lzJRq6i/ZY5Uz19Y1eHGWz2f/+bZqDKHAJOlXqimqJZ1Uw==", + "version": "2.2.67", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.67.tgz", + "integrity": "sha512-d3V26C26SGdG0wMeuXDdoPA4CZJQgHS53fqmIuSUNw83vMBullJSUGLxNvk2LzdWcuftSpMUqIUKLKxFzDEMIA==", "dev": true }, "node_modules/@aws-cdk/asset-kubectl-v20": { @@ -44,9 +44,9 @@ "dev": true }, "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.53.tgz", - "integrity": "sha512-gDNdL+Lf2oBhYOr61ovO/QV+Hw2WzSGuKoz+O7Dc56DAF9OiTTc5DZA4la6FUcLPIamlVwxVdASqWXJZfRf64A==", + "version": "2.0.56", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.56.tgz", + "integrity": "sha512-gmne4sTHeGfsnqyrpmMgp4VpNRRoaCrJIyEhcmokYL3qiE+qkeAJVVWXM7cL1rC05WjsG93IIg9Hw09g2VZRlA==", "dev": true }, "node_modules/@aws-cdk/aws-apigatewayv2-alpha": { @@ -183,48 +183,20 @@ "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==", "dev": true }, - "node_modules/@aws-cdk/cloudformation-diff/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@aws-cdk/cloudformation-diff/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@aws-cdk/cloudformation-diff/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@aws-cdk/cloudformation-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@aws-cdk/cloudformation-diff/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" + "node": ">=10" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@aws-cdk/cx-api": { @@ -299,12 +271,6 @@ "tslib": "^1.11.1" } }, - "node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@aws-crypto/crc32c": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz", @@ -316,12 +282,6 @@ "tslib": "^1.11.1" } }, - "node_modules/@aws-crypto/crc32c/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@aws-crypto/ie11-detection": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", @@ -331,12 +291,6 @@ "tslib": "^1.11.1" } }, - "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@aws-crypto/sha1-browser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz", @@ -351,12 +305,6 @@ "tslib": "^1.11.1" } }, - "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@aws-crypto/sha256-browser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", @@ -373,12 +321,6 @@ "tslib": "^1.11.1" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@aws-crypto/sha256-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", @@ -390,12 +332,6 @@ "tslib": "^1.11.1" } }, - "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", @@ -405,12 +341,6 @@ "tslib": "^1.11.1" } }, - "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@aws-crypto/util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", @@ -422,12 +352,6 @@ "tslib": "^1.11.1" } }, - "node_modules/@aws-crypto/util/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@aws-sdk/abort-controller": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.208.0.tgz", @@ -441,6 +365,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/abort-controller/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/chunked-blob-reader": { "version": "3.188.0", "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.188.0.tgz", @@ -460,6 +390,73 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/chunked-blob-reader-native/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/chunked-blob-reader/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/client-api-gateway": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-api-gateway/-/client-api-gateway-3.208.0.tgz", + "integrity": "sha512-BGZGEn1qgbjjWzBY6g4uSI+HrXUcQP2wdGV+n12S818tbmUE3171WFluKkh6q+vbcBIT9GuaOgTI4mtLgTIZ3g==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-sdk-api-gateway": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-api-gateway/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/client-cloudformation": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.208.0.tgz", @@ -511,14 +508,11 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/@aws-sdk/client-cloudformation/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true }, "node_modules/@aws-sdk/client-cloudfront": { "version": "3.208.0", @@ -571,6 +565,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-cloudfront/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/client-cognito-identity": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.208.0.tgz", @@ -619,6 +619,68 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/client-iam": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.208.0.tgz", + "integrity": "sha512-hCac/fo4pREeYSrNL9TrlJraLxiVT+M2eG8dVQXqaFcOKER+HLFV+DSFHnmDf1i0vS9jWvVn/Jjo19InorhNpA==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/client-iot": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-iot/-/client-iot-3.208.0.tgz", @@ -716,14 +778,17 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/@aws-sdk/client-iot-data-plane/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/client-iot/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true }, "node_modules/@aws-sdk/client-lambda": { "version": "3.208.0", @@ -774,6 +839,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-lambda/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/client-rds-data": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-rds-data/-/client-rds-data-3.208.0.tgz", @@ -822,6 +893,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-rds-data/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/client-s3": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.208.0.tgz", @@ -889,6 +966,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-s3/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/client-ssm": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.208.0.tgz", @@ -939,14 +1022,11 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/@aws-sdk/client-ssm/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true }, "node_modules/@aws-sdk/client-sso": { "version": "3.208.0", @@ -993,6 +1073,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-sso/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/client-sts": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.208.0.tgz", @@ -1042,6 +1128,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-sts/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/config-resolver": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.208.0.tgz", @@ -1058,6 +1150,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/config-resolver/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.208.0.tgz", @@ -1073,6 +1171,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.208.0.tgz", @@ -1087,6 +1191,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-provider-imds": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.208.0.tgz", @@ -1103,6 +1213,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-provider-imds/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.208.0.tgz", @@ -1122,6 +1238,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-provider-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.208.0.tgz", @@ -1143,6 +1265,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-provider-process": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.208.0.tgz", @@ -1158,6 +1286,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.208.0.tgz", @@ -1174,6 +1308,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.208.0.tgz", @@ -1188,6 +1328,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/credential-providers": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.208.0.tgz", @@ -1214,6 +1360,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-providers/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/eventstream-codec": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.208.0.tgz", @@ -1226,6 +1378,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/eventstream-codec/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/eventstream-serde-browser": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.208.0.tgz", @@ -1240,6 +1398,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/eventstream-serde-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/eventstream-serde-config-resolver": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.208.0.tgz", @@ -1253,6 +1417,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/eventstream-serde-config-resolver/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/eventstream-serde-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.208.0.tgz", @@ -1267,6 +1437,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/eventstream-serde-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/eventstream-serde-universal": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.208.0.tgz", @@ -1281,6 +1457,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/eventstream-serde-universal/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/fetch-http-handler": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.208.0.tgz", @@ -1294,6 +1476,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/hash-blob-browser": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.208.0.tgz", @@ -1306,6 +1494,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/hash-blob-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/hash-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.208.0.tgz", @@ -1320,6 +1514,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/hash-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/hash-stream-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.208.0.tgz", @@ -1333,6 +1533,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/hash-stream-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/invalid-dependency": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.208.0.tgz", @@ -1343,6 +1549,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/invalid-dependency/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/is-array-buffer": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", @@ -1355,6 +1567,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/is-array-buffer/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/md5-js": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.208.0.tgz", @@ -1367,6 +1585,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/md5-js/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.208.0.tgz", @@ -1383,6 +1607,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-content-length": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.208.0.tgz", @@ -1397,6 +1627,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-endpoint": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.208.0.tgz", @@ -1416,6 +1652,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.208.0.tgz", @@ -1430,6 +1672,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.208.0.tgz", @@ -1447,6 +1695,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.208.0.tgz", @@ -1461,6 +1715,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.208.0.tgz", @@ -1474,6 +1734,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-logger": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.208.0.tgz", @@ -1487,6 +1753,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.208.0.tgz", @@ -1501,6 +1773,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-retry": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.208.0.tgz", @@ -1518,15 +1796,32 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-sdk-api-gateway": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-api-gateway/-/middleware-sdk-api-gateway-3.208.0.tgz", + "integrity": "sha512-esI4x7qooCECo5hP6d4cSqGxJ8WtFsR3aCXZvO841MXCaYQDEh6tApJMwK3kwh4lcp0Iu3M5aYF/DP6vQFYS+Q==", "dev": true, - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-sdk-api-gateway/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.208.0.tgz", @@ -1543,6 +1838,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-sdk-sts": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.208.0.tgz", @@ -1560,6 +1861,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-serde": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.208.0.tgz", @@ -1573,6 +1880,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-signing": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.208.0.tgz", @@ -1590,6 +1903,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-ssec": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.208.0.tgz", @@ -1603,6 +1922,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-ssec/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-stack": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.208.0.tgz", @@ -1615,6 +1940,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.208.0.tgz", @@ -1629,6 +1960,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/node-config-provider": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.208.0.tgz", @@ -1644,6 +1981,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/node-http-handler": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.208.0.tgz", @@ -1660,6 +2003,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/property-provider": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.208.0.tgz", @@ -1673,6 +2022,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/property-provider/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/protocol-http": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.208.0.tgz", @@ -1686,6 +2041,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/protocol-http/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/querystring-builder": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.208.0.tgz", @@ -1700,6 +2061,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/querystring-parser": { "version": "3.267.0", "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz", @@ -1725,9 +2092,15 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/service-error-classification": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.208.0.tgz", + "node_modules/@aws-sdk/querystring-parser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.208.0.tgz", "integrity": "sha512-ZZWV3AOTd8UDcfXCNoQ8v4sHaTgFxGaXWO0NHHgqFbVYr1d+8EXQiOy/v8JsY1jrfoXBWXptTOcioCTeM0xBpw==", "dev": true, "engines": { @@ -1747,6 +2120,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/shared-ini-file-loader/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/signature-v4": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.208.0.tgz", @@ -1825,6 +2204,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/signature-v4-crt/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.208.0.tgz", @@ -1849,6 +2234,18 @@ } } }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/signature-v4/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/smithy-client": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.208.0.tgz", @@ -1863,6 +2260,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/smithy-client/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/types": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.208.0.tgz", @@ -1896,6 +2299,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/url-parser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-arn-parser": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz", @@ -1908,6 +2317,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-arn-parser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-base64": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", @@ -1930,6 +2345,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/util-base64-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-base64-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.208.0.tgz", @@ -1943,6 +2364,18 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-base64-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-base64/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-body-length-browser": { "version": "3.188.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", @@ -1952,6 +2385,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/util-body-length-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-body-length-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", @@ -1964,6 +2403,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-body-length-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-buffer-from": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", @@ -1977,6 +2422,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-buffer-from/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-config-provider": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", @@ -1989,6 +2440,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-config-provider/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-defaults-mode-browser": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.208.0.tgz", @@ -2004,6 +2461,12 @@ "node": ">= 10.0.0" } }, + "node_modules/@aws-sdk/util-defaults-mode-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-defaults-mode-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.208.0.tgz", @@ -2021,6 +2484,12 @@ "node": ">= 10.0.0" } }, + "node_modules/@aws-sdk/util-defaults-mode-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-endpoints": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.208.0.tgz", @@ -2034,6 +2503,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-hex-encoding": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", @@ -2046,6 +2521,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-hex-encoding/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-locate-window": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", @@ -2058,6 +2539,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-middleware": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.208.0.tgz", @@ -2070,6 +2557,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-middleware/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-stream-browser": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.208.0.tgz", @@ -2084,6 +2577,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/util-stream-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-stream-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.208.0.tgz", @@ -2099,6 +2598,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-stream-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-uri-escape": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", @@ -2111,6 +2616,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-uri-escape/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.208.0.tgz", @@ -2122,6 +2633,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.208.0.tgz", @@ -2144,6 +2661,12 @@ } } }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-utf8": { "version": "3.254.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", @@ -2166,6 +2689,12 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-utf8-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", @@ -2179,6 +2708,18 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-utf8-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-utf8/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/util-waiter": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.208.0.tgz", @@ -2193,6 +2734,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-waiter/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@aws-sdk/xml-builder": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.201.0.tgz", @@ -2205,6 +2752,12 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/xml-builder/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -2335,15 +2888,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2353,12 +2897,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -2657,13 +3195,19 @@ "bulma": "latest" } }, + "node_modules/@creativebulma/bulma-collapsible/node_modules/bulma": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.3.tgz", + "integrity": "sha512-0d7GNW1PY4ud8TWxdNcP6Cc8Bu7MxcntD/RRLGWuiw/s0a9P+XlH/6QoOIrmbj6o8WWJzJYhytiu9nFjTszk1g==" + }, "node_modules/@esbuild/android-arm": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", - "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.13.tgz", + "integrity": "sha512-JmtqThupn9Yf+FzANE+GG73ASUkssnPwOsndUElhp23685QzRK+MO1UompOlBaXV9D5FTuYcPnw7p4mCq2YbZQ==", "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "android" @@ -2673,12 +3217,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", - "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.13.tgz", + "integrity": "sha512-r4xetsd1ez1NF9/9R2f9Q6AlxqiZLwUqo7ICOcvEVwopVkXUcspIjEbJk0EVTgT6Cp5+ymzGPT6YNV0ievx4yA==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" @@ -2688,12 +3233,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", - "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.13.tgz", + "integrity": "sha512-hKt1bFht/Vtp0xJ0ZVzFMnPy1y1ycmM3KNnp3zsyZfQmw7nhs2WLO4vxdR5YG+6RsHKCb2zbZ3VwlC0Tij0qyA==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "android" @@ -2703,12 +3249,13 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", - "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.13.tgz", + "integrity": "sha512-ogrVuNi2URocrr3Ps20f075EMm9V7IeenOi9FRj4qdbT6mQlwLuP4l90PW2iBrKERx0oRkcZprEUNsz/3xd7ww==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -2718,12 +3265,13 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", - "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.13.tgz", + "integrity": "sha512-Agajik9SBGiKD7FPXE+ExW6x3MgA/dUdpZnXa9y1tyfE4lKQx+eQiknSdrBnWPeqa9wL0AOvkhghmYhpVkyqkA==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -2733,12 +3281,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", - "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.13.tgz", + "integrity": "sha512-KxMO3/XihBcHM+xQUM6nQZO1SgQuOsd1DCnKF1a4SIf/i5VD45vrqN3k8ePgFrEbMi7m5JeGmvNqwJXinF0a4Q==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -2748,12 +3297,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", - "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.13.tgz", + "integrity": "sha512-Ez15oqV1vwvZ30cVLeBW14BsWq/fdWNQGMOxxqaSJVQVLqHhvgfQ7gxGDiN9tpJdeQhqJO+Q0r02/Tce5+USNg==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -2763,12 +3313,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", - "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.13.tgz", + "integrity": "sha512-18dLd2L3mda+iFj6sswyBMSh2UwniamD9M4DwPv8VM+9apRFlQ5IGKxBdumnTuOI4NvwwAernmUseWhYQ9k+rg==", "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2778,12 +3329,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", - "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.13.tgz", + "integrity": "sha512-qi5n7KwcGViyJeZeQnu8fB6dC3Mlm5PGaqSv2HhQDDx/MPvVfQGNMcv7zcBL4qk3FkuWhGVwXkjQ76x7R0PWlA==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2793,12 +3345,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", - "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.13.tgz", + "integrity": "sha512-2489Xad9sr+6GD7nB913fUqpCsSwVwgskkQTq4Or2mZntSPYPebyJm8l1YruHo7oqYMTGV6RiwGE4gRo3H+EPQ==", "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2808,12 +3361,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", - "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.13.tgz", + "integrity": "sha512-x8KplRu9Y43Px8I9YS+sPBwQ+fw44Mvp2BPVADopKDWz+h3fcj1BvRU58kxb89WObmwKX9sWdtYzepL4Fmx03A==", "cpu": [ "loong64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2823,12 +3377,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", - "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.13.tgz", + "integrity": "sha512-qhhdWph9FLwD9rVVC/nUf7k2U4NZIA6/mGx0B7+O6PFV0GjmPA2E3zDQ4NUjq9P26E0DeAZy9akH9dYcUBRU7A==", "cpu": [ "mips64el" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2838,12 +3393,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", - "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.13.tgz", + "integrity": "sha512-cVWAPKsrRVxI1jCeJHnYSbE3BrEU+pZTZK2gfao9HRxuc+3m4+RLfs3EVEpGLmMKEcWfVCB9wZ3yNxnknutGKQ==", "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2853,12 +3409,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", - "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.13.tgz", + "integrity": "sha512-Agb7dbRyZWnmPn5Vvf0eyqaEUqSsaIUwwyInu2EoFTaIDRp093QU2M5alUyOooMLkRbD1WvqQNwx08Z/g+SAcQ==", "cpu": [ "riscv64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2868,12 +3425,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", - "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.13.tgz", + "integrity": "sha512-AqRBIrc/+kl08ahliNG+EyU+j41wIzQfwBTKpi80cCDiYvYFPuXjvzZsD9muiu58Isj0RVni9VgC4xK/AnSW4g==", "cpu": [ "s390x" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2898,12 +3456,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", - "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.13.tgz", + "integrity": "sha512-2c8JWgfUMlQHTdaR5X3xNMwqOyad8kgeCupuVkdm3QkUOzGREjlTETQsK6oHifocYzDCo9FeKcUwsK356SdR+g==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "netbsd" @@ -2913,12 +3472,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", - "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.13.tgz", + "integrity": "sha512-Bwh+PmKD/LK+xBjqIpnYnKYj0fIyQJ0YpRxsn0F+WfzvQ2OA+GKDlf8AHosiCns26Q4Dje388jQVwfOBZ1GaFw==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "openbsd" @@ -2928,12 +3488,13 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", - "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.13.tgz", + "integrity": "sha512-8wwk6f9XGnhrF94/DBdFM4Xm1JeCyGTCj67r516VS9yvBVQf3Rar54L+XPVDs/oZOokwH+XsktrgkuTMAmjntg==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "sunos" @@ -2943,12 +3504,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", - "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.13.tgz", + "integrity": "sha512-Jmwbp/5ArLCiRAHC33ODfcrlIcbP/exXkOEUVkADNJC4e/so2jm+i8IQFvVX/lA2GWvK3GdgcN0VFfp9YITAbg==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2958,12 +3520,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", - "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.13.tgz", + "integrity": "sha512-AX6WjntGjhJHzrPSVvjMD7grxt41koHfAOx6lxLorrpDwwIKKPaGDASPZgvFIZHTbwhOtILW6vAXxYPDsKpDJA==", "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2973,12 +3536,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", - "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.13.tgz", + "integrity": "sha512-A+U4gM6OOkPS03UgVU08GTpAAAxPsP/8Z4FmneGo4TaVSD99bK9gVJXlqUEPMO/htFXEAht2O6pX4ErtLY5tVg==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2987,11 +3551,6 @@ "node": ">=12" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" - }, "node_modules/@httptoolkit/websocket-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz", @@ -3029,6 +3588,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/@httptoolkit/websocket-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/@httptoolkit/websocket-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3120,28 +3685,10 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "node_modules/@npmcli/ci-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz", + "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==" }, "node_modules/@npmcli/git": { "version": "2.1.0", @@ -3158,27 +3705,99 @@ "which": "^2.0.2" } }, - "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/@npmcli/git/node_modules/@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dependencies": { + "infer-owner": "^1.0.4" + } + }, + "node_modules/@npmcli/git/node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/@npmcli/git/node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "dependencies": { "lru-cache": "^6.0.0" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "node_modules/@npmcli/git/node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { "node": ">=10" } }, + "node_modules/@npmcli/git/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@npmcli/git/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", "dependencies": { "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" }, "bin": { "installed-package-contents": "index.js" @@ -3191,7 +3810,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -3200,37 +3818,35 @@ "node": ">=10" } }, - "node_modules/@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==" - }, - "node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "infer-owner": "^1.0.4" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/run-script": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "node_modules/@npmcli/promise-spawn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.2.0.tgz", + "integrity": "sha512-nFtqjVETliApiRdjbYwKwhlSHx2ZMagyj5b9YbNt0BWeeOVxJd47ZVE2u16vxDHyTOZvk+YLV7INwfAE9a2uow==", "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" + "infer-owner": "^1.0.4" } }, "node_modules/@prisma/client": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.10.1.tgz", - "integrity": "sha512-VonXLJZybdt8e5XZH5vnIGCRNnIh6OMX1FS3H/yzMGLT3STj5TJ/OkMcednrvELgk8PK89Vo3aSh51MWNO0axA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.5.0.tgz", + "integrity": "sha512-B2cV0OPI1smhdYUxsJoLYQLoMlLH06MUxgFUWQnHodGMX98VRVXKmQE/9OcrTNkqtke5RC+YU24Szxd04tZA2g==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "4.10.1-2.aead147aa326ccb985dcfed5b065b4fdabd44b19" + "@prisma/engines-version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452" }, "engines": { "node": ">=14.17" @@ -3245,15 +3861,15 @@ } }, "node_modules/@prisma/engines": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.10.1.tgz", - "integrity": "sha512-B3tcTxjx196nuAu1GOTKO9cGPUgTFHYRdkPkTS4m5ptb2cejyBlH9X7GOfSt3xlI7p4zAJDshJP4JJivCg9ouA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.5.0.tgz", + "integrity": "sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g==", "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "4.10.1-2.aead147aa326ccb985dcfed5b065b4fdabd44b19", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.10.1-2.aead147aa326ccb985dcfed5b065b4fdabd44b19.tgz", - "integrity": "sha512-tsjTho7laDhf9EJ9EnDxAPEf7yrigSMDhniXeU4YoWc7azHAs4GPxRi2P9LTFonmHkJLMOLjR77J1oIP8Ife1w==" + "version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452.tgz", + "integrity": "sha512-o7LyVx8PPJBLrEzLl6lpxxk2D5VnlM4Fwmrbq0NoT6pr5aa1OuHD9ZG+WJY6TlR/iD9bhmo2LNcxddCMr5Rv2A==" }, "node_modules/@sindresorhus/is": { "version": "0.14.0", @@ -3275,9 +3891,9 @@ } }, "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", + "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", "engines": { "node": ">= 6" } @@ -3291,6 +3907,12 @@ "tslib": "^2.1.0" } }, + "node_modules/@trpc/server/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/@tsconfig/node18": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-1.0.1.tgz", @@ -3303,6 +3925,11 @@ "integrity": "sha512-r6egf2Cwv/JaFTTrF9OXFVUB3j/SXTgM9BwrlbBRjWAa2Tu6GWoDoLflppAZ8uSfbUJdXvC7Br3DjuN9pQ2NUQ==", "dev": true }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, "node_modules/@types/node": { "version": "18.13.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", @@ -3334,7 +3961,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -3395,9 +4023,9 @@ "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", "dependencies": { "debug": "4" }, @@ -3406,19 +4034,12 @@ } }, "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "^2.1.1" } }, "node_modules/agent-base/node_modules/ms": { @@ -3426,52 +4047,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/agentkeepalive/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agentkeepalive/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentkeepalive/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -3481,13 +4060,14 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -3512,28 +4092,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/ansi": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", @@ -3541,51 +4099,43 @@ "dev": true }, "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "dependencies": { - "string-width": "^4.1.0" + "string-width": "^3.0.0" } }, "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/ansi-escapes": { @@ -3618,16 +4168,17 @@ "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "engines": { "node": ">=0.10.0" } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dependencies": { + "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" }, "engines": { @@ -3640,12 +4191,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -3720,6 +4271,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/archiver-utils/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3743,26 +4300,6 @@ "node": ">= 6" } }, - "node_modules/archiver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/archiver/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -3773,39 +4310,13 @@ } }, "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", + "integrity": "sha512-Zfw6bteqM9gQXZ1BIWOgM8xEwMrUGoyL8nW13+O+OOgNX3YhuDN1GDgg1NzdTlmm3j+9sHy7uBZ12r+z9lXnZQ==", + "dev": true, "dependencies": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/are-we-there-yet/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "readable-stream": "^2.0.0 || ^1.1.13" } }, "node_modules/arg": { @@ -3825,7 +4336,7 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "node_modules/arraybuffer.slice": { "version": "0.0.7", @@ -3835,15 +4346,7 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "node_modules/asn1.js": { "version": "5.4.1", @@ -3857,14 +4360,6 @@ "safer-buffer": "^2.1.0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -3886,11 +4381,6 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -3982,9 +4472,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.62.2", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.62.2.tgz", - "integrity": "sha512-ynyoEFQckICFJzbUd89pWjol3GGbxRF05E8BCPEyy++vLHJZdqaJxRL4REl4lrdznnkb1kvxtBSGg4cOkR4o3w==", + "version": "2.64.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.64.0.tgz", + "integrity": "sha512-IrgL7thb6TeOyHgyR/qKWTdA9FBb9lv7Z9QPDzCNJlkKI+0ANjYHy3RYV8Gd+1+kc6l8DG9Z1elij40YCr/Ptg==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -3998,16 +4488,16 @@ ], "dev": true, "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.49", + "@aws-cdk/asset-awscli-v1": "^2.2.52", "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.38", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.42", "@balena/dockerignore": "^1.0.2", "case": "1.6.3", "fs-extra": "^9.1.0", "ignore": "^5.2.4", "jsonschema": "^1.4.1", "minimatch": "^3.1.2", - "punycode": "^2.2.0", + "punycode": "^2.3.0", "semver": "^7.3.8", "yaml": "1.10.2" }, @@ -4140,7 +4630,7 @@ } }, "node_modules/aws-cdk-lib/node_modules/punycode": { - "version": "2.2.0", + "version": "2.3.0", "dev": true, "inBundle": true, "license": "MIT", @@ -4203,6 +4693,72 @@ "tar": "^6.1.11" } }, + "node_modules/aws-crt/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-crt/node_modules/minipass": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", + "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-crt/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aws-crt/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-crt/node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-crt/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/aws-iot-device-sdk": { "version": "2.2.12", "resolved": "https://registry.npmjs.org/aws-iot-device-sdk/-/aws-iot-device-sdk-2.2.12.tgz", @@ -4309,26 +4865,6 @@ "node": ">= 6" } }, - "node_modules/aws-iot-device-sdk/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/aws-iot-device-sdk/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -4389,19 +4925,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, "node_modules/axios": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", @@ -4417,9 +4940,9 @@ "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "node_modules/base64-arraybuffer": { "version": "0.1.4", @@ -4465,14 +4988,6 @@ "node": ">=6.0.0" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -4553,26 +5068,6 @@ "node": ">= 6" } }, - "node_modules/bl/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/bl/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -4621,6 +5116,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -4648,76 +5151,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -4831,12 +5271,12 @@ "node_modules/builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==" + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" }, "node_modules/bulma": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.8.2.tgz", - "integrity": "sha512-vMM/ijYSxX+Sm+nD7Lmc1UgWDy2JcL2nTKqwgEqXuOMU+IGALbXd5MLt/BcjBAPLIx36TtzhzBcSnOP974gcqA==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.8.1.tgz", + "integrity": "sha512-Afi2zv4DKmNSYfmx55V+Mtnt8+WfR8Rs65kWArmzEuWP7vNr7dSAEDI+ORZlgOR1gueNZwpKaPdUi4ZiTNwgPA==" }, "node_modules/bulma-accordion": { "version": "2.0.1", @@ -4877,9 +5317,9 @@ "integrity": "sha512-fD50xz49zPVAfsRNcwBR7rd1lgNdKrcsIXAfVMwMH9A6iDhauOTkiEJOxXj4xZuW/CI6JpV+fCgj5uIuN1lP3Q==" }, "node_modules/bulma-switch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.4.tgz", - "integrity": "sha512-kMu4H0Pr0VjvfsnT6viRDCgptUq0Rvy7y7PX6q+IHg1xUynsjszPjhAdal5ysAlCG5HNO+5YXxeiu92qYGQolw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.0.tgz", + "integrity": "sha512-myD38zeUfjmdduq+pXabhJEe3x2hQP48l/OI+Y0fO3HdDynZUY/VJygucvEAJKRjr4HxD5DnEm4yx+oDOBXpAA==" }, "node_modules/bulma-tagsinput": { "version": "2.0.0", @@ -4912,33 +5352,43 @@ } }, "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", + "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", + "chownr": "^1.1.2", "fs-minipass": "^2.0.0", "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", + "lru-cache": "^5.1.1", "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", - "p-map": "^4.0.0", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", + "rimraf": "^2.7.1", + "ssri": "^8.0.0", + "tar": "^6.0.1", "unique-filename": "^1.1.1" }, "engines": { "node": ">= 10" } }, + "node_modules/cacache/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -4957,17 +5407,14 @@ } }, "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cacheable-request/node_modules/lowercase-keys": { @@ -5008,9 +5455,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001451", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", - "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", + "version": "1.0.30001452", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001452.tgz", + "integrity": "sha512-Lkp0vFjMkBB3GTpLR8zk4NwW5EdRdnitwYJHDOOKIU85x4ckYCPQ+9WlVvSVClHxVReefkUMtWZH2l9KGlD51w==", "dev": true, "funding": [ { @@ -5023,11 +5470,6 @@ } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, "node_modules/cdk-assets": { "version": "2.62.2", "resolved": "https://registry.npmjs.org/cdk-assets/-/cdk-assets-2.62.2.tgz", @@ -5900,29 +6342,13 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { "node": ">=8" } @@ -5964,12 +6390,9 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/ci-info": { "version": "2.0.0", @@ -5979,7 +6402,7 @@ "node_modules/cint": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz", - "integrity": "sha512-gyWqJHXgDFPNx7PEyFJotutav+al92TTC3dWlMFyTETlOyKBQMZb7Cetqmj3GlrnSILHwSJRwf4mIGzc7C5lXw==" + "integrity": "sha1-cDhrG0jidz0NYxZqVa/5TvRFahI=" }, "node_modules/clean-stack": { "version": "2.2.0", @@ -5992,7 +6415,7 @@ "node_modules/cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", "dependencies": { "exit": "0.1.2", "glob": "^7.1.1" @@ -6002,14 +6425,11 @@ } }, "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-cursor": { @@ -6037,9 +6457,9 @@ } }, "node_modules/cli-table": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", - "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", "dependencies": { "colors": "1.0.3" }, @@ -6063,62 +6483,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", + "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" } }, "node_modules/cliui/node_modules/ansi-regex": { @@ -6130,29 +6503,6 @@ "node": ">=8" } }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6168,26 +6518,23 @@ "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "engines": { "node": ">=0.8" } }, "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dependencies": { "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cls-bluebird": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", - "integrity": "sha512-XVb0RPmHQyy35Tz9z34gvtUcBKUK8A/1xkGCyeFc9B0C7Zr5SysgFaswRVdwI5NEMcO+3JKlIDGIOgERSn9NdA==", + "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", "dependencies": { "is-bluebird": "^1.0.2", "shimmer": "^1.1.0" @@ -6223,16 +6570,6 @@ "node": ">= 10.0.0" } }, - "node_modules/cmake-js/node_modules/are-we-there-yet": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", - "integrity": "sha512-Zfw6bteqM9gQXZ1BIWOgM8xEwMrUGoyL8nW13+O+OOgNX3YhuDN1GDgg1NzdTlmm3j+9sHy7uBZ12r+z9lXnZQ==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.0 || ^1.1.13" - } - }, "node_modules/cmake-js/node_modules/axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -6251,12 +6588,6 @@ "node": ">=0.10.0" } }, - "node_modules/cmake-js/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "node_modules/cmake-js/node_modules/cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -6305,17 +6636,16 @@ "minipass": "^2.6.0" } }, - "node_modules/cmake-js/node_modules/gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", + "node_modules/cmake-js/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "dependencies": { - "ansi": "^0.3.0", - "has-unicode": "^2.0.0", - "lodash.pad": "^4.1.0", - "lodash.padend": "^4.1.0", - "lodash.padstart": "^4.1.0" + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/cmake-js/node_modules/jsonfile": { @@ -6327,15 +6657,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/cmake-js/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/cmake-js/node_modules/minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", @@ -6373,36 +6694,28 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/cmake-js/node_modules/npmlog": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", - "integrity": "sha512-1J5KqSRvESP6XbjPaXt2H6qDzgizLTM7x0y1cXIjP2PpvdCqyNC7TO3cPRKsuYlElbi/DwkzRRdG2zpmE0IktQ==", + "node_modules/cmake-js/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "dependencies": { - "ansi": "~0.3.0", - "are-we-there-yet": "~1.0.0", - "gauge": "~1.2.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/cmake-js/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/cmake-js/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/cmake-js/node_modules/tar": { "version": "4.4.19", @@ -6462,12 +6775,6 @@ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, - "node_modules/cmake-js/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/cmake-js/node_modules/yargs": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", @@ -6499,6 +6806,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6528,30 +6836,11 @@ "node_modules/colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "engines": { "node": ">=0.1.90" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/commist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", @@ -6562,24 +6851,15 @@ "minimist": "^1.1.0" } }, - "node_modules/commist/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" }, "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "node_modules/component-inherit": { "version": "0.0.3", @@ -6615,26 +6895,6 @@ "node": ">= 6" } }, - "node_modules/compress-commons/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/compress-commons/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -6680,10 +6940,15 @@ "node": ">= 0.8" } }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/concat-stream": { "version": "2.0.0", @@ -6714,26 +6979,6 @@ "node": ">= 6" } }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -6744,15 +6989,15 @@ } }, "node_modules/concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.1.tgz", + "integrity": "sha512-7cab/QyqipqghrVr9qZmoWbidu0nHsmxrpNqQ7r/67vfl1DWJElexehQnTH1p+87tDkihaAjM79xTZyBQh7HLw==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "date-fns": "^2.29.1", + "date-fns": "^2.16.1", "lodash": "^4.17.21", - "rxjs": "^7.0.0", + "rxjs": "^6.6.3", "shell-quote": "^1.7.3", "spawn-command": "^0.0.2-1", "supports-color": "^8.1.0", @@ -6760,14 +7005,53 @@ "yargs": "^17.3.1" }, "bin": { - "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" }, "engines": { "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/conf": { @@ -6794,22 +7078,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conf/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/conf/node_modules/dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -6825,27 +7093,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conf/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/conf/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -6865,20 +7112,15 @@ "node_modules/console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dependencies": { "date-now": "^0.1.4" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, "node_modules/constructs": { - "version": "10.1.156", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.156.tgz", - "integrity": "sha512-BTZ3Kyt++/YFlph/ioqbDhzSKVMqHRHvc99FxU4b705ZP6s2IkDxMLCMinC70USMTJWFbO1p02Egux7sk4q07A==", + "version": "10.1.250", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.250.tgz", + "integrity": "sha512-eF71tcgvo6jMO/NlPFWuUpJ0VrpA9kvRvusIFLPjfV6h75epVQPwyhPoVlS0hHFQsujQJNXMLltaeRZSGhILcw==", "dev": true, "engines": { "node": ">= 14.17.0" @@ -6895,29 +7137,10 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "engines": { "node": ">= 0.6" } @@ -6937,14 +7160,6 @@ "node": ">= 4" } }, - "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cookie-parser": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", @@ -6957,6 +7172,14 @@ "node": ">= 0.8.0" } }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-session": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.0.0.tgz", @@ -6984,29 +7207,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/cookie-session/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/cookies": { "version": "0.8.0", @@ -7020,15 +7224,47 @@ "node": ">= 0.8" } }, + "node_modules/cookies/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cool-checkboxes-for-bulma.io": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/cool-checkboxes-for-bulma.io/-/cool-checkboxes-for-bulma.io-1.1.0.tgz", "integrity": "sha512-RDEXOeS9COGTbQjlwRQzPRwOA8ycP4azc/GDVF5qYSOs4tYk6dc9SWNOj7Bb/NvhVUsb+H95pNtGgOBwCENBQg==" }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "node_modules/crc-32": { "version": "1.2.2", @@ -7069,26 +7305,6 @@ "node": ">= 6" } }, - "node_modules/crc32-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/crc32-stream/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7153,21 +7369,10 @@ "node": ">=4" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", "dev": true, "engines": { "node": ">=0.11" @@ -7180,7 +7385,7 @@ "node_modules/date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==" + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, "node_modules/debounce-fn": { "version": "4.0.0", @@ -7205,6 +7410,14 @@ "ms": "2.0.0" } }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "engines": { + "node": "*" + } + }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -7217,7 +7430,7 @@ "node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dependencies": { "mimic-response": "^1.0.0" }, @@ -7260,18 +7473,14 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "object-keys": "^1.0.12" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/defined": { @@ -7283,18 +7492,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "node_modules/dendriform-immer-patch-optimiser": { "version": "2.1.3", @@ -7317,11 +7519,11 @@ } }, "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/destroy": { @@ -7350,13 +7552,13 @@ "node": ">=0.8.0" } }, - "node_modules/detective/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" } }, "node_modules/didyoumean": { @@ -7390,23 +7592,14 @@ } }, "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" }, "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" }, "node_modules/domelementtype": { "version": "1.3.1", @@ -7416,7 +7609,7 @@ "node_modules/domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", "dependencies": { "domelementtype": "1" } @@ -7424,16 +7617,16 @@ "node_modules/domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dependencies": { "dom-serializer": "0", "domelementtype": "1" } }, "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", "dependencies": { "is-obj": "^2.0.0" }, @@ -7442,17 +7635,17 @@ } }, "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/dottie": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.3.tgz", - "integrity": "sha512-4liA0PuRkZWQFQjwBypdxPfZaRWiv5tkhMXY2hzsa2pNf5s7U3m9cwUchfNKe8wZQxdGPQQzO6Rm2uGe0rvohQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, "node_modules/duplexer2": { "version": "0.1.4", @@ -7484,6 +7677,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -7494,9 +7693,9 @@ } }, "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "node_modules/duplexify": { "version": "3.7.1", @@ -7531,6 +7730,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/duplexify/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -7540,15 +7745,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -7570,9 +7766,9 @@ "dev": true }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -7583,22 +7779,11 @@ } }, "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "iconv-lite": "~0.4.13" } }, "node_modules/end-of-stream": { @@ -7643,6 +7828,11 @@ "yeast": "0.1.2" } }, + "node_modules/engine.io-client/node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, "node_modules/engine.io-client/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -7663,6 +7853,14 @@ "has-binary2": "~1.0.2" } }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/engine.io/node_modules/debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -7680,20 +7878,21 @@ "node_modules/entities": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, "engines": { "node": ">=6" } }, "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" }, "node_modules/esbuild": { "version": "0.17.3", @@ -7731,658 +7930,881 @@ "@esbuild/win32-x64": "0.17.3" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", + "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", + "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", + "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", + "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.8.0" + "node": ">=12" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", + "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", + "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "dev": true, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", + "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.4.x" + "node": ">=12" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", + "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", + "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.10.0" + "node": ">=12" } }, - "node_modules/express-handlebars": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.1.0.tgz", - "integrity": "sha512-7QlaXnSREMmN5P2o4gmpUZDfJlLtfBka9d6r7/ccXaU7rPp76odw9YYtwZYdIiha2JqwiaG6o2Wu6NZJQ0u7Fg==", - "dependencies": { - "glob": "^7.1.3", - "graceful-fs": "^4.1.2", - "handlebars": "^4.1.2", - "object.assign": "^4.1.0", - "promise": "^8.0.2" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", + "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10" + "node": ">=12" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", + "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", + "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6.0" + "node": ">=12" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-jwt": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/fast-jwt/-/fast-jwt-1.7.2.tgz", - "integrity": "sha512-OEInypGXJhtURzq9GbFM5KaALUu9+4IV3kJEbWPuqOBN5JBe7A51Tx0CaQYHGC9GNfZnr5npA0lCIMaWiZmz/A==", - "dev": true, - "dependencies": { - "asn1.js": "^5.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "mnemonist": "^0.39.0" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", + "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14 <20" - } - }, - "node_modules/fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", - "dev": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" + "node": ">=12" } }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", + "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", + "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", + "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", + "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" ], "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=12" } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", + "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", + "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", + "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.12" + "node": ">=12" } }, - "node_modules/form-urlencoded": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/form-urlencoded/-/form-urlencoded-2.0.9.tgz", - "integrity": "sha512-fWUzNiOnYa126vFAT6TFXd1mhJrvD8IqmQ9ilZPjkLYQfaRreBr5fIUoOpPlWtqaAG64nzoE7u5zSetifab9IA==" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", + "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "node": ">=6" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "engines": { - "node": ">=10" + "node": ">=0.8.0" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.6" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, "engines": { - "node": ">=0.6" + "node": ">=0.4.x" } }, - "node_modules/fstream/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/fstream/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { - "minimist": "^1.2.6" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, + "node_modules/express-handlebars": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.1.0.tgz", + "integrity": "sha512-7QlaXnSREMmN5P2o4gmpUZDfJlLtfBka9d6r7/ccXaU7rPp76odw9YYtwZYdIiha2JqwiaG6o2Wu6NZJQ0u7Fg==", "dependencies": { - "glob": "^7.1.3" + "glob": "^7.1.3", + "graceful-fs": "^4.1.2", + "handlebars": "^4.1.2", + "object.assign": "^4.1.0", + "promise": "^8.0.2" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=0.10" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dependencies": { - "is-property": "^1.0.2" + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/fast-jwt": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/fast-jwt/-/fast-jwt-1.7.2.tgz", + "integrity": "sha512-OEInypGXJhtURzq9GbFM5KaALUu9+4IV3kJEbWPuqOBN5JBe7A51Tx0CaQYHGC9GNfZnr5npA0lCIMaWiZmz/A==", "dev": true, + "dependencies": { + "asn1.js": "^5.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "mnemonist": "^0.39.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=14 <20" } }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "node_modules/fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } }, - "node_modules/get-port": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", - "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { - "pump": "^3.0.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "assert-plus": "^1.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": "*" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/glob-all": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.3.1.tgz", - "integrity": "sha512-Y+ESjdI7ZgMwfzanHZYQ87C59jOO0i+Hd+QYtVt9PhLi6d8wlOpzQnfBxWUlaTuAoR3TkybLqqbIoWveU4Ji7Q==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "glob": "^7.2.3", - "yargs": "^15.3.1" - }, - "bin": { - "glob-all": "bin/glob-all" + "is-callable": "^1.1.3" } }, - "node_modules/glob-all/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/form-urlencoded": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/form-urlencoded/-/form-urlencoded-2.0.9.tgz", + "integrity": "sha512-fWUzNiOnYa126vFAT6TFXd1mhJrvD8IqmQ9ilZPjkLYQfaRreBr5fIUoOpPlWtqaAG64nzoE7u5zSetifab9IA==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/glob-all/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" } }, - "node_modules/glob-all/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/glob-all/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/glob-all/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dependencies": { - "ansi-regex": "^5.0.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/glob-all/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", + "dev": true, + "dependencies": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", + "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-all": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.3.1.tgz", + "integrity": "sha512-Y+ESjdI7ZgMwfzanHZYQ87C59jOO0i+Hd+QYtVt9PhLi6d8wlOpzQnfBxWUlaTuAoR3TkybLqqbIoWveU4Ji7Q==", + "dev": true, + "dependencies": { + "glob": "^7.2.3", + "yargs": "^15.3.1" + }, + "bin": { + "glob-all": "bin/glob-all" + } + }, + "node_modules/glob-all/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/glob-all/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8445,25 +8867,28 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", "dependencies": { - "ini": "1.3.7" + "ini": "^1.3.5" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs/node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -8507,9 +8932,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "node_modules/graphql": { "version": "16.6.0", @@ -8548,27 +8973,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -8583,7 +8987,7 @@ "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -8617,17 +9021,6 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -8657,7 +9050,8 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "node_modules/has-yarn": { "version": "2.1.0", @@ -8691,39 +9085,19 @@ "node": ">= 6" } }, - "node_modules/help-me/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/help-me/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/help-me/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8731,10 +9105,26 @@ "node": ">=10" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", "dependencies": { "domelementtype": "1", "domhandler": "2.3", @@ -8744,9 +9134,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "node_modules/http-errors": { "version": "2.0.0", @@ -8763,6 +9153,14 @@ "node": ">= 0.8" } }, + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -8777,19 +9175,12 @@ } }, "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "^2.1.1" } }, "node_modules/http-proxy-agent/node_modules/ms": { @@ -8797,24 +9188,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -8824,19 +9201,12 @@ } }, "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "^2.1.1" } }, "node_modules/https-proxy-agent/node_modules/ms": { @@ -8847,7 +9217,7 @@ "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "dependencies": { "ms": "^2.0.0" } @@ -8869,16 +9239,21 @@ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dependencies": { "minimatch": "^3.0.4" } @@ -8896,7 +9271,7 @@ "node_modules/import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", "engines": { "node": ">=4" } @@ -8904,7 +9279,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "engines": { "node": ">=0.8.19" } @@ -8930,7 +9305,7 @@ "node_modules/inflection": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", "engines": [ "node >= 0.4.0" ] @@ -8938,7 +9313,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9022,37 +9397,20 @@ "node": ">=8" } }, - "node_modules/ink/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ink/node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/ink/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/ink/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/ink/node_modules/strip-ansi": { @@ -9124,9 +9482,9 @@ } }, "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -9167,7 +9525,7 @@ "node_modules/is-bluebird": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", - "integrity": "sha512-PDRu1vVip5dGQg5tfn2qVCCyxbBYu5MhYUJwSfL/RoGBI97n1fxvilVazxzptZW0gcmsMH17H4EVZZI5E/RSeA==", + "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=", "engines": { "node": ">=0.10.0" } @@ -9223,14 +9581,11 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dependencies": { - "number-is-nan": "^1.0.0" - }, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/is-generator-function": { @@ -9296,7 +9651,7 @@ "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" }, "node_modules/is-npm": { "version": "4.0.0", @@ -9324,9 +9679,9 @@ } }, "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", "engines": { "node": ">=8" } @@ -9345,12 +9700,12 @@ "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "engines": { "node": ">=0.10.0" } @@ -9377,7 +9732,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "node_modules/is-unicode-supported": { "version": "1.3.0", @@ -9399,17 +9754,17 @@ "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "engines": { "node": ">=0.10.0" } @@ -9432,15 +9787,10 @@ "ws": "*" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=" }, "node_modules/jmespath": { "version": "0.16.0", @@ -9477,9 +9827,9 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9488,11 +9838,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9506,9 +9851,9 @@ } }, "node_modules/jshint": { - "version": "2.13.6", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", - "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", + "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", "dependencies": { "cli": "~1.0.0", "console-browserify": "1.1.x", @@ -9522,44 +9867,29 @@ "jshint": "bin/jshint" } }, - "node_modules/jshint/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz", + "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==" }, "node_modules/json-parse-helpfulerror": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "dependencies": { "jju": "^1.1.0" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/json-schema-typed": { "version": "7.0.3", @@ -9567,11 +9897,6 @@ "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9586,7 +9911,7 @@ "node_modules/jsonapi-datastore": { "version": "0.4.0-beta", "resolved": "https://registry.npmjs.org/jsonapi-datastore/-/jsonapi-datastore-0.4.0-beta.tgz", - "integrity": "sha512-RkI3oL1Ww6HefMEVZXdBLmdVY/s4P5FlRzccyXb7QmsuyTQqYDXgI8QN6Py8QJRZF05f4b4gecdeBz/oTOgRVA==" + "integrity": "sha1-tJn86STUXivDxheGgVIAY+I2HxA=" }, "node_modules/jsonfile": { "version": "6.1.0", @@ -9603,25 +9928,11 @@ "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "engines": [ "node >= 0.2.0" ] }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/jszip": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.7.0.tgz", @@ -9702,6 +10013,22 @@ } } }, + "node_modules/kysely-codegen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/kysely-codegen/node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -9711,15 +10038,6 @@ "node": ">=12" } }, - "node_modules/kysely-codegen/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/kysely-data-api": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/kysely-data-api/-/kysely-data-api-0.1.4.tgz", @@ -9774,6 +10092,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -9808,7 +10132,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", - "deprecated": "This module is not used anymore. npm config is parsed by npm itself and by @npmcli/config", "dependencies": { "figgy-pudding": "^3.5.1", "find-up": "^3.0.0", @@ -9852,7 +10175,7 @@ "node_modules/libnpmconfig/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "engines": { "node": ">=4" } @@ -9996,20 +10319,17 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "dependencies": { "semver": "^6.0.0" }, @@ -10028,32 +10348,6 @@ "semver": "bin/semver.js" } }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -10068,7 +10362,7 @@ "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "engines": { "node": ">= 0.6" } @@ -10097,7 +10391,7 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "node_modules/merge2": { "version": "1.4.1", @@ -10111,7 +10405,7 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "engines": { "node": ">= 0.6" } @@ -10183,9 +10477,9 @@ "dev": true }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10194,14 +10488,17 @@ } }, "node_modules/minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", "dependencies": { "yallist": "^4.0.0" }, @@ -10221,11 +10518,12 @@ } }, "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", + "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", "dependencies": { "minipass": "^3.1.0", + "minipass-pipeline": "^1.2.2", "minipass-sized": "^1.0.3", "minizlib": "^2.0.0" }, @@ -10257,9 +10555,9 @@ } }, "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", "dependencies": { "minipass": "^3.0.0" }, @@ -10278,10 +10576,15 @@ "node": ">=8" } }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -10290,8 +10593,13 @@ "node": ">= 8" } }, - "node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { @@ -10319,9 +10627,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.40", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.40.tgz", - "integrity": "sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg==", + "version": "0.5.38", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", + "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", "dependencies": { "moment": ">= 2.9.0" }, @@ -10329,6 +10637,30 @@ "node": "*" } }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mqtt": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz", @@ -10425,13 +10757,16 @@ "stream-shift": "^1.0.0" } }, - "node_modules/mqtt/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/mqtt/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/mqtt/node_modules/ms": { @@ -10454,26 +10789,6 @@ "node": ">= 6" } }, - "node_modules/mqtt/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/mqtt/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -10504,10 +10819,16 @@ } } }, + "node_modules/mqtt/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/mute-stream": { "version": "0.0.8", @@ -10544,25 +10865,47 @@ "node": ">=0.10.0" } }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mysql2/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/named-placeholders": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", - "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", "dependencies": { - "lru-cache": "^7.14.1" + "lru-cache": "^4.1.3" }, "engines": { - "node": ">=12.0.0" + "node": ">=6.0.0" } }, "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", - "engines": { - "node": ">=12" + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, + "node_modules/named-placeholders/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -10605,7 +10948,7 @@ "node_modules/node-alias": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/node-alias/-/node-alias-1.0.4.tgz", - "integrity": "sha512-9uG48bfkbG9BlKe8QrlxuiPNaKl3wpQn6tJbrojVqgkJuWIO28ifRKrRDrrK+ee72rJ25EaE//PhSIo8E29lLw==", + "integrity": "sha1-HxuRa1a56iQcATX5fO1pQPVW8pI=", "dependencies": { "chalk": "^1.1.1", "lodash": "^4.2.0" @@ -10617,7 +10960,7 @@ "node_modules/node-alias/node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "engines": { "node": ">=0.10.0" } @@ -10625,7 +10968,7 @@ "node_modules/node-alias/node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -10640,7 +10983,7 @@ "node_modules/node-alias/node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "engines": { "node": ">=0.8.0" } @@ -10665,43 +11008,6 @@ "is-stream": "^1.0.1" } }, - "node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", @@ -10748,18 +11054,39 @@ "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, "engines": { "node": ">=4" } }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/nodemon/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10773,9 +11100,10 @@ } }, "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, "dependencies": { "abbrev": "1" }, @@ -10783,7 +11111,7 @@ "nopt": "bin/nopt.js" }, "engines": { - "node": ">=6" + "node": "*" } }, "node_modules/normalize-path": { @@ -10813,9 +11141,9 @@ } }, "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dependencies": { "npm-normalize-package-bin": "^1.0.1" } @@ -10855,41 +11183,12 @@ "node": ">=8" } }, - "node_modules/npm-check-updates/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-check-updates/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-check-updates/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/npm-check-updates/node_modules/commander": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", + "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", "engines": { - "node": ">=8" + "node": ">= 6" } }, "node_modules/npm-install-checks": { @@ -10903,56 +11202,28 @@ "node": ">=10" } }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" }, "node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", "validate-npm-package-name": "^3.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.1.tgz", + "integrity": "sha512-95TSDvGwujIhqfSpIiRRLodEF+y6mJMopuZdahoGzqtRDFZXGav46S0p6ngeWaiAkb5R72w6eVARhzej0HvZeQ==", "dependencies": { "glob": "^7.1.6", "ignore-walk": "^3.0.3", @@ -10967,36 +11238,23 @@ } }, "node_modules/npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", "dependencies": { "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" } }, "node_modules/npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.1.5.tgz", + "integrity": "sha512-yZPNoJK9clx1jhSXU54kU6Aj1SV2p7mXUs1W/6OjQvek3wb1RrjDCrt4iY1+VX9eBQvvSGEpzNmYkRUaTL8rqg==", "dependencies": { - "make-fetch-happen": "^9.0.1", + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", "minipass": "^3.1.3", "minipass-fetch": "^1.3.0", "minipass-json-stream": "^1.0.1", @@ -11007,37 +11265,224 @@ "node": ">=10" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/number-allocator": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", - "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", - "dev": true, + "node_modules/npm-registry-fetch/node_modules/agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", + "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", "dependencies": { - "debug": "^4.3.1", - "js-sdsl": "4.3.0" + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" } }, - "node_modules/number-allocator/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "node_modules/npm-registry-fetch/node_modules/cacache": { + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz", + "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==", "dependencies": { - "ms": "2.1.2" + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" }, "engines": { - "node": ">=6.0" + "node": ">= 10" + } + }, + "node_modules/npm-registry-fetch/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm-registry-fetch/node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", + "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", + "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-registry-fetch/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/npm-registry-fetch/node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-registry-fetch/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-registry-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha512-1J5KqSRvESP6XbjPaXt2H6qDzgizLTM7x0y1cXIjP2PpvdCqyNC7TO3cPRKsuYlElbi/DwkzRRdG2zpmE0IktQ==", + "dev": true, + "dependencies": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "dev": true, + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, + "node_modules/number-allocator/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { @@ -11055,6 +11500,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11062,28 +11508,21 @@ "node_modules/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", "dev": true, "engines": { "node": ">= 6" @@ -11106,20 +11545,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/obliterator": { @@ -11159,7 +11595,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dependencies": { "wrappy": "1" } @@ -11203,15 +11639,24 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/openid-client/node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=10" } }, + "node_modules/openid-client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -11221,6 +11666,11 @@ "wordwrap": "~0.0.2" } }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==" + }, "node_modules/ora": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", @@ -11368,26 +11818,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ora/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -11502,29 +11932,33 @@ } }, "node_modules/pacote": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.4.tgz", + "integrity": "sha512-eUGJvSSpWFZKn3z8gig/HgnBmUl6gIWByIIaHzSyEr3tOWX0w8tFEADXtpu8HGv5E0ShCeTP6enRq8iHKCHSvw==", + "dependencies": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.1.0", + "cacache": "^15.0.0", + "chownr": "^1.1.4", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.3", + "lru-cache": "^5.1.1", + "minipass": "^3.0.1", + "minipass-fetch": "^1.2.1", "mkdirp": "^1.0.3", "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", + "npm-packlist": "^2.1.0", "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" + "npm-registry-fetch": "^8.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "read-package-json-fast": "^1.1.3", + "rimraf": "^2.7.1", + "semver": "^7.1.3", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "which": "^2.0.2" }, "bin": { "pacote": "lib/bin.js" @@ -11583,7 +12017,7 @@ "node_modules/passport-oauth": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz", - "integrity": "sha512-4IZNVsZbN1dkBzmEbBqUxDG8oFOIK81jqdksE3HEb/vI3ib3FMjbiZZ6MTtooyYZzmKu0BfovjvT1pdGgIq+4Q==", + "integrity": "sha1-kK/2M4dUDwIImvKM2tOep/gNd98=", "dependencies": { "passport-oauth1": "1.x.x", "passport-oauth2": "1.x.x" @@ -11593,9 +12027,9 @@ } }, "node_modules/passport-oauth1": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.2.0.tgz", - "integrity": "sha512-Sv2YWodC6jN12M/OXwmR4BIXeeIHjjbwYTQw4kS6tHK4zYzSEpxBgSJJnknBjICA5cj0ju3FSnG1XmHgIhYnLg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.1.0.tgz", + "integrity": "sha1-p96YiiEfnPRoc3cTDqdN8ycwyRg=", "dependencies": { "oauth": "0.9.x", "passport-strategy": "1.x.x", @@ -11603,10 +12037,6 @@ }, "engines": { "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" } }, "node_modules/passport-oauth2": { @@ -11631,7 +12061,7 @@ "node_modules/passport-reddit": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/passport-reddit/-/passport-reddit-0.2.4.tgz", - "integrity": "sha512-5Dfkf/WxLMF61aS/NhsWNGimrasl1lDZBU7jFGIIWnLV7dhWBUYOJCl/N4nOkBeZG5EbPeymrGfqet94DJ2GfQ==", + "integrity": "sha1-TlgF2Rmo8o+Awjj32i2So4BnrMU=", "dependencies": { "passport-oauth": "1.x", "pkginfo": "0.3.x" @@ -11643,7 +12073,7 @@ "node_modules/passport-strategy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", "engines": { "node": ">= 0.4.0" } @@ -11668,7 +12098,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "engines": { "node": ">=0.10.0" } @@ -11690,7 +12120,7 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "node_modules/patreon": { "version": "0.4.1", @@ -11709,12 +12139,7 @@ "node_modules/pause": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, "node_modules/picocolors": { "version": "1.0.0", @@ -11804,7 +12229,7 @@ "node_modules/pkginfo": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", "engines": { "node": ">= 0.4.0" } @@ -11939,7 +12364,7 @@ "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "engines": { "node": ">=4" } @@ -12030,12 +12455,12 @@ } }, "node_modules/prisma": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.10.1.tgz", - "integrity": "sha512-0jDxgg+DruB1kHVNlcspXQB9au62IFfVg9drkhzXudszHNUAQn0lVuu+T8np0uC2z1nKD5S3qPeCyR8u5YFLnA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.5.0.tgz", + "integrity": "sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew==", "hasInstallScript": true, "dependencies": { - "@prisma/engines": "4.10.1" + "@prisma/engines": "4.5.0" }, "bin": { "prisma": "build/index.js", @@ -12048,7 +12473,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/progress": { "version": "2.0.3", @@ -12059,9 +12485,9 @@ } }, "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "dependencies": { "asap": "~2.0.6" } @@ -12069,18 +12495,18 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "err-code": "^1.0.0", + "retry": "^0.10.0" }, "engines": { - "node": ">=10" + "node": ">=0.12" } }, "node_modules/promptly": { @@ -12093,12 +12519,12 @@ } }, "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dependencies": { "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "sisteransi": "^1.0.4" }, "engines": { "node": ">= 6" @@ -12116,10 +12542,10 @@ "node": ">= 0.10" } }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "node_modules/pstree.remy": { "version": "1.1.8", @@ -12140,14 +12566,15 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, "engines": { "node": ">=6" } }, "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", "dependencies": { "escape-goat": "^2.0.0" }, @@ -12230,9 +12657,9 @@ } }, "node_modules/rate-limiter-flexible": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.1.tgz", - "integrity": "sha512-dgH4T44TzKVO9CLArNto62hJOwlWJMLUjVVr/ii0uUzZXEXthDNr7/yefW5z/1vvHAfycc1tnuiYyNJ8CTRB3g==" + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.1.10.tgz", + "integrity": "sha512-Pa+8TPD4xYaiCUB5K4a/+j2FHDUe4HP1g49JmKEmkOkhqPaeVqxJsZuuVaza/svSCOT+V73vtsyBiSFK/e1yXw==" }, "node_modules/raw-body": { "version": "2.5.1", @@ -12274,19 +12701,12 @@ } }, "node_modules/rc-config-loader/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "^2.1.1" } }, "node_modules/rc-config-loader/node_modules/ms": { @@ -12294,18 +12714,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/rc/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "engines": { "node": ">=0.10.0" } @@ -12350,16 +12762,6 @@ "react": "^17.0.2" } }, - "node_modules/react-reconciler/node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -12382,21 +12784,18 @@ } }, "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", + "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", "dependencies": { - "json-parse-even-better-errors": "^2.3.0", + "json-parse-even-better-errors": "^2.0.1", "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" } }, "node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -12434,6 +12833,17 @@ "node": ">=10" } }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -12447,11 +12857,11 @@ } }, "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", "dependencies": { - "rc": "1.2.8" + "rc": "^1.2.8" }, "engines": { "node": ">=6.0.0" @@ -12480,49 +12890,10 @@ "integrity": "sha512-ywn4Tv2cPBj6hk0TEYMHusWVXu72yJNCaWUdMK7kc7x/PjQPBSvtMbmBWP4PQH791kpl3rPBe3ZVkJyPj3c+0g==", "dev": true }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "engines": { "node": ">=0.10.0" @@ -12566,7 +12937,7 @@ "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dependencies": { "lowercase-keys": "^1.0.0" } @@ -12585,11 +12956,11 @@ } }, "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", "engines": { - "node": ">= 4" + "node": "*" } }, "node_modules/retry-as-promised": { @@ -12617,17 +12988,14 @@ "dev": true }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { @@ -12669,19 +13037,44 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "dependencies": { - "tslib": "^2.1.0" + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -12694,13 +13087,28 @@ "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", "dev": true }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-diff": { @@ -12727,6 +13135,22 @@ "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -12750,6 +13174,14 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -12758,7 +13190,7 @@ "node_modules/seq-queue": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { "version": "5.22.5", @@ -12786,28 +13218,13 @@ "node": ">=6.0.0" } }, - "node_modules/sequelize-pool": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", - "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==", - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/sequelize/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "^2.1.1" } }, "node_modules/sequelize/node_modules/ms": { @@ -12823,18 +13240,18 @@ "semver": "bin/semver.js" } }, - "node_modules/sequelize/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/sequelize/node_modules/sequelize-pool": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", + "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==", + "engines": { + "node": ">= 6.0.0" } }, "node_modules/serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", + "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", "dependencies": { "etag": "~1.8.1", "fresh": "0.5.2", @@ -12873,7 +13290,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/setimmediate": { "version": "1.0.5", @@ -12908,13 +13326,10 @@ } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true }, "node_modules/shimmer": { "version": "1.2.1", @@ -12935,14 +13350,14 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", "dev": true, "dependencies": { "semver": "~7.0.0" @@ -12989,9 +13404,9 @@ } }, "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -13033,6 +13448,11 @@ "to-array": "0.1.4" } }, + "node_modules/socket.io-client/node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, "node_modules/socket.io-client/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -13069,11 +13489,6 @@ "node": ">=10.0.0" } }, - "node_modules/socket.io-parser/node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==" - }, "node_modules/socket.io-parser/node_modules/debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -13086,7 +13501,7 @@ "node_modules/socket.io-parser/node_modules/isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" }, "node_modules/socket.io-parser/node_modules/ms": { "version": "2.1.3", @@ -13108,45 +13523,38 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" }, "engines": { - "node": ">= 10" + "node": ">= 6" } }, "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "^2.1.1" } }, "node_modules/socks-proxy-agent/node_modules/ms": { @@ -13174,13 +13582,13 @@ "node_modules/spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", "dev": true }, "node_modules/spawn-please": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-0.3.0.tgz", - "integrity": "sha512-gf9GJwAWhW0gnQp0dGui+nhIVICx1lGM1Ox95HzfaDBOQTauqlvHFLpo4vtAB3E377SA0YMIyRCh1w0S6R5m2w==", + "integrity": "sha1-2zOOxM/2Orxp8dDgjO6euL69nRE=", "engines": { "node": ">=0.10.0" } @@ -13208,26 +13616,6 @@ "node": ">= 6" } }, - "node_modules/split2/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/split2/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13246,7 +13634,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "node_modules/sqlstring": { "version": "2.3.3", @@ -13256,30 +13644,6 @@ "node": ">= 0.6" } }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -13292,9 +13656,9 @@ } }, "node_modules/sst": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/sst/-/sst-2.0.16.tgz", - "integrity": "sha512-R0piWOSRrslHXFc9W5llV+3tKhRc3/ohWqkc8X0S6AX8BnJK5bE1sDeEw2MGgrfYu8qVR2M/dS5e3Y8isGC40Q==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/sst/-/sst-2.0.23.tgz", + "integrity": "sha512-m9HCXNMUVxIHqqb7WwoS/brkuHGJfNo7o+S4EZj61d+u5V5HO+f7sgOc0LqGEVTJRcf1IMc6NWgWsfaUNkWNlw==", "dev": true, "dependencies": { "@aws-cdk/aws-apigatewayv2-alpha": "^2.62.2-alpha.0", @@ -13304,8 +13668,10 @@ "@aws-cdk/cloudformation-diff": "2.62.2", "@aws-cdk/cx-api": "2.62.2", "@aws-cdk/region-info": "2.62.2", + "@aws-sdk/client-api-gateway": "3.208.0", "@aws-sdk/client-cloudformation": "3.208.0", "@aws-sdk/client-cloudfront": "3.208.0", + "@aws-sdk/client-iam": "3.208.0", "@aws-sdk/client-iot": "3.208.0", "@aws-sdk/client-iot-data-plane": "3.208.0", "@aws-sdk/client-lambda": "3.208.0", @@ -13377,356 +13743,235 @@ } } }, - "node_modules/sst/node_modules/@esbuild/android-arm": { + "node_modules/sst/node_modules/@esbuild/linux-x64": { "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.13.tgz", - "integrity": "sha512-JmtqThupn9Yf+FzANE+GG73ASUkssnPwOsndUElhp23685QzRK+MO1UompOlBaXV9D5FTuYcPnw7p4mCq2YbZQ==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.13.tgz", + "integrity": "sha512-S4wn2BimuhPcoArRtVrdHUKIymCCZcYAXQE47kUiX4yrUrEX2/ifn5eKNbZ5c1jJKUlh1gC2ESIN+iw3wQax3g==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/sst/node_modules/@esbuild/android-arm64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.13.tgz", - "integrity": "sha512-r4xetsd1ez1NF9/9R2f9Q6AlxqiZLwUqo7ICOcvEVwopVkXUcspIjEbJk0EVTgT6Cp5+ymzGPT6YNV0ievx4yA==", - "cpu": [ - "arm64" - ], + "node_modules/sst/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/sst/node_modules/@esbuild/android-x64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.13.tgz", - "integrity": "sha512-hKt1bFht/Vtp0xJ0ZVzFMnPy1y1ycmM3KNnp3zsyZfQmw7nhs2WLO4vxdR5YG+6RsHKCb2zbZ3VwlC0Tij0qyA==", - "cpu": [ - "x64" + "node_modules/sst/node_modules/aws-cdk-lib": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.62.2.tgz", + "integrity": "sha512-ynyoEFQckICFJzbUd89pWjol3GGbxRF05E8BCPEyy++vLHJZdqaJxRL4REl4lrdznnkb1kvxtBSGg4cOkR4o3w==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "yaml" ], "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.49", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.38", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.2.0", + "semver": "^7.3.8", + "yaml": "1.10.2" + }, "engines": { - "node": ">=12" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" } }, - "node_modules/sst/node_modules/@esbuild/darwin-arm64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.13.tgz", - "integrity": "sha512-ogrVuNi2URocrr3Ps20f075EMm9V7IeenOi9FRj4qdbT6mQlwLuP4l90PW2iBrKERx0oRkcZprEUNsz/3xd7ww==", - "cpu": [ - "arm64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "inBundle": true, + "license": "Apache-2.0" }, - "node_modules/sst/node_modules/@esbuild/darwin-x64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.13.tgz", - "integrity": "sha512-Agajik9SBGiKD7FPXE+ExW6x3MgA/dUdpZnXa9y1tyfE4lKQx+eQiknSdrBnWPeqa9wL0AOvkhghmYhpVkyqkA==", - "cpu": [ - "x64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/at-least-node": { + "version": "1.0.0", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=12" + "node": ">= 4.0.0" } }, - "node_modules/sst/node_modules/@esbuild/freebsd-arm64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.13.tgz", - "integrity": "sha512-KxMO3/XihBcHM+xQUM6nQZO1SgQuOsd1DCnKF1a4SIf/i5VD45vrqN3k8ePgFrEbMi7m5JeGmvNqwJXinF0a4Q==", - "cpu": [ - "arm64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "inBundle": true, + "license": "MIT" + }, + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/sst/node_modules/@esbuild/freebsd-x64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.13.tgz", - "integrity": "sha512-Ez15oqV1vwvZ30cVLeBW14BsWq/fdWNQGMOxxqaSJVQVLqHhvgfQ7gxGDiN9tpJdeQhqJO+Q0r02/Tce5+USNg==", - "cpu": [ - "x64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/sst/node_modules/@esbuild/linux-arm": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.13.tgz", - "integrity": "sha512-18dLd2L3mda+iFj6sswyBMSh2UwniamD9M4DwPv8VM+9apRFlQ5IGKxBdumnTuOI4NvwwAernmUseWhYQ9k+rg==", - "cpu": [ - "arm" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/sst/node_modules/@esbuild/linux-arm64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.13.tgz", - "integrity": "sha512-qi5n7KwcGViyJeZeQnu8fB6dC3Mlm5PGaqSv2HhQDDx/MPvVfQGNMcv7zcBL4qk3FkuWhGVwXkjQ76x7R0PWlA==", - "cpu": [ - "arm64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.10", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "inBundle": true, + "license": "ISC" + }, + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 4" } }, - "node_modules/sst/node_modules/@esbuild/linux-ia32": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.13.tgz", - "integrity": "sha512-2489Xad9sr+6GD7nB913fUqpCsSwVwgskkQTq4Or2mZntSPYPebyJm8l1YruHo7oqYMTGV6RiwGE4gRo3H+EPQ==", - "cpu": [ - "ia32" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/sst/node_modules/@esbuild/linux-loong64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.13.tgz", - "integrity": "sha512-x8KplRu9Y43Px8I9YS+sPBwQ+fw44Mvp2BPVADopKDWz+h3fcj1BvRU58kxb89WObmwKX9sWdtYzepL4Fmx03A==", - "cpu": [ - "loong64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/sst/node_modules/@esbuild/linux-mips64el": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.13.tgz", - "integrity": "sha512-qhhdWph9FLwD9rVVC/nUf7k2U4NZIA6/mGx0B7+O6PFV0GjmPA2E3zDQ4NUjq9P26E0DeAZy9akH9dYcUBRU7A==", - "cpu": [ - "mips64el" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/sst/node_modules/@esbuild/linux-ppc64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.13.tgz", - "integrity": "sha512-cVWAPKsrRVxI1jCeJHnYSbE3BrEU+pZTZK2gfao9HRxuc+3m4+RLfs3EVEpGLmMKEcWfVCB9wZ3yNxnknutGKQ==", - "cpu": [ - "ppc64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/sst/node_modules/@esbuild/linux-riscv64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.13.tgz", - "integrity": "sha512-Agb7dbRyZWnmPn5Vvf0eyqaEUqSsaIUwwyInu2EoFTaIDRp093QU2M5alUyOooMLkRbD1WvqQNwx08Z/g+SAcQ==", - "cpu": [ - "riscv64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.2.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/sst/node_modules/@esbuild/linux-s390x": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.13.tgz", - "integrity": "sha512-AqRBIrc/+kl08ahliNG+EyU+j41wIzQfwBTKpi80cCDiYvYFPuXjvzZsD9muiu58Isj0RVni9VgC4xK/AnSW4g==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/sst/node_modules/@esbuild/linux-x64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.13.tgz", - "integrity": "sha512-S4wn2BimuhPcoArRtVrdHUKIymCCZcYAXQE47kUiX4yrUrEX2/ifn5eKNbZ5c1jJKUlh1gC2ESIN+iw3wQax3g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/sst/node_modules/@esbuild/netbsd-x64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.13.tgz", - "integrity": "sha512-2c8JWgfUMlQHTdaR5X3xNMwqOyad8kgeCupuVkdm3QkUOzGREjlTETQsK6oHifocYzDCo9FeKcUwsK356SdR+g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/sst/node_modules/@esbuild/openbsd-x64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.13.tgz", - "integrity": "sha512-Bwh+PmKD/LK+xBjqIpnYnKYj0fIyQJ0YpRxsn0F+WfzvQ2OA+GKDlf8AHosiCns26Q4Dje388jQVwfOBZ1GaFw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/sst/node_modules/@esbuild/sunos-x64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.13.tgz", - "integrity": "sha512-8wwk6f9XGnhrF94/DBdFM4Xm1JeCyGTCj67r516VS9yvBVQf3Rar54L+XPVDs/oZOokwH+XsktrgkuTMAmjntg==", - "cpu": [ - "x64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.3.8", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/sst/node_modules/@esbuild/win32-arm64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.13.tgz", - "integrity": "sha512-Jmwbp/5ArLCiRAHC33ODfcrlIcbP/exXkOEUVkADNJC4e/so2jm+i8IQFvVX/lA2GWvK3GdgcN0VFfp9YITAbg==", - "cpu": [ - "arm64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.0", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 10.0.0" } }, - "node_modules/sst/node_modules/@esbuild/win32-ia32": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.13.tgz", - "integrity": "sha512-AX6WjntGjhJHzrPSVvjMD7grxt41koHfAOx6lxLorrpDwwIKKPaGDASPZgvFIZHTbwhOtILW6vAXxYPDsKpDJA==", - "cpu": [ - "ia32" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "inBundle": true, + "license": "ISC" }, - "node_modules/sst/node_modules/@esbuild/win32-x64": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.13.tgz", - "integrity": "sha512-A+U4gM6OOkPS03UgVU08GTpAAAxPsP/8Z4FmneGo4TaVSD99bK9gVJXlqUEPMO/htFXEAht2O6pX4ErtLY5tVg==", - "cpu": [ - "x64" - ], + "node_modules/sst/node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=12" + "node": ">= 6" } }, "node_modules/sst/node_modules/brace-expansion": { @@ -13738,10 +13983,26 @@ "balanced-match": "^1.0.0" } }, + "node_modules/sst/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/sst/node_modules/ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { @@ -13753,6 +14014,29 @@ "node": ">=8" } }, + "node_modules/sst/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sst/node_modules/constructs": { + "version": "10.1.156", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.156.tgz", + "integrity": "sha512-BTZ3Kyt++/YFlph/ioqbDhzSKVMqHRHvc99FxU4b705ZP6s2IkDxMLCMinC70USMTJWFbO1p02Egux7sk4q07A==", + "dev": true, + "engines": { + "node": ">= 14.17.0" + } + }, "node_modules/sst/node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -13831,9 +14115,9 @@ } }, "node_modules/sst/node_modules/minimatch": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.1.6.tgz", - "integrity": "sha512-6bR3UIeh/DF8+p6A9Spyuy67ShOq42rOkHWi7eUe3Ua99Zo5lZfGC6lJJWkeoK4k9jQFT3Pl7czhTXimG2XheA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -13845,6 +14129,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sst/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/sst/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -13855,9 +14151,9 @@ } }, "node_modules/sst/node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", "dev": true, "engines": { "node": ">=10.0.0" @@ -13875,6 +14171,24 @@ } } }, + "node_modules/sst/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -13922,25 +14236,57 @@ "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -13951,7 +14297,7 @@ "node_modules/strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "bin": { "strip-json-comments": "cli.js" }, @@ -13966,18 +14312,14 @@ "dev": true }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -14008,26 +14350,10 @@ "node": ">=10.0.0" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" @@ -14042,12 +14368,6 @@ "node": ">=8" } }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/table/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -14065,20 +14385,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/table/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -14144,6 +14450,15 @@ "node": ">=10.13.0" } }, + "node_modules/tailwindcss/node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/tailwindcss/node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -14162,19 +14477,19 @@ } }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.10.tgz", + "integrity": "sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^3.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">= 10" } }, "node_modules/tar-stream": { @@ -14207,26 +14522,6 @@ "node": ">= 6" } }, - "node_modules/tar-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/tar-stream/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -14236,18 +14531,35 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/tar/node_modules/minipass": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", - "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" } }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", "engines": { "node": ">=8" }, @@ -14300,7 +14612,7 @@ "node_modules/toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" }, "node_modules/touch": { "version": "3.1.0", @@ -14314,33 +14626,6 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/touch/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", @@ -14360,9 +14645,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "node_modules/tsscmp": { @@ -14373,22 +14658,6 @@ "node": ">=0.6.x" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -14437,9 +14706,9 @@ } }, "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz", + "integrity": "sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g==", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -14449,9 +14718,9 @@ } }, "node_modules/uid2": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", - "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, "node_modules/ultron": { "version": "1.1.1", @@ -14466,9 +14735,9 @@ "dev": true }, "node_modules/undici": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.18.0.tgz", - "integrity": "sha512-1iVwbhonhFytNdg0P4PqyIAXbdlVZVebtPDvuM36m66mRw4OGrCm2MYynJv/UENFLdP13J1nPVQzVE2zTs1OeA==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.19.1.tgz", + "integrity": "sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A==", "dev": true, "dependencies": { "busboy": "^1.6.0" @@ -14623,33 +14892,11 @@ "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -14673,7 +14920,7 @@ "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "dependencies": { "prepend-http": "^2.0.0" }, @@ -14703,37 +14950,37 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", "dependencies": { "builtins": "^1.0.3" } }, "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", "engines": { "node": ">= 0.10" } @@ -14741,29 +14988,11 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "engines": { "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, "node_modules/vite": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", @@ -15219,625 +15448,13099 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wcwidth": { + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webapp": { + "resolved": "services/webapp", + "link": true + }, + "node_modules/websocket-stream": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.2.tgz", + "integrity": "sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "^3.2.0", + "xtend": "^4.0.0" + } + }, + "node_modules/websocket-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/websocket-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/websocket-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/websocket-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/websocket-stream/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz", + "integrity": "sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", + "dev": true, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/wkx": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", + "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" + }, + "node_modules/yoga-layout-prebuilt": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", + "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", + "dev": true, + "dependencies": { + "@types/yoga-layout": "1.9.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/zip-local": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/zip-local/-/zip-local-0.3.5.tgz", + "integrity": "sha512-GRV3D5TJY+/PqyeRm5CYBs7xVrKTKzljBoEXvocZu0HJ7tPEcgpSOYa2zFIsCZWgKWMuc4U3yMFgFkERGFIB9w==", + "dev": true, + "dependencies": { + "async": "^1.4.2", + "graceful-fs": "^4.1.3", + "jszip": "^2.6.1", + "q": "^1.4.1" + } + }, + "node_modules/zip-local/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/zip-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "services/express": { + "version": "1.9.3", + "license": "GNU", + "dependencies": { + "@creativebulma/bulma-collapsible": "^1.0.4", + "@prisma/client": "^4.5.0", + "body-parser": "^1.19.0", + "bulma": "^0.8.1", + "bulma-accordion": "^2.0.1", + "bulma-badge": "^3.0.1", + "bulma-checkradio": "^1.1.1", + "bulma-divider": "^0.2.0", + "bulma-pageloader": "^0.3.0", + "bulma-quickview": "^2.0.0", + "bulma-steps": "^2.2.1", + "bulma-switch": "^2.0.0", + "bulma-tagsinput": "^2.0.0", + "bulma-tooltip": "^3.0.2", + "compression": "^1.7.4", + "cookie-parser": "^1.4.6", + "cookie-session": "^2.0.0", + "cool-checkboxes-for-bulma.io": "^1.1.0", + "crypto": "^1.0.1", + "dotenv": "^8.2.0", + "esbuild": "0.17.3", + "express": "^4.17.1", + "express-handlebars": "^3.0.0", + "jshint": "^2.11.0", + "jsonapi-datastore": "^0.4.0-beta", + "lodash": "^4.17.21", + "mysql2": "^2.1.0", + "node-cache": "^5.1.2", + "npm-check-updates": "^4.1.1", + "passport": "^0.4.1", + "passport-google-oauth20": "^2.0.0", + "passport-reddit": "^0.2.4", + "patreon": "^0.4.1", + "prisma": "^4.5.0", + "rate-limiter-flexible": "^2.1.10", + "sequelize": "^5.21.6", + "serve-favicon": "^2.5.0", + "socket.io": "^2.3.0" + }, + "devDependencies": { + "concurrently": "^7.2.1", + "glob-all": "^3.3.1", + "handlebars": "4.5.3", + "ncp": "^2.0.0", + "nodemon": "^2.0.2", + "prettier": "2.8.3" + } + }, + "services/functions": { + "version": "0.0.0", + "dependencies": { + "sst": "^2.0.7" + }, + "devDependencies": { + "@tsconfig/node18": "^1.0.1", + "@types/aws-lambda": "^8.10.110", + "@types/node": "^18.13.0", + "sst": "^2.0.7" + } + }, + "services/webapp": { + "version": "0.0.0", + "devDependencies": { + "autoprefixer": "^10.4.13", + "postcss": "^8.4.21", + "prettier": "^2.8.4", + "prettier-plugin-tailwindcss": "^0.2.2", + "sst": "^2.0.16", + "tailwindcss": "^3.2.6", + "typescript": "^4.9.3", + "vite": "^4.1.0" + } + }, + "services/webapp/node_modules/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@aws-cdk/asset-awscli-v1": { + "version": "2.2.67", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.67.tgz", + "integrity": "sha512-d3V26C26SGdG0wMeuXDdoPA4CZJQgHS53fqmIuSUNw83vMBullJSUGLxNvk2LzdWcuftSpMUqIUKLKxFzDEMIA==", + "dev": true + }, + "@aws-cdk/asset-kubectl-v20": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.1.tgz", + "integrity": "sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw==", + "dev": true + }, + "@aws-cdk/asset-node-proxy-agent-v5": { + "version": "2.0.56", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.56.tgz", + "integrity": "sha512-gmne4sTHeGfsnqyrpmMgp4VpNRRoaCrJIyEhcmokYL3qiE+qkeAJVVWXM7cL1rC05WjsG93IIg9Hw09g2VZRlA==", + "dev": true + }, + "@aws-cdk/aws-apigatewayv2-alpha": { + "version": "2.62.2-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-apigatewayv2-alpha/-/aws-apigatewayv2-alpha-2.62.2-alpha.0.tgz", + "integrity": "sha512-MHnUWA846ksR8KNcxSGsrKCpUWuQfjwFiMyJE6gf2BugyDTtmdJCxWv7YAxk26s5hg87+JPqZ7VLPmxysBJvBg==", + "dev": true, + "requires": {} + }, + "@aws-cdk/aws-apigatewayv2-authorizers-alpha": { + "version": "2.62.2-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-apigatewayv2-authorizers-alpha/-/aws-apigatewayv2-authorizers-alpha-2.62.2-alpha.0.tgz", + "integrity": "sha512-QdFgtxHBWFmIu1uTJBlOqKS5BFD8iM2/JlEUSHMZoYNJ4fqmKQV3Ffi+RIEQNTvQ2fCARl3u0/QWEmbaUiZxzg==", + "dev": true, + "requires": {} + }, + "@aws-cdk/aws-apigatewayv2-integrations-alpha": { + "version": "2.62.2-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-apigatewayv2-integrations-alpha/-/aws-apigatewayv2-integrations-alpha-2.62.2-alpha.0.tgz", + "integrity": "sha512-dfqtZQhf1dnzaWCEjAB2PUvG4ftyaBbeEgsaHXsRduOf8TanSbpbbenP857+Q17t6V11cs41WZK3u8AEfudxzQ==", + "dev": true, + "requires": {} + }, + "@aws-cdk/cfnspec": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-2.62.2.tgz", + "integrity": "sha512-/Fohjzce9FCb+fGFev8J4rHOFvdRgQbnMPIshlSaYSTAXLDBkX6CCb+WjeI6Lo8nTbTTvRQiCDTnnDgKPzz8OA==", + "dev": true, + "requires": { + "fs-extra": "^9.1.0", + "md5": "^2.3.0" + } + }, + "@aws-cdk/cloud-assembly-schema": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.62.2.tgz", + "integrity": "sha512-oOjNdy9nZoz+dhuK/YBrfaT+ts2ge+RCy+9BtiFIspD0G+xkGODFB6pfIua6CnROWePEzhdEOpyZSJmqlc+XBw==", + "dev": true, + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + } + } + }, + "@aws-cdk/cloudformation-diff": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.62.2.tgz", + "integrity": "sha512-xknbQyTykLha7lCw+OpUS/7m33DdwDSuK+xZjsIIz9Hu4B7exWylefD9SERlO9xENInVW416zJ0EvxTodpTw/A==", + "dev": true, + "requires": { + "@aws-cdk/cfnspec": "2.62.2", + "@types/node": "^14.18.36", + "chalk": "^4", + "diff": "^5.1.0", + "fast-deep-equal": "^3.1.3", + "string-width": "^4.2.3", + "table": "^6.8.1" + }, + "dependencies": { + "@types/node": { + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@aws-cdk/cx-api": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-2.62.2.tgz", + "integrity": "sha512-RA3lSK3I5y1Nr2f1BBZgovTT0Vx8T9kz4tcbBln7efan+sZX7WEAIUkwSY+Vi5n8kZN8D62yhtJ0UVGO9OYB3w==", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "2.62.2", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + } + } + }, + "@aws-cdk/region-info": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-2.62.2.tgz", + "integrity": "sha512-OU4ZPIWUu4YC+TSBzdD/VS46KkJBSXZ5XRqo+MZpoV2iiA6Uy7Oa0/Ee0Pv0C0q7KFRvMuU2kxYaxclUcNnXCw==", + "dev": true + }, + "@aws-crypto/crc32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz", + "integrity": "sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==", + "dev": true, + "requires": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/crc32c": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz", + "integrity": "sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==", + "dev": true, + "requires": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/ie11-detection": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", + "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", + "dev": true, + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha1-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz", + "integrity": "sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==", + "dev": true, + "requires": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha256-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", + "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", + "dev": true, + "requires": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/sha256-js": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha256-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", + "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "dev": true, + "requires": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", + "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", + "dev": true, + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", + "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", + "dev": true, + "requires": { + "@aws-sdk/types": "^3.110.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "@aws-sdk/abort-controller": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.208.0.tgz", + "integrity": "sha512-mQkDR+8VLCafg9KI4TgftftBOL170ricyb+HgV8n5jLDrEG+TfOfud8e6us2lIFESEuMpohC+/8yIcf6JjKkMg==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/chunked-blob-reader": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.188.0.tgz", + "integrity": "sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/chunked-blob-reader-native": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.208.0.tgz", + "integrity": "sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA==", + "dev": true, + "requires": { + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-api-gateway": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-api-gateway/-/client-api-gateway-3.208.0.tgz", + "integrity": "sha512-BGZGEn1qgbjjWzBY6g4uSI+HrXUcQP2wdGV+n12S818tbmUE3171WFluKkh6q+vbcBIT9GuaOgTI4mtLgTIZ3g==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-sdk-api-gateway": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-cloudformation": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.208.0.tgz", + "integrity": "sha512-0Z4fz4CDoaGideh0JlSKS1GVHVmrWr2Ogxcs3bbtdVeXmIEOsTVLkSCtDIK+Y9IeEv6YkEQPSeBYdhv+v1okZA==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-cloudfront": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.208.0.tgz", + "integrity": "sha512-PCCDpQaT44B1YlD0Lj2DYCF4Lxzf5TKcj5uAe4vJhLrRsCuPGRU1ZrpkDEdKvDM4gIXbMsDbFknhH06ph2SyBA==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.208.0", + "@aws-sdk/xml-builder": "3.201.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.208.0.tgz", + "integrity": "sha512-mYlkNxRYJyXkHwY+6kv2Wth2xcP+dfgDrqfnHqMAKL1TGPVtkCKFYw0xAk4aBrlRfx1unyQFDen2NfBVtITCSw==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-iam": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.208.0.tgz", + "integrity": "sha512-hCac/fo4pREeYSrNL9TrlJraLxiVT+M2eG8dVQXqaFcOKER+HLFV+DSFHnmDf1i0vS9jWvVn/Jjo19InorhNpA==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-iot": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iot/-/client-iot-3.208.0.tgz", + "integrity": "sha512-F3zSdx37N4E32cbKeQUpp+y49EeZt9Md/aekHJLJvqz1zrI44XAomFbGB3hQyslUb6bQG/fpOvHb1FNAf7YHgg==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-iot-data-plane": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iot-data-plane/-/client-iot-data-plane-3.208.0.tgz", + "integrity": "sha512-YGFPYUbY1vFoYHWXqQ7D77ldkaQ1Tx84daO/rnPtYgyQSDOfuvTp3DeSFj4+rMbwMJWWhYoK4fXaIc9zLoy1NA==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-lambda": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.208.0.tgz", + "integrity": "sha512-/T61phXhpOsWE8wMD4u76zt/eb7noDANsCLJNfXRrm3I/gemd+3MNneEctj3fkBP0kM08Rcl90evu7ak9Y6NEQ==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-rds-data": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-rds-data/-/client-rds-data-3.208.0.tgz", + "integrity": "sha512-Lo5XQYtYR/M25jm372d3ayRkrdlaOhuVMRIbsrOZajzr0eiooi/oQ+H5UC7YH/Xux1bnOFu9EcJwJn6GS/hEUg==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-s3": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.208.0.tgz", + "integrity": "sha512-NBwSB8IwZ18cVEP1tEBtZ9f/dp5mEhSZnqwWYtOtLgcSyCMJSklVEtrN+CvGGIV6Ut1gwyL3trKT5qWONChO1g==", + "dev": true, + "requires": { + "@aws-crypto/sha1-browser": "2.0.0", + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/eventstream-serde-browser": "3.208.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.208.0", + "@aws-sdk/eventstream-serde-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-blob-browser": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/hash-stream-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/md5-js": "3.208.0", + "@aws-sdk/middleware-bucket-endpoint": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-expect-continue": "3.208.0", + "@aws-sdk/middleware-flexible-checksums": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-location-constraint": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-sdk-s3": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-ssec": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/signature-v4-multi-region": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-stream-browser": "3.208.0", + "@aws-sdk/util-stream-node": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.208.0", + "@aws-sdk/xml-builder": "3.201.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-ssm": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.208.0.tgz", + "integrity": "sha512-BUBqwXU/YlBOD3LDLlNqYCeYkjEPZHSG0fIIUIiMv3ZQm2QsHQClAEMG1DpCxxcq+SIldVE8LL5JmFE3QFkiCA==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.208.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-sso": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.208.0.tgz", + "integrity": "sha512-3e6kEFtuxqZVv1cLGbXFAytTPzR1GpctKITEtJR0MFy3pzj8ttbybrHe0F8z2AqAtDhna1i3u1WVZa+LK3gE9Q==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/client-sts": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.208.0.tgz", + "integrity": "sha512-xmPxI/vW0YVm2YhmIfdTQYY8b8dvzP0ordgooDlzAZVj5KnpZLVzQUxin5EqVcZYFJp6qEkVwmFK03QLy9fYOw==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/hash-node": "3.208.0", + "@aws-sdk/invalid-dependency": "3.208.0", + "@aws-sdk/middleware-content-length": "3.208.0", + "@aws-sdk/middleware-endpoint": "3.208.0", + "@aws-sdk/middleware-host-header": "3.208.0", + "@aws-sdk/middleware-logger": "3.208.0", + "@aws-sdk/middleware-recursion-detection": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-sdk-sts": "3.208.0", + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/middleware-user-agent": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/smithy-client": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-base64-browser": "3.208.0", + "@aws-sdk/util-base64-node": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.208.0", + "@aws-sdk/util-defaults-mode-node": "3.208.0", + "@aws-sdk/util-endpoints": "3.208.0", + "@aws-sdk/util-user-agent-browser": "3.208.0", + "@aws-sdk/util-user-agent-node": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/config-resolver": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.208.0.tgz", + "integrity": "sha512-eLwI7rjk3AJj/S8PqRcUi9iBD+cTm1Nzu1CmYyeiwU6YbJLe5/2CrhW1wjkOGleE+aD967U1TWiB18tsx6fj+w==", + "dev": true, + "requires": { + "@aws-sdk/signature-v4": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.208.0.tgz", + "integrity": "sha512-Eo7CkJTJQXrH0SsABcALRZXu7lqtdiwGVLWMtIzfL+Mb8weaIdWTJOvjSEOKe1ye3JMoOORf7UCPvAxOqywXKA==", + "dev": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.208.0", + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.208.0.tgz", + "integrity": "sha512-FB+KUSpZc03wVTXxGnMmgtaP0sJOv0D7oyogHb7wcf5b7RjjwqoaeUcJHTdKRZaW6e1foLk3/L9uebxiWefDbQ==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.208.0.tgz", + "integrity": "sha512-z4Bk42FQefBzS1SZ6/4gsAFE7tQhEoDmSUrFVSDu/9WwvGpFMnFfHLTBhivlcAHjc/eQ/hiWYLnQ8vahqhHl8w==", + "dev": true, + "requires": { + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.208.0.tgz", + "integrity": "sha512-AhsUj4046wMnxrPunNVEuddOIb//KsaicRqucw1Pb/UqszDRO4hYWkw7pL10MPIqjHBwuXYZ3vjDZrIhIWMn7A==", + "dev": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.208.0", + "@aws-sdk/credential-provider-imds": "3.208.0", + "@aws-sdk/credential-provider-sso": "3.208.0", + "@aws-sdk/credential-provider-web-identity": "3.208.0", + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/shared-ini-file-loader": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.208.0.tgz", + "integrity": "sha512-KYoxlpDzvhw6v0ae0TgIGPP52HJUHQGI3yImhAZZTz0Nh5B0zd2stip+p36sCYRW6V+TJ5mo5minwqDmYe8oXg==", + "dev": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.208.0", + "@aws-sdk/credential-provider-imds": "3.208.0", + "@aws-sdk/credential-provider-ini": "3.208.0", + "@aws-sdk/credential-provider-process": "3.208.0", + "@aws-sdk/credential-provider-sso": "3.208.0", + "@aws-sdk/credential-provider-web-identity": "3.208.0", + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/shared-ini-file-loader": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.208.0.tgz", + "integrity": "sha512-ExvFSJB/pVV+/BXIvFR9dgoGxWWnF6uqIw1hfpWCh28UDwsOQdbfUKblMovUfPDBUw67Laqy3mtiY37Jyo/EUQ==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/shared-ini-file-loader": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.208.0.tgz", + "integrity": "sha512-GVUBmSG8eO4oXy5XpslAgVUBimEVBYmyCdwrwED79ey/7NWfkIVt46VZQapWyAJsarKW+VFpx7BYnam9YBR6hA==", + "dev": true, + "requires": { + "@aws-sdk/client-sso": "3.208.0", + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/shared-ini-file-loader": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.208.0.tgz", + "integrity": "sha512-7wtrdEr8uvDr5t0stimrXGsW4G+TQyluZ9OucCCY0HXgNihmnk1BIu+COuOSxRtFXHwCh4rIPaVE1ABG2Mq24g==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/credential-providers": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.208.0.tgz", + "integrity": "sha512-wKbxh5RAEMseF2zViWgIZZ95tXDu8TVgVHZYcH5hv+PJSGRKpldZIdbaARKjaO7uOmeVdj/jvY3RuopwhMFO+g==", + "dev": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.208.0", + "@aws-sdk/client-sso": "3.208.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/credential-provider-cognito-identity": "3.208.0", + "@aws-sdk/credential-provider-env": "3.208.0", + "@aws-sdk/credential-provider-imds": "3.208.0", + "@aws-sdk/credential-provider-ini": "3.208.0", + "@aws-sdk/credential-provider-node": "3.208.0", + "@aws-sdk/credential-provider-process": "3.208.0", + "@aws-sdk/credential-provider-sso": "3.208.0", + "@aws-sdk/credential-provider-web-identity": "3.208.0", + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/shared-ini-file-loader": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/eventstream-codec": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.208.0.tgz", + "integrity": "sha512-CT5+DV92xvGpGivFCcg/Hb2HOEad52XMVVgxHkgwnsy8Z+S+mk7xON3+BG0U8+TCQXTlq3pDs05iJ6EPeBs2Wg==", + "dev": true, + "requires": { + "@aws-crypto/crc32": "2.0.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/eventstream-serde-browser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.208.0.tgz", + "integrity": "sha512-8nK/geIqWTuSJODTQ2dXhEuLhjpdXWm+ZU5iB76B7RoDXFGL+iX2VS9lsSNoxEcFQPx0iJ1OgV88JbXk13GmTg==", + "dev": true, + "requires": { + "@aws-sdk/eventstream-serde-universal": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.208.0.tgz", + "integrity": "sha512-pmq52299XfBwx72hVO3+qXH10VTGw9Ef6HmdQGhSAIs91F6pFWNZdkdGtEtJHBooGf93rtGxpJuk6Io+XhynCw==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/eventstream-serde-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.208.0.tgz", + "integrity": "sha512-N1nr1cIyyroGsqw7c02JESZP5EC8iN14VX9WwyZidlmPwtcTuyDgSzw1EYfC+QQQDW2nHkYtGfpweBNRlic6+g==", + "dev": true, + "requires": { + "@aws-sdk/eventstream-serde-universal": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/eventstream-serde-universal": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.208.0.tgz", + "integrity": "sha512-On8s1akmiUMqZIQ5Uj/F3Dzy6BkA4EzMnDsxDTVMRWKa3WQ4E574yvayQY/i6Z2TL7QvFD5sYT10iE5yPCy/Mg==", + "dev": true, + "requires": { + "@aws-sdk/eventstream-codec": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.208.0.tgz", + "integrity": "sha512-GuwkwOeyLKCbSbnFlyHdlKd7u54cnQUI8NfVDAxpZvomY3PV476Tzg8XEyOYE67r5rR6XMqn6IK1PmFAACY+ew==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/querystring-builder": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/hash-blob-browser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.208.0.tgz", + "integrity": "sha512-Mj9dOA2cLk3WvYgcK0myf4AGqXWi3IDcbbj6oFWeBYQ6tGolehzUeVHQH8inE0iRZSbDGXUwWhoa8vlyciYmew==", + "dev": true, + "requires": { + "@aws-sdk/chunked-blob-reader": "3.188.0", + "@aws-sdk/chunked-blob-reader-native": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/hash-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.208.0.tgz", + "integrity": "sha512-X5u6nD9+wzaA6qhqbobxsIgiyDJMW8NgqjZgHoc5x1wz4unHUCEuSBZy1kbIZ6+EPZ9bQHQZ21gKgf1j5vhsvQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/hash-stream-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.208.0.tgz", + "integrity": "sha512-gMmlzYsLXVt8ehibhTvQWHsPGR3RHytPOP33Jk/YLKyELnUvfn27396JgRgMv/mihIgMq7J2ZEbKkVRvx+FKZw==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.208.0.tgz", + "integrity": "sha512-mUpbtijk14KntYy+w5FSvmsfj/Dqa8HylYeCKniKBKkQ1avjEz7CdizVoxyZrR3rldnLE3gItr0FEDRUhtfkAA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/md5-js": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.208.0.tgz", + "integrity": "sha512-1yaf3gtXDJmWDMwU9gyswTGa1jG4cEFDydk8G2vkHPpSOrgbxLWtX31Hwnrxdw3FFJDasjLR99OylqHOh6D2lw==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-bucket-endpoint": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.208.0.tgz", + "integrity": "sha512-ttvwDsYfQRZRC/1Lbn50jlY4haK35DFt6IP7UdcI1R0aycM81LJYsTCgZ3yjAmouBZ7AX4IH7CCGeDcl0q0USg==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "@aws-sdk/util-config-provider": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.208.0.tgz", + "integrity": "sha512-8bLh7lHtmKQQ2fk0fGiP7pcVJglB/dz7Q9OooxFYK+eybqxfIDDUgKphA8AFT5W34tJRh5nhT3QTJ6zrOTQM3w==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-endpoint": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.208.0.tgz", + "integrity": "sha512-pVa/cyB6ronfTVAoKUUTFbAPslDPU43DWOKXY/bACC3ys1lFo1CWjz4dLSQARxEEW3iZ1yZTy0zoHXnNrw5CFQ==", + "dev": true, + "requires": { + "@aws-sdk/middleware-serde": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/signature-v4": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/url-parser": "3.208.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-expect-continue": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.208.0.tgz", + "integrity": "sha512-T/oTNwmJCbv36BidaE8GYY53dXnKKO6GkExp5RLcTeNx7ZGSarV5j+LMeTYPkx6Ha4IkMMIlz8DB4B7rb9bpRQ==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-flexible-checksums": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.208.0.tgz", + "integrity": "sha512-5VrjGKZ2PCp6+VtyWzVintsHA6J2n0gsMyRCQGMn2LC4+22TIUQIyYaIpVp0SzbJveV7z+5iGnxTMYlpYApr3Q==", + "dev": true, + "requires": { + "@aws-crypto/crc32": "2.0.0", + "@aws-crypto/crc32c": "2.0.0", + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.208.0.tgz", + "integrity": "sha512-3oyXK81TLWOZ2T/9Ltpbj/Z7R4QWSf+FCQRpY48ND2im/ALkgFRk/tmDTOshv+TQzW1q2lOSEeq4vK6yOCar7g==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-location-constraint": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.208.0.tgz", + "integrity": "sha512-TNU8/NibMyi97qf7/VL1CFIijY6mS9GP7dgN+J6BiMOLS3pJLCmFd5BiaZNsdhOnepQ3jnr+zpVxmfn3D8miVA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.208.0.tgz", + "integrity": "sha512-mwSpuWruB8RrgUAAW7w/lvadnMDesl/bZ2IELBgJri+2rIqLGbAtygJBiG0Y3e8/IeOHuKuGkN1rFYZ4SKr7/A==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.208.0.tgz", + "integrity": "sha512-Dgpf5NEOYXvkQuGcbxvDovTh4HwO4ULJReGko67NJjgdZZyFS1fNykVPncxenRpsN9SJBigswYs3lwPVpqijzA==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.208.0.tgz", + "integrity": "sha512-JAcN2e3PKWGcNX7run/jP6xJ7w2m15a2CpVrfMtka9p/I/3qnqB86jGUs/3Iv04FEqgXq7KTHbFBg8CndsaHEw==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/service-error-classification": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-middleware": "3.208.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-sdk-api-gateway": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-api-gateway/-/middleware-sdk-api-gateway-3.208.0.tgz", + "integrity": "sha512-esI4x7qooCECo5hP6d4cSqGxJ8WtFsR3aCXZvO841MXCaYQDEh6tApJMwK3kwh4lcp0Iu3M5aYF/DP6vQFYS+Q==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-sdk-s3": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.208.0.tgz", + "integrity": "sha512-YX4BGgUuo/GO2J/8KRS4arSOaBJe9nxouV+MH+ESfPYIetY1p9fEPDYU9p1j69+tKF13ER728msaa16Zb1HEYA==", + "dev": true, + "requires": { + "@aws-sdk/middleware-bucket-endpoint": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.208.0.tgz", + "integrity": "sha512-lFVodZHYLF7puXgNZ1m5ycKbyCPp79nqI+pkRXl066ZtZWzCW8+JKCaLjF3jfXlnvg6foPDJdxUvt0VU5EddGg==", + "dev": true, + "requires": { + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/signature-v4": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.208.0.tgz", + "integrity": "sha512-3h2yP6qyf/IhfdvyFeNX7w4BF37vOZvfUDBq+wb1QEc7DCAskoUKWtCCKJ9HDq3IJQp8hzqY82eawUir6flqlQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.208.0.tgz", + "integrity": "sha512-cMSWhg8xOrxZw04EYKEQQQ7RT+03rigS4KS3Uy6x/M+jFyoM+sRiY/7376sJCwlpvKH2xJIVpwPbKk/uz4j4DA==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/signature-v4": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-middleware": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-ssec": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.208.0.tgz", + "integrity": "sha512-Kx3Z8RQu/tHTDTBQPXT3SyvsW8KxoNPBxP2d84Gugb6Pj766fZlYj7qOqWTSx+aCOSOIHcPjxilgTNJ6VBbJmA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.208.0.tgz", + "integrity": "sha512-bvFPUa+RTB7PSRCUsO6bRlEtiEadrDES+dpNmInMNQ9kmbd4OhNOCb664hhtiglIIXX5cd8mSPEo+w/RV0kEEQ==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.208.0.tgz", + "integrity": "sha512-6RNf+TOZpiCy7xUcDSh8ji/x8ht1oAM+qIhm6hsEPLdI1cTvbPZrwowO9Y6L0J68V9OkEgLYiq77KKKYT7QQSw==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.208.0.tgz", + "integrity": "sha512-htjs1cDXYXEMwZ1q2vb7wfG3bOW4weWWkKcfT7vqzZKfTXoMH2mPpJIXnPE1PxXerOLXHGUU8qqhfl6LxjlnfQ==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/shared-ini-file-loader": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.208.0.tgz", + "integrity": "sha512-2t0b9Id7WekluqxQdPugAZhe/wdzW0L53rfMEfDS3R0INNSq1sEfddIfCzJrmfWDCrCOGIDNyxo/w7Ki3NclzQ==", + "dev": true, + "requires": { + "@aws-sdk/abort-controller": "3.208.0", + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/querystring-builder": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/property-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.208.0.tgz", + "integrity": "sha512-aUhfuwXjZ5TGzLhBstuAMmbnxHXeSGhzoIS8yy465ifgc95p6cHFZf+ZibgwgCMaGrKlTDCia2zwwpKQHN+4cw==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/protocol-http": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.208.0.tgz", + "integrity": "sha512-Sr9dmaW0Z9X9s16NHZn94efLRpaqLyLqABFPgjqE8cYP6eLX/VrmZGNR62GFVxCiyEEpVxy4Ddk1YkbRwnuonA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.208.0.tgz", + "integrity": "sha512-1Rpauh5hWlK++KjsHQjHcSN7yE05hj1FVb0HaeLrFIJB5rQYWXK7DpOUhmv5SOmU+q6cIM2kNCrSxH31+WglMw==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz", + "integrity": "sha512-Krq36GXqEfRfzJ9wOzkkzpbb4SWjgSYydTIgK6KtKapme0HPcB24kmmsjsUVuHzKuQMCHHDRWm+b47iBmHGpSQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "@aws-sdk/types": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.267.0.tgz", + "integrity": "sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.208.0.tgz", + "integrity": "sha512-ZZWV3AOTd8UDcfXCNoQ8v4sHaTgFxGaXWO0NHHgqFbVYr1d+8EXQiOy/v8JsY1jrfoXBWXptTOcioCTeM0xBpw==", + "dev": true + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.208.0.tgz", + "integrity": "sha512-ZDmwOLNiBKfvtN1M2eG2bItw0+4hKDU/XKqB+yVI9Uo29o4XwtQ4Br7HixTlPYJAavmM1cCch8PVvnwngYAKPA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/signature-v4": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.208.0.tgz", + "integrity": "sha512-+c5A8RsN4Lk3TXFiQ3ZsW7sJ4zYPPmYQ55ITSfjock5hzgM1vW43Mgvjjq6foW5L7SNfdhLH+NrhpgFwSF/GeA==", + "dev": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.208.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/signature-v4-crt": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.267.0.tgz", + "integrity": "sha512-wCmz2Oa0A05FoukJn9qlKfw4Whhxy6SIpftdvTSLu4SZckSj9oQuqCJ2IThDDTGlanU35vny8UHCBLviYCpR7w==", + "dev": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/querystring-parser": "3.267.0", + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.267.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "aws-crt": "^1.15.9", + "tslib": "^2.3.1" + }, + "dependencies": { + "@aws-sdk/signature-v4": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.267.0.tgz", + "integrity": "sha512-Je1e7rum2zvxa3jWfwq4E+fyBdFJmSJAwGtWYz3+/rWipwXFlSAPeSVqtNjHdfzakgabvzLp7aesG4yQTrO2YQ==", + "dev": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.267.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/types": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.267.0.tgz", + "integrity": "sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-middleware": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.267.0.tgz", + "integrity": "sha512-7nvqBZVz3RdwYv6lU958g6sWI2Qt8lzxDVn0uwfnPH+fAiX7Ln1Hen2A0XeW5cL5uYUJy6wNM5cyfTzFZosE0A==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/signature-v4-multi-region": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.208.0.tgz", + "integrity": "sha512-7CZtIxj+hlBvGKjz/8BweLIEdTZdtSiyH9RuW2Oue25RF3YPtKpwanlV7obk/+UIVh36oe1EWaXEBbS0h68GhA==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.208.0", + "@aws-sdk/signature-v4": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/smithy-client": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.208.0.tgz", + "integrity": "sha512-4SGPAs7ZtG9AUYknJNkZTs+ww1cpdcPth5te+R/dN4anUbqtL2qvmbdZJ+8rzdAZKndXu0huKE1OZrR3COLciw==", + "dev": true, + "requires": { + "@aws-sdk/middleware-stack": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/types": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.208.0.tgz", + "integrity": "sha512-5AuOPtY1Hdf4xoEo+voRijl3OnFm8IB+oITXl+SN2iASJv+XPnRNw/QVbIxfGeWgWhmK31F+XdjTYsjT2rx8Qw==", + "dev": true + }, + "@aws-sdk/url-parser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.208.0.tgz", + "integrity": "sha512-zhU231xkZbUh68Z/TGNRW30MGTZQVigGuMiJU6eOtL2aOulnKqI1Yjs/QejrTtPWsqSihWvxOUZ2cVRPyeOvrA==", + "dev": true, + "requires": { + "@aws-sdk/querystring-parser": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "@aws-sdk/querystring-parser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.208.0.tgz", + "integrity": "sha512-dVVLdP3il9bJX74/BNBjFn59XrEVBUZ4xSKYH6t7dgSz9uSu8DcT4pPzwaq+/94dVewCW3zq2jVA1iw1rK7JVQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-arn-parser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz", + "integrity": "sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "dev": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-base64-browser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.208.0.tgz", + "integrity": "sha512-nR6S6aZqlr//Sy3+2J7G2mn5XG1ELBBTswvbp6kCo5BK9v/kESuzsHC5b6f3xzl/TY4JSG8Aj+h7x+kZHfKwwg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-base64-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.208.0.tgz", + "integrity": "sha512-tCkSexa90loq8yU+BKAX5WIVQGq8IM/DdFhFphQd1azgOIBYxafA/aVw9mDY+to0mq4QRHiUwmUsmzLWEFSDJg==", + "dev": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "dev": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.208.0.tgz", + "integrity": "sha512-i4cA074pycou1BPr7axFMiK3iHv+Tzjl/ZiN3Yc0BQDLWC9AQdrNodB4WAKnn4a4fWgA/MadfzKXnW1oltSzIg==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/types": "3.208.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.208.0.tgz", + "integrity": "sha512-y9dENqcmiUb7/D3uwJsE/fV+RZ9CUc/cs4OcofO81sU29xz8Fg/XQarjSdGVZMTnrDd190GXymMcB4qpOYhtPw==", + "dev": true, + "requires": { + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-provider-imds": "3.208.0", + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/property-provider": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.208.0.tgz", + "integrity": "sha512-FGJA07iEbC883bAaw0qtDrly5Y+1nR3ic+OOzGX2AsSgaeVAc1j8Lgg3br7ofBbr8p81ec6zN4syy4v7V0Wb0A==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-middleware": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.208.0.tgz", + "integrity": "sha512-oXilrYpXwaPyMw1uNjL1wmR54zeFzIWx2ve1MSMheIYr26deFP3RpMfKkGXwiOvXzZ9pzTcA8shNLhg1frO/zg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-stream-browser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.208.0.tgz", + "integrity": "sha512-zKAwaMn7tLLTA1uZFL0Ynomxu/EVeUa2VKxB+y87g3hHZmC11QQ5rOiNTnvYzy6w3BsssWNYzazom3jNhpWvtQ==", + "dev": true, + "requires": { + "@aws-sdk/fetch-http-handler": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-stream-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.208.0.tgz", + "integrity": "sha512-2/gB8QchikmrxOBNVytviX8j1H6GZg/TKdUiUlLg5/x7I2EMlaKZK3FI7In80gqwoG6C7h8NwEIvpfmbhl7gAw==", + "dev": true, + "requires": { + "@aws-sdk/node-http-handler": "3.208.0", + "@aws-sdk/types": "3.208.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.208.0.tgz", + "integrity": "sha512-Z5n9Kg2pBstzzQgRymQRgb4pM0bNPLGQejB3ZmCAphaxvuTBfu2E6KO55h5WwkFHUuh0i5u2wn1BI9R66S8CgQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.208.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.208.0.tgz", + "integrity": "sha512-T7V3TTc+NdcHgITo8yMUDs/qR0wfPjURUrCixHPtqYkqvhoF6YrHUAoCbOcz7SG/Tsm2GgSKAHB4ip9D2QLg4g==", + "dev": true, + "requires": { + "@aws-sdk/node-config-provider": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-utf8": { + "version": "3.254.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", + "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", + "dev": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", + "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", + "dev": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/util-waiter": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.208.0.tgz", + "integrity": "sha512-DEMVnoZXLUXeakBDMe9IhZ8VQCVf/5cMlNtE+4EpSVvH8CEE0Qfc0nDjrTYEkLpAIZWRL3tpHx61MMKvgCirXA==", + "dev": true, + "requires": { + "@aws-sdk/abort-controller": "3.208.0", + "@aws-sdk/types": "3.208.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@aws-sdk/xml-builder": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.201.0.tgz", + "integrity": "sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "dev": true + }, + "@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", + "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "dev": true + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@creativebulma/bulma-collapsible": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@creativebulma/bulma-collapsible/-/bulma-collapsible-1.0.4.tgz", + "integrity": "sha512-aNqSwyuJxshoIc4oD3wJ3eRqOANRweYfpzqmef/fj5tf0Yn7UVx99yh8ovY6vhB8Il31bFcc7f/eRfJvEMNUPw==", + "requires": { + "bulma": "latest" + }, + "dependencies": { + "bulma": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.3.tgz", + "integrity": "sha512-0d7GNW1PY4ud8TWxdNcP6Cc8Bu7MxcntD/RRLGWuiw/s0a9P+XlH/6QoOIrmbj6o8WWJzJYhytiu9nFjTszk1g==" + } + } + }, + "@esbuild/android-arm": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.13.tgz", + "integrity": "sha512-JmtqThupn9Yf+FzANE+GG73ASUkssnPwOsndUElhp23685QzRK+MO1UompOlBaXV9D5FTuYcPnw7p4mCq2YbZQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.13.tgz", + "integrity": "sha512-r4xetsd1ez1NF9/9R2f9Q6AlxqiZLwUqo7ICOcvEVwopVkXUcspIjEbJk0EVTgT6Cp5+ymzGPT6YNV0ievx4yA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.13.tgz", + "integrity": "sha512-hKt1bFht/Vtp0xJ0ZVzFMnPy1y1ycmM3KNnp3zsyZfQmw7nhs2WLO4vxdR5YG+6RsHKCb2zbZ3VwlC0Tij0qyA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.13.tgz", + "integrity": "sha512-ogrVuNi2URocrr3Ps20f075EMm9V7IeenOi9FRj4qdbT6mQlwLuP4l90PW2iBrKERx0oRkcZprEUNsz/3xd7ww==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.13.tgz", + "integrity": "sha512-Agajik9SBGiKD7FPXE+ExW6x3MgA/dUdpZnXa9y1tyfE4lKQx+eQiknSdrBnWPeqa9wL0AOvkhghmYhpVkyqkA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.13.tgz", + "integrity": "sha512-KxMO3/XihBcHM+xQUM6nQZO1SgQuOsd1DCnKF1a4SIf/i5VD45vrqN3k8ePgFrEbMi7m5JeGmvNqwJXinF0a4Q==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.13.tgz", + "integrity": "sha512-Ez15oqV1vwvZ30cVLeBW14BsWq/fdWNQGMOxxqaSJVQVLqHhvgfQ7gxGDiN9tpJdeQhqJO+Q0r02/Tce5+USNg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.13.tgz", + "integrity": "sha512-18dLd2L3mda+iFj6sswyBMSh2UwniamD9M4DwPv8VM+9apRFlQ5IGKxBdumnTuOI4NvwwAernmUseWhYQ9k+rg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.13.tgz", + "integrity": "sha512-qi5n7KwcGViyJeZeQnu8fB6dC3Mlm5PGaqSv2HhQDDx/MPvVfQGNMcv7zcBL4qk3FkuWhGVwXkjQ76x7R0PWlA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.13.tgz", + "integrity": "sha512-2489Xad9sr+6GD7nB913fUqpCsSwVwgskkQTq4Or2mZntSPYPebyJm8l1YruHo7oqYMTGV6RiwGE4gRo3H+EPQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.13.tgz", + "integrity": "sha512-x8KplRu9Y43Px8I9YS+sPBwQ+fw44Mvp2BPVADopKDWz+h3fcj1BvRU58kxb89WObmwKX9sWdtYzepL4Fmx03A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.13.tgz", + "integrity": "sha512-qhhdWph9FLwD9rVVC/nUf7k2U4NZIA6/mGx0B7+O6PFV0GjmPA2E3zDQ4NUjq9P26E0DeAZy9akH9dYcUBRU7A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.13.tgz", + "integrity": "sha512-cVWAPKsrRVxI1jCeJHnYSbE3BrEU+pZTZK2gfao9HRxuc+3m4+RLfs3EVEpGLmMKEcWfVCB9wZ3yNxnknutGKQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.13.tgz", + "integrity": "sha512-Agb7dbRyZWnmPn5Vvf0eyqaEUqSsaIUwwyInu2EoFTaIDRp093QU2M5alUyOooMLkRbD1WvqQNwx08Z/g+SAcQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.13.tgz", + "integrity": "sha512-AqRBIrc/+kl08ahliNG+EyU+j41wIzQfwBTKpi80cCDiYvYFPuXjvzZsD9muiu58Isj0RVni9VgC4xK/AnSW4g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", + "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.13.tgz", + "integrity": "sha512-2c8JWgfUMlQHTdaR5X3xNMwqOyad8kgeCupuVkdm3QkUOzGREjlTETQsK6oHifocYzDCo9FeKcUwsK356SdR+g==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.13.tgz", + "integrity": "sha512-Bwh+PmKD/LK+xBjqIpnYnKYj0fIyQJ0YpRxsn0F+WfzvQ2OA+GKDlf8AHosiCns26Q4Dje388jQVwfOBZ1GaFw==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.13.tgz", + "integrity": "sha512-8wwk6f9XGnhrF94/DBdFM4Xm1JeCyGTCj67r516VS9yvBVQf3Rar54L+XPVDs/oZOokwH+XsktrgkuTMAmjntg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.13.tgz", + "integrity": "sha512-Jmwbp/5ArLCiRAHC33ODfcrlIcbP/exXkOEUVkADNJC4e/so2jm+i8IQFvVX/lA2GWvK3GdgcN0VFfp9YITAbg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.13.tgz", + "integrity": "sha512-AX6WjntGjhJHzrPSVvjMD7grxt41koHfAOx6lxLorrpDwwIKKPaGDASPZgvFIZHTbwhOtILW6vAXxYPDsKpDJA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.13.tgz", + "integrity": "sha512-A+U4gM6OOkPS03UgVU08GTpAAAxPsP/8Z4FmneGo4TaVSD99bK9gVJXlqUEPMO/htFXEAht2O6pX4ErtLY5tVg==", + "dev": true, + "optional": true + }, + "@httptoolkit/websocket-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz", + "integrity": "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==", + "dev": true, + "requires": { + "@types/ws": "*", + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "isomorphic-ws": "^4.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "*", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/ci-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz", + "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==" + }, + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "requires": { + "infer-owner": "^1.0.4" + } + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@npmcli/promise-spawn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.2.0.tgz", + "integrity": "sha512-nFtqjVETliApiRdjbYwKwhlSHx2ZMagyj5b9YbNt0BWeeOVxJd47ZVE2u16vxDHyTOZvk+YLV7INwfAE9a2uow==", + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@prisma/client": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.5.0.tgz", + "integrity": "sha512-B2cV0OPI1smhdYUxsJoLYQLoMlLH06MUxgFUWQnHodGMX98VRVXKmQE/9OcrTNkqtke5RC+YU24Szxd04tZA2g==", + "requires": { + "@prisma/engines-version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452" + } + }, + "@prisma/engines": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.5.0.tgz", + "integrity": "sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g==" + }, + "@prisma/engines-version": { + "version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452.tgz", + "integrity": "sha512-o7LyVx8PPJBLrEzLl6lpxxk2D5VnlM4Fwmrbq0NoT6pr5aa1OuHD9ZG+WJY6TlR/iD9bhmo2LNcxddCMr5Rv2A==" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tootallnate/once": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", + "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==" + }, + "@trpc/server": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@trpc/server/-/server-9.16.0.tgz", + "integrity": "sha512-IENsJs41ZR4oeFUJhsNNTSgEOtuRN0m9u7ec4u3eG/qOc7bIoo1nDoYtx4bl6OJJSQYEytG9tlcVz9G8OAaHbg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@tsconfig/node18": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-1.0.1.tgz", + "integrity": "sha512-sNFeK6X2ATlhlvzyH4kKYQlfHXE2f2/wxtB9ClvYXevWpmwkUT7VaSrjIN9E76Qebz8qP5JOJJ9jD3QoD/Z9TA==", + "dev": true + }, + "@types/aws-lambda": { + "version": "8.10.110", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.110.tgz", + "integrity": "sha512-r6egf2Cwv/JaFTTrF9OXFVUB3j/SXTgM9BwrlbBRjWAa2Tu6GWoDoLflppAZ8uSfbUJdXvC7Br3DjuN9pQ2NUQ==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yoga-layout": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", + "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==", + "dev": true + }, + "@wg/express": { + "version": "file:services/express", + "requires": { + "@creativebulma/bulma-collapsible": "^1.0.4", + "@prisma/client": "^4.5.0", + "body-parser": "^1.19.0", + "bulma": "^0.8.1", + "bulma-accordion": "^2.0.1", + "bulma-badge": "^3.0.1", + "bulma-checkradio": "^1.1.1", + "bulma-divider": "^0.2.0", + "bulma-pageloader": "^0.3.0", + "bulma-quickview": "^2.0.0", + "bulma-steps": "^2.2.1", + "bulma-switch": "^2.0.0", + "bulma-tagsinput": "^2.0.0", + "bulma-tooltip": "^3.0.2", + "compression": "^1.7.4", + "concurrently": "^7.2.1", + "cookie-parser": "^1.4.6", + "cookie-session": "^2.0.0", + "cool-checkboxes-for-bulma.io": "^1.1.0", + "crypto": "^1.0.1", + "dotenv": "^8.2.0", + "esbuild": "0.17.3", + "express": "^4.17.1", + "express-handlebars": "^3.0.0", + "glob-all": "^3.3.1", + "handlebars": "4.5.3", + "jshint": "^2.11.0", + "jsonapi-datastore": "^0.4.0-beta", + "lodash": "^4.17.21", + "mysql2": "^2.1.0", + "ncp": "^2.0.0", + "node-cache": "^5.1.2", + "nodemon": "^2.0.2", + "npm-check-updates": "^4.1.1", + "passport": "^0.4.1", + "passport-google-oauth20": "^2.0.0", + "passport-reddit": "^0.2.4", + "patreon": "^0.4.1", + "prettier": "2.8.3", + "prisma": "^4.5.0", + "rate-limiter-flexible": "^2.1.10", + "sequelize": "^5.21.6", + "serve-favicon": "^2.5.0", + "socket.io": "^2.3.0" + } + }, + "@wg/functions": { + "version": "file:services/functions", + "requires": { + "@tsconfig/node18": "^1.0.1", + "@types/aws-lambda": "^8.10.110", + "@types/node": "^18.13.0", + "sst": "^2.0.7" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "adm-zip": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" + }, + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", + "dev": true + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "are-we-there-yet": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", + "integrity": "sha512-Zfw6bteqM9gQXZ1BIWOgM8xEwMrUGoyL8nW13+O+OOgNX3YhuDN1GDgg1NzdTlmm3j+9sHy7uBZ12r+z9lXnZQ==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "dev": true + }, + "auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "aws-cdk": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.62.2.tgz", + "integrity": "sha512-fACUQEdc43AfiqKKXUZLuHB2VADLU965hl50Fn6BhMemFmUsc+iS/GFfOwvfCUO3/iaRtsn/gk+dQ3zZ+snKRw==", + "dev": true, + "requires": { + "fsevents": "2.3.2" + } + }, + "aws-cdk-lib": { + "version": "2.64.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.64.0.tgz", + "integrity": "sha512-IrgL7thb6TeOyHgyR/qKWTdA9FBb9lv7Z9QPDzCNJlkKI+0ANjYHy3RYV8Gd+1+kc6l8DG9Z1elij40YCr/Ptg==", + "dev": true, + "requires": { + "@aws-cdk/asset-awscli-v1": "^2.2.52", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.42", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.3.8", + "yaml": "1.10.2" + }, + "dependencies": { + "@balena/dockerignore": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "case": { + "version": "1.6.3", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "bundled": true, + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "bundled": true, + "dev": true + }, + "ignore": { + "version": "5.2.4", + "bundled": true, + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonschema": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "punycode": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yaml": { + "version": "1.10.2", + "bundled": true, + "dev": true + } + } + }, + "aws-crt": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/aws-crt/-/aws-crt-1.15.9.tgz", + "integrity": "sha512-tInTJwASvrj+iIQZd+p/S3fUf2nWp3mNQv+TJHndZIllCQg3tcy8vF6pkXR++3fF/eAIOYnr7adf7z2/JneJ8g==", + "dev": true, + "requires": { + "@aws-sdk/util-utf8-browser": "^3.109.0", + "@httptoolkit/websocket-stream": "^6.0.0", + "axios": "^0.24.0", + "cmake-js": "^6.3.2", + "crypto-js": "^4.0.0", + "mqtt": "^4.3.7", + "tar": "^6.1.11" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "minipass": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", + "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "dev": true + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "aws-iot-device-sdk": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/aws-iot-device-sdk/-/aws-iot-device-sdk-2.2.12.tgz", + "integrity": "sha512-OcUI6Hq1N3PhAMgceWV3nFhDNkOFmSYPuv1CCqZhQAcWQ7UOhPmA5QSE4aiQcVN3wSIzTEO0UU4sh6ubjMOjPA==", + "dev": true, + "requires": { + "crypto-js": "4.0.0", + "minimist": "1.2.6", + "mqtt": "4.2.8", + "websocket-stream": "^5.5.2" + }, + "dependencies": { + "crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", + "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dev": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "mqtt": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.8.tgz", + "integrity": "sha512-DJYjlXODVXtSDecN8jnNzi6ItX3+ufGsEs9OB3YV24HtkRrh7kpx8L5M1LuyF0KzaiGtWr2PzDcMGAY60KGOSA==", + "dev": true, + "requires": { + "commist": "^1.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "split2": "^3.1.0", + "ws": "^7.5.0", + "xtend": "^4.0.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + } + } + }, + "aws-sdk": { + "version": "2.1252.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1252.0.tgz", + "integrity": "sha512-ayBNGAPhCm/tyWNki24cwPgI8DUm/suKTh2YDB6SrgeROyHJHMTXpj1dVaYXrBrZjRN7erVi5g7pkaxzCt/28A==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true + } + } + }, + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.4" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + } + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g==", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "bulma": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.8.1.tgz", + "integrity": "sha512-Afi2zv4DKmNSYfmx55V+Mtnt8+WfR8Rs65kWArmzEuWP7vNr7dSAEDI+ORZlgOR1gueNZwpKaPdUi4ZiTNwgPA==" + }, + "bulma-accordion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bulma-accordion/-/bulma-accordion-2.0.1.tgz", + "integrity": "sha512-qqLN67Y60c0adHAVvQmJTr6rhg0FWUCWbswFaW/3+offjc6ujqrUoIdlzX1avni4d/aJEl7j9PckfRGmIJcxxQ==" + }, + "bulma-badge": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bulma-badge/-/bulma-badge-3.0.1.tgz", + "integrity": "sha512-owRTbInXkpsSrFSvCXyWMNyjcQXr7j3Vj4aSnKYISalcmYqql/YVC7e82M/MXFQG8J66ak5VvIu6dCrdAiQUtQ==", + "requires": { + "bulma": "latest" + } + }, + "bulma-checkradio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bulma-checkradio/-/bulma-checkradio-1.1.1.tgz", + "integrity": "sha512-6Wn2faBiFkctSeiaQkeU2MbjkQeuXsN4AthBDEKrHGGPl5wmV2GEj4iZCqzvw7Te7baaHdU8PbUgrmlD5D6oGA==" + }, + "bulma-divider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bulma-divider/-/bulma-divider-0.2.0.tgz", + "integrity": "sha512-REe3k56GECRfDaqFjC8cwLhV4RxXmV0RubuzDJqwior9wlJcdHlN0qfW0tvUX+qphikaTQegIeRuhjRIAqkjkw==" + }, + "bulma-pageloader": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/bulma-pageloader/-/bulma-pageloader-0.3.0.tgz", + "integrity": "sha512-lbahiqhBCov5AYdziHFnC5/JOhCrJWFTpdRiAkwW49IM/mf0whCWHVe8MuejZFu2PEs1mtH8Gnz8exEks4Q+7g==" + }, + "bulma-quickview": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bulma-quickview/-/bulma-quickview-2.0.0.tgz", + "integrity": "sha512-EJq9XYcJ+pG94FIYgw9AI2NoRDRjQX/Iua0H3iIJq4C3D+4sVOCg/Y+I7gd/G0v7fez/qvKX/S+91UZqaTmXSQ==" + }, + "bulma-steps": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bulma-steps/-/bulma-steps-2.2.1.tgz", + "integrity": "sha512-fD50xz49zPVAfsRNcwBR7rd1lgNdKrcsIXAfVMwMH9A6iDhauOTkiEJOxXj4xZuW/CI6JpV+fCgj5uIuN1lP3Q==" + }, + "bulma-switch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.0.tgz", + "integrity": "sha512-myD38zeUfjmdduq+pXabhJEe3x2hQP48l/OI+Y0fO3HdDynZUY/VJygucvEAJKRjr4HxD5DnEm4yx+oDOBXpAA==" + }, + "bulma-tagsinput": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bulma-tagsinput/-/bulma-tagsinput-2.0.0.tgz", + "integrity": "sha512-BFvd0oaxgeWHOEh3d4cgETy5vpSSjRRBA9w+8TWEuhjFQg38Rb+3vjDCavL+udpdjf+dRV0SK5T4kYCXTOrz5A==" + }, + "bulma-tooltip": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bulma-tooltip/-/bulma-tooltip-3.0.2.tgz", + "integrity": "sha512-CsT3APjhlZScskFg38n8HYL8oYNUHQtcu4sz6ERarxkUpBRbk9v0h/5KAvXeKapVSn2dp9l7bOGit5SECP8EWQ==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "requires": { + "streamsearch": "^1.1.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cacache": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", + "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", + "requires": { + "chownr": "^1.1.2", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + } + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001452", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001452.tgz", + "integrity": "sha512-Lkp0vFjMkBB3GTpLR8zk4NwW5EdRdnitwYJHDOOKIU85x4ckYCPQ+9WlVvSVClHxVReefkUMtWZH2l9KGlD51w==", + "dev": true + }, + "cdk-assets": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/cdk-assets/-/cdk-assets-2.62.2.tgz", + "integrity": "sha512-NbBLaHZ5NY+OSHBp+nQaEHIB+qsm3poySSpjnxsyWjX9OoaAMte5kknxpvu099NwFYWSk/DvWdNxec9UiA8JBw==", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "2.62.2", + "@aws-cdk/cx-api": "2.62.2", + "archiver": "^5.3.1", + "aws-sdk": "^2.1211.0", + "glob": "^7.2.3", + "mime": "^2.6.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "2.62.2", + "dev": true, + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + } + }, + "@aws-cdk/cx-api": { + "version": "2.62.2", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "2.62.2", + "semver": "^7.3.8" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "aws-sdk": { + "version": "2.1292.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1292.0.tgz#bff92d794b8bbb71628c2f7b9d799c34ef2f27b4", + "integrity": "sha512-GqN75aYmaZrirMCJI5CwvYW/bQRyBs59t/tDYBuwb9RMppL8vv9cEwGu3H74yxeoz89LyrbQtoOB8ZgHxNDNmA==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.4.19" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true + }, + "jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz#b185789b8e6a43491635b6953295c5c5e3fd224c", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "dev": true, + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } + } + } + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz", + "integrity": "sha1-cDhrG0jidz0NYxZqVa/5TvRFahI=" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + } + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "requires": { + "colors": "1.0.3" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "cls-bluebird": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", + "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "requires": { + "is-bluebird": "^1.0.2", + "shimmer": "^1.1.0" + } + }, + "cmake-js": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.3.2.tgz", + "integrity": "sha512-7MfiQ/ijzeE2kO+WFB9bv4QP5Dn2yVaAP2acFJr4NIFy2hT4w6O4EpOTLNcohR5IPX7M4wNf/5taIqMj7UA9ug==", + "dev": true, + "requires": { + "axios": "^0.21.1", + "bluebird": "^3", + "debug": "^4", + "fs-extra": "^5.0.0", + "is-iojs": "^1.0.1", + "lodash": "^4", + "memory-stream": "0", + "npmlog": "^1.2.0", + "rc": "^1.2.7", + "semver": "^5.0.3", + "splitargs": "0", + "tar": "^4", + "unzipper": "^0.8.13", + "url-join": "0", + "which": "^1.0.9", + "yargs": "^3.6.0" + }, + "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dev": true, + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, + "code-excerpt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", + "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "dev": true, + "requires": { + "convert-to-spaces": "^1.0.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "dev": true, + "requires": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "concurrently": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.1.tgz", + "integrity": "sha512-7cab/QyqipqghrVr9qZmoWbidu0nHsmxrpNqQ7r/67vfl1DWJElexehQnTH1p+87tDkihaAjM79xTZyBQh7HLw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "shell-quote": "^1.7.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^17.3.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "conf": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "dev": true, + "requires": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "dependencies": { + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constructs": { + "version": "10.1.250", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.250.tgz", + "integrity": "sha512-eF71tcgvo6jMO/NlPFWuUpJ0VrpA9kvRvusIFLPjfV6h75epVQPwyhPoVlS0hHFQsujQJNXMLltaeRZSGhILcw==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "convert-to-spaces": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", + "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==", + "dev": true + }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } + } + }, + "cookie-session": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.0.0.tgz", + "integrity": "sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==", + "requires": { + "cookies": "0.8.0", + "debug": "3.2.7", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "cool-checkboxes-for-bulma.io": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cool-checkboxes-for-bulma.io/-/cool-checkboxes-for-bulma.io-1.1.0.tgz", + "integrity": "sha512-RDEXOeS9COGTbQjlwRQzPRwOA8ycP4azc/GDVF5qYSOs4tYk6dc9SWNOj7Bb/NvhVUsb+H95pNtGgOBwCENBQg==" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true + }, + "crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "dev": true + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dev": true, + "requires": { + "mimic-fn": "^3.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + } + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "dendriform-immer-patch-optimiser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/dendriform-immer-patch-optimiser/-/dendriform-immer-patch-optimiser-2.1.3.tgz", + "integrity": "sha512-QG2IegUCdlhycVwsBOJ7SNd18PgzyWPxBivTzuF0E1KFxaU47fHy/frud74A9E66a4WXyFFp9FLLC2XQDkVj7g==", + "dev": true, + "requires": {} + }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dottie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "electron-to-chromium": { + "version": "1.4.295", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz", + "integrity": "sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.1.tgz", + "integrity": "sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "engine.io-client": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.3.tgz", + "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==", + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" + }, + "esbuild": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", + "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", + "requires": { + "@esbuild/android-arm": "0.17.3", + "@esbuild/android-arm64": "0.17.3", + "@esbuild/android-x64": "0.17.3", + "@esbuild/darwin-arm64": "0.17.3", + "@esbuild/darwin-x64": "0.17.3", + "@esbuild/freebsd-arm64": "0.17.3", + "@esbuild/freebsd-x64": "0.17.3", + "@esbuild/linux-arm": "0.17.3", + "@esbuild/linux-arm64": "0.17.3", + "@esbuild/linux-ia32": "0.17.3", + "@esbuild/linux-loong64": "0.17.3", + "@esbuild/linux-mips64el": "0.17.3", + "@esbuild/linux-ppc64": "0.17.3", + "@esbuild/linux-riscv64": "0.17.3", + "@esbuild/linux-s390x": "0.17.3", + "@esbuild/linux-x64": "0.17.3", + "@esbuild/netbsd-x64": "0.17.3", + "@esbuild/openbsd-x64": "0.17.3", + "@esbuild/sunos-x64": "0.17.3", + "@esbuild/win32-arm64": "0.17.3", + "@esbuild/win32-ia32": "0.17.3", + "@esbuild/win32-x64": "0.17.3" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", + "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", + "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", + "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", + "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", + "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", + "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", + "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", + "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", + "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", + "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", + "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", + "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", + "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", + "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", + "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", + "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", + "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", + "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", + "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", + "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", + "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", + "optional": true + } + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "express-handlebars": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.1.0.tgz", + "integrity": "sha512-7QlaXnSREMmN5P2o4gmpUZDfJlLtfBka9d6r7/ccXaU7rPp76odw9YYtwZYdIiha2JqwiaG6o2Wu6NZJQ0u7Fg==", + "requires": { + "glob": "^7.1.3", + "graceful-fs": "^4.1.2", + "handlebars": "^4.1.2", + "object.assign": "^4.1.0", + "promise": "^8.0.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-jwt": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/fast-jwt/-/fast-jwt-1.7.2.tgz", + "integrity": "sha512-OEInypGXJhtURzq9GbFM5KaALUu9+4IV3kJEbWPuqOBN5JBe7A51Tx0CaQYHGC9GNfZnr5npA0lCIMaWiZmz/A==", + "dev": true, + "requires": { + "asn1.js": "^5.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "mnemonist": "^0.39.0" + } + }, + "fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "dev": true, + "requires": { + "strnum": "^1.0.5" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "form-urlencoded": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/form-urlencoded/-/form-urlencoded-2.0.9.tgz", + "integrity": "sha512-fWUzNiOnYa126vFAT6TFXd1mhJrvD8IqmQ9ilZPjkLYQfaRreBr5fIUoOpPlWtqaAG64nzoE7u5zSetifab9IA==" + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", + "dev": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", + "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", + "dev": true + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "glob-all": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.3.1.tgz", + "integrity": "sha512-Y+ESjdI7ZgMwfzanHZYQ87C59jOO0i+Hd+QYtVt9PhLi6d8wlOpzQnfBxWUlaTuAoR3TkybLqqbIoWveU4Ji7Q==", + "dev": true, + "requires": { + "glob": "^7.2.3", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "requires": { + "ini": "^1.3.5" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "graphql": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "dev": true + }, + "graphql-helix": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/graphql-helix/-/graphql-helix-1.13.0.tgz", + "integrity": "sha512-cqDKMoRywKjnL0ZWCTB0GOiBgsH6d3nU4JGDF6RuzAyd35tmalzKpSxkx3NNp4H5RvnKWnrukWzR51wUq277ng==", + "dev": true, + "requires": {} + }, + "handlebars": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "immer": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", + "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "ink": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ink/-/ink-3.2.0.tgz", + "integrity": "sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "auto-bind": "4.0.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "code-excerpt": "^3.0.0", + "indent-string": "^4.0.0", + "is-ci": "^2.0.0", + "lodash": "^4.17.20", + "patch-console": "^1.0.0", + "react-devtools-core": "^4.19.1", + "react-reconciler": "^0.26.2", + "scheduler": "^0.20.2", + "signal-exit": "^3.0.2", + "slice-ansi": "^3.0.0", + "stack-utils": "^2.0.2", + "string-width": "^4.2.2", + "type-fest": "^0.12.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0", + "ws": "^7.5.5", + "yoga-layout-prebuilt": "^1.9.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "type-fest": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + } + } + }, + "ink-spinner": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-4.0.3.tgz", + "integrity": "sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==", + "dev": true, + "requires": { + "cli-spinners": "^2.3.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-bluebird": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", + "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true + }, + "is-iojs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", + "integrity": "sha512-tLn1j3wYSL6DkvEI+V/j0pKohpa5jk+ER74v6S4SgCXnjS0WA+DoZbwZBrrhgwksMvtuwndyGeG5F8YMsoBzSA==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "dev": true, + "requires": {} + }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=" + }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true + }, + "jose": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.11.4.tgz", + "integrity": "sha512-94FdcR8felat4vaTJyL/WVdtlWLlsnLMZP8v+A0Vru18K3bQ22vn7TtpVh3JlgBFNIlYOUlGqwp/MjRPOnIyCQ==", + "dev": true + }, + "js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "jshint": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", + "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-even-better-errors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz", + "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==" + }, + "json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", + "requires": { + "jju": "^1.1.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonapi-datastore": { + "version": "0.4.0-beta", + "resolved": "https://registry.npmjs.org/jsonapi-datastore/-/jsonapi-datastore-0.4.0-beta.tgz", + "integrity": "sha1-tJn86STUXivDxheGgVIAY+I2HxA=" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jszip": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.7.0.tgz", + "integrity": "sha512-JIsRKRVC3gTRo2vM4Wy9WBC3TRcfnIZU8k65Phi3izkvPH975FowRYtKGT6PxevA0XnJ/yO8b0QwV0ydVyQwfw==", + "dev": true, + "requires": { + "pako": "~1.0.2" + } + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "kysely": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.23.4.tgz", + "integrity": "sha512-3icLnj1fahUtZsP9zzOvF4DcdhekGsLX4ZaoBaIz0ZeHegyRDdbwpJD7zezAJ+KwQZNDeKchel6MikFNLsSZIA==", + "dev": true + }, + "kysely-codegen": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/kysely-codegen/-/kysely-codegen-0.9.0.tgz", + "integrity": "sha512-VCkrEY0WPwObvT4LGJkwLn29DXmvwG2oAv94qa+yAXDPAWtYTfO8NQSqyeEiNHEWmuKI+Sl+ANSn63by2Xn1tw==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "dotenv": "^16.0.3", + "micromatch": "^4.0.5", + "minimist": "^1.2.7" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true + } + } + }, + "kysely-data-api": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/kysely-data-api/-/kysely-data-api-0.1.4.tgz", + "integrity": "sha512-7xgXbNuhsBAOi3PWAc5vETt0kMPCMH9qeOSsmkoVVqhvswa9v3lWUxGOQGhg9ABQqFyTbJe+JdLgd/wChIMiFw==", + "dev": true, + "requires": {} + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "dev": true + }, + "libnpmconfig": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", + "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", + "requires": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", + "dev": true + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", + "dev": true + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "requires": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "dependencies": { + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true + } + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-stream": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", + "integrity": "sha512-q0D3m846qY6ZkIt+19ZemU5vH56lpOZZwoJc3AICARKh/menBuayQUjAGPrqtHQQMUYERSdOrej92J9kz7LgYA==", + "dev": true, + "requires": { + "readable-stream": "~1.0.26-2" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", + "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-pipeline": "^1.2.2", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mnemonist": { + "version": "0.39.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.5.tgz", + "integrity": "sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==", + "dev": true, + "requires": { + "obliterator": "^2.0.1" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "moment-timezone": { + "version": "0.5.38", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", + "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "mqtt": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz", + "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==", + "dev": true, + "requires": { + "commist": "^1.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "lru-cache": "^6.0.0", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "number-allocator": "^1.0.9", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^3.1.0", + "ws": "^7.5.5", + "xtend": "^4.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dev": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "dev": true, + "requires": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mysql2": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", + "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "requires": { + "denque": "^2.0.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "requires": { + "lru-cache": "^4.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==" + }, + "node-alias": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-alias/-/node-alias-1.0.4.tgz", + "integrity": "sha1-HxuRa1a56iQcATX5fO1pQPVW8pI=", + "requires": { + "chalk": "^1.1.1", + "lodash": "^4.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "requires": { + "clone": "2.x" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-check-updates": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-4.1.2.tgz", + "integrity": "sha512-CRO20Z12fygKL/ow4j4pnpyxevda/PuFbWpsF5E9sFW0B+M3d32A1dD+fTHLDjgderhKXr64W8qQ6M/Gq8OLiw==", + "requires": { + "chalk": "^3.0.0", + "cint": "^8.2.1", + "cli-table": "^0.3.1", + "commander": "^5.0.0", + "fast-diff": "^1.2.0", + "find-up": "4.1.0", + "get-stdin": "^7.0.0", + "json-parse-helpfulerror": "^1.0.3", + "libnpmconfig": "^1.2.1", + "lodash": "^4.17.15", + "node-alias": "^1.0.4", + "p-map": "^4.0.0", + "pacote": "^11.1.4", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "rc-config-loader": "^3.0.0", + "requireg": "^0.2.2", + "semver": "^7.2.1", + "semver-utils": "^1.1.4", + "spawn-please": "^0.3.0", + "update-notifier": "^4.1.0" + }, + "dependencies": { + "commander": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", + "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==" + } + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "requires": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.1.tgz", + "integrity": "sha512-95TSDvGwujIhqfSpIiRRLodEF+y6mJMopuZdahoGzqtRDFZXGav46S0p6ngeWaiAkb5R72w6eVARhzej0HvZeQ==", + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "npm-registry-fetch": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.1.5.tgz", + "integrity": "sha512-yZPNoJK9clx1jhSXU54kU6Aj1SV2p7mXUs1W/6OjQvek3wb1RrjDCrt4iY1+VX9eBQvvSGEpzNmYkRUaTL8rqg==", + "requires": { + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "dependencies": { + "agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", + "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "cacache": { + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz", + "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==", + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-fetch-happen": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", + "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-fetch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", + "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha512-1J5KqSRvESP6XbjPaXt2H6qDzgizLTM7x0y1cXIjP2PpvdCqyNC7TO3cPRKsuYlElbi/DwkzRRdG2zpmE0IktQ==", + "dev": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, + "number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "dev": true, + "requires": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", + "dev": true + }, + "oidc-token-hash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", + "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, + "openid-client": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.0.tgz", + "integrity": "sha512-hgJa2aQKcM2hn3eyVtN12tEA45ECjTJPXCgUh5YzTzy9qwapCvmDTVPWOcWVL0d34zeQoQ/hbG9lJhl3AYxJlQ==", + "dev": true, + "requires": { + "jose": "^4.10.0", + "lru-cache": "^6.0.0", + "object-hash": "^2.0.1", + "oidc-token-hash": "^5.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==" + } + } + }, + "ora": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", + "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "dev": true, + "requires": { + "bl": "^5.0.0", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "pacote": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.4.tgz", + "integrity": "sha512-eUGJvSSpWFZKn3z8gig/HgnBmUl6gIWByIIaHzSyEr3tOWX0w8tFEADXtpu8HGv5E0ShCeTP6enRq8iHKCHSvw==", + "requires": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.1.0", + "cacache": "^15.0.0", + "chownr": "^1.1.4", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.1", + "minipass-fetch": "^1.2.1", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^8.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "read-package-json-fast": "^1.1.3", + "rimraf": "^2.7.1", + "semver": "^7.1.3", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "which": "^2.0.2" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "requires": { + "passport-oauth2": "1.x.x" + } + }, + "passport-oauth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz", + "integrity": "sha1-kK/2M4dUDwIImvKM2tOep/gNd98=", + "requires": { + "passport-oauth1": "1.x.x", + "passport-oauth2": "1.x.x" + } + }, + "passport-oauth1": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.1.0.tgz", + "integrity": "sha1-p96YiiEfnPRoc3cTDqdN8ycwyRg=", + "requires": { + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "utils-merge": "1.x.x" + } + }, + "passport-oauth2": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.1.tgz", + "integrity": "sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ==", + "requires": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, + "passport-reddit": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/passport-reddit/-/passport-reddit-0.2.4.tgz", + "integrity": "sha1-TlgF2Rmo8o+Awjj32i2So4BnrMU=", + "requires": { + "passport-oauth": "1.x", + "pkginfo": "0.3.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "patch-console": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-1.0.0.tgz", + "integrity": "sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "patreon": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/patreon/-/patreon-0.4.1.tgz", + "integrity": "sha512-aLhjx4rg2BArTq0Kg61MrM4dkJnTQ9kPN8F6a2IlQoYVEtIH7kUK/dprClTx+QYQKlXMfKksN9NCux1YarQJsQ==", + "requires": { + "form-urlencoded": "^2.0.4", + "is-plain-object": "^2.0.4", + "isomorphic-fetch": "^2.2.1", + "jsonapi-datastore": "^0.4.0-beta" + } + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + } + } + }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" + }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "prettier": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", + "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", + "dev": true + }, + "prettier-plugin-tailwindcss": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.2.tgz", + "integrity": "sha512-5RjUbWRe305pUpc48MosoIp6uxZvZxrM6GyOgsbGLTce+ehePKNm7ziW2dLG2air9aXbGuXlHVSQQw4Lbosq3w==", + "dev": true, + "requires": {} + }, + "prisma": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.5.0.tgz", + "integrity": "sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew==", + "requires": { + "@prisma/engines": "4.5.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "promptly": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-3.2.0.tgz", + "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==", + "dev": true, + "requires": { + "read": "^1.0.4" + } + }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "rate-limiter-flexible": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.1.10.tgz", + "integrity": "sha512-Pa+8TPD4xYaiCUB5K4a/+j2FHDUe4HP1g49JmKEmkOkhqPaeVqxJsZuuVaza/svSCOT+V73vtsyBiSFK/e1yXw==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, + "rc-config-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-3.0.0.tgz", + "integrity": "sha512-bwfUSB37TWkHfP+PPjb/x8BUjChFmmBK44JMfVnU7paisWqZl/o5k7ttCH+EQLnrbn2Aq8Fo1LAsyUiz+WF4CQ==", + "requires": { + "debug": "^4.1.1", + "js-yaml": "^3.12.0", + "json5": "^2.1.1", + "require-from-string": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-devtools-core": { + "version": "4.27.2", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.2.tgz", + "integrity": "sha512-8SzmIkpO87alD7Xr6gWIEa1jHkMjawOZ+6egjazlnjB4UUcbnzGDf/vBJ4BzGuWWEM+pzrxuzsPpcMqlQkYK2g==", + "dev": true, + "requires": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "react-reconciler": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz", + "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-package-json-fast": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", + "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", + "requires": { + "json-parse-even-better-errors": "^2.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "dev": true, + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "registry-auth-token": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==", + "dev": true + }, + "remeda": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-1.6.1.tgz", + "integrity": "sha512-ywn4Tv2cPBj6hk0TEYMHusWVXu72yJNCaWUdMK7kc7x/PjQPBSvtMbmBWP4PQH791kpl3rPBe3ZVkJyPj3c+0g==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "requires": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + } + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "requires": { + "path-parse": "^1.0.5" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" + }, + "retry-as-promised": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", + "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "requires": { + "any-promise": "^1.3.0" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.15.0.tgz", + "integrity": "sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + }, + "sequelize": { + "version": "5.22.5", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.22.5.tgz", + "integrity": "sha512-ySIHof18sJbeVG4zjEvsDL490cd9S14/IhkCrZR/g0C/FPlZq1AzEJVeSAo++9/sgJH2eERltAIGqYQNgVqX/A==", + "requires": { + "bluebird": "^3.5.0", + "cls-bluebird": "^2.1.0", + "debug": "^4.1.1", + "dottie": "^2.0.0", + "inflection": "1.12.0", + "lodash": "^4.17.15", + "moment": "^2.24.0", + "moment-timezone": "^0.5.21", + "retry-as-promised": "^3.2.0", + "semver": "^6.3.0", + "sequelize-pool": "^2.3.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.7.0", + "wkx": "^0.4.8" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "sequelize-pool": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", + "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==" + } + } + }, + "serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "requires": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + }, + "socket.io": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz", + "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==", + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.6.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.5.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + }, + "socket.io-client": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz", + "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==", + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" + }, + "socket.io-parser": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz", + "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==", + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + } + } + }, + "socket.io-parser": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.2.tgz", + "integrity": "sha512-QFZBaZDNqZXeemwejc7D39jrq2eGK/qZuVDiMPKzZK1hLlNvjGilGt4ckfQZeVX4dGmuPzCytN9ZW1nQlEWjgA==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spawn-please": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-0.3.0.tgz", + "integrity": "sha1-2zOOxM/2Orxp8dDgjO6euL69nRE=" + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "splitargs": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", + "integrity": "sha512-UUFYD2oWbNwULH6WoVtLUOw8ch586B+HUqcsAjjjeoBQAM1bD4wZRXu01koaxyd8UeYpybWqW4h+lO1Okv40Tg==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "sst": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/sst/-/sst-2.0.23.tgz", + "integrity": "sha512-m9HCXNMUVxIHqqb7WwoS/brkuHGJfNo7o+S4EZj61d+u5V5HO+f7sgOc0LqGEVTJRcf1IMc6NWgWsfaUNkWNlw==", + "dev": true, + "requires": { + "@aws-cdk/aws-apigatewayv2-alpha": "^2.62.2-alpha.0", + "@aws-cdk/aws-apigatewayv2-authorizers-alpha": "^2.62.2-alpha.0", + "@aws-cdk/aws-apigatewayv2-integrations-alpha": "^2.62.2-alpha.0", + "@aws-cdk/cloud-assembly-schema": "2.62.2", + "@aws-cdk/cloudformation-diff": "2.62.2", + "@aws-cdk/cx-api": "2.62.2", + "@aws-cdk/region-info": "2.62.2", + "@aws-sdk/client-api-gateway": "3.208.0", + "@aws-sdk/client-cloudformation": "3.208.0", + "@aws-sdk/client-cloudfront": "3.208.0", + "@aws-sdk/client-iam": "3.208.0", + "@aws-sdk/client-iot": "3.208.0", + "@aws-sdk/client-iot-data-plane": "3.208.0", + "@aws-sdk/client-lambda": "3.208.0", + "@aws-sdk/client-rds-data": "3.208.0", + "@aws-sdk/client-s3": "3.208.0", + "@aws-sdk/client-ssm": "3.208.0", + "@aws-sdk/client-sts": "3.208.0", + "@aws-sdk/config-resolver": "3.208.0", + "@aws-sdk/credential-providers": "3.208.0", + "@aws-sdk/middleware-retry": "3.208.0", + "@aws-sdk/middleware-signing": "3.208.0", + "@aws-sdk/signature-v4-crt": "^3.31.0", + "@aws-sdk/smithy-client": "3.208.0", + "@babel/core": "^7.0.0-0", + "@babel/generator": "^7.20.5", + "@trpc/server": "9.16.0", + "adm-zip": "^0.5.10", + "archiver": "^5.3.1", + "aws-cdk": "2.62.2", + "aws-cdk-lib": "2.62.2", + "aws-iot-device-sdk": "^2.2.12", + "aws-sdk": "2.1252.0", + "builtin-modules": "3.2.0", + "cdk-assets": "2.62.2", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "ci-info": "^3.7.0", + "colorette": "^2.0.19", + "conf": "^10.2.0", + "constructs": "10.1.156", + "cross-spawn": "^7.0.3", + "dendriform-immer-patch-optimiser": "^2.1.0", + "dotenv": "^16.0.3", + "esbuild": "0.16.13", + "express": "^4.18.2", + "fast-jwt": "^1.6.1", + "get-port": "^6.1.2", + "glob": "^8.0.3", + "graphql": "*", + "graphql-helix": "^1.12.0", + "immer": "9", + "ink": "^3.2.0", + "ink-spinner": "^4.0.3", + "kysely": "^0.23.3", + "kysely-codegen": "^0.9.0", + "kysely-data-api": "^0.1.4", + "minimatch": "^6.1.6", + "openid-client": "^5.1.8", + "ora": "^6.1.2", + "promptly": "^3.2.0", + "react": "17.0.2", + "remeda": "^1.3.0", + "undici": "^5.12.0", + "uuid": "^9.0.0", + "ws": "^8.11.0", + "yaml": "1.10.2", + "yargs": "^17.6.2", + "zip-local": "^0.3.5" + }, + "dependencies": { + "@esbuild/linux-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.13.tgz", + "integrity": "sha512-S4wn2BimuhPcoArRtVrdHUKIymCCZcYAXQE47kUiX4yrUrEX2/ifn5eKNbZ5c1jJKUlh1gC2ESIN+iw3wQax3g==", + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "aws-cdk-lib": { + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.62.2.tgz", + "integrity": "sha512-ynyoEFQckICFJzbUd89pWjol3GGbxRF05E8BCPEyy++vLHJZdqaJxRL4REl4lrdznnkb1kvxtBSGg4cOkR4o3w==", + "dev": true, + "requires": { + "@aws-cdk/asset-awscli-v1": "^2.2.49", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.38", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.2.0", + "semver": "^7.3.8", + "yaml": "1.10.2" + }, + "dependencies": { + "@balena/dockerignore": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "case": { + "version": "1.6.3", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "bundled": true, + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "bundled": true, + "dev": true + }, + "ignore": { + "version": "5.2.4", + "bundled": true, + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonschema": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "punycode": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yaml": { + "version": "1.10.2", + "bundled": true, + "dev": true + } + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "constructs": { + "version": "10.1.156", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.156.tgz", + "integrity": "sha512-BTZ3Kyt++/YFlph/ioqbDhzSKVMqHRHvc99FxU4b705ZP6s2IkDxMLCMinC70USMTJWFbO1p02Egux7sk4q07A==", + "dev": true + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true + }, + "esbuild": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.13.tgz", + "integrity": "sha512-oYwFdSEIoKM1oYzyem1osgKJAvg5447XF+05ava21fOtilyb2HeQQh26/74K4WeAk5dZmj/Mx10zUqUnI14jhA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.13", + "@esbuild/android-arm64": "0.16.13", + "@esbuild/android-x64": "0.16.13", + "@esbuild/darwin-arm64": "0.16.13", + "@esbuild/darwin-x64": "0.16.13", + "@esbuild/freebsd-arm64": "0.16.13", + "@esbuild/freebsd-x64": "0.16.13", + "@esbuild/linux-arm": "0.16.13", + "@esbuild/linux-arm64": "0.16.13", + "@esbuild/linux-ia32": "0.16.13", + "@esbuild/linux-loong64": "0.16.13", + "@esbuild/linux-mips64el": "0.16.13", + "@esbuild/linux-ppc64": "0.16.13", + "@esbuild/linux-riscv64": "0.16.13", + "@esbuild/linux-s390x": "0.16.13", + "@esbuild/linux-x64": "0.16.13", + "@esbuild/netbsd-x64": "0.16.13", + "@esbuild/openbsd-x64": "0.16.13", + "@esbuild/sunos-x64": "0.16.13", + "@esbuild/win32-arm64": "0.16.13", + "@esbuild/win32-ia32": "0.16.13", + "@esbuild/win32-x64": "0.16.13" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "minimatch": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + }, + "ws": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "dev": true, + "requires": {} + }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + } + } + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=" + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "tailwindcss": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.6.tgz", + "integrity": "sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==", + "dev": true, + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.0.9", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "tar": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.10.tgz", + "integrity": "sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "uglify-js": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz", + "integrity": "sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g==", + "optional": true + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "undici": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.19.1.tgz", + "integrity": "sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A==", + "dev": true, + "requires": { + "busboy": "^1.6.0" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "unzipper": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", + "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "~1.0.10", + "listenercount": "~1.0.1", + "readable-stream": "~2.1.5", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==", + "dev": true + }, + "readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw==", + "dev": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + } + } + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + } + } + }, + "url-join": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", + "integrity": "sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw==", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "requires": { + "builtins": "^1.0.3" + } + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vite": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", + "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", + "dev": true, + "requires": { + "esbuild": "^0.16.14", + "fsevents": "~2.3.2", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.10.0" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "dependencies": { + "requires": { "defaults": "^1.0.3" } }, - "node_modules/webapp": { - "resolved": "services/webapp", - "link": true + "webapp": { + "version": "file:services/webapp", + "requires": { + "autoprefixer": "^10.4.13", + "postcss": "^8.4.21", + "prettier": "^2.8.4", + "prettier-plugin-tailwindcss": "^0.2.2", + "sst": "^2.0.16", + "tailwindcss": "^3.2.6", + "typescript": "^4.9.3", + "vite": "^4.1.0" + }, + "dependencies": { + "prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true + } + } }, - "node_modules/websocket-stream": { + "websocket-stream": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.2.tgz", "integrity": "sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ==", "dev": true, - "dependencies": { + "requires": { "duplexify": "^3.5.1", "inherits": "^2.0.1", "readable-stream": "^2.3.3", "safe-buffer": "^5.1.2", "ws": "^3.2.0", "xtend": "^4.0.0" - } - }, - "node_modules/websocket-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/websocket-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/websocket-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/websocket-stream/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, + }, "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } } }, - "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + "whatwg-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz", + "integrity": "sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w==" }, - "node_modules/which": { + "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { + "requires": { "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" } }, - "node_modules/which-module": { + "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, - "node_modules/which-typed-array": { + "which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, - "dependencies": { + "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/widest-line": { + "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { + "requires": { "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" } }, - "node_modules/window-size": { + "window-size": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", - "dev": true, - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } + "dev": true }, - "node_modules/wkx": { + "wkx": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", - "dependencies": { + "requires": { "@types/node": "*" } }, - "node_modules/wordwrap": { + "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "engines": { - "node": ">=0.4.0" - } + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, - "node_modules/wrap-ansi": { + "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "dependencies": { + "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, - "node_modules/wrappy": { + "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "node_modules/write-file-atomic": { + "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { + "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/xdg-basedir": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} + }, + "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, - "node_modules/xml2js": { + "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, - "dependencies": { + "requires": { "sax": ">=0.6.0", "xmlbuilder": "~9.0.1" } }, - "node_modules/xmlbuilder": { + "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } + "dev": true }, - "node_modules/xmlhttprequest-ssl": { + "xmlhttprequest-ssl": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", - "engines": { - "node": ">=0.4.0" - } + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==" }, - "node_modules/xtend": { + "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } + "dev": true }, - "node_modules/y18n": { + "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } + "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, - "node_modules/yaml": { + "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } + "dev": true }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, - "dependencies": { - "cliui": "^8.0.1", + "requires": { + "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" + "yargs-parser": "^21.0.0" } }, - "node_modules/yargs-parser": { + "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/yeast": { + "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" }, - "node_modules/yoga-layout-prebuilt": { + "yoga-layout-prebuilt": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", "dev": true, - "dependencies": { + "requires": { "@types/yoga-layout": "1.9.2" - }, - "engines": { - "node": ">=8" } }, - "node_modules/zip-local": { + "zip-local": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/zip-local/-/zip-local-0.3.5.tgz", "integrity": "sha512-GRV3D5TJY+/PqyeRm5CYBs7xVrKTKzljBoEXvocZu0HJ7tPEcgpSOYa2zFIsCZWgKWMuc4U3yMFgFkERGFIB9w==", "dev": true, - "dependencies": { + "requires": { "async": "^1.4.2", "graceful-fs": "^4.1.3", "jszip": "^2.6.1", "q": "^1.4.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + } } }, - "node_modules/zip-local/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, - "node_modules/zip-stream": { + "zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "dev": true, - "dependencies": { + "requires": { "archiver-utils": "^2.1.0", "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/zip-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } }, - { - "type": "consulting", - "url": "https://feross.org/support" + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } } - ] - }, - "node_modules/zip-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "services/express": { - "name": "@wg/express", - "version": "1.9.3", - "license": "GNU", - "dependencies": { - "@creativebulma/bulma-collapsible": "^1.0.4", - "@prisma/client": "^4.5.0", - "body-parser": "^1.19.0", - "bulma": "^0.8.1", - "bulma-accordion": "^2.0.1", - "bulma-badge": "^3.0.1", - "bulma-checkradio": "^1.1.1", - "bulma-divider": "^0.2.0", - "bulma-pageloader": "^0.3.0", - "bulma-quickview": "^2.0.0", - "bulma-steps": "^2.2.1", - "bulma-switch": "^2.0.0", - "bulma-tagsinput": "^2.0.0", - "bulma-tooltip": "^3.0.2", - "compression": "^1.7.4", - "cookie-parser": "^1.4.6", - "cookie-session": "^2.0.0", - "cool-checkboxes-for-bulma.io": "^1.1.0", - "crypto": "^1.0.1", - "dotenv": "^8.2.0", - "esbuild": "0.17.3", - "express": "^4.17.1", - "express-handlebars": "^3.0.0", - "jshint": "^2.11.0", - "jsonapi-datastore": "^0.4.0-beta", - "lodash": "^4.17.21", - "mysql2": "^2.1.0", - "node-cache": "^5.1.2", - "npm-check-updates": "^4.1.1", - "passport": "^0.4.1", - "passport-google-oauth20": "^2.0.0", - "passport-reddit": "^0.2.4", - "patreon": "^0.4.1", - "prisma": "^4.5.0", - "rate-limiter-flexible": "^2.1.10", - "sequelize": "^5.21.6", - "serve-favicon": "^2.5.0", - "socket.io": "^2.3.0" - }, - "devDependencies": { - "concurrently": "^7.2.1", - "glob-all": "^3.3.1", - "handlebars": "4.5.3", - "ncp": "^2.0.0", - "nodemon": "^2.0.2", - "prettier": "2.8.3" - } - }, - "services/functions": { - "name": "@wg/functions", - "version": "0.0.0", - "dependencies": { - "sst": "^2.0.7" - }, - "devDependencies": { - "@tsconfig/node18": "^1.0.1", - "@types/aws-lambda": "^8.10.110", - "@types/node": "^18.13.0", - "sst": "^2.0.7" - } - }, - "services/webapp": { - "version": "0.0.0", - "devDependencies": { - "autoprefixer": "^10.4.13", - "postcss": "^8.4.21", - "prettier": "^2.8.4", - "prettier-plugin-tailwindcss": "^0.2.2", - "sst": "^2.0.16", - "tailwindcss": "^3.2.6", - "typescript": "^4.9.3", - "vite": "^4.1.0" - } - }, - "services/webapp/node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" } } } From 9efe8bfc3a98facc12984e21bb620a6438dcf43a Mon Sep 17 00:00:00 2001 From: significantotter Date: Sun, 29 Jan 2023 10:25:01 -0500 Subject: [PATCH 02/11] moves legacy character-list code to a legacy file for the sake of example --- client/vue-src/App.vue | 10 - .../character-list/character-list-legacy.vue | 461 ++++++++++++++++++ .../character-list/character-list.vue | 449 +---------------- 3 files changed, 464 insertions(+), 456 deletions(-) create mode 100644 client/vue-src/views/dashboard/character-list/character-list-legacy.vue diff --git a/client/vue-src/App.vue b/client/vue-src/App.vue index eb11e240..c5c5b952 100644 --- a/client/vue-src/App.vue +++ b/client/vue-src/App.vue @@ -3,17 +3,7 @@ diff --git a/client/vue-src/views/dashboard/character-list/character-list.vue b/client/vue-src/views/dashboard/character-list/character-list.vue index a0a785ce..ff02ed80 100644 --- a/client/vue-src/views/dashboard/character-list/character-list.vue +++ b/client/vue-src/views/dashboard/character-list/character-list.vue @@ -1,450 +1,7 @@ - + From e5fc4eb5e0cd9f60fc1de63092899c7eae4100f5 Mon Sep 17 00:00:00 2001 From: significantotter Date: Sun, 29 Jan 2023 13:53:29 -0500 Subject: [PATCH 03/11] makes vue route proxying better with a /v/ prefix and adds vue-data routes to deliver frontend data --- client/package-lock.json | 238 +++++- client/package.json | 5 +- client/vite.config.ts | 10 +- client/vue-src/App.vue | 2 +- .../legacy-js/char_export/export-handler.js | 2 +- client/vue-src/legacy-js/character-list.js | 2 +- client/vue-src/main.ts | 36 +- client/vue-src/router.ts | 39 + client/vue-src/stores/characters.ts | 71 ++ client/vue-src/stores/user.ts | 42 ++ .../character-list/character-list-legacy.vue | 26 +- services/express/dev.env | 4 +- .../public/js/char_export/export-handler.js | 2 +- services/express/public/js/character-list.js | 2 +- services/express/routes/auth-routes.js | 6 +- services/express/routes/chardelete-routes.js | 2 +- services/express/routes/core-routes.js | 4 + services/express/routes/vue-data-routes.js | 89 +++ .../admin_builder/builder_ancestry.handlebars | 2 +- .../builder_archetype.handlebars | 2 +- .../builder_background.handlebars | 2 +- .../builder_class-feature.handlebars | 2 +- .../admin_builder/builder_class.handlebars | 2 +- .../admin_builder/builder_extra.handlebars | 2 +- .../builder_feat-action.handlebars | 2 +- .../admin_builder/builder_heritage.handlebars | 2 +- .../admin_builder/builder_item.handlebars | 2 +- .../admin_builder/builder_spell.handlebars | 2 +- .../builder_uni-heritage.handlebars | 2 +- .../admin_manager/manager_ancestry.handlebars | 2 +- .../manager_archetype.handlebars | 2 +- .../manager_background.handlebars | 2 +- .../manager_class-feature.handlebars | 2 +- .../admin_manager/manager_class.handlebars | 2 +- .../admin_manager/manager_creature.handlebars | 2 +- .../admin_manager/manager_extra.handlebars | 2 +- .../manager_feat-action.handlebars | 2 +- .../admin_manager/manager_heritage.handlebars | 2 +- .../admin_manager/manager_item.handlebars | 2 +- .../admin_manager/manager_spell.handlebars | 2 +- .../manager_uni-heritage.handlebars | 2 +- .../views/admin/admin_panel.handlebars | 2 +- .../express/views/docs/api_docs.handlebars | 2 +- .../express/views/docs/wsc_docs.handlebars | 2 +- .../views/gm_tools/shop_generator.handlebars | 2 +- .../homebrew/builder_creature.handlebars | 2 +- .../express/views/pages/browse.handlebars | 2 +- views/builder/build_planner_abc.handlebars | 425 +++++++++++ views/builder/build_planner_level.handlebars | 414 ++++++++++ views/builds/build_creator.handlebars | 417 ++++++++++ views/builds/build_creator_init.handlebars | 571 ++++++++++++++ views/builds/builds.handlebars | 110 +++ views/char_builder/char_builder.handlebars | 201 +++++ .../char_builder/char_builder_init.handlebars | 713 ++++++++++++++++++ views/docs/guidechar_docs.handlebars | 196 +++++ views/error/403_builder_error.handlebars | 51 ++ views/error/404_error.handlebars | 51 ++ views/error/500_error.handlebars | 52 ++ views/error/patreon_link_error.handlebars | 52 ++ .../error/private_character_error.handlebars | 51 ++ views/gm_tools/campaigns.handlebars | 259 +++++++ views/gm_tools/encounter_builder.handlebars | 331 ++++++++ views/gm_tools/gm_tools.handlebars | 116 +++ views/homebrew/builder_ancestry.handlebars | 475 ++++++++++++ .../builder_animal-companion.handlebars | 365 +++++++++ views/homebrew/builder_archetype.handlebars | 422 +++++++++++ views/homebrew/builder_background.handlebars | 142 ++++ .../homebrew/builder_class-feature.handlebars | 191 +++++ views/homebrew/builder_class.handlebars | 632 ++++++++++++++++ views/homebrew/builder_feat-action.handlebars | 296 ++++++++ views/homebrew/builder_heritage.handlebars | 123 +++ views/homebrew/builder_item.handlebars | 644 ++++++++++++++++ views/homebrew/builder_language.handlebars | 108 +++ views/homebrew/builder_spell.handlebars | 393 ++++++++++ views/homebrew/builder_toggleable.handlebars | 105 +++ views/homebrew/builder_trait.handlebars | 94 +++ .../homebrew/builder_uni-heritage.handlebars | 288 +++++++ views/pages/character_list.handlebars | 204 +++++ views/pages/home.handlebars | 172 +++++ views/pages/homebrew.handlebars | 128 ++++ views/pages/license.handlebars | 204 +++++ views/pages/login.handlebars | 69 ++ views/pages/material_stats.handlebars | 83 ++ views/pages/profile.handlebars | 246 ++++++ views/sheet/charsheet.handlebars | 683 +++++++++++++++++ 85 files changed, 10638 insertions(+), 79 deletions(-) create mode 100644 client/vue-src/router.ts create mode 100644 client/vue-src/stores/characters.ts create mode 100644 client/vue-src/stores/user.ts create mode 100644 services/express/routes/vue-data-routes.js create mode 100644 views/builder/build_planner_abc.handlebars create mode 100644 views/builder/build_planner_level.handlebars create mode 100644 views/builds/build_creator.handlebars create mode 100644 views/builds/build_creator_init.handlebars create mode 100644 views/builds/builds.handlebars create mode 100644 views/char_builder/char_builder.handlebars create mode 100644 views/char_builder/char_builder_init.handlebars create mode 100644 views/docs/guidechar_docs.handlebars create mode 100644 views/error/403_builder_error.handlebars create mode 100644 views/error/404_error.handlebars create mode 100644 views/error/500_error.handlebars create mode 100644 views/error/patreon_link_error.handlebars create mode 100644 views/error/private_character_error.handlebars create mode 100644 views/gm_tools/campaigns.handlebars create mode 100644 views/gm_tools/encounter_builder.handlebars create mode 100644 views/gm_tools/gm_tools.handlebars create mode 100644 views/homebrew/builder_ancestry.handlebars create mode 100644 views/homebrew/builder_animal-companion.handlebars create mode 100644 views/homebrew/builder_archetype.handlebars create mode 100644 views/homebrew/builder_background.handlebars create mode 100644 views/homebrew/builder_class-feature.handlebars create mode 100644 views/homebrew/builder_class.handlebars create mode 100644 views/homebrew/builder_feat-action.handlebars create mode 100644 views/homebrew/builder_heritage.handlebars create mode 100644 views/homebrew/builder_item.handlebars create mode 100644 views/homebrew/builder_language.handlebars create mode 100644 views/homebrew/builder_spell.handlebars create mode 100644 views/homebrew/builder_toggleable.handlebars create mode 100644 views/homebrew/builder_trait.handlebars create mode 100644 views/homebrew/builder_uni-heritage.handlebars create mode 100644 views/pages/character_list.handlebars create mode 100644 views/pages/home.handlebars create mode 100644 views/pages/homebrew.handlebars create mode 100644 views/pages/license.handlebars create mode 100644 views/pages/login.handlebars create mode 100644 views/pages/material_stats.handlebars create mode 100644 views/pages/profile.handlebars create mode 100644 views/sheet/charsheet.handlebars diff --git a/client/package-lock.json b/client/package-lock.json index 3d84a2c6..9a87b7c2 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,9 +8,11 @@ "name": "client", "version": "0.0.0", "dependencies": { - "jquery": "^3.6.3", + "axios": "^1.2.6", + "pinia": "^2.0.29", "socket.io": "^4.5.4", - "vue": "^3.2.45" + "vue": "^3.2.45", + "vue-router": "^4.1.6" }, "devDependencies": { "@types/jquery": "^3.5.16", @@ -534,6 +536,11 @@ "@vue/shared": "3.2.45" } }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, "node_modules/@vue/reactivity": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", @@ -602,6 +609,21 @@ "node": ">= 0.6" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.6.tgz", + "integrity": "sha512-rC/7F08XxZwjMV4iuWv+JpD3E0Ksqg9nac4IIg6RwNuF0JTeWoCo/mBNG54+tNhhI11G3/VDRbdDQTs9hGp4pQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -625,6 +647,17 @@ "balanced-match": "^1.0.0" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -672,6 +705,14 @@ } } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/engine.io": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", @@ -742,6 +783,38 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -795,11 +868,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" - }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -888,6 +956,56 @@ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, + "node_modules/pinia": { + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.29.tgz", + "integrity": "sha512-5z/KpFecq/cIgfeTnulJXldiLcTITRkTe3N58RKYSj0Pc1EdR6oyCdnf5A9jLoVwBqX5LtHhd0kGlpzWvk9oiQ==", + "dependencies": { + "@vue/devtools-api": "^6.4.5", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -911,6 +1029,11 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -1015,7 +1138,7 @@ "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1093,6 +1216,20 @@ "@vue/shared": "3.2.45" } }, + "node_modules/vue-router": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "dependencies": { + "@vue/devtools-api": "^6.4.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/vue-template-compiler": { "version": "2.7.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", @@ -1445,6 +1582,11 @@ "@vue/shared": "3.2.45" } }, + "@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, "@vue/reactivity": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", @@ -1507,6 +1649,21 @@ "negotiator": "0.6.3" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.6.tgz", + "integrity": "sha512-rC/7F08XxZwjMV4iuWv+JpD3E0Ksqg9nac4IIg6RwNuF0JTeWoCo/mBNG54+tNhhI11G3/VDRbdDQTs9hGp4pQ==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1527,6 +1684,14 @@ "balanced-match": "^1.0.0" } }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -1560,6 +1725,11 @@ "ms": "2.1.2" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "engine.io": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", @@ -1617,6 +1787,21 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -1654,11 +1839,6 @@ "has": "^1.0.3" } }, - "jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" - }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -1726,6 +1906,23 @@ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, + "pinia": { + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.29.tgz", + "integrity": "sha512-5z/KpFecq/cIgfeTnulJXldiLcTITRkTe3N58RKYSj0Pc1EdR6oyCdnf5A9jLoVwBqX5LtHhd0kGlpzWvk9oiQ==", + "requires": { + "@vue/devtools-api": "^6.4.5", + "vue-demi": "*" + }, + "dependencies": { + "vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "requires": {} + } + } + }, "postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -1736,6 +1933,11 @@ "source-map-js": "^1.0.2" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -1808,7 +2010,7 @@ "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true + "devOptional": true }, "vary": { "version": "1.1.2", @@ -1840,6 +2042,14 @@ "@vue/shared": "3.2.45" } }, + "vue-router": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "requires": { + "@vue/devtools-api": "^6.4.5" + } + }, "vue-template-compiler": { "version": "2.7.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", diff --git a/client/package.json b/client/package.json index 47be094d..db1e0451 100644 --- a/client/package.json +++ b/client/package.json @@ -9,8 +9,11 @@ "preview": "vite preview" }, "dependencies": { + "axios": "^1.2.6", + "pinia": "^2.0.29", "socket.io": "^4.5.4", - "vue": "^3.2.45" + "vue": "^3.2.45", + "vue-router": "^4.1.6" }, "devDependencies": { "@types/jquery": "^3.5.16", diff --git a/client/vite.config.ts b/client/vite.config.ts index 7d9f66dc..77f3e8b5 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -6,8 +6,16 @@ export default defineConfig({ plugins: [vue()], server: { proxy: { + + // There's probably a better way to do this, but I don't know my way around proxies well enough! + "/vue-data": { + target: "http://localhost:3000", + changeOrigin: false, + secure: false, + ws: true, + }, // There's probably a better way to do this, but I don't know my way around proxies well enough! - "^(?!(/profile/characters\/?$)|(.*vue)|(.*vite)).*": { + "^(?!(/v/)|(.*vue)|(.*vite)).*": { target: "http://localhost:3000", changeOrigin: false, secure: false, diff --git a/client/vue-src/App.vue b/client/vue-src/App.vue index c5c5b952..778aba56 100644 --- a/client/vue-src/App.vue +++ b/client/vue-src/App.vue @@ -1,5 +1,5 @@ + diff --git a/services/express/dev.env b/services/express/dev.env index 21777448..7af65723 100644 --- a/services/express/dev.env +++ b/services/express/dev.env @@ -1,6 +1,6 @@ CLOUD_SQL_USERNAME = root CLOUD_SQL_PASSWORD = password -CLOUD_DB_HOST = mysql +CLOUD_DB_HOST = localhost CLOUD_DB_PORT = 3306 BACK_DB_NAME = wandeide_main CONTENT_DB_NAME = wandeide_main @@ -22,4 +22,4 @@ PATREON_CLIENT_SECRET = PRODUCTION = false -DATABASE_URL = mysql://root:password@host.docker.internal:3306/wandeide_main?ssl-mode=REQUIRED?schema=wandeide_main \ No newline at end of file +DATABASE_URL = mysql://root:password@localhost:3306/wandeide_main?ssl-mode=REQUIRED?schema=wandeide_main \ No newline at end of file diff --git a/services/express/public/js/char_export/export-handler.js b/services/express/public/js/char_export/export-handler.js index 8c9ed3d6..a7c1d585 100644 --- a/services/express/public/js/char_export/export-handler.js +++ b/services/express/public/js/char_export/export-handler.js @@ -38,5 +38,5 @@ function copyCharacter(charID){ socket.on("returnCharCopy", function(){ // Hardcoded redirect - window.location.href = '/profile/characters'; + window.location.href = '/v/profile/characters'; }); diff --git a/services/express/public/js/character-list.js b/services/express/public/js/character-list.js index 7e29536a..d8d7f058 100644 --- a/services/express/public/js/character-list.js +++ b/services/express/public/js/character-list.js @@ -135,7 +135,7 @@ function initCharacterImport(){ socket.on("returnCharImport", function(){ // Hardcoded redirect - window.location.href = '/profile/characters'; + window.location.href = '/v/profile/characters'; }); diff --git a/services/express/routes/auth-routes.js b/services/express/routes/auth-routes.js index 64c46b2e..f3e404a6 100644 --- a/services/express/routes/auth-routes.js +++ b/services/express/routes/auth-routes.js @@ -75,7 +75,7 @@ function handlePatreonAccess(req, res) { apiClient("/current_user") .then((result) => { console.log("Patreon - Valid Access Token - OK"); - res.redirect("/profile/characters"); + res.redirect("/v/profile/characters"); }) .catch((err) => { if (req.user.patreonRefreshToken != null) { @@ -114,7 +114,7 @@ function handlePatreonAccess(req, res) { }); } else { console.log("Patreon - No Access Token - OK"); - res.redirect("/profile/characters"); + res.redirect("/v/profile/characters"); } } @@ -307,7 +307,7 @@ function attemptAccessTokenRefresh(res, userID, refreshToken) { patreonRefreshToken: refresh_token, }; User.update(updateValues, { where: { id: userID } }).then((result) => { - res.redirect("/profile/characters"); + res.redirect("/v/profile/characters"); }); }) .catch((err) => { diff --git a/services/express/routes/chardelete-routes.js b/services/express/routes/chardelete-routes.js index 18f56e4f..47c96644 100644 --- a/services/express/routes/chardelete-routes.js +++ b/services/express/routes/chardelete-routes.js @@ -19,7 +19,7 @@ router.get("*", (req, res) => { Character.destroy({ where: { id: character.id }, }).then((result) => { - res.redirect("/profile/characters"); + res.redirect("/v/profile/characters"); }); }); } else { diff --git a/services/express/routes/core-routes.js b/services/express/routes/core-routes.js index 5a5d67cb..340d26ad 100644 --- a/services/express/routes/core-routes.js +++ b/services/express/routes/core-routes.js @@ -5,6 +5,10 @@ const Sequelize = require("sequelize"); const homebrewRoutes = require("./homebrew/homebrew-routes"); const buildsRoutes = require("./builds/builds-routes"); const gmToolsRoutes = require("./gm_tools/gm-tools-routes"); +const vueDataRoutes = require("./vue-data-routes"); + +// Vue Data Route +router.use("/vue-data", vueDataRoutes); // Home Route router.get("/", (req, res) => { diff --git a/services/express/routes/vue-data-routes.js b/services/express/routes/vue-data-routes.js new file mode 100644 index 00000000..4a7d060d --- /dev/null +++ b/services/express/routes/vue-data-routes.js @@ -0,0 +1,89 @@ +const router = require("express").Router(); +const Character = require("../models/contentDB/Character"); + +const CharStateUtils = require("../js/CharStateUtils"); + +const Class = require("../models/contentDB/Class"); +const Ancestry = require("../models/contentDB/Ancestry"); +const Heritage = require("../models/contentDB/Heritage"); +const UniHeritage = require("../models/contentDB/UniHeritage"); + +router.get("/user", async (req, res) => { + try { + res.status(200).json({ + user: req.user, + }); + } catch (error) { + console.error(error); + res.status(500); + res.render("error/500_error", { + title: "500 Server Error - Wanderer's Guide", + user: req.user, + }); + } +}); +router.get("/characters", async (req, res) => { + // this is essentially the characters_list endpoint below, but just delivering data instead of a handlebars templateCharacter.findAll({ where: { userID: req.user.id } }) + try { + const [characters, classes, heritages, uniheritages, ancestries] = + await Promise.all([ + Character.findAll({ where: { userID: req.user.id }, raw: true }), + Class.findAll({ raw: true }), + Heritage.findAll({ raw: true }), + UniHeritage.findAll({ raw: true }), + Ancestry.findAll({ raw: true }), + ]); + + for (let character of characters) { + let cClass = classes.find((cClass) => { + return cClass.id == character.classID; + }); + character.className = cClass != null ? cClass.name : ""; + + if (character.heritageID != null) { + let heritage = heritages.find((heritage) => { + return heritage.id == character.heritageID; + }); + if (heritage != null) { + character.heritageName = heritage.name; + } + } else if (character.uniHeritageID != null) { + let heritageName = ""; + let uniHeritage = uniHeritages.find((uniHeritage) => { + return uniHeritage.id == character.uniHeritageID; + }); + if (uniHeritage != null) { + heritageName = uniHeritage.name; + } + + let ancestry = ancestries.find((ancestry) => { + return ancestry.id == character.ancestryID; + }); + heritageName += ancestry != null ? " " + ancestry.name : ""; + character.heritageName = heritageName; + } else { + let ancestry = ancestries.find((ancestry) => { + return ancestry.id == character.ancestryID; + }); + character.heritageName = ancestry != null ? ancestry.name : ""; + console.log(`set ${character.className} ${character.heritageName}`); + } + + character.isPlayable = CharStateUtils.isPlayable(character); + } + + res.status(200).json({ + characters, + canMakeCharacter: CharStateUtils.canMakeCharacter(req.user, characters), + characterLimit: CharStateUtils.getUserCharacterLimit(), + }); + } catch (error) { + console.error(error); + res.status(500); + res.render("error/500_error", { + title: "500 Server Error - Wanderer's Guide", + user: req.user, + }); + } +}); +module.exports = router; diff --git a/services/express/views/admin/admin_builder/builder_ancestry.handlebars b/services/express/views/admin/admin_builder/builder_ancestry.handlebars index 8be5f737..edc541cd 100644 --- a/services/express/views/admin/admin_builder/builder_ancestry.handlebars +++ b/services/express/views/admin/admin_builder/builder_ancestry.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -

                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_archetype.handlebars b/services/express/views/admin/admin_builder/builder_archetype.handlebars index 49bd5e1a..e1f5a2ee 100644 --- a/services/express/views/admin/admin_builder/builder_archetype.handlebars +++ b/services/express/views/admin/admin_builder/builder_archetype.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_background.handlebars b/services/express/views/admin/admin_builder/builder_background.handlebars index 27e953e4..d09b16e7 100644 --- a/services/express/views/admin/admin_builder/builder_background.handlebars +++ b/services/express/views/admin/admin_builder/builder_background.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_class-feature.handlebars b/services/express/views/admin/admin_builder/builder_class-feature.handlebars index 70a28648..ae791796 100644 --- a/services/express/views/admin/admin_builder/builder_class-feature.handlebars +++ b/services/express/views/admin/admin_builder/builder_class-feature.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_class.handlebars b/services/express/views/admin/admin_builder/builder_class.handlebars index 5e304efb..e8c17047 100644 --- a/services/express/views/admin/admin_builder/builder_class.handlebars +++ b/services/express/views/admin/admin_builder/builder_class.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_extra.handlebars b/services/express/views/admin/admin_builder/builder_extra.handlebars index c588059f..359265d4 100644 --- a/services/express/views/admin/admin_builder/builder_extra.handlebars +++ b/services/express/views/admin/admin_builder/builder_extra.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_feat-action.handlebars b/services/express/views/admin/admin_builder/builder_feat-action.handlebars index 7098cef0..86d7031e 100644 --- a/services/express/views/admin/admin_builder/builder_feat-action.handlebars +++ b/services/express/views/admin/admin_builder/builder_feat-action.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_heritage.handlebars b/services/express/views/admin/admin_builder/builder_heritage.handlebars index 77795dce..66cde992 100644 --- a/services/express/views/admin/admin_builder/builder_heritage.handlebars +++ b/services/express/views/admin/admin_builder/builder_heritage.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_item.handlebars b/services/express/views/admin/admin_builder/builder_item.handlebars index 38aa211b..f4f4f5fd 100644 --- a/services/express/views/admin/admin_builder/builder_item.handlebars +++ b/services/express/views/admin/admin_builder/builder_item.handlebars @@ -15,7 +15,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_spell.handlebars b/services/express/views/admin/admin_builder/builder_spell.handlebars index 24b9a425..f1f7334f 100644 --- a/services/express/views/admin/admin_builder/builder_spell.handlebars +++ b/services/express/views/admin/admin_builder/builder_spell.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_builder/builder_uni-heritage.handlebars b/services/express/views/admin/admin_builder/builder_uni-heritage.handlebars index 4de1549c..b50ed216 100644 --- a/services/express/views/admin/admin_builder/builder_uni-heritage.handlebars +++ b/services/express/views/admin/admin_builder/builder_uni-heritage.handlebars @@ -14,7 +14,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_ancestry.handlebars b/services/express/views/admin/admin_manager/manager_ancestry.handlebars index 4a262b26..b1849265 100644 --- a/services/express/views/admin/admin_manager/manager_ancestry.handlebars +++ b/services/express/views/admin/admin_manager/manager_ancestry.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_archetype.handlebars b/services/express/views/admin/admin_manager/manager_archetype.handlebars index 64d742af..2aa470fa 100644 --- a/services/express/views/admin/admin_manager/manager_archetype.handlebars +++ b/services/express/views/admin/admin_manager/manager_archetype.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_background.handlebars b/services/express/views/admin/admin_manager/manager_background.handlebars index 6b182d89..40939445 100644 --- a/services/express/views/admin/admin_manager/manager_background.handlebars +++ b/services/express/views/admin/admin_manager/manager_background.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_class-feature.handlebars b/services/express/views/admin/admin_manager/manager_class-feature.handlebars index fe2ea49e..f714c63a 100644 --- a/services/express/views/admin/admin_manager/manager_class-feature.handlebars +++ b/services/express/views/admin/admin_manager/manager_class-feature.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_class.handlebars b/services/express/views/admin/admin_manager/manager_class.handlebars index 5d39c8a9..393265cd 100644 --- a/services/express/views/admin/admin_manager/manager_class.handlebars +++ b/services/express/views/admin/admin_manager/manager_class.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_creature.handlebars b/services/express/views/admin/admin_manager/manager_creature.handlebars index 36fb94ba..776e5420 100644 --- a/services/express/views/admin/admin_manager/manager_creature.handlebars +++ b/services/express/views/admin/admin_manager/manager_creature.handlebars @@ -26,7 +26,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_extra.handlebars b/services/express/views/admin/admin_manager/manager_extra.handlebars index b72b0889..e1a5e5f4 100644 --- a/services/express/views/admin/admin_manager/manager_extra.handlebars +++ b/services/express/views/admin/admin_manager/manager_extra.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_feat-action.handlebars b/services/express/views/admin/admin_manager/manager_feat-action.handlebars index bdcd55ac..3a5776a9 100644 --- a/services/express/views/admin/admin_manager/manager_feat-action.handlebars +++ b/services/express/views/admin/admin_manager/manager_feat-action.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_heritage.handlebars b/services/express/views/admin/admin_manager/manager_heritage.handlebars index fcddea3d..3f9b1ebf 100644 --- a/services/express/views/admin/admin_manager/manager_heritage.handlebars +++ b/services/express/views/admin/admin_manager/manager_heritage.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_item.handlebars b/services/express/views/admin/admin_manager/manager_item.handlebars index e3521553..50f9bdd6 100644 --- a/services/express/views/admin/admin_manager/manager_item.handlebars +++ b/services/express/views/admin/admin_manager/manager_item.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_spell.handlebars b/services/express/views/admin/admin_manager/manager_spell.handlebars index 2803a323..0e90cc52 100644 --- a/services/express/views/admin/admin_manager/manager_spell.handlebars +++ b/services/express/views/admin/admin_manager/manager_spell.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_manager/manager_uni-heritage.handlebars b/services/express/views/admin/admin_manager/manager_uni-heritage.handlebars index 72667d33..f58f2e55 100644 --- a/services/express/views/admin/admin_manager/manager_uni-heritage.handlebars +++ b/services/express/views/admin/admin_manager/manager_uni-heritage.handlebars @@ -9,7 +9,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/admin/admin_panel.handlebars b/services/express/views/admin/admin_panel.handlebars index 092111b2..6b5ca1d2 100644 --- a/services/express/views/admin/admin_panel.handlebars +++ b/services/express/views/admin/admin_panel.handlebars @@ -10,7 +10,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/docs/api_docs.handlebars b/services/express/views/docs/api_docs.handlebars index aa47be6b..6a3a0539 100644 --- a/services/express/views/docs/api_docs.handlebars +++ b/services/express/views/docs/api_docs.handlebars @@ -12,7 +12,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/docs/wsc_docs.handlebars b/services/express/views/docs/wsc_docs.handlebars index 28bef2de..8a85294c 100644 --- a/services/express/views/docs/wsc_docs.handlebars +++ b/services/express/views/docs/wsc_docs.handlebars @@ -12,7 +12,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/gm_tools/shop_generator.handlebars b/services/express/views/gm_tools/shop_generator.handlebars index e088afe1..eba46800 100644 --- a/services/express/views/gm_tools/shop_generator.handlebars +++ b/services/express/views/gm_tools/shop_generator.handlebars @@ -38,7 +38,7 @@ {{/section}} {{#section 'nav_characters'}} -
                    • Characters
                    • +
                    • Characters
                    • {{/section}} {{#section 'nav_builds'}} diff --git a/services/express/views/homebrew/builder_creature.handlebars b/services/express/views/homebrew/builder_creature.handlebars index eb904128..606219d7 100644 --- a/services/express/views/homebrew/builder_creature.handlebars +++ b/services/express/views/homebrew/builder_creature.handlebars @@ -22,7 +22,7 @@ {{#section "nav_characters"}}
                    • Characters
                    • {{/section}} diff --git a/services/express/views/pages/browse.handlebars b/services/express/views/pages/browse.handlebars index 8def90e5..a0ad8462 100644 --- a/services/express/views/pages/browse.handlebars +++ b/services/express/views/pages/browse.handlebars @@ -50,7 +50,7 @@ {{#section "nav_characters"}}
                    • Characters
                    • {{/section}} diff --git a/views/builder/build_planner_abc.handlebars b/views/builder/build_planner_abc.handlebars new file mode 100644 index 00000000..8a537997 --- /dev/null +++ b/views/builder/build_planner_abc.handlebars @@ -0,0 +1,425 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +

                      +
                      +
                      +
                      + + + +
                      + + + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +

                      Home

                      +
                      +
                      +
                      + +
                      +

                      Ancestry

                      +
                      +
                      +
                      + + +
                      +
                      + +
                      +

                      Class

                      +
                      +
                      +
                      +
                      + +
                      +
                      +

                      Sheet

                      +
                      +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      +

                      ABC

                      +
                      +
                      + None +
                      +
                      + +
                      + +
                      +

                      Statistics

                      +
                      + + +
                      +
                      +

                      Str

                      +

                      Dex

                      +

                      Con

                      +

                      Int

                      +

                      Wis

                      +

                      Cha

                      +
                      +
                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +
                      +
                      + + +
                      +
                      Hit Points
                      +

                      130

                      +

                      (at max)

                      +
                      + + +
                      +
                      Class DC
                      +

                      18

                      +

                      E

                      +
                      + + +
                      +
                      Perception
                      +

                      +28

                      +

                      T

                      +
                      + + +
                      +
                      + Skills + + + +
                      + +
                      + + +
                      +
                      + Saves + + + +
                      + +
                      + + +
                      +
                      + Attacks + + + +
                      + +
                      + + +
                      +
                      + Defenses + + + +
                      + +
                      + + +
                      +
                      + Spellcasting + + + +
                      + +
                      + + +
                      +
                      + Languages + + + +
                      + +
                      + + +
                      +
                      + Resist & Weaks + + + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + + +{{#section 'overlay'}} + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + +
                      +
                      +

                      Statistics

                      +
                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +{{/section}} \ No newline at end of file diff --git a/views/builder/build_planner_level.handlebars b/views/builder/build_planner_level.handlebars new file mode 100644 index 00000000..8e139a42 --- /dev/null +++ b/views/builder/build_planner_level.handlebars @@ -0,0 +1,414 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +

                      +
                      +
                      +
                      + + + +
                      + + + +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +

                      Ancestry

                      +
                      +
                      + None +
                      +
                      +
                      +
                      +

                      Background

                      +
                      +
                      + None +
                      +
                      +
                      +
                      +

                      Class

                      +
                      +
                      + None +
                      +
                      + +
                      +
                      +

                      Statistics

                      +
                      + + +
                      +
                      +

                      Str

                      +

                      Dex

                      +

                      Con

                      +

                      Int

                      +

                      Wis

                      +

                      Cha

                      +
                      +
                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +
                      +
                      + + +
                      +
                      Hit Points
                      +

                      130

                      +

                      (at max)

                      +
                      + + +
                      +
                      Class DC
                      +

                      18

                      +

                      E

                      +
                      + + +
                      +
                      Perception
                      +

                      +28

                      +

                      T

                      +
                      + + +
                      +
                      + Skills + + + +
                      + +
                      + + +
                      +
                      + Saves + + + +
                      + +
                      + + +
                      +
                      + Attacks + + + +
                      + +
                      + + +
                      +
                      + Defenses + + + +
                      + +
                      + + +
                      +
                      + Spellcasting + + + +
                      + +
                      + + +
                      +
                      + Languages + + + +
                      + +
                      + + +
                      +
                      + Resist & Weaks + + + +
                      + +
                      + +
                      +
                      +
                      +
                      +
                      +
                      +
                      + +
                      +
                      +
                      + +
                      +
                      +

                      Home

                      +
                      +
                      +
                      + +
                      +

                      Creation

                      +
                      +
                      +
                      +
                      + +
                      +
                      +

                      Sheet

                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + + +{{#section 'overlay'}} + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + +
                      +
                      +

                      Statistics

                      +
                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +{{/section}} \ No newline at end of file diff --git a/views/builds/build_creator.handlebars b/views/builds/build_creator.handlebars new file mode 100644 index 00000000..7a144e06 --- /dev/null +++ b/views/builds/build_creator.handlebars @@ -0,0 +1,417 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +

                      +
                      +
                      +
                      + + + +
                      + + + +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +

                      Ancestry

                      +
                      +
                      + None +
                      +
                      +
                      +
                      +

                      Background

                      +
                      +
                      + None +
                      +
                      +
                      +
                      +

                      Class

                      +
                      +
                      + None +
                      +
                      + +
                      +
                      +

                      Statistics

                      +
                      + + +
                      +
                      +

                      Str

                      +

                      Dex

                      +

                      Con

                      +

                      Int

                      +

                      Wis

                      +

                      Cha

                      +
                      +
                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +

                      10

                      +
                      +
                      + + +
                      +
                      Hit Points
                      +

                      130

                      +

                      (at max)

                      +
                      + + +
                      +
                      Class DC
                      +

                      18

                      +

                      E

                      +
                      + + +
                      +
                      Perception
                      +

                      +28

                      +

                      T

                      +
                      + + +
                      +
                      + Skills + + + +
                      + +
                      + + +
                      +
                      + Saves + + + +
                      + +
                      + + +
                      +
                      + Attacks + + + +
                      + +
                      + + +
                      +
                      + Defenses + + + +
                      + +
                      + + +
                      +
                      + Spellcasting + + + +
                      + +
                      + + +
                      +
                      + Languages + + + +
                      + +
                      + + +
                      +
                      + Resist & Weaks + + + +
                      + +
                      + +
                      +
                      +
                      +
                      +
                      +
                      +
                      + +
                      +
                      +
                      + +
                      +
                      +

                      Home

                      +
                      +
                      +
                      + +
                      +

                      Creation

                      +
                      +
                      +
                      +
                      + +
                      +
                      +

                      Publish

                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + + +{{#section 'overlay'}} + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + +
                      +
                      +

                      Statistics

                      +
                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +{{/section}} \ No newline at end of file diff --git a/views/builds/build_creator_init.handlebars b/views/builds/build_creator_init.handlebars new file mode 100644 index 00000000..4826323b --- /dev/null +++ b/views/builds/build_creator_init.handlebars @@ -0,0 +1,571 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + + + +
                      + +

                      Build Creator

                      + +
                      +
                      +
                      + +
                      +
                      +

                      Home

                      +
                      +
                      +
                      + +
                      +

                      Creation

                      +
                      +
                      +
                      +
                      + +
                      +
                      +

                      Publish

                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + + + + +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +

                      + You can write notes for specific feats you've selected by writing at the end of the description, each on their own line: "{feat name}: {notes}" +

                      +

                      + Example. +

                      +

                      + Goblin Song: A great option for easily lowering an enemy's Perception and Will saves, this can be an amazing tool in helping rogues and casters alike. +

                      +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + + + + +
                      + +
                      +
                      +
                      +

                      Books

                      +
                      + +
                      + Enable All +
                      +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      +

                      Lost Omens

                      +
                      +
                      +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      +

                      Adventure Paths

                      +
                      +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      +

                      Standalone Adventures

                      +
                      +
                      +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + + +
                      +

                      Other

                      +
                      +
                      +
                      + + +
                      + + + +
                      +
                      +
                      +
                      +
                      +

                      Homebrew

                      + +
                      + +
                      +
                      +
                      +
                      +
                      +
                      + + +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +

                      Variants

                      +
                      + +
                      +
                      +
                      + +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + +
                      +
                      + +
                      +

                      Options

                      +
                      + +
                      +
                      +
                      + +
                      + + +
                      + +
                      + + + +
                      + +
                      +
                      +
                      +
                      + +
                      + + + +
                      \ No newline at end of file diff --git a/views/builds/builds.handlebars b/views/builds/builds.handlebars new file mode 100644 index 00000000..22601785 --- /dev/null +++ b/views/builds/builds.handlebars @@ -0,0 +1,110 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      + +
                      + +
                      +
                      + + +
                      + +{{#section 'overlay'}} + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +{{/section}} \ No newline at end of file diff --git a/views/char_builder/char_builder.handlebars b/views/char_builder/char_builder.handlebars new file mode 100644 index 00000000..d5fcfced --- /dev/null +++ b/views/char_builder/char_builder.handlebars @@ -0,0 +1,201 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +

                      +
                      +
                      +
                      + + + +
                      + +
                      + +
                      + +
                      + + + +
                      + + + +
                      + +{{#if isPlayable}} +
                      + + + +
                      +{{/if}} + +
                      + +
                      + +{{#section 'overlay'}} + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + +
                      +
                      +

                      +
                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +{{/section}} \ No newline at end of file diff --git a/views/char_builder/char_builder_init.handlebars b/views/char_builder/char_builder_init.handlebars new file mode 100644 index 00000000..32fc6a35 --- /dev/null +++ b/views/char_builder/char_builder_init.handlebars @@ -0,0 +1,713 @@ + +{{#section 'header'}} + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + + + +
                      + +

                      Character Builder

                      + +
                      +
                      +
                      + +
                      +
                      +

                      Home

                      +
                      +
                      +
                      + +
                      +

                      Ancestry

                      +
                      +
                      +
                      + + +
                      +
                      + +
                      +

                      Class

                      +
                      +
                      +
                      + +
                      +

                      Creation

                      +
                      +
                      +
                      +
                      + +
                      +
                      +

                      Sheet

                      +
                      +
                      +
                      + +
                      + +
                      +
                      Campaign
                      + +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      + + +
                      + +
                      +
                      Build
                      +
                      + + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      Character Name
                      +
                      +
                      +
                      + + + + + + + +
                      +
                      + +
                      +
                      + +
                      +
                      Level
                      +
                      +
                      + +
                      + + +
                      +
                      +
                      +
                      + + + +
                      + +
                      +
                      +

                      Ability Scores

                      +

                      (usually left unchanged as 10's)

                      +
                      +
                      +
                      +

                      STR

                      + +
                      +
                      +

                      DEX

                      + +
                      +
                      +

                      CON

                      + +
                      +
                      +

                      INT

                      + +
                      +
                      +

                      WIS

                      + +
                      +
                      +

                      CHA

                      + +
                      +
                      +
                      + + +
                      + +
                      +
                      +
                      +

                      Books

                      +
                      + +
                      + Enable All +
                      +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      +

                      Lost Omens

                      +
                      +
                      +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      +

                      Adventure Paths

                      +
                      +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      +

                      Standalone Adventures

                      +
                      +
                      +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + + +
                      +

                      Other

                      +
                      +
                      +
                      + + +
                      + + + +
                      +
                      +
                      +
                      +
                      +

                      Homebrew

                      + +
                      + +
                      +
                      +
                      +
                      +
                      +
                      + + +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +

                      Variants

                      +
                      + +
                      +
                      +
                      + +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + +
                      +
                      + +
                      +

                      Options

                      +
                      + +
                      +
                      +
                      + +
                      + + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      +
                      +
                      +
                      + +
                      + + + + + +
                      \ No newline at end of file diff --git a/views/docs/guidechar_docs.handlebars b/views/docs/guidechar_docs.handlebars new file mode 100644 index 00000000..874a13a5 --- /dev/null +++ b/views/docs/guidechar_docs.handlebars @@ -0,0 +1,196 @@ + +{{#section 'header'}} + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + + +
                      +
                      +
                      +
                      +
                      +
                      +

                      Guidechar File Documentation

                      +

                      + This documentation is for developering looking to understand the structure of guidechar files. +

                      +

                      + Guidechar files are TEXT type code files that follow a minified JSON file format. To open and read a file, it's recommended to use a text editor (like Notepad++) and copy the contents over to a JSON formatter (such as JSON Pretty Print). +

                      +

                      + When explaining the file structure, not all data will be covered - just the most important data worth noting. +

                      +
                      +
                      +
                      +

                      + Version 2 File Structure +

                      +
                      +
                      + +
                      +

                      version

                      +

                      File version.

                      +
                      +
                      +

                      character

                      +

                      Basic character info.

                      +
                      + +
                      +

                      _class

                      +

                      Basic information about the character's class (or null if unselected).

                      +
                      +
                      +

                      _background

                      +

                      Basic information about the character's background (or null if unselected).

                      +
                      +
                      +

                      _ancestry

                      +

                      Basic information about the character's ancestry (or null if unselected).

                      +
                      +
                      +

                      _heritage

                      +

                      Basic information about the character's heritage or versatile heritage (or null if unselected).

                      +
                      + +
                      +

                      build

                      +

                      Contains most of the selections made for the character when being built in the character builder. For example, what feats were selected when in the building process.

                      +
                      + +
                      +

                      boosts

                      +

                      A list of each ability boost (or flaw).

                      +
                      + +
                      +

                      Ability

                      +

                      The name of the targeted ability score.

                      +
                      +
                      +

                      Bonus

                      +

                      Whether it is a boost or flaw.

                      +
                      + +
                      +

                      domains

                      +

                      A list of each domains they have.

                      +
                      + +
                      +

                      value

                      +

                      Information about the domain.

                      +
                      + +
                      +

                      feats

                      +

                      A list of each feat they have.

                      +
                      + +
                      +

                      value

                      +

                      Information about the feat.

                      +
                      + +
                      +

                      languages

                      +

                      A list of each language they have.

                      +
                      + +
                      +

                      value

                      +

                      Information about the language.

                      +
                      + +
                      +

                      proficiencies

                      +

                      A list of each proficiency change.

                      +
                      + +
                      +

                      For

                      +

                      The category of what the proficiency change is going towards ('Skill' for Nature, 'Save' for Will, etc).

                      +
                      +
                      +

                      To

                      +

                      What the proficiency change is going towards (a skill, saving throw, weapon, etc).

                      +
                      +
                      +

                      Prof

                      +

                      The updated proficiency. 'UP' means a skill increase.

                      +
                      +
                      +

                      SourceName

                      +

                      The name of the feat or feature that gave this proficiency change.

                      +
                      + +
                      +

                      senses

                      +

                      A list of each sense they have. This can include common senses, like darkvision, to things like tremorsense.

                      +
                      + +
                      +

                      value

                      +

                      Information about the sense.

                      +
                      + + + +
                      +
                      +
                      +
                      +
                      +
                      +
                      \ No newline at end of file diff --git a/views/error/403_builder_error.handlebars b/views/error/403_builder_error.handlebars new file mode 100644 index 00000000..15c27d42 --- /dev/null +++ b/views/error/403_builder_error.handlebars @@ -0,0 +1,51 @@ + +{{#section 'header'}} + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +

                      Character Builder - Access Denied - 403

                      +

                      You cannot edit this character.

                      +
                      \ No newline at end of file diff --git a/views/error/404_error.handlebars b/views/error/404_error.handlebars new file mode 100644 index 00000000..956cbf50 --- /dev/null +++ b/views/error/404_error.handlebars @@ -0,0 +1,51 @@ + +{{#section 'header'}} + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +

                      Page Not Found - 404

                      +

                      This must not be the page you're looking for, huh.

                      +
                      \ No newline at end of file diff --git a/views/error/500_error.handlebars b/views/error/500_error.handlebars new file mode 100644 index 00000000..a0b94bae --- /dev/null +++ b/views/error/500_error.handlebars @@ -0,0 +1,52 @@ + +{{#section 'header'}} + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +

                      Server Error - 500

                      +

                      Oh no, an interanl server error must have occured.

                      +

                      Sorry for the inconvenience :/

                      +
                      \ No newline at end of file diff --git a/views/error/patreon_link_error.handlebars b/views/error/patreon_link_error.handlebars new file mode 100644 index 00000000..b7a82bf7 --- /dev/null +++ b/views/error/patreon_link_error.handlebars @@ -0,0 +1,52 @@ + +{{#section 'header'}} + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +

                      Patreon Account Linking Error

                      +

                      The Patreon account you attempted to link to is already linked to a different account.

                      +

                      If you believe this may be an error, please contact us on Patreon.

                      +
                      \ No newline at end of file diff --git a/views/error/private_character_error.handlebars b/views/error/private_character_error.handlebars new file mode 100644 index 00000000..1290c564 --- /dev/null +++ b/views/error/private_character_error.handlebars @@ -0,0 +1,51 @@ + +{{#section 'header'}} + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +

                      Private Character - 403

                      +

                      The character you're trying to view is private, sorry.

                      +
                      \ No newline at end of file diff --git a/views/gm_tools/campaigns.handlebars b/views/gm_tools/campaigns.handlebars new file mode 100644 index 00000000..335b986b --- /dev/null +++ b/views/gm_tools/campaigns.handlebars @@ -0,0 +1,259 @@ +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + + +
                      + +
                      +
                      +

                      Campaigns

                      + {{#ifEqual user.isPatreonMember 0}} + ({{campaigns.length}}/{{campaignLimit}}) + {{/ifEqual}} +
                      +
                      + {{#if canMakeCampaign}} + + {{else}} + + + + + + + Become a patron + + {{/if}} +
                      +
                      +
                      + + +
                      + {{#each campaigns}} + + {{else}} +
                      +

                      You have no campaigns.

                      +
                      + {{/each}} +
                      + +
                      + + +{{#section 'overlay'}} + + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + + + + + + + + + +{{/section}} \ No newline at end of file diff --git a/views/gm_tools/encounter_builder.handlebars b/views/gm_tools/encounter_builder.handlebars new file mode 100644 index 00000000..4bf45e71 --- /dev/null +++ b/views/gm_tools/encounter_builder.handlebars @@ -0,0 +1,331 @@ +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + + +
                      + +
                      + +

                      Encounters

                      + +
                      +
                      + +
                      +
                      + + + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      +

                      + + + + +

                      +
                      +
                      +

                      + + + Lvl + +

                      +
                      +
                      + +
                      + +
                      + + +
                      + +
                      +

                      + +

                      +

                      + +

                      +
                      + +
                      + +
                      + +
                      + +
                      + + + +
                      +
                      +

                      Init.

                      +
                      +
                      +

                      Name

                      +
                      +
                      + +
                      +
                      +

                      HP

                      +
                      +
                      +

                      Conditions

                      +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + 100% + +
                      + +
                      + +
                      + +
                      + + + +{{#section 'overlay'}} + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + +
                      +
                      +

                      +
                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + + + + + + + + + + + + + +{{/section}} \ No newline at end of file diff --git a/views/gm_tools/gm_tools.handlebars b/views/gm_tools/gm_tools.handlebars new file mode 100644 index 00000000..79ebfd71 --- /dev/null +++ b/views/gm_tools/gm_tools.handlebars @@ -0,0 +1,116 @@ + +{{#section 'header'}} + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + diff --git a/views/homebrew/builder_ancestry.handlebars b/views/homebrew/builder_ancestry.handlebars new file mode 100644 index 00000000..b4ae7306 --- /dev/null +++ b/views/homebrew/builder_ancestry.handlebars @@ -0,0 +1,475 @@ + +{{#section 'header'}} + + + + {{#if ancestryID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Ancestry Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + + +
                      + +
                      + + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + + + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + + + + +
                      + +
                      + +
                      +
                      + +
                      +
                      + + {{#if ancestryID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_animal-companion.handlebars b/views/homebrew/builder_animal-companion.handlebars new file mode 100644 index 00000000..6d0c2a5d --- /dev/null +++ b/views/homebrew/builder_animal-companion.handlebars @@ -0,0 +1,365 @@ + +{{#section 'header'}} + + + + {{#if spellID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Animal Companion Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + {{#if spellID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_archetype.handlebars b/views/homebrew/builder_archetype.handlebars new file mode 100644 index 00000000..322b0f29 --- /dev/null +++ b/views/homebrew/builder_archetype.handlebars @@ -0,0 +1,422 @@ + +{{#section 'header'}} + + + + {{#if archetypeID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Archetype Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +

                      Dedication Feat

                      +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      + + + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + + +
                      + +
                      + +
                      + +
                      +
                      + + + + + + + + + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + + + +
                      + +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + + + + +
                      + +
                      + +
                      +
                      + +
                      +
                      + {{#if archetypeID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_background.handlebars b/views/homebrew/builder_background.handlebars new file mode 100644 index 00000000..8315ee77 --- /dev/null +++ b/views/homebrew/builder_background.handlebars @@ -0,0 +1,142 @@ + +{{#section 'header'}} + + + + {{#if backgroundID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Background Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + {{#if backgroundID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_class-feature.handlebars b/views/homebrew/builder_class-feature.handlebars new file mode 100644 index 00000000..454b5a02 --- /dev/null +++ b/views/homebrew/builder_class-feature.handlebars @@ -0,0 +1,191 @@ + +{{#section 'header'}} + + + + {{#if classFeatureID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Class Feature Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      + + + +
                      + +
                      + +
                      +
                      + +
                      +
                      + {{#if classFeatureID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_class.handlebars b/views/homebrew/builder_class.handlebars new file mode 100644 index 00000000..b44fee54 --- /dev/null +++ b/views/homebrew/builder_class.handlebars @@ -0,0 +1,632 @@ + +{{#section 'header'}} + + + + {{#if classID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Class Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + + + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      + + +
                      + + +
                      + + +
                      + +
                      + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + +
                      + + +
                      + +
                      + +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + + + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + + + + +
                      + +
                      + +
                      +
                      + +
                      +
                      + {{#if classID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_feat-action.handlebars b/views/homebrew/builder_feat-action.handlebars new file mode 100644 index 00000000..ff55c747 --- /dev/null +++ b/views/homebrew/builder_feat-action.handlebars @@ -0,0 +1,296 @@ + +{{#section 'header'}} + + + + {{#if featID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Feat / Activity Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +

                      Use this builder to create any type of feat or basic activity.

                      +
                      +
                      +
                      +
                      + +
                      +
                      + + + +
                      +
                      + + + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + {{#if featID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_heritage.handlebars b/views/homebrew/builder_heritage.handlebars new file mode 100644 index 00000000..04a49aa4 --- /dev/null +++ b/views/homebrew/builder_heritage.handlebars @@ -0,0 +1,123 @@ + +{{#section 'header'}} + + + + {{#if heritageID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Heritage Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + {{#if heritageID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_item.handlebars b/views/homebrew/builder_item.handlebars new file mode 100644 index 00000000..137b33f2 --- /dev/null +++ b/views/homebrew/builder_item.handlebars @@ -0,0 +1,644 @@ + +{{#section 'header'}} + + + + {{#if itemID}} + + {{/if}} + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Item Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +

                      Use this builder to create general items, storage, weapons, armor, shields, or runes.

                      +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      + +
                      + + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + + + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + {{#if itemID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_language.handlebars b/views/homebrew/builder_language.handlebars new file mode 100644 index 00000000..c52c9739 --- /dev/null +++ b/views/homebrew/builder_language.handlebars @@ -0,0 +1,108 @@ + +{{#section 'header'}} + + + + {{#if languageID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Language Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + {{#if languageID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_spell.handlebars b/views/homebrew/builder_spell.handlebars new file mode 100644 index 00000000..e88fd470 --- /dev/null +++ b/views/homebrew/builder_spell.handlebars @@ -0,0 +1,393 @@ + +{{#section 'header'}} + + + + {{#if spellID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Spell Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + + +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + {{#if spellID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_toggleable.handlebars b/views/homebrew/builder_toggleable.handlebars new file mode 100644 index 00000000..44feb144 --- /dev/null +++ b/views/homebrew/builder_toggleable.handlebars @@ -0,0 +1,105 @@ + +{{#section 'header'}} + + + + {{#if toggleableID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Toggleable Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + {{#if toggleableID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_trait.handlebars b/views/homebrew/builder_trait.handlebars new file mode 100644 index 00000000..b90e8b3a --- /dev/null +++ b/views/homebrew/builder_trait.handlebars @@ -0,0 +1,94 @@ + +{{#section 'header'}} + + + + {{#if traitID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Trait Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      +
                      + +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + {{#if traitID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/homebrew/builder_uni-heritage.handlebars b/views/homebrew/builder_uni-heritage.handlebars new file mode 100644 index 00000000..54e39fb8 --- /dev/null +++ b/views/homebrew/builder_uni-heritage.handlebars @@ -0,0 +1,288 @@ + +{{#section 'header'}} + + + + {{#if uniHeritageID}} + + {{/if}} +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +
                      + +
                      +

                      Versatile Heritage Builder

                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      +
                      + +
                      +
                      +
                      + +
                      +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + +
                      + + + + +
                      + +
                      + +
                      +
                      + +
                      +
                      + {{#if uniHeritageID}} + + {{else}} + + {{/if}} +
                      +
                      \ No newline at end of file diff --git a/views/pages/character_list.handlebars b/views/pages/character_list.handlebars new file mode 100644 index 00000000..5ca24d80 --- /dev/null +++ b/views/pages/character_list.handlebars @@ -0,0 +1,204 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + + +
                      + +
                      +
                      +

                      Characters

                      + {{#ifEqual user.isPatreonMember 0}} + ({{characters.length}}/{{characterLimit}}) + {{/ifEqual}} +
                      +
                      + {{#if canMakeCharacter}} + + + + + + {{else}} + + + + + + + + + + + Become a patron + + + {{/if}} +
                      +
                      +
                      + + + + +
                      + + + + + + + + diff --git a/views/pages/home.handlebars b/views/pages/home.handlebars new file mode 100644 index 00000000..ed7e7bac --- /dev/null +++ b/views/pages/home.handlebars @@ -0,0 +1,172 @@ + +{{#section 'header'}} + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +
                      +
                      +

                      What is Wanderer's Guide?

                      +

                      + Wanderer's Guide is a semi-automated character manager for Pathfinder Second Edition. Designed for desktop and tablets, Wanderer's Guide has an interactive inventory, conditions, and spells management system. Character building in Wanderer's Guide is intuitive and easier than ever, try it out for yourself! +

                      + +

                      Pathfinder 2e and License

                      +

                      + This website uses trademarks and/or copyrights owned by Paizo Inc., which are used under Paizo's Community Use Policy. We are expressly prohibited from charging you to use or access this content. This website is not published, endorsed, or specifically approved by Paizo Inc. For more information about Paizo's Community Use Policy, please visit paizo.com/communityuse. For more information about Paizo Inc. and Paizo products, please visit paizo.com. +
                      + Wanderer's Guide is produced under the Open Game License 1.0a. +
                      + Pathfinder Second Edition contains an enormous amount of content, as such, there are a few features with ambiguous wording. In these cases, we try to follow the ruling of what the community generally agrees upon (we may also adjust the feature's wording to support this). If there is any doubt on how a mechanic or feature works, we highly recommend referring back to the source books. In addition, Wanderer's Guide contains features which are not included in the official Pathfinder Second Edition source material. These features are included in cases where we believe such content was missing in the source material and will be replaced by official content if it is made available in the future (examples include an item for a piece of paper, things like that). +

                      + +

                      Artwork

                      +

                      + Wanderer's Guide does not own any of the background artwork above. +

                      + +

                      + The creator of each piece has their name in the bottom right corner, which links to their website. +

                      + +
                      +
                      + + \ No newline at end of file diff --git a/views/pages/homebrew.handlebars b/views/pages/homebrew.handlebars new file mode 100644 index 00000000..5c2aa096 --- /dev/null +++ b/views/pages/homebrew.handlebars @@ -0,0 +1,128 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      + +
                      + +
                      +
                      + + +
                      + +{{#section 'overlay'}} + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +{{/section}} + + \ No newline at end of file diff --git a/views/pages/license.handlebars b/views/pages/license.handlebars new file mode 100644 index 00000000..64180041 --- /dev/null +++ b/views/pages/license.handlebars @@ -0,0 +1,204 @@ + +{{#section 'header'}} + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + +
                      +
                      +

                      Community Use Policy

                      +

                      + This website uses trademarks and/or copyrights owned by Paizo Publishing, LLC, which are used under Paizo's Community Use Policy. We are expressly prohibited from charging you to use or access this content. This website is not published, endorsed, or specifically approved by Paizo Publishing. For more information about Paizo's Community Use Policy, please visit paizo.com/communityuse. For more information about Paizo Publishing and Paizo products, please visit paizo.com. +

                      +

                      Open Game License

                      +

                      Open Game License Version 1.0a

                      +

                      + The following text is the property of Wizards of the Coast, Inc. and is Copyright 2000 Wizards of the Coast, Inc ("Wizards"). All Rights Reserved. +

                      +

                      + 1. Definitions: (a)"Contributors" means the copyright and/or trademark owners who have contributed Open Game Content; (b)"Derivative Material" means copyrighted material including derivative works and translations (including into other computer languages), potation, modification, correction, addition, extension, upgrade, improvement, compilation, abridgment or other form in which an existing work may be recast, transformed or adapted; (c) "Distribute" means to reproduce, license, rent, lease, sell, broadcast, publicly display, transmit or otherwise distribute; (d)"Open Game Content" means the game mechanic and includes the methods, procedures, processes and routines to the extent such content does not embody the Product Identity and is an enhancement over the prior art and any additional content clearly identified as Open Game Content by the Contributor, and means any work covered by this License, including translations and derivative works under copyright law, but specifically excludes Product Identity. (e) "Product Identity" means product and product line names, logos and identifying marks including trade dress; artifacts; creatures characters; stories, storylines, plots, thematic elements, dialogue, incidents, language, artwork, symbols, designs, depictions, likenesses, formats, poses, concepts, themes and graphic, photographic and other visual or audio representations; names and descriptions of characters, spells, enchantments, personalities, teams, personas, likenesses and special abilities; places, locations, environments, creatures, equipment, magical or supernatural abilities or effects, logos, symbols, or graphic designs; and any other trademark or registered trademark clearly identified as Product identity by the owner of the Product Identity, and which specifically excludes the Open Game Content; (f) "Trademark" means the logos, names, mark, sign, motto, designs that are used by a Contributor to identify itself or its products or the associated products contributed to the Open Game License by the Contributor (g) "Use", "Used" or "Using" means to use, Distribute, copy, edit, format, modify, translate and otherwise create Derivative Material of Open Game Content. (h) "You" or "Your" means the licensee in terms of this agreement. +

                      +

                      + 2. The License: This License applies to any Open Game Content that contains a notice indicating that the Open Game Content may only be Used under and in terms of this License. You must affix such a notice to any Open Game Content that you Use. No terms may be added to or subtracted from this License except as described by the License itself. No other terms or conditions may be applied to any Open Game Content distributed using this License. +

                      +

                      + 3. Offer and Acceptance: By Using the Open Game Content You indicate Your acceptance of the terms of this License. +

                      +

                      + 4. Grant and Consideration: In consideration for agreeing to use this License, the Contributors grant You a perpetual, worldwide, royalty-free, non-exclusive license with the exact terms of this License to Use, the Open Game Content. +

                      +

                      + 5. Representation of Authority to Contribute: If You are contributing original material as Open Game Content, You represent that Your Contributions are Your original creation and/or You have sufficient rights to grant the rights conveyed by this License. +

                      +

                      + 6. Notice of License Copyright: You must update the COPYRIGHT NOTICE portion of this License to include the exact text of the COPYRIGHT NOTICE of any Open Game Content You are copying, modifying or distributing, and You must add the title, the copyright date, and the copyright holder's name to the COPYRIGHT NOTICE of any original Open Game Content you Distribute. +

                      +

                      + 7. Use of Product Identity: You agree not to Use any Product Identity, including as an indication as to compatibility, except as expressly licensed in another, independent Agreement with the owner of each element of that Product Identity. You agree not to indicate compatibility or co-adaptability with any Trademark or Registered Trademark in conjunction with a work containing Open Game Content except as expressly licensed in another, independent Agreement with the owner of such Trademark or Registered Trademark. The use of any Product Identity in Open Game Content does not constitute a challenge to the ownership of that Product Identity. The owner of any Product Identity used in Open Game Content shall retain all rights, title and interest in and to that Product Identity. +

                      +

                      + 8. Identification: If you distribute Open Game Content You must clearly indicate which portions of the work that you are distributing are Open Game Content. +

                      +

                      + 9. Updating the License: Wizards or its designated Agents may publish updated versions of this License. You may use any authorized version of this License to copy, modify and distribute any Open Game Content originally distributed under any version of this License. +

                      +

                      + 10. Copy of this License: You MUST include a copy of this License with every copy of the Open Game Content You Distribute. +

                      +

                      + 11. Use of Contributor Credits: You may not market or advertise the Open Game Content using the name of any Contributor unless You have written permission from the Contributor to do so. +

                      +

                      + 12. Inability to Comply: If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Open Game Content due to statute, judicial order, or governmental regulation then You may not Use any Open Game Material so affected. +

                      +

                      + 13. Termination: This License will terminate automatically if You fail to comply with all terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses shall survive the termination of this License. +

                      +

                      + 14. Reformation: If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. +

                      +

                      + 15. COPYRIGHT NOTICE +

                      +

                      + Open Game License v 1.0 Copyright 2000, Wizards of the Coast, Inc. +

                      +

                      + System Reference Document. Copyright 2000. Wizards of the Coast, Inc; Authors: Jonathan Tweet, Monte Cook, Skip Williams, based on material by E. Gary Gygax and Dave Arneson. +

                      + +

                      Advanced Player's Guide

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Authors: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      +

                      Genie, Marid from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Pathfinder Advanced Player’s Guide © 2020, Paizo Inc.; Authors: Amirali Attar Olyaee, Alexander Augunas, Kate Baker, Brian Bauman, Logan Bonner, Carlos Cabrera, James Case, Jessica Catalan, John Compton, Paris Crenshaw, Jesse Decker, Fabby Garza Marroquín, Steven Hammond, Sasha Laranoa Harving, Joan Hong, Nicolas Hornyak, Vanessa Hoskins, James Jacobs, Erik Keith, Lyz Liddell, Luis Loza, Ron Lundeen, Patchen Mortimer, Dennis Muldoon, Stephen Radney-MacFarland, Jessica Redekop, Mikhail Rekun, Alex Riggs, David N. Ross, Michael Sayre, Mark Seifter, Kendra Leigh Speedling, Jason Tondro, Clark Valentine, and Andrew White.

                      + +

                      Age of Ashes Player's Guide

                      +

                      Age of Ashes Player’s Guide © 2019, Paizo Inc.; Authors: James Jacobs, with Amanda Hamon.

                      + +

                      Agents of Edgewatch Player's Guide

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Authors: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      +

                      Agents of Edgewatch Player's Guide © 2020, Paizo Inc.; Author: Patrick Renie.

                      + +

                      Bestiary

                      +

                      Daemon, Guardian from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Ian McDowall.

                      +

                      Dark Creeper from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Rik Shepard.

                      +

                      Dark Stalker from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Simon Muth.

                      +

                      Dragon, Faerie from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Brian Jaeger and Gary Gygax.

                      +

                      Genie, Marid from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Mite from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Ian Livingstone and Mark Barnes.

                      +

                      Pathfinder Bestiary (Second Edition) © 2019, Paizo Inc.; Authors: Alexander Augunas, Logan Bonner, Jason Bulmahn, John Compton, Paris Crenshaw, Adam Daigle, Eleanor Ferron, Leo Glass, Thurston Hillman, James Jacobs, Jason Keeley, Lyz Liddell, Ron Lundeen, Robert G. McCreary, Tim Nightengale, Stephen Radney-MacFarland, Alex Riggs, David N. Ross, Michael Sayre, Mark Seifter, Chris S. Sims, Jeffrey Swank, Jason Tondro, Tonya Woldridge, and Linda Zayas-Palmer.

                      + +

                      Bestiary 2

                      +

                      Angel, Monadic Deva from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Aurumvorax from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Basidirond from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Blindheim from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Roger Musson.

                      +

                      The Book of Fiends © 2003, Green Ronin Publishing; Authors: Aaron Loeb, Erik Mona, Chris Pramas, and Robert J. Schwalb.

                      +

                      Armies of the Abyss © 2002, Green Ronin Publishing; Authors: Erik Mona and Chris Pramas.

                      +

                      The Avatar's Handbook © 2003, Green Ronin Publishing; Authors: Jesse Decker and Chris Thomasson.

                      +

                      Book of the Righteous © 2002, Aaron Loeb.

                      +

                      Legions of Hell © 2001, Green Ronin Publishing; Author: Chris Pramas.

                      +

                      The Unholy Warrior's Handbook © 2003, Green Ronin Publishing; Author: Robert J. Schwalb.

                      +

                      Carbuncle from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Albie Fiore.

                      +

                      Cave Fisher from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Lawrence Schick.

                      +

                      Daemon, Derghodaemon from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Daemon, Piscodaemon from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Dark Creeper from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Rik Shepard.

                      +

                      Dark Stalker from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Simon Muth.

                      +

                      Demon, Nabasu from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Demon, Shadow from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Neville White.

                      +

                      Dracolisk from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Froghemoth from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Genie, Marid from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Grippli from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Korred from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Necrophidius from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Simon Tillbrook.

                      +

                      Nereid from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Quickling from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Quickwood from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Scythe Tree from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene.

                      +

                      Skulk from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Simon Muth.

                      +

                      Soul Eater from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by David Cook.

                      +

                      Troll, Two-Headed from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Oliver Charles MacDonald.

                      +

                      Yellow Musk Creeper from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Albie Fiore.

                      +

                      Yellow Musk Zombie from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Albie Fiore.

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Authors: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      +

                      Pathfinder Bestiary 2 (Second Edition) © 2020, Paizo Inc.; Authors: Alexander Augunas, Dennis Baker, Jesse Benner, Joseph Blomquist, Logan Bonner, Paris Crenshaw, Adam Daigle, Jesse Decker, Darrin Drader, Brian Duckwitz, Robert N. Emerson, Scott Fernandez, Keith Garrett, Scott Gladstein, Matthew Goodall, T.H. Gulliver, BJ Hensley, Tim Hitchcock, Vanessa Hoskins, James Jacobs, Brian R. James, Jason Keeley, John Laffan, Lyz Liddell, Colm Lundberg, Ron Lundeen, Jason Nelson, Randy Price, Jessica Redekop, Patrick Renie, Alistair Rigg, Alex Riggs, David N. Ross, David Schwartz, Mark Seifter, Amber Stewart, Jeffrey Swank, Russ Taylor, and Jason Tondro.

                      + +

                      Core Rulebook

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Designers: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      + +

                      Extinction Curse Player's Guide

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Authors: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      +

                      Extinction Curse Player’s Guide © 2020, Paizo Inc.; Author: Ron Lundeen.

                      + +

                      Gamemastery Guide

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Authors: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      +

                      Pathfinder Adventure Path #152: Legacy of the Lost God © 2020, Paizo Inc.; Authors: Jenny Jarzabski, with Stephen Glicker, Luis Loza, Ron Lundeen, Andrew Mullen, and David N. Ross.

                      + +

                      Lost Omens Character Guide

                      +

                      Genie, Marid from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Pathfinder Lost Omens Character Guide (Second Edition) © 2019, Paizo Inc.; Authors: John Compton, Sasha Lindley Hall, Amanda Hamon, Mike Kimmel, Luis Loza, Ron Lundeen, Matt Morris, Patchen Mortimer, Andrew Mullen, Mikhail Rekun, Micheal Sayre, Owen K.C. Stephens, Isabelle Thorne, and Linda Zayas-Palmer.

                      + +

                      Lost Omens Gods & Magic

                      +

                      Genie, Marid from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Pathfinder Lost Omens Gods & Magic (Second Edition) © 2020, Paizo Inc.; Authors: Robert Adducci, Amirali Attar Olyaee, Calder CaDavid, James Case, Adam Daigle, Katina Davis, Leo Glass, Joshua Grinlinton, James Jacobs, Virginia Jordan, Jason Keeley, Jacky Leung, Lyz Liddell, Ron Lundeen, Stephanie Lundeen, Jacob W. Michaels, Matt Morris, Dave Nelson, Samantha Phelan, Jennifer Povey, Jessica Redekop, Nathan Reinecke, Patrick Renie, David N. Ross, Simone D. Sallé, Michael Sayre, David Schwartz, Shahreena Shahrani, Isabelle Thorne, Marc Thuot, Jason Tondro, and Diego Valdez.

                      + +

                      Lost Omens Legends

                      +

                      Genie, Marid from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Authors: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      +

                      Pathfinder Lost Omens Legends © 2020, Paizo Inc.; Authors: Alexander Augunas, Kate Baker, Jason Bulmahn, Alexandria Bustion, Carlos Cabrera, Calder CaDavid, Jessica Catalan, Natalie Collazo, Ryan Costello, Greg Diaz, Fabby Garza Marroquín, Jaym Gates, Alice Grizzle, Steven Hammond, Nicolas Hornyak, James Jacobs, Michelle Jones, Kristina Sisto Kindel, Aaron Lascano, Ron Lundeen, Stephanie Lundeen, Sydney Meeker, Liane Merciel, Matt Morris, Patchen Mortimer, Hilary Moon Murphy, Dennis Muldoon, Andrew Mullen, Amirali Attar Olyaee, Mikhail Rekun, Michael Sayre, Mark Seifter, Ashton Sperry, Owen K.C. Stephens, and Isabelle Thorne

                      + +

                      Lost Omens World Guide

                      +

                      Genie, Marid from the Tome of Horrors Complete © 2011, Necromancer Games, Inc., published and distributed by Frog God Games; Author: Scott Greene, based on original material by Gary Gygax.

                      +

                      Pathfinder Lost Omens World Guide (Second Edition) © 2019, Paizo Inc.; Authors: Tanya DePass, James Jacobs, Lyz Liddell, Ron Lundeen, Liane Merciel, Erik Mona, Mark Seifter, James L. Sutter.

                      + + +

                      The Fall of Plaguestone

                      +

                      Pathfinder Adventure: The Fall of Plaguestone © 2019, Paizo Inc.; Author: Jason Bulmahn.

                      + +

                      The Slithering

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Authors: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      +

                      Pathfinder Adventure: The Slithering © 2020, Paizo Inc.; Author: Ron Lundeen.

                      + +

                      Troubles in Otari

                      +

                      Pathfinder Core Rulebook (Second Edition) © 2019, Paizo Inc.; Authors: Logan Bonner, Jason Bulmahn, Stephen Radney-MacFarland, and Mark Seifter.

                      +

                      Pathfinder Adventure: Troubles in Otari © 2020, Paizo Inc.; Authors: Jason Keeley, Lyz Liddell, and Ron Lundeen.

                      + +

                      Battlezoo Bestiary © 2021, Skyscraper Studios, Inc.; Authors: Stephen Glicker, Patrick Renie, and Mark Seifter.

                      + +
                      +
                      \ No newline at end of file diff --git a/views/pages/login.handlebars b/views/pages/login.handlebars new file mode 100644 index 00000000..23539640 --- /dev/null +++ b/views/pages/login.handlebars @@ -0,0 +1,69 @@ + +{{#section 'header'}} + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + diff --git a/views/pages/material_stats.handlebars b/views/pages/material_stats.handlebars new file mode 100644 index 00000000..29caa7a6 --- /dev/null +++ b/views/pages/material_stats.handlebars @@ -0,0 +1,83 @@ + +{{#section 'header'}} + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + +
                      +
                      +
                      + +

                      Material Statistics

                      +

                        + The table below (Table 11–4 in the CRB, pg. 577) provides the Hardness, Hit Points, Broken Threshold, and example items for some types of common materials. The table has separate entries for thin items (like shields), ordinary items (like armor), and reinforced or durable structures (such as walls). +

                      +

                        + Stone is a catchall for any hard stone, such as granite and marble. Likewise, wood covers ordinary woods, such as oak and pine. Metal weapons and armor are assumed to be made of iron or steel unless noted otherwise. +

                      +

                        + If an object consists of more than one material, the GM typically uses the statistics for the strongest material involved. For instance, breaking a wall made of paper panels over a woven wooden framework would require damaging thin wood, not paper. However, the GM might choose the weaker material based on the item’s function. For instance, breaking the wooden handle of a hammer rather than its iron head would still render the item unusable. Sometimes an item is even less sturdy than the Hardness and Hit Points provided for a thin object; for instance, a twig doesn’t take 9 damage to break, even though it’s made of thin wood. Similarly, a particularly sturdy item or structure might have even higher Hardness and Hit Points. Certain structures, particularly thick walls, are so reinforced that you have to break them down over time with tools. (CRB pg. 515 has more information on walls.) +

                      +
                      + Material|Hardness|HP|BT|Example Items + :--|:-:|:-:|:-:|:-- + Paper|0|1|—|Book pages, paper fan, scroll + Thin cloth|0|1|—|Kite, silk dress, undershirt + Thin glass|0|1|—|Bottle, spectacles, window pane + Cloth|1|4|2|Cloth armor, heavy jacket, sack, tent + Glass|1|4|2|Glass block, glass table, heavy vase + Glass structure|2|8|4|Glass block wall + Thin leather|2|8|4|Backpack, jacket, pouch, strap, whip + Thin rope|2|8|4|Standard adventuring rope + Thin wood|3|12|6|Chair, club, sapling, wooden shield + Leather|4|16|8|Leather armor, saddle + Rope|4|16|8|Industrial rope, ship rigging + Thin stone|4|16|8|Chalkboard, slate tiles, stone cladding + Thin iron or steel|5|20|10|Chain, steel shield, sword + Wood|5|20|10|Chest, simple door, table, tree trunk + Stone|7|28|14|Paving stone, statue + Iron or steel|9|36|18|Anvil, iron or steel armor, stove + Wooden structure|10|40|20|Reinforced door, wooden wall + Stone structure|14|56|28|Stone wall + Iron or steel structure|18|72|36|Iron plate wall +
                      + +
                      +
                      +
                      diff --git a/views/pages/profile.handlebars b/views/pages/profile.handlebars new file mode 100644 index 00000000..b63be68a --- /dev/null +++ b/views/pages/profile.handlebars @@ -0,0 +1,246 @@ + +{{#section 'header'}} + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + +
                      +
                      +
                      +
                      +
                      +
                      + Profile Image +

                      ID #{{user.id}}

                      +
                      +
                      +
                      +

                      {{user.username}}

                      + +

                      Developer

                      + {{#ifEqual user.isAdmin 1}} +

                      Admin

                      + {{/ifEqual}} + {{#ifEqual user.isPatreonSupporter 1}} + {{#ifEqual user.isPatreonLegend 1}} +

                      Patron - Legend

                      + {{else}} + {{#ifEqual user.isPatreonMember 1}} +

                      Patron - Wanderer

                      + {{/ifEqual}} + {{#ifEqual user.isPatreonMember 0}} +

                      Patron - Advocate

                      + {{/ifEqual}} + {{/ifEqual}} + {{/ifEqual}} + {{#ifEqual user.isPatreonSupporter 0}} +

                      Non-Patron

                      + {{/ifEqual}} + + +
                      + + +
                      +
                      + + +
                      + +
                      +
                      + +
                      + {{#if isPatreonConnected}} + Refresh Patreon Link + {{else}} + Connect to Patreon + {{/if}} +
                      + +
                      + +
                      +

                      Clients & API Keys

                      +
                      +
                      +
                      +
                      +
                      +
                      + + + + + + \ No newline at end of file diff --git a/views/sheet/charsheet.handlebars b/views/sheet/charsheet.handlebars new file mode 100644 index 00000000..c3f97107 --- /dev/null +++ b/views/sheet/charsheet.handlebars @@ -0,0 +1,683 @@ + +{{#section 'header'}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{/section}} + +{{#section 'nav_home'}} +
                    • Home
                    • +{{/section}} + +{{#section 'nav_characters'}} +
                    • Characters
                    • +{{/section}} + +{{#section 'nav_builds'}} +
                    • Builds
                    • +{{/section}} + +{{#section 'nav_homebrew'}} +
                    • Homebrew
                    • +{{/section}} + +{{#section 'nav_gm_tools'}} +
                    • GM Tools
                    • +{{/section}} + +{{#section 'nav_browse'}} +
                    • +{{/section}} + +{{#section 'nav_login'}} +
                    • Login
                    • +{{/section}} + + + +{{#section 'banner_nav'}} + +{{/section}} + + +
                      +
                      +
                      + +

                      +
                      +
                      +
                      + + + + +
                      + + + +
                      + +
                      + + + + + +
                      +
                      +
                      +
                      +
                      +
                      +
                      +

                      +
                      +

                      +
                      +
                      +
                      +

                      +
                      +

                      Experience

                      +
                      +

                      + +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +

                      Hit Points

                      +
                      +
                      +
                      +
                      +
                      +
                      +

                      /

                      +
                      +
                      +

                      +
                      +
                      +
                      +
                      +

                      Temp. HP

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + + + + + +
                      +
                      +
                      +

                      +
                      + + + +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +

                      Conditions

                      +
                      + +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +

                      Class DC

                      +

                      +
                      +
                      +

                      Hero Points

                      +
                      + +
                      +
                      +
                      +
                      + +
                      +
                      +
                      +
                      +
                      +

                      Speed

                      +

                      + +
                      +
                      +
                      +
                      +

                      Perception

                      +

                      +
                      +
                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      + +
                      +
                      +
                      Strength
                      +
                      + +
                      +
                      +
                      Dexterity
                      +
                      + +
                      +
                      +
                      Constitution
                      +
                      + +
                      +
                      +
                      Intelligence
                      +
                      + +
                      +
                      +
                      Wisdom
                      +
                      + +
                      +
                      +
                      Charisma
                      +
                      + +
                      +
                      +
                      +
                      +
                      +
                      + +

                      Saving Throws

                      +
                      +
                      +

                      Fortitude

                      +
                      +
                      +
                      +

                      Reflex

                      +
                      +
                      +
                      +

                      Will

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      +

                      AC

                      +

                      +
                      + +
                      +
                      +
                      +
                      +
                      +

                      Attacks

                      +

                      +
                      +
                      +
                      +
                      +

                      Defenses

                      +

                      +
                      +
                      +
                      +
                      +

                      Spells

                      +

                      +
                      +
                      +
                      +
                      +

                      Languages

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + +
                      +
                      + +
                      + +
                      +
                      +
                      + +
                      + + + +{{#section 'overlay'}} + + +
                      +
                      +

                      +
                      +

                      +

                      +
                      +
                      +
                      +
                      +
                      +
                      +
                      + + +
                      +
                      +

                      Sheet Tools

                      +
                      +

                      +
                      +
                      +
                      +
                      + + +
                      + +
                      +
                      +
                      +
                      + + + + + + + + + + + + + + +{{/section}} + From 83f576f9b3f41b080892e4be0dc3defab914daea Mon Sep 17 00:00:00 2001 From: significantotter Date: Sun, 29 Jan 2023 14:26:38 -0500 Subject: [PATCH 04/11] fixes issues with certain buttons not working --- .../legacy-js/char_export/export-handler.js | 7 ++++--- .../legacy-js/char_export/populate-pdf.js | 16 +++++----------- client/vue-src/legacy-js/character-list.js | 5 ++++- .../character-list/character-list-legacy.vue | 4 ++-- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/client/vue-src/legacy-js/char_export/export-handler.js b/client/vue-src/legacy-js/char_export/export-handler.js index a7c1d585..53562f84 100644 --- a/client/vue-src/legacy-js/char_export/export-handler.js +++ b/client/vue-src/legacy-js/char_export/export-handler.js @@ -1,9 +1,10 @@ /* Copyright (C) 2021, Wanderer's Guide, all rights reserved. By Aaron Cassar. */ +let socket = io(); // ~~~~~ Character Export ~~~~~ // -function exportCharacter(charID){ +export function exportCharacter(charID){ startSpinnerSubLoader(); socket.emit("requestCharExport", charID); } @@ -16,7 +17,7 @@ socket.on("returnCharExport", function(charExportData){ $('.modal-card-close').trigger('click'); }); -function charExportDataFileDownload(filename, text) { +export function charExportDataFileDownload(filename, text) { let element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); @@ -32,7 +33,7 @@ function charExportDataFileDownload(filename, text) { // ~~~~~ Character Copy ~~~~~ // -function copyCharacter(charID){ +export function copyCharacter(charID){ socket.emit("requestCharCopy", charID); } diff --git a/client/vue-src/legacy-js/char_export/populate-pdf.js b/client/vue-src/legacy-js/char_export/populate-pdf.js index 77324cca..032f865a 100644 --- a/client/vue-src/legacy-js/char_export/populate-pdf.js +++ b/client/vue-src/legacy-js/char_export/populate-pdf.js @@ -1,10 +1,11 @@ /* Copyright (C) 2021, Wanderer's Guide, all rights reserved. By Aaron Cassar. */ +let socket = io(); const { PDFDocument } = PDFLib; -export function setup(socket) { +export function setup() { socket.on("returnCharExportPDFInfo", function (charInfo, extraData) { try { charExportGeneratePDF(charInfo, extraData); @@ -24,11 +25,9 @@ export function getNumZeroIfNull(number) { return number != null ? number : 0; } -export function initCharacterExportToPDF() { - $("#btn-export-to-pdf").click(function () { - startSpinnerSubLoader(); - socket.emit("requestCharExportPDFInfo", activeModalCharID); - }); +export function initCharacterExportToPDF(activeModalCharID) { + startSpinnerSubLoader(); + socket.emit("requestCharExportPDFInfo", activeModalCharID); } let g_featMap = null; @@ -40,8 +39,6 @@ let g_featMap = null; async function charExportGeneratePDF(charInfo, extraData) { g_featMap = objToMap(extraData.featsObject); - console.log(charInfo); - const formUrl = "/pdf/character_sheet.pdf"; const formPdfBytes = await fetch(formUrl).then((res) => res.arrayBuffer()); @@ -51,8 +48,6 @@ async function charExportGeneratePDF(charInfo, extraData) { const profMap = objToMap(charInfo.profs); - console.log(profMap); - const nameField = form.getTextField("Character Name"); const playerNameField = form.getTextField("Player Name"); const xpField = form.getTextField("Experience Points XP"); @@ -328,7 +323,6 @@ async function charExportGeneratePDF(charInfo, extraData) { const weap6SpeField = form.getTextField("undefined_3"); let weapons = JSON.parse(charInfo.stats.weapons); - console.log(weapons); if (weapons.length >= 1) { weap1NameField.setText(weapons[0].Name); weap1HitBonusField.setText(weapons[0].Bonus); diff --git a/client/vue-src/legacy-js/character-list.js b/client/vue-src/legacy-js/character-list.js index 421242fd..f3d9e471 100644 --- a/client/vue-src/legacy-js/character-list.js +++ b/client/vue-src/legacy-js/character-list.js @@ -7,6 +7,7 @@ import { initCharacterExportToPDF, setup as setupPopulatePdf, } from "./char_export/populate-pdf"; +import { exportCharacter, copyCharacter } from "./char_export/export-handler"; let activeModalCharID = -1; let activeModalCharName = ""; @@ -108,7 +109,9 @@ export function setup() { } initCharacterExport(); - initCharacterExportToPDF(); // <- PDF + $("#btn-export-to-pdf").click(function () { + initCharacterExportToPDF(activeModalCharID); // <- PDF + }); } export function teardown() { //once we implement actual pages, this will need to be run to clean the state of this file diff --git a/client/vue-src/views/dashboard/character-list/character-list-legacy.vue b/client/vue-src/views/dashboard/character-list/character-list-legacy.vue index 63946b2c..a4217d50 100644 --- a/client/vue-src/views/dashboard/character-list/character-list-legacy.vue +++ b/client/vue-src/views/dashboard/character-list/character-list-legacy.vue @@ -442,12 +442,12 @@ diff --git a/client/vue-src/components/HelloWorld.vue b/client/vue-src/components/HelloWorld.vue deleted file mode 100644 index 52309103..00000000 --- a/client/vue-src/components/HelloWorld.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/client/vue-src/components/WGButton.vue b/client/vue-src/components/WGButton.vue new file mode 100644 index 00000000..c6488bbc --- /dev/null +++ b/client/vue-src/components/WGButton.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/client/vue-src/components/WGModal.vue b/client/vue-src/components/WGModal.vue new file mode 100644 index 00000000..3331698f --- /dev/null +++ b/client/vue-src/components/WGModal.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/client/vue-src/index.css b/client/vue-src/index.css new file mode 100644 index 00000000..70350dee --- /dev/null +++ b/client/vue-src/index.css @@ -0,0 +1,4 @@ +/* base styles */ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/client/vue-src/legacy-js/char_export/populate-pdf.js b/client/vue-src/legacy-js/char_export/populate-pdf.js index 032f865a..44080b89 100644 --- a/client/vue-src/legacy-js/char_export/populate-pdf.js +++ b/client/vue-src/legacy-js/char_export/populate-pdf.js @@ -7,6 +7,7 @@ const { PDFDocument } = PDFLib; export function setup() { socket.on("returnCharExportPDFInfo", function (charInfo, extraData) { + console.log(charInfo, extraData); try { charExportGeneratePDF(charInfo, extraData); } catch (err) { diff --git a/client/vue-src/legacy-js/character-list.js b/client/vue-src/legacy-js/character-list.js index f3d9e471..1352ed0e 100644 --- a/client/vue-src/legacy-js/character-list.js +++ b/client/vue-src/legacy-js/character-list.js @@ -4,7 +4,7 @@ import "./build_planner/ui-handler"; import { isTabletView } from "./general-utils"; import { - initCharacterExportToPDF, + initCharacterExportToPDF as initCharacterExportToPDFInternal, setup as setupPopulatePdf, } from "./char_export/populate-pdf"; import { exportCharacter, copyCharacter } from "./char_export/export-handler"; @@ -98,20 +98,18 @@ export function setup() { activeModalCharName = ""; }); - $("#delete-confirmation-btn").click(function () { - window.location.href = "/profile/characters/delete/" + activeModalCharID; - }); - if ($("#icon-character-import").length) { // If icon-character-import exists, AKA has permissions initCharacterImport(); initCharacterCopy(); } - initCharacterExport(); $("#btn-export-to-pdf").click(function () { initCharacterExportToPDF(activeModalCharID); // <- PDF }); + $("#btn-export-character").click(function () { + initCharacterExport(activeModalCharID); // <- PDF + }); } export function teardown() { //once we implement actual pages, this will need to be run to clean the state of this file @@ -152,10 +150,11 @@ socket.on("returnCharImport", function () { }); // ~~~~~ Character Export ~~~~~ // -function initCharacterExport() { - $("#btn-export-character").click(function () { - exportCharacter(activeModalCharID); - }); +export function initCharacterExport(charID) { + exportCharacter(charID ?? activeModalCharIDactiveModalCharID); +} +export function initCharacterExportToPDF(charID) { + initCharacterExportToPDFInternal(charID ?? activeModalCharID); } // ~~~~~ Character Copy ~~~~~ // diff --git a/client/vue-src/main.ts b/client/vue-src/main.ts index ec48d928..ef7121bc 100644 --- a/client/vue-src/main.ts +++ b/client/vue-src/main.ts @@ -1,5 +1,5 @@ import { createApp } from "vue"; -import "./style.css"; +import "./index.css"; import App from "./App.vue"; import { router } from "./router"; import { createPinia } from "pinia"; diff --git a/client/vue-src/stores/characters.ts b/client/vue-src/stores/characters.ts index c05382a8..d107002e 100644 --- a/client/vue-src/stores/characters.ts +++ b/client/vue-src/stores/characters.ts @@ -1,7 +1,8 @@ import axios from "axios"; import { defineStore } from "pinia"; +import { reactive } from "vue"; -interface character { +export interface character { id?: number; userID?: number; buildID?: null | number; @@ -56,7 +57,7 @@ export const useCharacters = defineStore("characters", { characters: character[]; isLoaded: boolean; } => ({ - characters: [], + characters: reactive([]), isLoaded: false, }), actions: { @@ -67,5 +68,13 @@ export const useCharacters = defineStore("characters", { this.isLoaded = true; } }, + async reload() { + this.isLoaded = false; + await this.load(); + }, + async copy(character: character) { + await axios.post(`/vue-data/characters/${character.id}/copy`); + this.reload(); + }, }, }); diff --git a/client/vue-src/stores/settings.ts b/client/vue-src/stores/settings.ts new file mode 100644 index 00000000..a7d231ff --- /dev/null +++ b/client/vue-src/stores/settings.ts @@ -0,0 +1,12 @@ +import { defineStore } from "pinia"; + +export const useSettings = defineStore("characters", { + state: () => ({ + darkMode: false, + }), + actions: { + set({ darkMode }: { darkMode: boolean }) { + this.darkMode = darkMode; + }, + }, +}); diff --git a/client/vue-src/style.css b/client/vue-src/style.css deleted file mode 100644 index 1b024c7c..00000000 --- a/client/vue-src/style.css +++ /dev/null @@ -1 +0,0 @@ -/* base styles */ \ No newline at end of file diff --git a/client/vue-src/views/dashboard/character-list/character-list-card.vue b/client/vue-src/views/dashboard/character-list/character-list-card.vue new file mode 100644 index 00000000..c7f54a80 --- /dev/null +++ b/client/vue-src/views/dashboard/character-list/character-list-card.vue @@ -0,0 +1,82 @@ + + + diff --git a/client/vue-src/views/dashboard/character-list/character-list-legacy.vue b/client/vue-src/views/dashboard/character-list/character-list-legacy.vue index a4217d50..fe6403b2 100644 --- a/client/vue-src/views/dashboard/character-list/character-list-legacy.vue +++ b/client/vue-src/views/dashboard/character-list/character-list-legacy.vue @@ -155,7 +155,7 @@ v-if="!user?.isPatreonMember" class="is-size-5 ml-3 has-tooltip-bottom has-tooltip-multiline has-txt-listing" data-tooltip="You can only have up to six characters at once. To get unlimited characters, support us and what we're doing on Patreon!" - >({{ characters.length }}/{{ characterLimit }})({{ characterStore.characters.length }}/{{ characterLimit }})
                      @@ -219,76 +219,14 @@
                      - diff --git a/client/vue-src/views/dashboard/character-list/character-list-options-modal.vue b/client/vue-src/views/dashboard/character-list/character-list-options-modal.vue new file mode 100644 index 00000000..ea74c001 --- /dev/null +++ b/client/vue-src/views/dashboard/character-list/character-list-options-modal.vue @@ -0,0 +1,71 @@ + + diff --git a/services/express/routes/vue-data-routes.js b/services/express/routes/vue-data-routes.js index 4a7d060d..51c5dea5 100644 --- a/services/express/routes/vue-data-routes.js +++ b/services/express/routes/vue-data-routes.js @@ -7,6 +7,9 @@ const Class = require("../models/contentDB/Class"); const Ancestry = require("../models/contentDB/Ancestry"); const Heritage = require("../models/contentDB/Heritage"); const UniHeritage = require("../models/contentDB/UniHeritage"); +const User = require("../models/contentDB/User"); +const CharExport = require("./../js/CharExport"); +const CharImport = require("./../js/CharImport"); router.get("/user", async (req, res) => { try { @@ -86,4 +89,32 @@ router.get("/characters", async (req, res) => { }); } }); +router.post("/characters/:charID/copy", async function (req, res) { + const charID = Number(req.params.charID); + if (isNaN(charID)) { + return res.status(400).send("Invalid Request!"); + } + const userID = req.user.id; + if (!userID || userID < 0) { + return res.status(401).send("Unauthorized"); + } + + const charExportData = await CharExport.getExportData(userID, charID); + + const user = await User.findOne({ where: { id: userID } }); + const characters = await Character.findAll({ + where: { userID: userID, id: charID }, + }); + + if (characters.length && CharStateUtils.canMakeCharacter(user, characters)) { + CharImport.processImport( + user.id, + JSON.parse(JSON.stringify(charExportData)), + ).then((result) => { + res.status(200).send("Ok!"); + }); + } else { + return res.status(401).send("Unauthorized"); + } +}); module.exports = router; From e4649f4aee2724b632546f4949380217d8f45335 Mon Sep 17 00:00:00 2001 From: significantotter Date: Mon, 30 Jan 2023 12:49:58 -0500 Subject: [PATCH 06/11] implements delete functionality in vue, switches modal to vue --- .../legacy-js/char_export/populate-pdf.js | 1 - .../character-list/character-list-card.vue | 23 ++++++++++-- .../character-list/character-list-legacy.vue | 35 +++---------------- 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/client/vue-src/legacy-js/char_export/populate-pdf.js b/client/vue-src/legacy-js/char_export/populate-pdf.js index 44080b89..032f865a 100644 --- a/client/vue-src/legacy-js/char_export/populate-pdf.js +++ b/client/vue-src/legacy-js/char_export/populate-pdf.js @@ -7,7 +7,6 @@ const { PDFDocument } = PDFLib; export function setup() { socket.on("returnCharExportPDFInfo", function (charInfo, extraData) { - console.log(charInfo, extraData); try { charExportGeneratePDF(charInfo, extraData); } catch (err) { diff --git a/client/vue-src/views/dashboard/character-list/character-list-card.vue b/client/vue-src/views/dashboard/character-list/character-list-card.vue index c7f54a80..7f35b874 100644 --- a/client/vue-src/views/dashboard/character-list/character-list-card.vue +++ b/client/vue-src/views/dashboard/character-list/character-list-card.vue @@ -48,10 +48,11 @@ - Delete + Delete @@ -65,9 +66,26 @@ :can-make-character="canMakeCharacter" v-model="characterOptionsModalOpen" > + + + + + + + diff --git a/client/vue-src/views/dashboard/character-list/character-list-legacy.vue b/client/vue-src/views/dashboard/character-list/character-list-legacy.vue index fe6403b2..0db69f4b 100644 --- a/client/vue-src/views/dashboard/character-list/character-list-legacy.vue +++ b/client/vue-src/views/dashboard/character-list/character-list-legacy.vue @@ -155,7 +155,9 @@ v-if="!user?.isPatreonMember" class="is-size-5 ml-3 has-tooltip-bottom has-tooltip-multiline has-txt-listing" data-tooltip="You can only have up to six characters at once. To get unlimited characters, support us and what we're doing on Patreon!" - >({{ characterStore.characters.length }}/{{ characterLimit }})({{ characterStore.characters.length }}/{{ + characterLimit + }})
                      @@ -233,36 +235,6 @@
                      - - -