fceux/branches/sdl2/output/luaScripts/SMB-Snow.lua

246 lines
6.7 KiB
Lua

--Super Mario Bros. - It's Snowing!
--Written by XKeeper
require("x_functions");
if not x_requires then
-- Sanity check. If they require a newer version, let them know.
timer = 1;
while (true) do
timer = timer + 1;
for i = 0, 32 do
gui.drawbox( 6, 28 + i, 250, 92 - i, "#000000");
end;
gui.text( 10, 32, string.format("This Lua script requires the x_functions library."));
gui.text( 53, 42, string.format("It appears you do not have it."));
gui.text( 39, 58, "Please get the x_functions library at");
gui.text( 14, 69, "http://xkeeper.shacknet.nu/");
gui.text(114, 78, "emu/nes/lua/x_functions.lua");
warningboxcolor = string.format("%02X", math.floor(math.abs(30 - math.fmod(timer, 60)) / 30 * 0xFF));
gui.drawbox(7, 29, 249, 91, "#ff" .. warningboxcolor .. warningboxcolor);
FCEU.frameadvance();
end;
else
x_requires(4);
end;
function smbpx2ram(px, py)
py = math.floor(py) - 0x20;
px = math.floor(px);
-- text(90, 16, string.format("PX[%4d] PY[%4d]", px, py));
if px < 0 or px > 400 or py < 0x00 or py > (240 - 0x20) then
return false;
end;
oy = math.floor(py / 0x10);
ox = math.fmod(math.floor((px + smbdata['screenpos']) / 0x10), 0x20);
-- text(90, 16, string.format("CX[%4X] CY[%4X]", ox, oy));
offset = 0x500 + math.fmod(oy * 0x10 + math.floor(ox / 0x10) * 0xC0 + math.fmod(ox, 0xD0), 0x1A0);
return offset;
end;
function smbram2px(offset)
offset = offset - 0x500;
if offset < 0 or offset >= 0x1A0 then
return false;
end;
px = (math.fmod(offset, 0x10) + math.floor(offset / 0xD0) * 0x10) * 0x10;
px = px - math.fmod(smbdata['screenpos'], 0x200);
-- text(8, 8, string.format("PX[%4d] OF[%4X]", px, offset));
if px < 0 then
px = px + 0x200;
end;
py = math.floor(math.fmod(offset, 0xD0) / 0x10);
returnval = {x = px, y = py};
return returnval;
end;
function doballs()
count = 0;
for k, v in pairs(balls) do
v['x'] = v['x'] + v['xs'] - smbdata['screenposchg'];
v['y'] = v['y'] + v['ys'];
-- v['ys'] = v['ys'] - 0.1;
v['life'] = v['life'] - 1;
offset = smbpx2ram(v['x'], v['y']);
temp = 0;
if offset then
temp = memory.readbyte(offset);
end;
-- 354 so we can spawn them offscreen
if v['x'] < 0 or v['x'] > 512 or v['y'] < 0 or v['y'] > 243 or v['life'] < 0 or (temp > 0) then
balls[k] = nil;
else
balls[k] = v;
colkey = math.ceil(255 * (5 - math.max(math.min(5, (v['life'] / 15)), 0)) / 5);
if v['c'] >= 0 then
color = string.format("#%02X%02X%02X", v['c'], v['c'], 255);
-- color = string.format("#%02X%02X%02X", v['c'] * .8, v['c'] * .5, v['c'] * 0);
else
color = string.format("#%02X0000", v['c'] * -1 , 0, 0);
end;
if v['life'] > 400 then
box(v['x'] - 1, v['y'] - 1, v['x'] + 1, v['y'] + 1, color);
pixel(v['x'], v['y'], color);
elseif v['life'] > 200 then
box(v['x'], v['y'], v['x'] + 1, v['y'] + 1, color);
else
pixel(v['x'], v['y'], color);
end;
count = count + 1;
end;
end;
return count;
end;
balls = {};
z = 0;
timer = 0;
smbdata = {screenpos = 0};
while (true) do
if
memory.readbyte(0x0301) == 0x3F and
memory.readbyte(0x0302) == 0x10 and
memory.readbyte(0x0303) == 0x04 and
memory.readbyte(0x0304) == 0x22
then
memory.writebyte(0x0304, 0x0F);
end;
smbdata['screenposold'] = smbdata['screenpos'];
smbdata['screenpos'] = memory.readbyte(0x071a) * 0x100 + memory.readbyte(0x071c);
smbdata['screenposchg'] = smbdata['screenpos'] - smbdata['screenposold'];
smbdata['rendercol'] = memory.readbyte(0x06A0);
if smbdata['screenposchg'] < 0 then
smbdata['screenposchg'] = 0;
end;
timer = timer + 1;
ballcount = doballs();
for i = 0, 2 do
balls[z] = {x = math.random(0, 512), y = 0, xs = math.random(-50, 00) / 100, ys = math.random(100, 150) / 100, life = math.random(400, 700), c = math.random(200, 255)};
z = z + 1;
end;
-- lifebar(8, 8, 240, 2, ballcount, 1000, "#ffffff", "clear");
--]]
--[[
for x = 0x00, 0x0F do
for y = 0x00, 0x0C do
box(x * 0x10 + 0, y * 0x10 + 0x20, x * 0x10 + 0x01, y * 0x10 + 0x21, "#FFFFFF");
value = memory.readbyte(smbpx2ram(x * 0x10, y * 0x10 + 0x20));
if value > 0 then
text(x * 0x10 + 0, y * 0x10 + 0x20, string.format("%02X", value));
end;
end;
end;
]]
-- text(8, 8, string.format("0x06A0 [%4X]", smbdata['rendercol']));
--[[
for i = 0, 5 do
ret = smbram2px(0x500 + i * 0x10 + i);
if ret then
-- text(8, 16, string.format("PX[%4d] PY[%4d]", ret['x'], ret['y']));
box(ret['x'] + 0, ret['y'] * 0x10 + 0x20, ret['x'] + 0x0F, ret['y'] * 0x10 + 0x2F, "#FFFFFF");
end;
end;
--]]
--[[
box(19, 19, 0x20 * 2 + 20, 46, "#0000ff");
box(18, 18, 0x20 * 2 + 21, 47, "#0000ff");
for x = 0, 0x1F do
for y = 0, 0x0C do
offset = 0x500 + y * 0x10 + math.floor(x / 0x10) * 0xD0 + math.fmod(x, 0x10);
c = memory.readbyte(offset);
box(x * 2 + 20, y * 2 + 20, x * 2 + 21, y * 2 + 21, string.format("#%02X%02X%02X", c, c, c));
end;
end;
if math.fmod(timer, 2) < 1 then
temp = math.floor(math.fmod(smbdata['screenpos'], 0x200) / 8);
if temp < 0x20 then
box(temp + 20, 19, temp + 0x10 * 2 + 20, 46, "#ffffff");
else
box(temp + 20, 19, 0x20 * 2 + 20, 46, "#ffffff");
box(19, 19, (temp - 0x20) + 20, 46, "#ffffff");
end;
line(smbdata['rendercol'] * 2 + 20, 19, smbdata['rendercol'] * 2 + 20, 46, "#00ff00");
end;
--]]
--[[
x = 0;
y = 0;
px = math.sin(timer / 60) * 100 + 127;
py = math.cos(timer / 60) * 90 + 100 + 0x20;
offset = smbpx2ram(px, py);
if offset then
offset = offset - 0x500;
x = math.floor(offset / 0xD0) * 0x10 + math.fmod(offset, 0x10);
y = math.floor(math.fmod(offset, 0xD0) / 0x10);
x2 = math.fmod(smbdata['screenpos'] + x * 0x10, 0x100);
box( x2, y * 0x10 + 0x20, x2 + 0x0F, y * 0x10 + 0x2F, "#ffffff");
-- line( 0, y * 0x10, 255, y * 0x10, "#ffffff");
box (px - 3, py - 3, px + 3, py + 3, "#ffffff");
line(px - 6, py , px + 6, py , "#ffffff");
line(px , py - 6, px , py + 6, "#ffffff");
text(90, 24, string.format("Offset[%04X]", offset + 0x500));
text(90, 32, string.format("OX[%4X] OY[%4X]", x, y));
text(90, 40, string.format("SX[%4X]", x2));
else
text(90, 24, "Offset failed");
end;
if math.fmod(timer, 2) < 1 then
temp = math.floor(math.fmod(smbdata['screenpos'], 0x200) / 8) + 20;
line(temp, 18, temp, 47, "#ffffff");
box(20 + x * 2, 20 + y * 2, 21 + x * 2, 21 + y * 2, "#ffffff");
end;
--]]
text( 20, 222, " 2009 Xkeeper - http://jul.rustedlogic.net/ ");
line( 21, 231, 232, 231, "#000000");
FCEU.frameadvance();
end;