cleanup and debugging

This commit is contained in:
dylan
2024-03-29 22:23:01 -07:00
parent 9dffa2ef8e
commit 2e02dbcc92
9 changed files with 354 additions and 133520 deletions

View File

@ -1,9 +1,13 @@
import { assertNever } from "@firebox/tsutil";
import { pngToRom } from "./pngToRom";
import { renderCart as rawRenderCart } from "./rawRenderCart";
type PicoCart = {
name: string;
src: string; // TODO: ideally, accept png data url as well (or even just actual url?)
src: string;
} | {
name: string;
rom: number[];
}
type PlayerButtons = {
@ -31,9 +35,6 @@ type PicoPlayerHandle = {
setGamepadCount: (count: number) => void;
readonly gpio: number[]; // read + write (should be 256-tuple)
// audio
setAudioContext: (audioContext: AudioContext) => void;
// state (all communicated out)
readonly state: {
readonly frameNumber: number;
@ -66,25 +67,24 @@ const bitfield = (...args: boolean[]): number => {
return (args[0]?1:0)+2*bitfield(...args.slice(1));
}
export const makePicoConsole = async (carts: PicoCart[]): Promise<PicoPlayerHandle> => {
const canvas = document.createElement("canvas");
const getRom = async (cart: PicoCart) => {
if ("src" in cart) {
return await pngToRom(cart.src);
} else if ("rom" in cart) {
return cart.rom;
}
assertNever(cart);
}
export const makePicoConsole = async (props: {
canvas?: HTMLCanvasElement;
audioContext?: AudioContext;
carts: PicoCart[];
}): Promise<PicoPlayerHandle> => {
const {carts, canvas = document.createElement("canvas"), audioContext = new AudioContext()} = props;
canvas.style.imageRendering = "pixelated";
const Module = {canvas};
const cartsDatasPromiseArr = carts.map(cart => pngToRom(cart.src));
const audioContext = new AudioContext();
try {
var dummy_source_sfx = audioContext.createBufferSource();
dummy_source_sfx.buffer = audioContext.createBuffer(1, 1, 22050); // dummy
dummy_source_sfx.connect(audioContext.destination);
dummy_source_sfx.start(1, 0.25); // gives InvalidStateError -- why? hasn't been played before
//dummy_source_sfx.noteOn(0); // deleteme
}
catch(err) {
console.log("** dummy_source_sfx.start(1, 0.25) failed");
}
(window as any).cartsDatasPromiseArr = cartsDatasPromiseArr;
const cartsDatas = await Promise.all(cartsDatasPromiseArr);
const cartsDatas = await Promise.all(carts.map(cart => getRom(cart)));
const handle = rawRenderCart(Module, carts.map(cart => cart.name), cartsDatas, audioContext);
handle.pico8_state = {};
handle.pico8_buttons = [0,0,0,0,0,0,0,0];
@ -137,10 +137,7 @@ export const makePicoConsole = async (carts: PicoCart[]): Promise<PicoPlayerHand
dropCart(cart) {
handle.p8_dropped_cart_name = cart.name;
// TODO: make sure this is a dataURL first, and if not, load it and then pass it in
handle.p8_dropped_cart = cart.src;
},
setAudioContext(audioContext) {
handle.pico8_audio_context = audioContext;
// handle.p8_dropped_cart = cart.src;
},
modDragOver: (Module as any).pico8DragOver,
modDragStop: (Module as any).pico8DragStop,