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));
});