import { Duration, formatDuration } from "../components/Duration";
import Element = JSX.Element;
import { Section } from "../components/Section";
import MultiRangeSlider from "../components/MultiSlider";
import { DemoHead } from "../header";
import { createSignal } from "solid-js";
import { downloadBuffer, edit } from "./tools";
export interface EditPageProps {
header: DemoHead;
demoData: ArrayBuffer;
setDropText: (string) => void;
name: string;
}
export const Editor = (props: EditPageProps) => {
let demoInfo: any[] | Element = [];
demoInfo = (
{props.header.map}
);
const [loading, setLoading] = createSignal(false);
const [cutFrom, setCutFrom] = createSignal(0);
const [cutTo, setCutTo] = createSignal(props.header.ticks);
const intervalPerTick = props.header.duration / props.header.ticks;
const [unlockPov, setUnlockPov] = createSignal(false);
const [fixPlayerCount, setFixPlayerCount] = createSignal(true);
const editCb = async () => {
try {
setLoading(true);
props.setDropText("Editing...");
await doEdit(
props.name,
props.demoData,
props.header,
unlockPov(),
fixPlayerCount(),
cutFrom(),
cutTo(),
);
props.setDropText(props.name);
setLoading(false);
} catch (e) {
props.setDropText("Error: " + e.toString());
setLoading(false);
}
};
return (
{demoInfo}
- Cuts the demo file to the selected tick range.
-
Cutting demos is experimental, resulting demo files might crash,
have broken animations or have other issues.
-
Changing the specific cut range can sometimes work around issues
with broken demos.
{
if (min !== cutFrom() || max !== cutTo()) {
setCutFrom(min);
setCutTo(max);
}
}}
labelFn={(ticks) => formatDuration(ticks * intervalPerTick)}
/>
);
};
async function doEdit(
name: string,
data: ArrayBuffer,
header: DemoHead,
unlockPov: boolean,
fixPlayerCount: boolean,
from: number,
to: number,
) {
let options = {
unlock_pov: unlockPov,
fix_player_count: fixPlayerCount,
cut: from > 0 || to < header.ticks ? { from, to } : undefined,
};
console.log(options);
const edited = await edit(data, options);
downloadBuffer(edited, name.replace(".dem", "_edited.dem"));
}