No real progress. Just dumping this script on to you for your viewing pleasure.
There are two glitches with this script, but they are not of high priority to fix. Besides, said glitches are pretty out of the way for me anyway.
EDIT: Some extra stuff to the script. Some of the additions are hacked in, but the current need is to identify helicopter stuff in 1-4.
Download AHscan.luaLanguage: lua
--Constants we might want to change:
local MAX_RNGLIST= 20 --How many RNGs to show?
--0x8AA7C5B0 6000 RNG rolls
--0x3FB02DC9 6499 RNG rolls
--Acmlm's piece of work identifying some things, with some changes from me.
local types={
[ 0]={"Particle" },
[ 1]={"Player" ,color= 0x00FF00FF},
[ 2]={"1-1 boss 2's eye" },
[ 5]={"Back shots" },
[ 6]={"Monster" },
[ 7]={"Enemy" },
[ 8]={"Fire gunner 1" ,HP= 0xEE},
[ 9]={"Ice gunner 1" ,HP= 0xEE},
[ 10]={"Fire gunner 2" ,HP= 0xEE},
[ 11]={"Ice gunner 2" ,HP= 0xEE},
[ 14]={"Heli rider" },
[ 15]={"Tank rider" },
[ 16]={"Heli holding part",HP= 0xF0},
[ 17]={"Tower enemy" },
[ 18]={"KGB rider" },
[ 19]={"Jetpack guy" },
[ 20]={"Helicopter 1" ,HP= 0xEC},
[ 21]={"Helicopter 2" ,HP= 0xF0},
[ 22]={"KGB" },
[ 23]={"Metal wall" ,HP= 0xEA},
[ 24]={"Brick wall" },
[ 25]={"Bag wall" },
[ 26]={"Big missile" },
[ 27]={"Car" },
[ 28]={"3-2 boss" },
[ 29]={"Monster chain 1" },
[ 30]={"Monster chain 2" },
[ 31]={"Grenade thrower 1",HP= 0xEA},
[ 32]={"Grenade thrower 2"},
[ 33]={"Tank 1" ,HP= 0xEE},
[ 34]={"Tank 2" ,HP= 0xEE},
[ 41]={"Fly" },
[ 45]={"Crusher" },
[ 46]={"Runner" },
[ 47]={"1-1 boss 1" },
[ 48]={"1-1 boss 2" },
[ 53]={"Normal shot" ,color= -0x0000FF01},
[ 54]={"Bio shot" ,color= -0x0000FF01},
[ 55]={"Fire shot" ,color= -0x0000FF01},
[ 56]={"Ice shot" ,color= -0x0000FF01},
[ 57]={"Laser shot" ,color= -0x0000FF01},
[ 58]={"Ball shot" ,color= -0x0000FF01},
[ 59]={"3-shot" ,color= -0x0000FF01},
[ 60]={"Spread shot" ,color= -0x0000FF01},
[ 61]={"Charged shot" ,HP= 0xEC,color= -0x0000FF01},
[ 62]={"Fire splash" ,color= -0x0000FF01},
[ 63]={"Ice splash" ,color= -0x0000FF01},
[ 64]={"Grenade 1" ,color= -0x0000FF01},
[ 65]={"Grenade 2" ,color= -0x0000FF01},
[ 66]={"Grenade 3" ,color= -0x0000FF01},
[ 67]={"Grenade 4" ,color= -0x0000FF01},
[ 68]={"Grenade 5" ,color= -0x0000FF01},
[ 69]={"Grenade 6" ,color= -0x0000FF01},
[ 70]={"Grenade 7" ,color= -0x0000FF01},
[ 71]={"Grenade 8" ,color= -0x0000FF01},
[ 74]={"Monster grab" },
[ 75]={"Enemy bullet" },
[ 76]={"Enemy grab 1" },
[ 77]={"Enemy grab 2" },
[ 78]={"Thrown enemy" },
[ 79]={"Fire ball" },
[ 80]={"Ice ball" },
[ 81]={"Cannon ball" },
[ 82]={"Bullet" },
[ 83]={"Beam 1" },
[ 84]={"Beam 2" },
[ 85]={"Ground shake" },
[ 88]={"Missile" },
[ 89]={"Barrel bomb" },
[ 90]={"Mine" },
[ 91]={"Toxic barrel" },
[ 92]={"Building 1" ,HP= 0xEC},
[ 93]={"Building 2" ,HP= 0xEC},
[ 94]={"Building 3" ,HP= 0xEC},
[ 95]={"Building 4" ,HP= 0xEC},
[ 96]={"Building 5" ,HP= 0xEC},
[ 97]={"Building 6" ,HP= 0xEC},
[ 98]={"Building 7" ,HP= 0xEC},
[ 99]={"Building 8" ,HP= 0xEC},
[100]={"Building 9" ,HP= 0xEC},
[102]={"Building 11" ,HP= 0xEC},
[103]={"Building 12" ,HP= 0xEC},
[104]={"Building 13" ,HP= 0xEC},
[105]={"Building 14" ,HP= 0xEC},
[106]={"Building 15" ,HP= 0xEC},
[108]={"Vehicle 1" ,HP= 0xEC},
[109]={"Vehicle 2" },
[110]={"Bus 1" },
[111]={"Bus 2" ,HP= 0xEC},
[112]={"Bus 3" },
[122]={"Weapon gift" ,color= 0x00FFFFFF},
[123]={"Weapon drop" ,color= 0x00FFFFFF},
[132]={"Flower" ,color= 0x00FFFFFF},
[133]={"30 grenades" ,color= 0x00FFFFFF},
[134]={"Weapon giver 1" ,color= 0x00FFFF80},
[135]={"Weapon giver 2" ,color= 0x00FFFF80},
[157]={"Bullet shooter" },
[159]={"Tornado" },
[160]={"Scorpion" },
[161]={"Vulture" },
[162]={"Robot bomb" },
[163]={"Vulture feather" },
[164]={"Robot" },
[168]={"Sludge hand" },
[170]={"Falling sludge" },
[173]={"Big sludge" },
[176]={"Water splasher" },
[177]={"Pudding sign" },
[180]={"1-2 boss?" },
[181]={"2-3 boss" },
[185]={"2-3 boss missile" },
[186]={"2-1 boss part 1" },
[187]={"2-1 boss part 2" },
[188]={"2-1 boss part 3" },
[189]={"2-1 boss part 4" },
[195]={"2-2 boss" },
[199]={"2-2 boss small" },
[203]={"2-2 boss tiny" },
[205]={"3-1 boss head" },
[206]={"3-1 boss claws" },
[207]={"3-1 boss body" },
[208]={"3-1 boss tail" },
[214]={"Final boss" },
[219]={"Large shot" },
[222]={"Alien piece" },
[223]={"Large grenade" },
[224]={"Large red grenade"}
}
--Second, a few sanities I want to make:
local R4s= memory.readdwordsigned --Read 4 bytes, signed
local R4u= memory.readdword --Read 4 bytes, unsigned
local R2u= memory.readword --Read 2 bytes, unsigned
local green= 0x00FF00FF
local green2= 0x00A000FF
local cyan= 0x00FFFFFF
local white= -0x00000001
local violet=-0x00FF0001
local red= -0x00DFFF01
local orange=-0x005FFF01
local fade= -0x00000080
local shade= 0x000000D0
local PXpos,PYpos,PXspd,PYspd= 0,0,0,0
local CamX = 0
local CamY = 0
local function NULLfn() end
--*****************************************************************************
local function RefreshStats()
--*****************************************************************************
spacemode= R2u(0x030016DB)
if spacemode == 0 then
cooldown = R2u(0x03000476) + R2u(0x03000478)*8
ammo = R2u(0x03000472)
grenades = R2u(0x03000474) .. ":" .. R2u(0x03000310)
CamX = R4s(0x03000170)
CamY = R4s(0x03000370)
-- CamY = 0x58000
if R2u(0x03000470) == 7 then ammo= ammo/6 end
else
cooldown = R2u(0x030016CC)
ammo = R2u(0x030016B4)
grenades = R2u(0x030016C8)
CamX = R4s(0x03000248)
CamY = R4s(0x0300024C)
end
charge = R2u(0x0300047E)
scoreL = R4s(0x03000484)
scoreT = R4s(0x03000134)
tokill = R2u(0x03000328)
bosshp = R2u(0x030003F6)
end
--#############################################################################
--#############################################################################
--Object detection Module
local LinkSel= 3
local BaseLink= {
{0x03000500, "Objects"}, --All ingame objects that need tracking is here.
{0x0300050C, "Vehicle"}, --Naturally, these drive around.
{0x03000518, "Hit me!"}, --Hitboxes. The kinds that are actually used!
{0x03000524, "Shots" }, --Projectiles of all sorts.
{0x03000530, "Enemy" }, --Apparently the low-class enemies.
{0x0300053C, "Alt?" } --Alternate of "Objects".
}
--My favorite base is one marked as "Hit me!".
--*****************************************************************************
local function NextLink(ptr)
--*****************************************************************************
--Returns two values: An object pointer (possibly nil) and a link pointer.
local PTR= R4s(ptr)
local OBJ= R4s(PTR+8)
if OBJ == 0 then OBJ= nil end
return OBJ, PTR
end
local H= {}
--*****************************************************************************
local function PutHitbox(obj,index)
--*****************************************************************************
local Xpos,Ypos= R4s(obj+0x80),R4s(obj+0x84)
local X_hitbox= R4s(obj+0x70)
local Y_hitbox= R4s(obj+0x74)
local Y_offset= R4s(obj+0x6C)
local Left= Xpos - X_hitbox
local Right= Xpos + X_hitbox
local Up= Ypos - Y_hitbox/2 + Y_offset
local Down= Ypos + Y_hitbox/2 + Y_offset
local tbl= H[index] or {}
tbl.obj= obj
tbl.L= (Left -CamX)/1024 --By pixel, in relation to camera
tbl.R= (Right-CamX)/1024
tbl.U= (Up -CamY)/1024
tbl.D= (Down -CamY)/1024
local T= types[R4s(R4s(obj+0x68))]
if T then
tbl.color= T.color or -0x00FFFF01
if T.HP then tbl.HP= R2u(obj+T.HP)
else tbl.HP= nil end
else
tbl.color= 0x0080FFFF
end
H[index]= tbl
end
local PlPosX, PlPosY, HiPosX, HiPoxY, DistanceEst
--*****************************************************************************
local function WalkList()
--*****************************************************************************
local obj, ptr= NextLink(BaseLink[LinkSel][1])
local count= 0
PlPosX, PlPosY, HiPosX, HiPoxY= nil, nil, nil, nil
while obj do
count= count+1
if count > 200 then error("FRK goofed, shutting down") end --Panic.
PutHitbox(obj,count)
--H[count].HP= R4s(R4s(obj+0x68))
if R4s(R4s(obj+0x68)) == 1 then
PlPosX,PlPosY= R4s(obj+0x80),R4s(obj+0x84)
elseif R4s(R4s(obj+0x68)) == 16 then
HiPosX,HiPosY= R4s(obj+0x80),R4s(obj+0x84)
end
obj, ptr= NextLink(ptr)
end
H[count+1]= nil
if PlPosX and HiPosX then
local Xdelta, Ydelta= PlPosX-HiPosX , PlPosY-HiPosY
DistanceEst= (Xdelta^2 + Ydelta^2)^(0.5)
else
DistanceEst= nil
end
end
--#############################################################################
--#############################################################################
--RNG Module
local RNGaddr= 0x030019E0
local BigNum= 0xFFFFFFFF +1 --Using 0x100000000 directly fails somehow.
--*****************************************************************************
local function Roll(v) return ((v*0x0019660D)+0x3C6EF35F) % BigNum end
-- function Unroll(v) return ((v*0xFEE058C5)+0x25D60FE5) % BigNum end
--*****************************************************************************
--*****************************************************************************
local function Unroll(v)
--*****************************************************************************
--Inverse of Roll; Goes backwards through the RNG.
--This expanded function is needed for the fact double-precision float fails.
local LowWord= v % 0x10000 --Splitting the value into two.
local HighWord= v - LowWord --Double-precision float not good enough!
HighWord= (HighWord*0x011FA73B) % BigNum --Using the negative. Fewer
LowWord= (LowWord *0x011FA73B) % BigNum --bits, but not enough...
return ( 0x25D60FE5 - (HighWord + LowWord) ) % BigNum
end
local CurrentRNG= 0x00020080
local RNGcount= 0
local RNGpanic= false
--*****************************************************************************
local function CountRolls(RN)
--*****************************************************************************
if RN == CurrentRNG then return 0 end
local Next,Prev= CurrentRNG, CurrentRNG
for i= 1, 2000 do --Create a MAX_COUNTRNG variable?
Next= Roll(Next)
if Next == RN then return i end
Prev= Unroll(Prev)
if Prev == RN then return -i end
end
return false -- Uh, I'm not searching anymore, this is where you panic.
end
--*****************************************************************************
local function CountRollsFromScratch()
--*****************************************************************************
local R= 0x00020080
local T= R4u(RNGaddr)
for i= 0, 200000 do
if R == T then RNGcount= i; return end
R= Roll(R)
end
RNGcount= -99
end
--*****************************************************************************
local function FindType(RN)
--*****************************************************************************
--Takes in RNG state.
--Returns new RNG state, and rolls to find type
local rolls= 0
repeat
rolls= rolls+1
RN= Roll(RN)
until bit.band(RN,0x00070000) == 0x00070000 -- Known constant, but...
return RN, rolls
end
--*****************************************************************************
local function FindDrop(RN)
--*****************************************************************************
--Takes in RNG state.
--Returns new RNG state, rolls to reach RNG state, and rolls to determine type.
local rolls= 0
repeat
rolls= rolls+1
RN= Roll(RN)
until bit.band(RN,0x000F0000) == 0x00000000 -- Uh, might change...
local junk, type= FindType(RN)
return RN, rolls, type
end
local RList= {}
local TList= {}
TList[0]= 0
--*****************************************************************************
local function RefreshRNGList(RN)
--*****************************************************************************
local rollR, rollT= 0, 0
local R2= RN
for i= 1, MAX_RNGLIST do
local roll, type
RN, roll, type= FindDrop(RN)
rollR= rollR + roll
local tbl= RList[i] or {}
tbl.roll= rollR
tbl.type= type
RList[i]= tbl
R2, type= FindType(R2)
rollT= rollT + type
TList[i]= rollT
end
RList.RNG= RN
TList.RNG= R2
end
--*****************************************************************************
local function AdvanceRNGList(rolls)
--*****************************************************************************
local len= MAX_RNGLIST
if (RList[len].roll < rolls) then RefreshRNGList(CurrentRNG); return end
local i= 1
while RList[i] do
RList[i].roll= RList[i].roll-rolls
if RList[i].roll <= 0 then
table.insert(RList,table.remove(RList,i))
local R, rl, ty= FindDrop(RList.RNG)
RList[len].roll= RList[len-1].roll+rl
RList[len].type= ty
RList.RNG= R
else
i= i+1
end
end
i= 1
while TList[i] do
TList[i]= TList[i]-rolls
if TList[i] <= 0 then
table.remove(TList,i)
local R, rl= FindType(TList.RNG)
TList[len]= TList[len-1] + rl
TList.RNG= R
else
i= i+1
end
end
end
--*****************************************************************************
local function HandleRNG()
--*****************************************************************************
local NewRNG= R4u(RNGaddr)
local rolls= CountRolls(NewRNG)
CurrentRNG= NewRNG
if not rolls then
RNGcount= 0 --Panic. Use some substitute.
RefreshRNGList(NewRNG) --Full refresh. Can't even guess where we are.
else
RNGcount= RNGcount + rolls
if rolls < 0 then RefreshRNGList(NewRNG)
elseif rolls > 0 then AdvanceRNGList(rolls) end
end
end
--Immediate code to execute.
CountRollsFromScratch()
CurrentRNG= memory.readdword(RNGaddr)
RefreshRNGList(CurrentRNG)
--0x8AA7C5B0 6000 RNG rolls
--0x3FB02DC9 6499 RNG rolls
--0x01E196B8 7000 RNG rolls
--*****************************************************************************
local function CheatModifyRNG(v)
--*****************************************************************************
local r= 0x01E196B8
for i= 1, v do r= Roll(r) end
CurrentRNG= r
if r >= 0x80000000 then r= r-BigNum end
memory.writedword(RNGaddr,r)
RNGcount= 7000+v
end
--#############################################################################
--#############################################################################
--Display Module
--*****************************************************************************
local function GuiTextRight(x,y,str,c1,c2)
--*****************************************************************************
str= tostring(str)
x= x - (#str)*4
gui.text(x,y,str,c1,c2)
end
--*****************************************************************************
local function HexStr(v)
--*****************************************************************************
local str= ""
if v < 0 then
str= "-"
v= -v
end
return str .. string.upper(string.format("%x",v))
end
--local zzxx= 0x00020080
--for i= 1, 7200 do
-- zzxx= Roll(zzxx)
--end
--for i= 7201, 7226 do
-- zzxx= Roll(zzxx)
-- print(i .. " - " .. HexStr(zzxx) )
--end
--*****************************************************************************
local function HexVal(a) return HexStr(R4s(a)) end
--*****************************************************************************
local ObjTrace= nil
--*****************************************************************************
local function WatchObj()
--*****************************************************************************
if not ObjTrace then return end
GuiTextRight(190, 0,HexStr(ObjTrace), green)
GuiTextRight(190, 8,HexVal(ObjTrace+0x90))
GuiTextRight(190, 16,HexVal(ObjTrace+0x94))
GuiTextRight(190, 24,HexVal(ObjTrace+0x98))
GuiTextRight(190, 32,HexVal(ObjTrace+0x9C))
GuiTextRight(190, 40,HexVal(R4s(ObjTrace+0x68)),cyan)
end
local XSCR, YSCR= 240, 160
local offX, offY= 0, 0
local Sc= 1
--*****************************************************************************
local function PaintHitboxes(scale)
--*****************************************************************************
if scale > 1 then gui.box(offX,offY,offX+XSCR/scale,offY+YSCR/scale,0,fade) end
local i= 1
while H[i] do
local x1= math.floor(H[i].L/scale)+offX
local x2= math.floor(H[i].R/scale)+offX
local y1= math.floor(H[i].U/scale)+offY
local y2= math.floor(H[i].D/scale)+offY
gui.box(x1,y1,x2,y2,0,H[i].color)
if H[i].HP then gui.text(x1,y2+1,H[i].HP) end
i=i+1
end
end
local TypeClr= {
[0]= green, --Grenade pack
green2,--Green cloud gun
orange,--Flame
cyan, --Ice
fade, --Bleh
fade, --Also Bleh
violet,--Humn
red, --Yay
}
--*****************************************************************************
local function RNGHUD()
--*****************************************************************************
for i= 1, MAX_RNGLIST do
local clr= TypeClr[RList[i].type%8]
GuiTextRight(240,7*(i-1), string.format("%d:%2d",RList[i].roll,RList[i].type),clr,shade)
clr= fade; if TList[i] >= TList[i-1]+8 then clr= white end
GuiTextRight(210,7*(i-1), TList[i],clr,shade)
end
end
local CrgLvl= {51,72,98,128,162,200 ,200}
--*****************************************************************************
local function BasicHUD()
--*****************************************************************************
-- gui.text(1,1,spacemode)
WatchObj()
if cooldown == 0 then gui.text(0,1,"Ready",green)
else GuiTextRight(20,1,cooldown) end
GuiTextRight( 20, 9,ammo)
GuiTextRight( 20,17,grenades)
GuiTextRight(240,152,HexStr(CamX))
-- GuiTextRight(180,152,HexStr(CamY))
--Later, I'll separate them out...
local a= R2u(0x03000332) --Camera lock flag
if bit.band(a,1) == 1 then
gui.text(120,152,"LOCK",red)
a= R2u(0x03000328) -- Kills left
if a ~= 0 then gui.text(140,152,a,green) end
end
if charge ~= 0 then
GuiTextRight(21,30,charge)
local b= 7
for i= 1, 6 do
if charge < CrgLvl[i] then b= i; break end
end
gui.text(21,30,string.format("/%3d",CrgLvl[b]))
if b == 1 then GuiTextRight(21,38,"Wait",red)
else GuiTextRight(21,38,b+3,green) end
end
a= R2u(0x0300031A) -- Enemy spawn timer
if a == 30 then gui.text(120,144,"SPAWN",red)
else gui.text(120,144,"Spawn") end
a= string.format("Timer: %2d",a)
gui.text(144,144,a)
GuiTextRight(240,142,RNGcount,green)
if bosshp ~= 0 then GuiTextRight(152,6,bosshp,fade,shade) end
end
--#############################################################################
--#############################################################################
--User Control Module
local keys, lastkeys= input.get(), input.get() --So we have some default state
--*****************************************************************************
local function UpdateKeys() lastkeys= keys; keys= input.get() end
local function Press(k) return keys[k] and not lastkeys[k] end
--*****************************************************************************
--*****************************************************************************
local function Rescale(adj)
--*****************************************************************************
-- Affects the Display Module; Hitbox scaling for off-screen viewing.
Sc= math.max(Sc+adj,1)
offX= XSCR*(1 - 1/Sc) / 2
offY= YSCR*(1 - 1/Sc) / 2
end
--*****************************************************************************
local function Trace()
--*****************************************************************************
local i= 1
local mX, mY= keys.xmouse, keys.ymouse
while H[i] do
if (mX >= H[i].L) and (mX <= H[i].R)
and (mY >= H[i].U) and (mY <= H[i].D) then
ObjTrace= H[i].obj
return
end
i= i+1
end
end
local Obox= 1
local OHUD= 1
local ShowBoxes= PaintHitboxes
local ShowRNG= RNGHUD
--*****************************************************************************
local function KeyScan()
--*****************************************************************************
UpdateKeys()
if keys.numpad6 then LinkSel= (LinkSel%6)+1 end
if keys.numpad7 then Rescale( .125) end
if keys.numpad1 then Rescale(-.125) end
if keys.numpad8 then Obox= math.min(Obox+.125 , 1); ShowBoxes= PaintHitboxes end
if keys.numpad2 then Obox= math.max(Obox-.125 , 0); if Obox <= 0 then ShowBoxes= NULLfn end end
if keys.numpad9 then OHUD= math.min(OHUD+.125 , 1); ShowRNG= RNGHUD end
if keys.numpad3 then OHUD= math.max(OHUD-.125 , 0); if OHUD <= 0 then ShowRNG= NULLfn end end
if keys.leftclick then Trace() end
if keys.numpad5 then CountRollsFromScratch() end
if keys.numpad0 then RNGcount= 0 end
end
--#############################################################################
--#############################################################################
-- Immediate
local zZz= 0
--*****************************************************************************
local function Fn()
--*****************************************************************************
local h= R2u(0x020087C6)
if h < 300 then gui.text(1,132,movie.framecount()-299+h,cyan) end
end
local ScM,ScE,ScB,ScS= 0, 0, 0, 0
--*****************************************************************************
local function ScoreCalc()
--*****************************************************************************
-- Because I'm feeling silly today
--*0484 -- Primary score
--*0488 -- ( 11 E_S) Kill count
--*048C -- Usual kills
--*0490 -- Grenade kills
--*0494 -- ( 51 __S) Bites
--*0498 -- ( 5 E_S) Knife kills
--*049C -- ??
--*04A0 -- ??
--*04A4 -- ( 11 _BS) Damage to bosses, for boss score
--*04A8 -- (100 __S) Buildings destroyed
--*04AC -- ??
ScM= R4s(0x03000484)
ScE= 11*R4s(0x03000488) + 5*R4s(0x03000498)
ScB= 11*R4s(0x030004A4)
ScS= 51*R4s(0x03000494) +100*R4s(0x030004A8) + ScE + ScB
end
--*****************************************************************************
local function DispScore()
--*****************************************************************************
GuiTextRight( 60, 1,ScM,cyan)
GuiTextRight( 60, 9,ScE,red)
GuiTextRight( 60, 17,ScB,violet)
GuiTextRight( 60, 25,ScS,green)
GuiTextRight( 60, 34,ScM+ScE+ScB+ScS)
end
--#############################################################################
--#############################################################################
--Main loop
--*****************************************************************************
local function GuiStuff()
--*****************************************************************************
gui.opacity(Obox); ShowBoxes(Sc)
gui.opacity(OHUD); RNGHUD()
gui.opacity(1); BasicHUD()
-- Fn()
-- DispScore()
if DistanceEst then
GuiTextRight( 60, 1,math.floor(DistanceEst/1024),fade)
GuiTextRight( 60, 9,math.floor((PlPosX-HiPosX)/1024))
GuiTextRight( 60,17,math.floor((PlPosY-HiPosY)/1024))
GuiTextRight( 90, 9,PlPosX-HiPosX)
GuiTextRight( 90,17,PlPosY-HiPosY)
end
end
gui.register(GuiStuff)
--*****************************************************************************
local function FrameUpdates()
--*****************************************************************************
RefreshStats()
-- ScoreCalc()
KeyScan()
WalkList()
HandleRNG()
-- if Press("Z") then CheatModifyRNG(zZz); zZz= zZz+1 end
end
emu.registerafter(FrameUpdates)
FrameUpdates()