export function writeCustomEvent(dataView: DataView, spaceEvent: ISpaceEvent, info: IEventWriteInfo, asm: string, temp: any) { $$log("Writing custom event", spaceEvent, info); // Assemble and write if (info.gameVersion === 1) { return asm; } const customEvent = createCustomEvent(asm); const preppedAsm = prepAsm(asm, customEvent, spaceEvent, info); const bytes = assemble(preppedAsm) as ArrayBuffer; $$log(preppedAsm); copyRange(dataView, bytes, 0, 0, bytes.byteLength); return [info.offset!, bytes.byteLength]; }
testAssemble: function(asm: string, parameters?: IEventParameter[], info: Partial<IEventWriteInfo> = {}) { // Make fake parameterValues const parameterValues: any = {}; if (parameters && parameters.length) { parameters.forEach(parameter => { parameterValues[parameter.name] = 0; }); } const customEvent = createCustomEvent(asm); const preppedAsm = prepAsm(asm, customEvent, { parameterValues } as ISpaceEvent, Object.assign({ addr: 0, }, info) as IEventWriteInfo); const bytes = assemble(preppedAsm) as ArrayBuffer; return bytes; }
} return true; } return false; }, write(dataView: DataView, event: ISpaceEvent, info: IEventWriteInfo, temp: any) { let staticHelperJal = 0; if (info.boardIndex === 0) staticHelperJal = 0x80108C1C; else throw `ChainMerge3 for ${info.boardIndex} needs work`; const asm = prepAsm(` ADDIU SP, SP, -0x18 SW RA, 0x10(SP) ADDIU A0, R0, ${event.parameterValues!.prevSpace} ADDIU A1, R0, ${event.parameterValues!.chain || 0} JAL ${$$hex(staticHelperJal)} ADDIU A2, R0, ${event.parameterValues!.spaceIndex || 0} LW RA, 0x10(SP) JR RA ADDIU SP, SP, 0x18 `, ChainMerge3, event, info); const bytes = assemble(asm) as ArrayBuffer; copyRange(dataView, bytes, 0, 0, bytes.byteLength); return [info.offset!, bytes.byteLength]; }, } addEventToLibrary(ChainMerge3);
return true; } } return false; }, // TODO: We can do a O(1) + n/2 style improvement for this event. write(dataView: DataView, event: ISpaceEvent, info: IEventWriteInfo, temp: any) { const asm = ` ADDIU SP, SP, -0x18 SW RA, 0x10(SP) ADDIU A0, R0, -1 ADDIU A1, R0, ${event.parameterValues!.chain as number} JAL SetNextChainAndSpace ADDIU A2, R0, ${event.parameterValues!.spaceIndex || 0} LW RA, 0x10(SP) JR RA ADDIU SP, SP, 0x18 `; if (info.gameVersion === 1) { return asm; } const bytes = assemble(prepAsm(asm, ChainMerge, event, info)) as ArrayBuffer; copyRange(dataView, bytes, 0, 0, bytes.byteLength); return [info.offset!, bytes.byteLength]; } }; addEventToLibrary(ChainMerge);