This file is indexed.

/usr/share/fceux/luaScripts/SMB2U.lua is in fceux 2.2.2+dfsg0-1build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
-- Super Mario Bros. 2 USA - Grids & Contents (Unfinished)
-- Super Mario Bros. 2 (U) (PRG0) [!].nes
-- Written by QFox
-- 31 July 2008

-- shows (proper!) grid and contents. disable grid by setting variable to false
-- shows any non-air grid's tile-id
-- Slow! Will be heavy on lighter systems



local angrybirdo = false; -- makes birdo freak, but can skew other creatures with timing :)
local drawgrid = true; -- draws a green grid

local function box(x1,y1,x2,y2,color)
	-- gui.text(50,50,x1..","..y1.." "..x2..","..y2);
	if (x1 > 0 and x1 < 0xFF and x2 > 0 and x2 < 0xFF and y1 > 0 and y1 < 239 and y2 > 0 and y2 < 239) then
		gui.drawbox(x1,y1,x2,y2,color);
	end;
end;
local function text(x,y,str)
	if (x > 0 and x < 0xFF and y > 0 and y < 240) then
		gui.text(x,y,str);
	end;
end;
local function toHexStr(n)
	local meh = "%X";
	return meh:format(n);
end;

while (true) do
	if (angrybirdo and memory.readbyte(0x0010) > 0x81) then memory.writebyte(0x0010, 0x6D); end; -- birdo fires eggs constantly :p
	
	-- px = horzizontal page of current level
	-- x = page x (relative to current page)
	-- rx = real x (relative to whole level)
	-- sx = screen x (relative to viewport)
	local playerpx = memory.readbyte(0x0014);
	local playerpy = memory.readbyte(0x001E);
	local playerx = memory.readbyte(0x0028);
	local playery = memory.readbyte(0x0032);
	local playerrx = (playerpx*0xFF)+playerx;
	local playerry = (playerpy*0xFF)+playery;
	local playerstate = memory.readbyte(0x0050);
	local screenoffsetx = memory.readbyte(0x04C0);
	local screenoffsety = memory.readbyte(0x00CB);

	local playersx = (playerx - screenoffsetx);
	if (playersx < 0) then playersx = playersx + 0xFF; end;
	
	local playersy = (playery - screenoffsety);
	if (playersy < 0) then playersy = playersy + 0xFF; end;
	
	if (playerstate ~= 0x07) then
		box(playersx, playersy, playersx+16, playersy+16, "green");
	end;

	if (memory.readbyte(0x00D8) == 0) then -- not scrolling vertically
		-- show environment
		-- i have playerrx, which is my real position in this level
		-- i have the level, which is located at 0x6000 (the SRAM)
		-- each tile (denoted by one byte) is 16x16 pixels
		-- each screen is 15 tiles high and about 16 tiles wide
		-- to get the right column, we add our playerrx/16 to 0x6000
		-- to be exact:
		-- 0x6000 + (math.floor(playerrx/16) * 0xF0) + math.mod(playerx,0x0F)
		
		local levelstart = 0x6000; -- start of level layout in RAM
	
	  -- ok, here we have two choices. either this is a horizontal level or
	  -- it is a vertical level. We have no real way of checking this, but
	  -- luckily levels are either horizontal or vertical :)
	  -- so there are three possibilities
	  -- 1: you're in 0:0, no worries
	  -- 2: you're in x:0, you're in a horizontal level
	  -- 3: you're in 0:y, you're in a vertical level
	  
	
		local addleftcrap = math.mod(screenoffsetx,16)*-1; -- works as padding to keep the grid aligned
		local leftsplitrx = (memory.readbyte(0x04BE)*0x100) + (screenoffsetx + addleftcrap); -- column start left. add addleftcrap to iterative stuff to build up
		local addtopcrap = math.mod(screenoffsety,15); -- works as padding to keep the grid aligned
		local columns = math.floor(leftsplitrx/16); -- column x of the level is on the left side of the screen
		
		if (drawgrid) then -- print grid?
			for i=0,15 do
				-- text(addleftcrap+(i*16)-1, 37, toHexStr(columns+i)); -- print colnumber in each column
				for j=0,17 do
					box(addleftcrap+(i*16), addtopcrap+(j*16), addleftcrap+(i*16)+16, addtopcrap+(j*16)+16, "green"); -- draw green box for each cell
				end;
			end;
		end;
	
	-- 42=mushroom if you go sub
	-- 45=small
	-- 44=big
	-- 49=subspace
	-- 6c=pow
	-- 4e=cherry
		
		local topsplitry = (screenoffsety);
	
		-- starting page (might flow into next page). if the number of columns 
		-- is > 16, its a horizontal level, else its a vertical level. in either 
		-- case, the other will not up this value.
		local levelpage = 
				levelstart + 
				((math.floor(columns/16))*0xF0) + 
				(memory.readbyte(0x00CA)*0x100) +
				topsplitry;
		local levelcol = math.mod(columns,16); -- this is our starting column
	
		--text(10,150,toHexStr(topsplitry).." "..toHexStr(levelcol).." "..toHexStr(levelpage+levelcol).." "..toHexStr(leftsplitrx));
	
		for j=0,15 do -- 16 columns
			if (levelcol + j > 15) then -- go to next page
				levelpage = levelpage + 0xF0;
				levelcol = -j;
			end;
			for i=0,14 do -- 15 rows
				local tile = memory.readbyte(levelpage+(levelcol+j)+(i*0x10));
				if (tile ~= 0x40) then
					text(-2+addleftcrap+(j*16),5+(i*16),toHexStr(tile));
				end;
			end;
		end;
	end; -- not scrolling if

	-- print some generic stats
	text(2,10,"x:"..toHexStr(screenoffsetx));
	text(2,25,"y: "..toHexStr(screenoffsety));
	text(230,10,memory.readbyte(0x04C1));
	text(100,10,"Page: "..playerpx..","..playerpy);
	text(playersx,playersy,playerrx.."\n"..playery);
	
	-- draw enemy info
	local startpx = 0x0015;
	local startpy = 0x001F;
	local startx = 0x0029;
	local starty = 0x0033;
	local drawn = 0x0051;
	local type = 0x0090;
	for i=0,9 do
		local estate = memory.readbyte(drawn+i);
		if (estate ~= 0) then
			local ex = memory.readbyte(startx+i);
			local epx = memory.readbyte(startpx+i);
			local ey = memory.readbyte(starty+i);
			local epy = memory.readbyte(startpy+i);
			local erx = (epx*0xFF)+ex;
			local ery = (epy*0xFF)+ey;
			local esx = (ex - screenoffsetx);
			if (esx < 0) then esx = esx + 0xFF; end;
			local esy = (ey - screenoffsety);
			if (esy < 0) then esy = esy + 0xFF; end;

			--text(10, 20+(16*i), i..": "..esx.." "..erx); -- show enemy position list

			-- show enemy information
			if ((erx > playerrx-127) and erx < (playerrx+120)) then
				--text(esx,esy,erx); -- show level x pos above enemy
				local wtf = "%X";
				text(esx,esy,wtf:format(memory.readbyte(type+i))); -- show enemy code
				if (estate == 1 and i < 5) then
					box(esx, esy, esx+16, esy+16, "red");
				else
					box(esx, esy, esx+16, esy+16, "blue");
				end;
			end;
		end;
	end; -- enemy info

	FCEU.frameadvance();
end;