From fd7176d9c9e1850b1b6501e4adf5f2d1899339dc Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Sun, 4 Jan 2026 00:43:35 -0600 Subject: [PATCH] Add dungeon map randomizer --- src/components/PresetPicker.vue | 10 ++-- src/components/SettingPicker.vue | 32 ++++++----- src/components/SettingsPage.vue | 85 ++++++++++++++++------------ src/data/generator-settings.yaml | 33 +++++++++++ src/data/presets.yaml | 3 + src/data/settings.yaml | 22 +++++++ src/router/index.js | 5 ++ src/views/GenerateDungeonMapView.vue | 65 +++++++++++++++++++++ src/views/GenerateView.vue | 2 +- 9 files changed, 203 insertions(+), 54 deletions(-) create mode 100644 src/views/GenerateDungeonMapView.vue diff --git a/src/components/PresetPicker.vue b/src/components/PresetPicker.vue index 81270d7..2af10ba 100644 --- a/src/components/PresetPicker.vue +++ b/src/components/PresetPicker.vue @@ -49,10 +49,12 @@ export default defineComponent({ }, presets() { const filledPresets = {}; - for (const presetName of Object.keys(presets[this.generator])) { - const preset = JSON.parse(JSON.stringify(presets[this.generator][presetName])); - this.fillPreset(preset); - filledPresets[presetName] = preset; + if (presets[this.generator]) { + for (const presetName of Object.keys(presets[this.generator])) { + const preset = JSON.parse(JSON.stringify(presets[this.generator][presetName])); + this.fillPreset(preset); + filledPresets[presetName] = preset; + } } return filledPresets; }, diff --git a/src/components/SettingPicker.vue b/src/components/SettingPicker.vue index 09243df..53500f2 100644 --- a/src/components/SettingPicker.vue +++ b/src/components/SettingPicker.vue @@ -46,9 +46,11 @@ export default defineComponent({ }, }, async mounted() { - this.$refs.tips.forEach(el => new Tooltip(el)); - this.selected = await localforage.getItem(`${this.prefix}setting_${this.name}`) ?? this.settings.default; - this.change(); + this.$refs.tips?.forEach(el => new Tooltip(el)); + if (this.settings) { + this.selected = await localforage.getItem(`${this.prefix}setting_${this.name}`) ?? this.settings.default; + this.change(); + } }, methods: { async change() { @@ -63,16 +65,18 @@ export default defineComponent({ diff --git a/src/data/generator-settings.yaml b/src/data/generator-settings.yaml index 1f05c1d..a5b9720 100644 --- a/src/data/generator-settings.yaml +++ b/src/data/generator-settings.yaml @@ -29,6 +29,8 @@ base: bombs: all book: all follower_shuffle: all + flute_shuffle: all + tile_swap: all damage_challenge: all hints: all apr2025: @@ -46,3 +48,34 @@ apr2025: display: Wild boots: ['normal', 'pseudoboots'] hints: all +dungeon_map: + mode: all + weapons: all + goal: all + crystals_ganon: all + crystals_gt: all + ganon_item: all + entrance_shuffle: all + skull_woods: all + linked_drops: all + boss_shuffle: all + enemy_shuffle: all + damage_table_shuffle: all + small_keys: all + big_keys: all + maps: all + compasses: all + shop_shuffle: all + drop_shuffle: all + pottery: all + prize_shuffle: all + boots: all + flute: all + dark_rooms: all + bombs: all + book: all + follower_shuffle: all + flute_shuffle: all + tile_swap: all + damage_challenge: all + hints: all diff --git a/src/data/presets.yaml b/src/data/presets.yaml index aac47a7..164e38b 100644 --- a/src/data/presets.yaml +++ b/src/data/presets.yaml @@ -30,3 +30,6 @@ base: drop_shuffle: keys pottery: keys dark_rooms: always_light_cone +dungeon_map: + default: + display: Default diff --git a/src/data/settings.yaml b/src/data/settings.yaml index 863d3f4..7e91fd3 100644 --- a/src/data/settings.yaml +++ b/src/data/settings.yaml @@ -461,6 +461,28 @@ follower_shuffle: display: None shuffled: display: Shuffled +flute_shuffle: + display: Flute Spot Shuffle + default: vanilla + values: + vanilla: + display: Vanilla + tip: The eight flute spots are at their vanilla locations. + random: + display: Random + tip: The seven flute spots outside the Desert/Mire area are each moved to a random screen, with one spot available on the mountain. + balanced: + display: Balanced + tip: The seven flute spots outside the Desert/Mire area are each moved to a random screen such that no two flute spots are on adjacent screens. +tile_swap: + display: Tile Swap + default: vanilla + values: + vanilla: + display: Normal + tile_swap: + display: Tile Swap + tip: Each tile on the overworld has a chance to be swapped with its inverted version. damage_challenge: display: Damage Mode default: normal diff --git a/src/router/index.js b/src/router/index.js index 9fd2bde..4e13f9d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -4,6 +4,7 @@ import MultiView from "@/views/MultiView.vue"; import GenerateView from "@/views/GenerateView.vue"; import GenerateMulti from "@/views/GenerateMulti.vue"; import GenerateApr2025View from "@/views/GenerateApr2025View.vue"; +import GenerateDungeonMapView from "@/views/GenerateDungeonMapView.vue"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -24,6 +25,10 @@ const router = createRouter({ path: '/generate/apr2025', component: GenerateApr2025View, }, + { + path: '/generate/beta_test', + component: GenerateDungeonMapView, + }, { path: '/seed/:id', name: 'seed', diff --git a/src/views/GenerateDungeonMapView.vue b/src/views/GenerateDungeonMapView.vue new file mode 100644 index 0000000..f728f5a --- /dev/null +++ b/src/views/GenerateDungeonMapView.vue @@ -0,0 +1,65 @@ + + + + diff --git a/src/views/GenerateView.vue b/src/views/GenerateView.vue index 2feaae2..a998f7f 100644 --- a/src/views/GenerateView.vue +++ b/src/views/GenerateView.vue @@ -46,7 +46,7 @@ export default defineComponent({ Generate Seed
- +