From dfe984c8610c733483a69ddaceb308ca9d1aa087 Mon Sep 17 00:00:00 2001 From: MassHesteria Date: Thu, 26 Oct 2023 06:47:28 -0500 Subject: [PATCH 1/5] setting layout for speed prediction --- apps/web/app/components/spoiler.module.css | 19 +++++++++++++ apps/web/app/components/spoiler.tsx | 22 +++++++++++++++ apps/web/app/seed/[seed]/seed.tsx | 32 ++++++++++++++++++++-- 3 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 apps/web/app/components/spoiler.module.css create mode 100644 apps/web/app/components/spoiler.tsx diff --git a/apps/web/app/components/spoiler.module.css b/apps/web/app/components/spoiler.module.css new file mode 100644 index 00000000..a406e17c --- /dev/null +++ b/apps/web/app/components/spoiler.module.css @@ -0,0 +1,19 @@ +.text_hidden > * { + background-color: white; + color: white; + cursor: pointer; + border-radius: 4px; + padding: 2px; +} + +.text_notHidden > * { + background-color: unset; + color: unset; + cursor: unset; + transition: all 1s; +} + +.text_hidden > *::selection { + color: white; + border-radius: 6px; +} \ No newline at end of file diff --git a/apps/web/app/components/spoiler.tsx b/apps/web/app/components/spoiler.tsx new file mode 100644 index 00000000..45937ca7 --- /dev/null +++ b/apps/web/app/components/spoiler.tsx @@ -0,0 +1,22 @@ +import React, { useState } from 'react'; +import styles from './spoiler.module.css'; + +function SpoilerText(props: any) { + const [hidden, setHidden] = useState(true); + + const reveal = () => { + setHidden(false); + console.log('revealed') + }; + + return ( + + {props.children} + + ) +} + +export default SpoilerText; \ No newline at end of file diff --git a/apps/web/app/seed/[seed]/seed.tsx b/apps/web/app/seed/[seed]/seed.tsx index 221b4cb7..7d3f880d 100644 --- a/apps/web/app/seed/[seed]/seed.tsx +++ b/apps/web/app/seed/[seed]/seed.tsx @@ -17,8 +17,9 @@ import { downloadFile } from '@/lib/downloads' import Button from '@/app/components/button' import { useSearchParams } from 'next/navigation' import { get as getKey } from 'idb-keyval' -import { ArrowDown } from 'react-feather' +import { ArrowDown, Eye } from 'react-feather' import VanillaButton from '@/app/generate/vanilla' +import SpoilerText from '@/app/components/spoiler' type Seed = { @@ -99,7 +100,7 @@ const getExtraItems = (extraItems: number[]) => { const parseSettings = (parameters: any) => { const { settings } = parameters const extraItems = getExtraItems(settings.extraItems) - const randomizeParams = [ + let randomizeParams: any[] = [ { label: 'Item Split', value: getItemSplit(settings.majorDistribution) }, { label: 'Boss Locations', value: getBossMode(settings.bossMode) }, { label: 'Map Layout', value: getAreaMode(settings.mapLayout, settings.randomizeAreas) } @@ -117,10 +118,35 @@ const parseSettings = (parameters: any) => { { label: 'Seed Number', value: parameters.seed }, { label: 'Disable Fanfare', value: displayOnOff(parameters.options.DisableFanfare), } ] + randomizeParams = randomizeParams.concat( + { label: 'Seed Speed', value: ' medium ', spoiler: true } + ) + return { randomizeParams, settingsParams, optionsParams } } const Parameters = ({ title, items }: { title: string, items: any[] }) => { + const getValue = (item: any) => { + if (item.spoiler == undefined || !item.spoiler) { + return ( +
{item.value}
+ ) + } + + return ( +
+ + + + + + {item.value} + + +
+ ) + } + return (

{title}

@@ -129,7 +155,7 @@ const Parameters = ({ title, items }: { title: string, items: any[] }) => { {items.map((item, index) => (
  • {item.label}
    -
    {item.value}
    + {getValue(item)}
  • ))} From dfed7a43ef533549d0356f02e071db64d4ae635c Mon Sep 17 00:00:00 2001 From: MassHesteria Date: Tue, 31 Oct 2023 06:23:15 -0500 Subject: [PATCH 2/5] added predicted speed to generate page --- apps/web/app/components/spoiler.module.css | 1 - apps/web/app/components/spoiler.tsx | 1 - apps/web/app/generate/form.tsx | 47 ++++++++++++++++++++-- packages/core/lib/randomize.ts | 38 ++++++++++++++++- 4 files changed, 80 insertions(+), 7 deletions(-) diff --git a/apps/web/app/components/spoiler.module.css b/apps/web/app/components/spoiler.module.css index a406e17c..06e7a9e4 100644 --- a/apps/web/app/components/spoiler.module.css +++ b/apps/web/app/components/spoiler.module.css @@ -3,7 +3,6 @@ color: white; cursor: pointer; border-radius: 4px; - padding: 2px; } .text_notHidden > * { diff --git a/apps/web/app/components/spoiler.tsx b/apps/web/app/components/spoiler.tsx index 45937ca7..a25a1ea4 100644 --- a/apps/web/app/components/spoiler.tsx +++ b/apps/web/app/components/spoiler.tsx @@ -6,7 +6,6 @@ function SpoilerText(props: any) { const reveal = () => { setHidden(false); - console.log('revealed') }; return ( diff --git a/apps/web/app/generate/form.tsx b/apps/web/app/generate/form.tsx index a679bb91..0d4799aa 100644 --- a/apps/web/app/generate/form.tsx +++ b/apps/web/app/generate/form.tsx @@ -24,15 +24,19 @@ import { import { fetchSignature } from 'core' import { useCallback, useEffect, useState } from 'react' import Spacer from '../components/spacer' +import SpoilerText from '../components/spoiler' +import { Eye } from 'react-feather' const Sidebar = ({ name = null, signature = null, - hash = null + hash = null, + speed = null }: { name?: string | null signature?: string | null hash?: string | null + speed?: string | null }) => { const { data } = useVanilla() const mounted = useMounted() @@ -91,7 +95,24 @@ const Sidebar = ({

    - + {speed && ( +
    +

    + Predicted Speed +

    +

    + + + + {speed} + + +

    +
    + )} + )} ) : ( @@ -256,6 +277,7 @@ type RolledSeed = { seed: any name: string hash: string + speed: string } export default function Form() { @@ -390,13 +412,29 @@ export default function Form() { }; const seedNumber = getSeed(); - const { data: seed, name } = await RandomizeRom( + const { data: seed, name, locs } = await RandomizeRom( seedNumber, settings, options, config); const hash = paramsToString(seedNumber, settings, options); if (seed !== null) { downloadFile(seed, name, hash) } - setRolledSeed({ seed, name, hash }) + + let speed = null; + if (settings.preset == "2017MM") { + const input = {'type': 'standard_mm', 'locations': locs}; + //console.log(input); + const response = await fetch("https://python-api-testing.vercel.app/api", { + method: "POST", + body: JSON.stringify(input), + headers: { "Content-Type": "application/json", }, + }) + + const res_json = await response.json(); + speed = res_json['speed']; + } + + setRolledSeed({ seed, name, hash, speed }) + } catch (error) { console.error('SEED ERROR', error) } @@ -679,6 +717,7 @@ export default function Form() { name={rolledSeed?.name || null} signature={signature} hash={rolledSeed?.hash} + speed={rolledSeed?.speed} /> diff --git a/packages/core/lib/randomize.ts b/packages/core/lib/randomize.ts index 89d1f5d3..2664d228 100644 --- a/packages/core/lib/randomize.ts +++ b/packages/core/lib/randomize.ts @@ -1,7 +1,8 @@ import BpsPatch from "./bps-patch"; -import { getBasePatch, getFileName, generateSeedPatch } from "./sm-rando"; +import { getBasePatch, getFileName, generateSeedPatch, getItemNodes } from "./sm-rando"; import { generateSeed } from "./graph/fill"; import { patchRom } from "../helpers/patcher"; +import { getLocations } from "./locations"; export type Opts = { DisableFanfare: number @@ -26,6 +27,30 @@ export type Settings = { suitMode: number } +const ITEM_TYPES: { [id:string] : number } = { + "Missile": 0, + "Super Missile": 1, + "Power Bomb": 2, + "Morph Ball": 3, + "Wave Beam": 4, + "Plasma Beam": 5, + "Ice Beam": 6, + "Charge Beam": 7, + "Energy Tank": 8, + "Reserve Tank": 9, + "Varia Suit": 10, + "Gravity Suit": 11, + "Grappling Beam": 12, + "Space Jump": 13, + "Screw Attack": 14, + "Spring Ball": 15, + "Bomb": 16, + "Spazer": 17, + "Xray Scope": 18, + "HiJump Boots": 19, + "Speed Booster": 20 +} + async function RandomizeRom( seed: number = 0, settings: Settings, @@ -40,6 +65,16 @@ async function RandomizeRom( // Place the items. const graph = generateSeed(seed, settings); + const nodes = getItemNodes(graph) + + let encoded = '' + getLocations().forEach(l => { + const node = nodes.find(n => n.location.name == l.name); + if (node == undefined) { + return; + } + encoded += String.fromCharCode(65 + ITEM_TYPES[node.item.name]) + }) // Load the base patch associated with the map layout. const patch = getBasePatch(settings); @@ -59,6 +94,7 @@ async function RandomizeRom( return { data: patchRom(config.vanillaBytes, basePatch, seedPatch), name: getFileName(seed, settings, options), + locs: encoded }; } From e411509455fae4a995143958c173fb7f4daa0f70 Mon Sep 17 00:00:00 2001 From: MassHesteria Date: Tue, 31 Oct 2023 06:26:55 -0500 Subject: [PATCH 3/5] removed speed from seed page --- apps/web/app/seed/[seed]/seed.tsx | 32 +++---------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/apps/web/app/seed/[seed]/seed.tsx b/apps/web/app/seed/[seed]/seed.tsx index 7d3f880d..221b4cb7 100644 --- a/apps/web/app/seed/[seed]/seed.tsx +++ b/apps/web/app/seed/[seed]/seed.tsx @@ -17,9 +17,8 @@ import { downloadFile } from '@/lib/downloads' import Button from '@/app/components/button' import { useSearchParams } from 'next/navigation' import { get as getKey } from 'idb-keyval' -import { ArrowDown, Eye } from 'react-feather' +import { ArrowDown } from 'react-feather' import VanillaButton from '@/app/generate/vanilla' -import SpoilerText from '@/app/components/spoiler' type Seed = { @@ -100,7 +99,7 @@ const getExtraItems = (extraItems: number[]) => { const parseSettings = (parameters: any) => { const { settings } = parameters const extraItems = getExtraItems(settings.extraItems) - let randomizeParams: any[] = [ + const randomizeParams = [ { label: 'Item Split', value: getItemSplit(settings.majorDistribution) }, { label: 'Boss Locations', value: getBossMode(settings.bossMode) }, { label: 'Map Layout', value: getAreaMode(settings.mapLayout, settings.randomizeAreas) } @@ -118,35 +117,10 @@ const parseSettings = (parameters: any) => { { label: 'Seed Number', value: parameters.seed }, { label: 'Disable Fanfare', value: displayOnOff(parameters.options.DisableFanfare), } ] - randomizeParams = randomizeParams.concat( - { label: 'Seed Speed', value: ' medium ', spoiler: true } - ) - return { randomizeParams, settingsParams, optionsParams } } const Parameters = ({ title, items }: { title: string, items: any[] }) => { - const getValue = (item: any) => { - if (item.spoiler == undefined || !item.spoiler) { - return ( -
    {item.value}
    - ) - } - - return ( -
    - - - - - - {item.value} - - -
    - ) - } - return (

    {title}

    @@ -155,7 +129,7 @@ const Parameters = ({ title, items }: { title: string, items: any[] }) => { {items.map((item, index) => (
  • {item.label}
    - {getValue(item)} +
    {item.value}
  • ))} From 916b0de8ceb711accae70e6bf858454f93f13f25 Mon Sep 17 00:00:00 2001 From: MassHesteria Date: Sat, 25 Nov 2023 20:03:01 -0600 Subject: [PATCH 4/5] updated api url --- apps/web/app/generate/form.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/app/generate/form.tsx b/apps/web/app/generate/form.tsx index 0d4799aa..cfb9f4ed 100644 --- a/apps/web/app/generate/form.tsx +++ b/apps/web/app/generate/form.tsx @@ -423,7 +423,7 @@ export default function Form() { if (settings.preset == "2017MM") { const input = {'type': 'standard_mm', 'locations': locs}; //console.log(input); - const response = await fetch("https://python-api-testing.vercel.app/api", { + const response = await fetch("https://masshesteria.pythonanywhere.com/api/speed", { method: "POST", body: JSON.stringify(input), headers: { "Content-Type": "application/json", }, From 5b3cf8df86fceba41be6a747402b84b59ce13c95 Mon Sep 17 00:00:00 2001 From: MassHesteria Date: Sun, 5 Nov 2023 14:04:07 -0600 Subject: [PATCH 5/5] removed print statements --- apps/web/app/generate/form.tsx | 2 +- packages/core/lib/sm-rando.js | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/web/app/generate/form.tsx b/apps/web/app/generate/form.tsx index cfb9f4ed..86cc2f9a 100644 --- a/apps/web/app/generate/form.tsx +++ b/apps/web/app/generate/form.tsx @@ -312,7 +312,7 @@ export default function Form() { } else { setValue('mode', 'custom') } - console.log('updating mode', value, matchedMode || 'custom') + //console.log('updating mode', value, matchedMode || 'custom') }, [setValue]) const onSubmit = async (data: GenerateFormParams) => { diff --git a/packages/core/lib/sm-rando.js b/packages/core/lib/sm-rando.js index 9eed798c..41937eed 100644 --- a/packages/core/lib/sm-rando.js +++ b/packages/core/lib/sm-rando.js @@ -184,9 +184,7 @@ export const generateSeedPatch = (seed, settings, graph, options) => { .forEach((b) => { if (settings.bossMode == BossMode.ShuffleStandard) { bossUpdates.concat(getDoorUpdate(b.from.name, b.to.name)); - console.debug(`from: ${b.from.name} to: ${b.to.name}`); } else if (settings.bossMode == BossMode.ShuffleDash) { - console.debug(`from: ${b.from.name} to: ${b.to.name}`); if (b.from.name == "Door_KraidBoss") { if (b.to.name == "Exit_Draygon") { bossUpdates.push({ @@ -266,7 +264,6 @@ export const generateSeedPatch = (seed, settings, graph, options) => { .filter((e) => isAreaEdge(e)) .forEach((a) => { const areaUpdates = getDoorUpdate(a.from.name, a.to.name); - console.debug(`from: ${a.from.name} to: ${a.to.name}`); areaUpdates.forEach((p) => { encodeBytes(seedPatch, p.door, U16toBytes(p.dest & 0xffff)); });