fceux/output/luaScripts/tetris.lua

141 lines
5.2 KiB
Lua

-- Tetris - displays block stats and shows hitboxes
-- Written by QFox
-- http://www.datacrystal.org/wiki/Tetris:RAM_map
-- Tetris (U) [!].rom
local function getPiece(n) -- returns table with information about this piece
-- every piece consists of 4 blocks
-- so piece will contain the information about these blocks
-- for every block is the offset compared to the x,y position of the piece
-- the x,y is written in a 4x4 plane of blocks, 1x1 being the topleft block
-- x,y is the position as given by tetris
local piece = {};
if (n == 0) then -- T right
piece.pos = {{2,1},{1,2},{2,2},{3,2}};
piece.rel = {{0,-1},{-1,0},{0,0},{1,0}};
piece.anchor = {2,2};
elseif (n == 1) then -- T up
piece.pos = {{1,1},{1,2},{2,2},{1,3}};
piece.rel = {{0,-1},{0,0},{1,0},{0,1}};
piece.anchor = {1,2};
elseif (n == 2) then -- T down
piece.pos = {{1,1},{2,1},{3,1},{2,2}};
piece.rel = {{-1,0},{0,0},{1,0},{0,1}};
piece.anchor = {2,1};
elseif (n == 3) then -- T left
piece.pos = {{2,1},{1,2},{2,2},{2,3}};
piece.rel = {{0,-1},{-1,0},{0,0},{0,1}};
piece.anchor = {2,2};
elseif (n == 4) then -- J left
piece.pos = {{2,1},{2,2},{1,3},{2,3}};
piece.rel = {{0,-1},{0,0},{-1,1},{0,1}};
piece.anchor = {2,2};
elseif (n == 5) then -- J up
piece.pos = {{1,1},{1,2},{2,2},{3,2}};
piece.rel = {{-1,-1},{-1,0},{0,0},{1,0}};
piece.anchor = {2,2};
elseif (n == 6) then -- J right
piece.pos = {{1,1},{2,1},{1,2},{1,3}};
piece.rel = {{0,-1},{1,-1},{0,0},{0,1}};
piece.anchor = {1,2};
elseif (n == 7) then -- J down
piece.pos = {{1,1},{2,1},{3,1},{3,2}};
piece.rel = {{-1,0},{0,0},{1,0},{1,1}};
piece.anchor = {2,1};
elseif (n == 8) then -- Z horz
piece.pos = {{1,1},{2,1},{2,2},{3,2}};
piece.rel = {{-1,0},{0,0},{0,1},{1,1}};
piece.anchor = {2,1};
elseif (n == 9) then -- Z vert
piece.pos = {{2,1},{1,2},{2,2},{1,3}};
piece.rel = {{1,-1},{0,0},{1,0},{0,1}};
piece.anchor = {1,2};
elseif (n == 10) then -- O
piece.pos = {{1,1},{2,1},{1,2},{2,2}};
piece.rel = {{-1,0},{0,0},{-1,1},{0,1}};
piece.anchor = {2,1};
elseif (n == 11) then -- S horz
piece.pos = {{2,1},{3,1},{1,2},{2,2}};
piece.rel = {{0,0},{1,0},{-1,1},{0,1}};
piece.anchor = {2,1};
elseif (n == 12) then -- S vert
piece.pos = {{1,1},{1,2},{2,2},{2,3}};
piece.rel = {{0,-1},{0,0},{1,0},{1,1}};
piece.anchor = {1,2};
elseif (n == 13) then -- L right
piece.pos = {{1,1},{1,2},{1,3},{2,3}};
piece.rel = {{0,-1},{0,0},{0,1},{1,1}};
piece.anchor = {1,2};
elseif (n == 14) then -- L down
piece.pos = {{1,1},{2,1},{3,1},{1,2}};
piece.rel = {{-1,0},{0,0},{1,0},{-1,1}};
piece.anchor = {2,1};
elseif (n == 15) then -- L left
piece.pos = {{1,1},{2,1},{2,2},{2,3}};
piece.rel = {{-1,-1},{0,-1},{0,0},{0,1}};
piece.anchor = {2,2};
elseif (n == 16) then -- L up
piece.pos = {{3,1},{1,2},{2,2},{3,2}};
piece.rel = {{1,-1},{-1,0},{0,0},{1,0}};
piece.anchor = {2,2};
elseif (n == 17) then -- I vert
piece.pos = {{1,1},{1,2},{1,3},{1,4}};
piece.rel = {{0,-2},{0,-1},{0,0},{0,1}};
piece.anchor = {1,3};
elseif (n == 18) then -- I horz
piece.pos = {{1,1},{2,1},{3,1},{4,1}};
piece.rel = {{-2,0},{-1,0},{0,0},{1,0}};
piece.anchor = {3,1};
else
return nil;
end;
piece.id = n;
return piece;
end;
-- 0,0 - 10,20
-- translated it's: <95,40> to <175,200>
-- x starts at 1, y starts at 0...
-- each block is 8x8
local areax = 95;
local areay = 40;
local blocksize = 8;
while (true) do
-- get position of current piece (now)
local x = (memory.readbyte(0x0060)*blocksize)+areax;
local y = (memory.readbyte(0x0061)*blocksize)+areay;
local now = getPiece(memory.readbyte(0x0062)); -- get piece info
-- draw a nice box around it
gui.drawbox(95,40,175,200,"red");
gui.text(5,5,"xy: <"..x..", "..y..">");
if (now and x > 0 and y > 0 and x < 250 and y < 200) then
gui.drawbox(x+(now.rel[1][1]*blocksize),y+(now.rel[1][2]*blocksize),x+(now.rel[1][1]*blocksize)+blocksize,y+(now.rel[1][2]*blocksize)+blocksize,"green");
gui.drawbox(x+(now.rel[2][1]*blocksize),y+(now.rel[2][2]*blocksize),x+(now.rel[2][1]*blocksize)+blocksize,y+(now.rel[2][2]*blocksize)+blocksize,"green");
gui.drawbox(x+(now.rel[3][1]*blocksize),y+(now.rel[3][2]*blocksize),x+(now.rel[3][1]*blocksize)+blocksize,y+(now.rel[3][2]*blocksize)+blocksize,"green");
gui.drawbox(x+(now.rel[4][1]*blocksize),y+(now.rel[4][2]*blocksize),x+(now.rel[4][1]*blocksize)+blocksize,y+(now.rel[4][2]*blocksize)+blocksize,"green");
end;
gui.text(5,15,"Now: "..memory.readbyte(0x0062).."\nNext: "..memory.readbyte(0x00BF));
-- draw the filled field and do some counting
local start = 0x0400; -- toprow
local height = -1;
local filled = 0;
for j=0,19 do
for i=0,9 do
if (memory.readbyte(start+(j*10)+i) ~= 0xEF) then
filled = filled + 1;
if (height == -1) then height = j; end;
gui.drawbox(areax+(i*blocksize),areay+(j*blocksize),areax+(i*blocksize)+blocksize,areay+(j*blocksize)+blocksize,"red");
end;
end;
end;
if (height == -1) then height = 0;
else height = 20 - height; end;
gui.text(5,30,"Height: "..height.."\nFilled: "..filled.." ("..math.floor(filled/(height)*10).."%)");
--local inp1 = joypad.read(1);
--joypad.set(1,{right=1});
FCEU.frameadvance();
end;