dofile("textrender.lua");
mouse_vx = 0;
mouse_vy = 0;
mouse_deadzone = 8192
mouse_ysensitivity = 70;
mouse_xsensitivity = 70;
last_x = 0;
last_y = 0;
last_d = 0;
last_f = 0;
dx = 0;
dy = 0;
dd = 0;
wolfmap = {};
for i=0,4095,1 do
wolfmap[i] = 0;
end
htable = {};
for i=1,150,1 do
htable[i] = 0;
end
hstring = "";
rndtable = {0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66, 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36, 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188, 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224, 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242, 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0, 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235, 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113, 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75, 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196, 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113, 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241, 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224, 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95, 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226, 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36, 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106, 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136, 120, 163, 236, 249};
while true do
a, b = jpcrr.wait_event();
if a == "lock" then
jpcrr.hud.top_gap(3, 16);
jpcrr.hud.right_gap(3, 512);
jpcrr.hud.bottom_gap(3, 112);
x = jpcrr.read_dword(0x004882E);
y = jpcrr.read_dword(0x0048832);
d = jpcrr.read_word(0x00048848);
timer = jpcrr.read_word(0x471DE);
rngindex = jpcrr.read_byte(0x26E70);
f = jpcrr.frame_number();
spd = math.sqrt(dx * dx + dy * dy)
render_text(3, 0, 0, string.format("(%7d,%7d) %3d [%+5d,%+5d](%f) %+3d", x, y, d, dx, dy, spd, dd), false, 0, 255, 0);
render_text(3, 0, 432, string.format("Time: %5d",timer), false, 0, 255, 0);
render_text(3, 0, 448, "Index", false, 0, 255, 0);
render_text(3, 88, 448, tostring(rngindex), false, 255, 255, 255);
render_text(3, 0, 464, "Dist 0-1", false, 0, 255, 0);
render_text(3, 0, 480, "Dist 2+", false, 0, 255, 0);
render_text(3, 0, 496, "Max Dist", false, 0, 255, 0);
for i=1,10,1 do
nextind = rngindex+i+1;
if nextind>256 then nextind = nextind - 256 end
render_text(3, 144+48*(i-1), 448, tostring(nextind-1), false, 0, 255, 0);
render_text(3, 144+48*(i-1), 464, tostring(math.floor((rndtable[nextind])/4)), false, 0, 255, 0);
render_text(3, 144+48*(i-1), 480, tostring(math.floor((rndtable[nextind])/6)), false, 0, 255, 0);
if i>1 then
distind = nextind - 1;
if distind<1 then distind=256 end
maxdist = math.floor(rndtable[distind]/12);
if maxdist<4 then maxdist = 3 end
render_text(3, 144+48*(i-1), 496, tostring(maxdist), false, 0, 255, 0);
end
end
if f ~= last_f then
dx = x - last_x;
dy = y - last_y;
dd = d - last_d;
last_x = x;
last_y = y;
last_d = d;
last_f = f;
end
for i=0,4095,1 do
tile = wolfmap[i];
if tile>0x7F then
doornum = tile - 0x80;
dooropen = jpcrr.read_byte(0x425F7+doornum*2);
if dooropen<0xFF then
jpcrr.hud.box(3,640+math.floor(i/64)*8,(i%64)*8,math.floor(((0xFF-dooropen)/0xFF)*8),8,0,0,0,0,0,0,255,255,255);
end
elseif tile>0 then
jpcrr.hud.box(3,640+math.floor(i/64)*8,(i%64)*8,8,8,0,0,0,0,0,255,255,255,255);
end
end
jpcrr.hud.circle(3,math.floor(x/8192)+640,math.floor(y/8192),4,0,0,0,0,0,255,69,0,255);
jpcrr.hud.circle(3,math.floor(x/8192)+640+math.cos(math.rad(d))*4,math.floor(y/8192)-math.sin(math.rad(d))*4,2,0,0,0,0,0,255,69,0,255);
--4882F: enemy x
for i=1,150,1 do
enemyt = jpcrr.read_word(0x48822+60*i);
if enemyt==0 then break end -- no ID, end of the list (...right?)
enemyh = jpcrr.read_word_signed(0x4884A+60*i);
if enemyh>0 then -- it's alive, otherwise move on
enemyx = jpcrr.read_word(0x4882F+60*i);
enemyy = jpcrr.read_word(0x48833+60*i);
enemyd = jpcrr.read_byte(0x4882C+60*i);
if enemyt==3 then -- guard
jpcrr.hud.circle(3,math.floor(enemyx/32)+640,math.floor(enemyy/32),4,0,0,0,0,0,205,133,63,255);
jpcrr.hud.circle(3,math.floor(enemyx/32)+640+math.cos(math.rad(enemyd*45))*4,math.floor(enemyy/32)-math.sin(math.rad(enemyd*45))*4,2,0,0,0,0,0,205,133,63,255);
elseif enemyt==5 then -- SS
jpcrr.hud.circle(3,math.floor(enemyx/32)+640,math.floor(enemyy/32),4,0,0,0,0,0,0,0,255,255);
jpcrr.hud.circle(3,math.floor(enemyx/32)+640+math.cos(math.rad(enemyd*45))*4,math.floor(enemyy/32)-math.sin(math.rad(enemyd*45))*4,2,0,0,0,0,0,0,0,255,255);
elseif enemyt==6 then -- dog
jpcrr.hud.circle(3,math.floor(enemyx/32)+640,math.floor(enemyy/32),4,0,0,0,0,0,255,105,180,255);
jpcrr.hud.circle(3,math.floor(enemyx/32)+640+math.cos(math.rad(enemyd*45))*4,math.floor(enemyy/32)-math.sin(math.rad(enemyd*45))*4,2,0,0,0,0,0,255,105,180,255);
else -- not yet ID'd
jpcrr.hud.circle(3,math.floor(enemyx/32)+640,math.floor(enemyy/32),4,0,0,0,0,0,255,255,255,255);
end
end
if enemyh~=htable[i] then -- damage has been done
hstring = string.format("Last damage dealt: %3d",(htable[i]-enemyh))
end
render_text(3, 0,416, hstring,false, 0, 255, 0);
htable[i]=enemyh;
end
jpcrr.release_vga();
elseif a == "message" then
c,d,e = string.match(b, "(.*) (.*) (.*)");
if b == "refresh" then
for i = 0,4095,1 do
wolfmap[i] = jpcrr.read_byte(0x44888+i);
end
end
if e and c == "BUTTON" then
if d == "304" and e == "1" then
jpcrr.pc_start();
end
if d == "304" and e == "0" then
jpcrr.pc_stop();
end
if d == "305" then
jpcrr.sendevent("org.jpc.emulator.peripheral.Keyboard", "KEYEDGE", "157");
end
if d == "307" then
jpcrr.sendevent("org.jpc.emulator.peripheral.Keyboard", "KEYEDGE", "57");
end
if d == "308" then
jpcrr.sendevent("org.jpc.emulator.peripheral.Keyboard", "KEYEDGE", "184");
end
end
if e and c == "move" then
if string.match(d, "-?[0-9]+") and string.match(e, "-?[0-9]+") then
print("Moved X "..tonumber(d).." and Y "..tonumber(e));
jpcrr.hold_mouse_motion(tonumber(d), tonumber(e));
end
end
--print(b);
end
end
-- 0x4882E U position (dword)
-- 0x48832 V position (dword)
-- 0x48848 Direction (word)