2025-11-14 17:23:16 -08:00
|
|
|
import { getResourceList } from "../manifest";
|
2025-11-13 23:41:10 -08:00
|
|
|
import { useSettings } from "./SettingsProvider";
|
2025-11-13 22:55:58 -08:00
|
|
|
|
|
|
|
|
const excludeMissions = new Set([
|
|
|
|
|
"SkiFree",
|
|
|
|
|
"SkiFree_Daily",
|
|
|
|
|
"SkiFree_Randomizer",
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const missions = getResourceList()
|
|
|
|
|
.map((resourcePath) => resourcePath.match(/^missions\/(.+)\.mis$/))
|
|
|
|
|
.filter(Boolean)
|
|
|
|
|
.map((match) => match[1])
|
|
|
|
|
.filter((name) => !excludeMissions.has(name));
|
|
|
|
|
|
|
|
|
|
export function InspectorControls({
|
|
|
|
|
missionName,
|
|
|
|
|
onChangeMission,
|
|
|
|
|
}: {
|
|
|
|
|
missionName: string;
|
|
|
|
|
onChangeMission: (name: string) => void;
|
|
|
|
|
}) {
|
2025-11-13 23:41:10 -08:00
|
|
|
const {
|
|
|
|
|
fogEnabled,
|
|
|
|
|
setFogEnabled,
|
|
|
|
|
speedMultiplier,
|
|
|
|
|
setSpeedMultiplier,
|
|
|
|
|
fov,
|
|
|
|
|
setFov,
|
2025-11-15 16:33:18 -08:00
|
|
|
audioEnabled,
|
|
|
|
|
setAudioEnabled,
|
2025-11-19 02:21:55 -05:00
|
|
|
debugMode,
|
|
|
|
|
setDebugMode,
|
2025-11-13 23:41:10 -08:00
|
|
|
} = useSettings();
|
|
|
|
|
|
2025-11-13 22:55:58 -08:00
|
|
|
return (
|
2025-11-14 00:15:28 -08:00
|
|
|
<div
|
|
|
|
|
id="controls"
|
2025-11-14 22:46:58 -08:00
|
|
|
onKeyDown={(e) => e.stopPropagation()}
|
2025-11-14 00:15:28 -08:00
|
|
|
onPointerDown={(e) => e.stopPropagation()}
|
|
|
|
|
onClick={(e) => e.stopPropagation()}
|
|
|
|
|
>
|
2025-11-13 22:55:58 -08:00
|
|
|
<select
|
|
|
|
|
id="missionList"
|
|
|
|
|
value={missionName}
|
|
|
|
|
onChange={(event) => onChangeMission(event.target.value)}
|
|
|
|
|
>
|
|
|
|
|
{missions.map((missionName) => (
|
|
|
|
|
<option key={missionName}>{missionName}</option>
|
|
|
|
|
))}
|
|
|
|
|
</select>
|
|
|
|
|
<div className="CheckboxField">
|
|
|
|
|
<input
|
|
|
|
|
id="fogInput"
|
|
|
|
|
type="checkbox"
|
|
|
|
|
checked={fogEnabled}
|
|
|
|
|
onChange={(event) => {
|
2025-11-13 23:41:10 -08:00
|
|
|
setFogEnabled(event.target.checked);
|
2025-11-13 22:55:58 -08:00
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
<label htmlFor="fogInput">Fog?</label>
|
|
|
|
|
</div>
|
2025-11-15 16:33:18 -08:00
|
|
|
<div className="CheckboxField">
|
|
|
|
|
<input
|
|
|
|
|
id="audioInput"
|
|
|
|
|
type="checkbox"
|
|
|
|
|
checked={audioEnabled}
|
|
|
|
|
onChange={(event) => {
|
|
|
|
|
setAudioEnabled(event.target.checked);
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
<label htmlFor="audioInput">Audio?</label>
|
|
|
|
|
</div>
|
2025-11-19 02:21:55 -05:00
|
|
|
<div className="CheckboxField">
|
|
|
|
|
<input
|
|
|
|
|
id="debugInput"
|
|
|
|
|
type="checkbox"
|
|
|
|
|
checked={debugMode}
|
|
|
|
|
onChange={(event) => {
|
|
|
|
|
setDebugMode(event.target.checked);
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
<label htmlFor="debugInput">Debug?</label>
|
|
|
|
|
</div>
|
2025-11-13 23:41:10 -08:00
|
|
|
<div className="Field">
|
|
|
|
|
<label htmlFor="fovInput">FOV</label>
|
|
|
|
|
<input
|
|
|
|
|
id="speedInput"
|
|
|
|
|
type="range"
|
|
|
|
|
min={75}
|
|
|
|
|
max={120}
|
|
|
|
|
step={5}
|
|
|
|
|
value={fov}
|
|
|
|
|
onChange={(event) => setFov(parseInt(event.target.value))}
|
|
|
|
|
/>
|
|
|
|
|
<output htmlFor="speedInput">{fov}</output>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="Field">
|
|
|
|
|
<label htmlFor="speedInput">Speed</label>
|
|
|
|
|
<input
|
|
|
|
|
id="speedInput"
|
|
|
|
|
type="range"
|
|
|
|
|
min={0.1}
|
|
|
|
|
max={5}
|
|
|
|
|
step={0.05}
|
|
|
|
|
value={speedMultiplier}
|
|
|
|
|
onChange={(event) =>
|
|
|
|
|
setSpeedMultiplier(parseFloat(event.target.value))
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2025-11-13 22:55:58 -08:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|