Basic generation page

This commit is contained in:
2025-03-06 23:37:43 -06:00
parent 330f958d55
commit b46ba6fd2c
5 changed files with 369 additions and 2 deletions

View File

@@ -91,7 +91,7 @@ export default defineComponent({
.catch(error => {
if (error.response.status == 409) {
// still generating, try again
setInterval(2000, this.fetchSeed.bind(this));
setTimeout(this.fetchSeed.bind(this), 2000);
} else {
this.error = "Seed not found. :(";
}

View File

@@ -0,0 +1,43 @@
<script>
import { defineComponent } from 'vue';
import localforage from "localforage";
export default defineComponent({
data() {
return {
selected: null,
};
},
emits: [
'update:modelValue'
],
props: {
modelValue: null,
name: null,
settings: {},
},
mounted() {
this.selected = this.settings.default;
this.change();
},
methods: {
change() {
this.$emit("update:modelValue", this.selected);
},
},
});
</script>
<template>
<b>{{ settings.display ?? name }}:</b>
<div class="nav nav-pills nav-fill mt-1 mb-1">
<template v-for="value of Object.keys(settings.values)">
<input type="radio" class="btn-check" :name="name" :id="`${name}_${value}`"
autocomplete="off" :value="value" v-model="selected" @change="change" />
<label class="btn btn-outline-primary nav-item m-1" :for="`${name}_${value}`">
{{ settings.values[value].display }}
</label>
</template>
</div>
</template>

232
src/data/settings.yaml Normal file
View File

@@ -0,0 +1,232 @@
base:
race:
default: normal
values:
normal:
display: Normal
race:
display: Race
mode:
display: Mode
default: open
values:
open:
display: Open
standard:
display: Standard
inverted:
display: Inverted
weapons:
display: Weapons
default: random
values:
random:
display: Random
assured:
display: Assured
vanilla:
display: Vanilla
swordless:
display: Swordless
goal:
display: Goal
default: ganon
values:
ganon:
display: Ganon
fast_ganon:
display: Fast Ganon
all_dungeons:
display: All Dungeons
pedestal:
display: Pedestal
triforce_hunt:
display: Triforce Hunt
ganon_hunt:
display: Ganon Hunt
completionist:
display: Completionist
crystals_ganon:
display: Crystals for Ganon
default: 7
values:
7:
display: 7
6:
display: 6
5:
display: 5
4:
display: 4
3:
display: 3
2:
display: 2
1:
display: 1
0:
display: 0
random:
display: Random
crystals_gt:
display: Crystals for GT
default: 7
values:
7:
display: 7
6:
display: 6
5:
display: 5
4:
display: 4
3:
display: 3
2:
display: 2
1:
display: 1
0:
display: 0
random:
display: Random
entrance_shuffle:
display: Entrance Shuffle
default: vanilla
values:
vanilla:
display: None
full:
display: Full
crossed:
display: Crossed
swapped:
display: Swapped
decoupled:
display: Decoupled
skull_woods:
display: Skull Woods Entrances
default: original
values:
original:
display: Original
restricted:
display: Restricted
loose:
display: Loose
follow_linked:
display: Follow Linked
linked_drops:
display: Linked Drops
default: unset
values:
unset:
display: Unset
linked:
display: Linked
independent:
display: Independent
boss_shuffle:
values:
vanilla:
display: None
simple:
display: Simple
full:
display: Full
random:
display: Random
prize_unique:
display: Prize Unique
enemy_shuffle:
values:
vanilla:
display: None
shuffled:
display: Shuffled
small_keys:
values:
dungeon:
display: In Dungeon
wild:
display: Wild
nearby:
display: Nearby
universal:
display: Universal
big_keys:
values:
dungeon:
display: In Dungeon
wild:
display: Wild
nearby:
display: Nearby
maps:
values:
dungeon:
display: In Dungeon
wild:
display: Wild
nearby:
display: Nearby
compasses:
values:
dungeon:
display: In Dungeon
wild:
display: Wild
nearby:
display: Nearby
shop_shuffle:
values:
vanilla:
display: None
shuffled:
display: Shuffled
drop_shuffle:
values:
vanilla:
display: None
keys:
display: Key Drops
underworld:
display: All Underworld Enemies
pottery:
values:
vanilla:
display: None
keys:
display: Keys
cave:
display: Caves
cave_keys:
display: Caves & Keys
reduced:
display: Reduced
clustered:
display: Clustered
non_empty:
display: Non-Empty
dungeon:
display: Dungeon
lottery:
display: Lottery
prize_shuffle:
values:
vanilla:
display: On Boss
dungeon:
display: In Dungeon
nearby:
display: Nearby
wild:
display: Wild
boots:
values:
normal:
display: No Starting Boots
pseudoboots:
display: Pseudoboots
starting:
display: Starting Boots

View File

@@ -1,12 +1,18 @@
import { createRouter, createWebHistory } from "vue-router";
import SeedView from "@/views/SeedView.vue";
import GenerateView from "@/views/GenerateView.vue";
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/generate',
name: 'generate',
component: GenerateView,
},
{
path: '/seed/:id',
name: 'game',
name: 'seed',
component: SeedView,
},
],

View File

@@ -0,0 +1,86 @@
<script>
import { defineComponent } from "vue";
import axios from "axios";
import settingsData from "@/data/settings.yaml";
import SettingPicker from "@/components/SettingPicker.vue";
export default defineComponent({
components: {
SettingPicker,
},
data() {
return {
mode: null,
goal: null,
weapons: null,
crystals_ganon: null,
crystals_gt: null,
entrance_shuffle: null,
skull_woods: null,
linked_drops: null,
};
},
computed: {
settings() {
return settingsData.base;
},
},
methods: {
async generate(race) {
const settings = { race: race ? "race" : "normal" };
for (const setting of Object.keys(this.$data)) {
settings[setting] = this.$data[setting];
}
await axios.post("/generate", {settings: settings})
.then(response => {
const id = response.data;
this.$router.push(`/seed/${id}`);
})
.catch(error => {
console.log(error);
});
},
},
});
</script>
<template>
<div class="card content-div m-3">
<div class="card-header">
Generate Seed
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<SettingPicker v-model="mode" name="mode" :settings="settings.mode" />
<SettingPicker v-model="weapons" name="weapons" :settings="settings.weapons" />
</li>
<li class="list-group-item">
<SettingPicker v-model="goal" name="goal" :settings="settings.goal" />
<SettingPicker v-if="['ganon', 'fast_ganon'].includes(this.goal)"
v-model="crystals_ganon" name="crystals_ganon" :settings="settings.crystals_ganon" />
<SettingPicker v-model="crystals_gt" name="crystals_gt" :settings="settings.crystals_gt" />
</li>
<li class="list-group-item">
<SettingPicker v-model="entrance_shuffle" name="entrance_shuffle" :settings="settings.entrance_shuffle" />
<SettingPicker v-if="this.entrance_shuffle != 'vanilla'"
v-model="skull_woods" name="skull_woods" :settings="settings.skull_woods" />
<SettingPicker v-if="this.entrance_shuffle != 'vanilla'"
v-model="linked_drops" name="linked_drops" :settings="settings.linked_drops" />
</li>
</ul>
<div class="card-footer">
<div class="nav nav-pills nav-fill" role="group">
<button type="button" class="m-1 nav-item btn btn-outline-danger"
@click="generate(true);">
Generate Race ROM
</button>
<button type="button" class="m-1 nav-item btn btn-outline-primary"
@click="generate(false);">
Generate ROM
</button>
</div>
</div>
</div>
</template>