package main

import (
 "image"
 "syscall/js"
 "testing/fstest"
 "time"
)

var referenceConfig js.Value
var referenceFrames, referenceEvent int
var referenceTick int32 = -1
var referenceCallbacks []js.Func

type referenceFrontend struct{}

func (*referenceFrontend) DrawFrame(img *image.RGBA) {
 if gametic==referenceTick {return}
 referenceTick=gametic
 referenceFrames++
 p:=players[consoleplayer].Fmo
 pixels:=js.Global().Get("Uint8Array").New(len(img.Pix))
 js.CopyBytesToJS(pixels,img.Pix)
 js.Global().Call("postMessage",js.ValueOf(map[string]any{"type":"frame","pixels":pixels,"tick":int(gametic),"x":int(p.Fx),"y":int(p.Fy),"z":int(p.Fz),"angle":float64(p.Fangle),"health":int(p.Fhealth)}))
 time.Sleep(time.Millisecond)
 if referenceFrames>=120 {Stop()}
}
func (*referenceFrontend) SetTitle(string) {}
func (*referenceFrontend) CacheSound(string, []byte) {}
func (*referenceFrontend) PlaySound(string, int, int, int) {}
func (*referenceFrontend) GetEvent(event *DoomEvent) bool {
 schedule:=[][2]int{{5,173|256},{25,173},{30,174|256},{40,174},{45,163|256},{55,163},{65,162|256},{66,162}}
 if referenceEvent>=len(schedule)||referenceFrames<schedule[referenceEvent][0] {return false}
 value:=schedule[referenceEvent][1];referenceEvent++
 event.Key=uint8(value&255);event.Type=Ev_keyup
 if value&256!=0 {event.Type=Ev_keydown}
 return true
}
func main() {
 callback:=js.FuncOf(func(_ js.Value,args []js.Value)any{
  referenceConfig=args[0]
  go func(){
   name:=referenceConfig.Get("wadName").String()
   value:=referenceConfig.Get("wad")
   wad:=make([]byte,value.Get("byteLength").Int());js.CopyBytesToGo(wad,value)
   SetVirtualFileSystem(fstest.MapFS{name:&fstest.MapFile{Data:wad}})
   dg_run_full_speed=true
   args:=[]string{"-iwad",name,"-warp","1"};if name=="freedoom1.wad"{args=append(args,"1")}
   Run(&referenceFrontend{},args)
   js.Global().Call("postMessage",js.ValueOf(map[string]any{"type":"stopped"}))
  }()
  return nil
 })
 referenceCallbacks=append(referenceCallbacks,callback)
 js.Global().Set("doomStart",callback)
 select{}
}
