Merge branch 'master' into master
This commit is contained in:
commit
8c485d23a2
|
@ -1,4 +1,4 @@
|
||||||
-- feos, 2012
|
-- feos, r57shell, 2012-2018
|
||||||
-- gui.box frame simulates transparency
|
-- gui.box frame simulates transparency
|
||||||
|
|
||||||
print("Hi-hat and keys may glitch if you produce sound effects.")
|
print("Hi-hat and keys may glitch if you produce sound effects.")
|
||||||
|
@ -23,12 +23,18 @@ function Draw()
|
||||||
snd = sound.get()
|
snd = sound.get()
|
||||||
keys = input.get()
|
keys = input.get()
|
||||||
|
|
||||||
|
if iterator == 1 then
|
||||||
|
kb.y = 30
|
||||||
|
else
|
||||||
|
kb.y = 154
|
||||||
|
end
|
||||||
|
|
||||||
-- do only at the first frame
|
-- do only at the first frame
|
||||||
if #volumes.S1V == 1 then
|
if #volumes.S1V == 1 then
|
||||||
channels = {
|
channels = {
|
||||||
Square1 = {x=1, y=9, vol=volumes.S1V, color=volumes.S1C, duty=0, midi=0, semitone=0, octave=0, prev_semitone=0, float = {}},
|
Square1 = {x=1, y=9, vol=volumes.S1V, color=volumes.S1C, duty=0, midi=0, semitone=0, octave=0, prev_semitone=0, float = {}, floaty = {}, floatz = {}},
|
||||||
Square2 = {x=1+45*1, y=9, vol=volumes.S2V, color=volumes.S2C, duty=0, midi=0, semitone=0, octave=0, prev_semitone=0, float = {}},
|
Square2 = {x=1+45*1, y=9, vol=volumes.S2V, color=volumes.S2C, duty=0, midi=0, semitone=0, octave=0, prev_semitone=0, float = {}, floaty = {}, floatz = {}},
|
||||||
Triangle = {x=1+45*2, y=9, vol=volumes.TV, midi=0, semitone=0, octave=0, prev_semitone=0, float = {}},
|
Triangle = {x=1+45*2, y=9, vol=volumes.TV, midi=0, semitone=0, octave=0, prev_semitone=0, float = {}, floaty = {}, floatz = {}},
|
||||||
Noise = {x=1+45*3, y=9, vol=volumes.NV, midi=0, semitone=0, octave=0},
|
Noise = {x=1+45*3, y=9, vol=volumes.NV, midi=0, semitone=0, octave=0},
|
||||||
DPCM = {x=1+45*4, y=9, vol=volumes.DPCMV}
|
DPCM = {x=1+45*4, y=9, vol=volumes.DPCMV}
|
||||||
}
|
}
|
||||||
|
@ -120,7 +126,7 @@ function Draw()
|
||||||
|
|
||||||
if (kb.on) then
|
if (kb.on) then
|
||||||
-- capture leftclicks
|
-- capture leftclicks
|
||||||
if keys.xmouse <= 256 and keys.xmouse >= 205 and keys.ymouse >= 154 and keys.ymouse <= 181 then
|
if keys.xmouse <= 256 and keys.xmouse >= 205 and keys.ymouse >= kb.y and keys.ymouse <= kb.y+27 then
|
||||||
if keys["leftclick"] and not prev_keys["leftclick"] then kb.on = false end
|
if keys["leftclick"] and not prev_keys["leftclick"] then kb.on = false end
|
||||||
end
|
end
|
||||||
-- draw the kayboard
|
-- draw the kayboard
|
||||||
|
@ -185,7 +191,7 @@ function Draw()
|
||||||
gui.line(kb.x+200, kb.y, kb.x+200, kb.y+16, "#00000088")
|
gui.line(kb.x+200, kb.y, kb.x+200, kb.y+16, "#00000088")
|
||||||
else
|
else
|
||||||
-- capture leftclicks
|
-- capture leftclicks
|
||||||
if keys.xmouse <= 256 and keys.xmouse >= 205 and keys.ymouse >= 154 and keys.ymouse <= 181 then
|
if keys.xmouse <= 256 and keys.xmouse >= 205 and keys.ymouse >= kb.y and keys.ymouse <= kb.y+27 then
|
||||||
if keys["leftclick"] and not prev_keys["leftclick"] then kb.on = true end
|
if keys["leftclick"] and not prev_keys["leftclick"] then kb.on = true end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -199,6 +205,7 @@ function Draw()
|
||||||
if name == "Square1" or name == "Square2" or name == "Triangle" then
|
if name == "Square1" or name == "Square2" or name == "Triangle" then
|
||||||
|
|
||||||
if chan.prev_semitone ~= chan.semitone then
|
if chan.prev_semitone ~= chan.semitone then
|
||||||
|
local len_prev = #chan.float
|
||||||
if chan.semitone == "C" then table.insert(chan.float, 1, kb.x+1 +28*(chan.octave-1))
|
if chan.semitone == "C" then table.insert(chan.float, 1, kb.x+1 +28*(chan.octave-1))
|
||||||
elseif chan.semitone == "D" then table.insert(chan.float, 1, kb.x+5 +28*(chan.octave-1))
|
elseif chan.semitone == "D" then table.insert(chan.float, 1, kb.x+5 +28*(chan.octave-1))
|
||||||
elseif chan.semitone == "E" then table.insert(chan.float, 1, kb.x+9 +28*(chan.octave-1))
|
elseif chan.semitone == "E" then table.insert(chan.float, 1, kb.x+9 +28*(chan.octave-1))
|
||||||
|
@ -212,6 +219,9 @@ function Draw()
|
||||||
elseif chan.semitone == "G#" then table.insert(chan.float, 1, kb.x+19+28*(chan.octave-1))
|
elseif chan.semitone == "G#" then table.insert(chan.float, 1, kb.x+19+28*(chan.octave-1))
|
||||||
elseif chan.semitone == "A#" then table.insert(chan.float, 1, kb.x+23+28*(chan.octave-1))
|
elseif chan.semitone == "A#" then table.insert(chan.float, 1, kb.x+23+28*(chan.octave-1))
|
||||||
end
|
end
|
||||||
|
if len_prev ~= #chan.float then table.insert(chan.floaty, 1, 0) table.insert(chan.floatz, 1, 0) end
|
||||||
|
elseif chan.semitone ~= '--' then
|
||||||
|
chan.floaty[1] = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
if name == "Triangle" then color = "#00aaffff"
|
if name == "Triangle" then color = "#00aaffff"
|
||||||
|
@ -219,17 +229,20 @@ function Draw()
|
||||||
else color = "#aa00ccff"
|
else color = "#aa00ccff"
|
||||||
end
|
end
|
||||||
|
|
||||||
if #chan.float < 13 then
|
for i = 1, #chan.float do
|
||||||
for i = 2, #chan.float do
|
local y = kb.y+chan.floaty[i]
|
||||||
if movie.framecount()%2 == 0 then gui.box(chan.float[i]-1, 161+i*5, chan.float[i]+3, 165+i*5, "#eedd2200") end
|
local z = kb.y+chan.floatz[i]
|
||||||
gui.box(chan.float[i], 162+i*5, chan.float[i]+2, 164+i*5, color)
|
chan.floaty[i] = chan.floaty[i] + 1
|
||||||
|
chan.floatz[i] = chan.floatz[i] + 1
|
||||||
|
if y+17<=z+15 then
|
||||||
|
if movie.framecount()%2 == 0 then gui.box(chan.float[i]-1, y+16, chan.float[i]+3, z+16, "#eedd2200") end
|
||||||
|
gui.box(chan.float[i], y+17, chan.float[i]+2, z+15, color)
|
||||||
end
|
end
|
||||||
else
|
|
||||||
for i = 2, 13 do
|
|
||||||
if movie.framecount()%2 == 0 then gui.box(chan.float[i]-1, 161+i*5, chan.float[i]+3, 165+i*5, "#eedd2200") end
|
|
||||||
gui.box(chan.float[i], 162+i*5, chan.float[i]+2, 164+i*5, color)
|
|
||||||
end
|
end
|
||||||
table.remove(chan.float, 14)
|
while #chan.float ~= 0 and chan.floaty[#chan.float] > 224 do
|
||||||
|
table.remove(chan.float, #chan.float)
|
||||||
|
table.remove(chan.floaty, #chan.floaty)
|
||||||
|
table.remove(chan.floatz, #chan.floatz)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,44 +1,64 @@
|
||||||
-- Simple sprite visualizer
|
-- Sprite visualizer
|
||||||
-- Draws a box around all sprites on screen.
|
--
|
||||||
-- rainwarrior 8/23/2016
|
-- Draws a box around all sprites on screen,
|
||||||
|
-- hover with the mouse to inspect data.
|
||||||
|
--
|
||||||
|
-- Original by tokumaru 2016-10-08:
|
||||||
|
-- https://forums.nesdev.com/viewtopic.php?p=181008#p181008
|
||||||
|
|
||||||
sprite_color = "#FF00FF" -- change to customize color
|
numSpriteHeight = 8
|
||||||
|
strFillColor = "#ffffff3f"
|
||||||
|
strOutlineColor = "#ff0000bf"
|
||||||
|
strHighlightColor = "#ffffffbf"
|
||||||
|
|
||||||
sprite_height_last = 8
|
function readSpriteAttributes(a,s,v)
|
||||||
sprite_height = 8
|
local numAddress = v * 256
|
||||||
|
tabSpriteAttributes = {}
|
||||||
function oam_dma(a,s,v)
|
for numIndex = 0, 255 do
|
||||||
local oam = v * 256
|
table.insert(tabSpriteAttributes, memory.readbyte(numAddress + numIndex))
|
||||||
for i=1,64 do
|
|
||||||
local is = (i-1) * 4
|
|
||||||
local x0 = memory.readbyte(oam + is + 3)
|
|
||||||
local x1 = x0 + 7
|
|
||||||
local y0 = memory.readbyte(oam + is + 0) + 1
|
|
||||||
local y1 = y0 + (sprite_height_last - 1)
|
|
||||||
gui.box(x0,y0,x1,y1,"",sprite_color)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function ppu_ctrl(a,s,v)
|
function setSpriteHeight(a,s,v)
|
||||||
if AND(v,0x20) == 0 then
|
if AND(a, 7) == 0 then
|
||||||
sprite_height = 8
|
numSpriteHeight = AND((v / 4), 8) + 8
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function drawBoxes()
|
||||||
|
local tabInput, numSpriteX, numSpriteY, numDetailsBase, numTextY = input.read()
|
||||||
|
if tabSpriteAttributes ~= nill then
|
||||||
|
for numBase = 252, 0, -4 do
|
||||||
|
numSpriteX0 = tabSpriteAttributes[numBase + 4]
|
||||||
|
numSpriteY0 = tabSpriteAttributes[numBase + 1] + 1
|
||||||
|
numSpriteX1 = numSpriteX0 + 7
|
||||||
|
numSpriteY1 = numSpriteY0 + numSpriteHeight - 1
|
||||||
|
if (tabInput.xmouse >= numSpriteX0) and (tabInput.xmouse <= numSpriteX1) and (tabInput.ymouse >= numSpriteY0) and (tabInput.ymouse <= numSpriteY1) then
|
||||||
|
gui.box(numSpriteX0, numSpriteY0, numSpriteX1, numSpriteY1, strHighlightColor, strOutlineColor)
|
||||||
|
numDetailsBase = numBase
|
||||||
else
|
else
|
||||||
sprite_height = 16
|
gui.box(numSpriteX0, numSpriteY0, numSpriteX1, numSpriteY1, strFillColor, strOutlineColor)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if numDetailsBase ~= nil then
|
||||||
|
numTextY = (1 - math.floor(tabInput.ymouse / 120)) * 127 + 16
|
||||||
|
gui.text(16, numTextY, string.format("OAM Slot: %d", numDetailsBase / 4)); numTextY = numTextY + 9
|
||||||
|
gui.text(16, numTextY, string.format("OAM Offset: $%02X", numDetailsBase)); numTextY = numTextY + 9
|
||||||
|
gui.text(16, numTextY, string.format("Sprite X: $%02X", tabSpriteAttributes[numDetailsBase + 4])); numTextY = numTextY + 9
|
||||||
|
gui.text(16, numTextY, string.format("Sprite Y: $%02X", tabSpriteAttributes[numDetailsBase + 1])); numTextY = numTextY + 9
|
||||||
|
gui.text(16, numTextY, string.format("Tile ID: $%02X", tabSpriteAttributes[numDetailsBase + 2])); numTextY = numTextY + 9
|
||||||
|
gui.text(16, numTextY, string.format("Palette: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x03))); numTextY = numTextY + 9
|
||||||
|
gui.text(16, numTextY, string.format("Behind Background: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x20) / 0x20)); numTextY = numTextY + 9
|
||||||
|
gui.text(16, numTextY, string.format("Flip X: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x40) / 0x40)); numTextY = numTextY + 9
|
||||||
|
gui.text(16, numTextY, string.format("Flip Y: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x80) / 0x80)); numTextY = numTextY + 9
|
||||||
|
end
|
||||||
|
gui.box(tabInput.xmouse - 2, tabInput.ymouse - 2, tabInput.xmouse + 2, tabInput.ymouse + 2, strHighlightColor, strOutlineColor)
|
||||||
end
|
end
|
||||||
|
|
||||||
function frame_end()
|
memory.registerwrite(0x4014, 0x0001, readSpriteAttributes)
|
||||||
-- information about sprite height will be behind by 1 frame
|
memory.registerwrite(0x2000, 0x2000, setSpriteHeight)
|
||||||
-- (or potentially wrong if changed before the end of the frame)
|
gui.register(drawBoxes)
|
||||||
-- in most games this doesn't change from frame to frame, though
|
|
||||||
sprite_height_last = sprite_height
|
|
||||||
end
|
|
||||||
|
|
||||||
-- main
|
|
||||||
|
|
||||||
memory.registerwrite(0x4014,1,oam_dma)
|
|
||||||
memory.registerwrite(0x2000,1,ppu_ctrl)
|
|
||||||
emu.registerafter(frame_end)
|
|
||||||
|
|
||||||
while (true) do
|
while (true) do
|
||||||
emu.frameadvance()
|
emu.frameadvance()
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
-- Simple sprite visualizer
|
||||||
|
-- Draws a box around all sprites on screen.
|
||||||
|
-- rainwarrior 8/23/2016
|
||||||
|
|
||||||
|
sprite_color = "#FF00FF" -- change to customize color
|
||||||
|
|
||||||
|
sprite_height_last = 8
|
||||||
|
sprite_height = 8
|
||||||
|
|
||||||
|
function oam_dma(a,s,v)
|
||||||
|
local oam = v * 256
|
||||||
|
for i=1,64 do
|
||||||
|
local is = (i-1) * 4
|
||||||
|
local x0 = memory.readbyte(oam + is + 3)
|
||||||
|
local x1 = x0 + 7
|
||||||
|
local y0 = memory.readbyte(oam + is + 0) + 1
|
||||||
|
local y1 = y0 + (sprite_height_last - 1)
|
||||||
|
gui.box(x0,y0,x1,y1,"",sprite_color)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ppu_ctrl(a,s,v)
|
||||||
|
if AND(v,0x20) == 0 then
|
||||||
|
sprite_height = 8
|
||||||
|
else
|
||||||
|
sprite_height = 16
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function frame_end()
|
||||||
|
-- information about sprite height will be behind by 1 frame
|
||||||
|
-- (or potentially wrong if changed before the end of the frame)
|
||||||
|
-- in most games this doesn't change from frame to frame, though
|
||||||
|
sprite_height_last = sprite_height
|
||||||
|
end
|
||||||
|
|
||||||
|
-- main
|
||||||
|
|
||||||
|
memory.registerwrite(0x4014,1,oam_dma)
|
||||||
|
memory.registerwrite(0x2000,1,ppu_ctrl)
|
||||||
|
emu.registerafter(frame_end)
|
||||||
|
|
||||||
|
while (true) do
|
||||||
|
emu.frameadvance()
|
||||||
|
end
|
|
@ -1330,8 +1330,10 @@ void toggleSound(GtkWidget* check, gpointer data)
|
||||||
{
|
{
|
||||||
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)))
|
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)))
|
||||||
{
|
{
|
||||||
|
int last_soundopt;
|
||||||
|
g_config->getOption("SDL.Sound", &last_soundopt);
|
||||||
g_config->setOption("SDL.Sound", 1);
|
g_config->setOption("SDL.Sound", 1);
|
||||||
if(GameInfo)
|
if(GameInfo && !last_soundopt)
|
||||||
InitSound();
|
InitSound();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -901,6 +901,9 @@ doloopy:
|
||||||
}
|
}
|
||||||
else skippy = 0;
|
else skippy = 0;
|
||||||
|
|
||||||
|
if(FCEU_LuaFrameskip())
|
||||||
|
skippy = true;
|
||||||
|
|
||||||
FCEUI_Emulate(&gfx, &sound, &ssize, skippy); //emulate a single frame
|
FCEUI_Emulate(&gfx, &sound, &ssize, skippy); //emulate a single frame
|
||||||
FCEUD_Update(gfx, sound, ssize); //update displays and debug tools
|
FCEUD_Update(gfx, sound, ssize); //update displays and debug tools
|
||||||
|
|
||||||
|
|
|
@ -859,11 +859,8 @@ void FCEUD_TraceInstruction(uint8 *opcode, int size)
|
||||||
{
|
{
|
||||||
// special case: an RTS opcode
|
// special case: an RTS opcode
|
||||||
// add "----------" to emphasize the end of subroutine
|
// add "----------" to emphasize the end of subroutine
|
||||||
strcat(str_disassembly, " ");
|
static const char* emphasize = " -------------------------------------------------------------------------------------------------------------------------";
|
||||||
int i = strlen(str_disassembly);
|
strncat(str_disassembly, emphasize, LOG_DISASSEMBLY_MAX_LEN - strlen(str_disassembly) - 1);
|
||||||
for (; i < (LOG_DISASSEMBLY_MAX_LEN - 2); ++i)
|
|
||||||
str_disassembly[i] = '-';
|
|
||||||
str_disassembly[i] = 0;
|
|
||||||
}
|
}
|
||||||
// stretch the disassembly string out if we have to output other stuff.
|
// stretch the disassembly string out if we have to output other stuff.
|
||||||
if ((logging_options & (LOG_REGISTERS|LOG_PROCESSOR_STATUS)) && !(logging_options & LOG_TO_THE_LEFT))
|
if ((logging_options & (LOG_REGISTERS|LOG_PROCESSOR_STATUS)) && !(logging_options & LOG_TO_THE_LEFT))
|
||||||
|
|
|
@ -1223,7 +1223,7 @@ void GetMouseData(uint32 (&md)[3])
|
||||||
}
|
}
|
||||||
md[0] += VNSCLIP;
|
md[0] += VNSCLIP;
|
||||||
md[1] += FSettings.FirstSLine;
|
md[1] += FSettings.FirstSLine;
|
||||||
md[2] = ((mouseb == MK_LBUTTON) ? 1 : 0) | (( mouseb == MK_RBUTTON ) ? 2 : 0);
|
md[2] = ((mouseb & MK_LBUTTON) ? 1 : 0) | (( mouseb & MK_RBUTTON ) ? 2 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetMouseRelative(int32 (&md)[3])
|
void GetMouseRelative(int32 (&md)[3])
|
||||||
|
@ -1263,7 +1263,7 @@ void GetMouseRelative(int32 (&md)[3])
|
||||||
|
|
||||||
md[0] = dx;
|
md[0] = dx;
|
||||||
md[1] = dy;
|
md[1] = dy;
|
||||||
md[2] = ((mouseb == MK_LBUTTON) ? 1 : 0) | (( mouseb == MK_RBUTTON ) ? 2 : 0);
|
md[2] = ((mouseb & MK_LBUTTON) ? 1 : 0) | (( mouseb & MK_RBUTTON ) ? 2 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DumpSubtitles(HWND hWnd)
|
void DumpSubtitles(HWND hWnd)
|
||||||
|
@ -3196,7 +3196,6 @@ void SaveSnapshotAs()
|
||||||
FCEUI_SaveSnapshotAs();
|
FCEUI_SaveSnapshotAs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void UpdateSortColumnIcon(HWND hwndListView, int sortColumn, bool sortAsc)
|
void UpdateSortColumnIcon(HWND hwndListView, int sortColumn, bool sortAsc)
|
||||||
{
|
{
|
||||||
HWND header = (HWND)SendMessage(hwndListView, LVM_GETHEADER, 0, 0);
|
HWND header = (HWND)SendMessage(hwndListView, LVM_GETHEADER, 0, 0);
|
||||||
|
|
|
@ -327,7 +327,7 @@ int FCEU_LuaSpeed() {
|
||||||
* Asks Lua if it wants control whether this frame is skipped.
|
* Asks Lua if it wants control whether this frame is skipped.
|
||||||
* Returns 0 if no, 1 if frame should be skipped, -1 if it should not be.
|
* Returns 0 if no, 1 if frame should be skipped, -1 if it should not be.
|
||||||
*/
|
*/
|
||||||
int FCEU_LuaFrameSkip() {
|
int FCEU_LuaFrameskip() {
|
||||||
if (!L || !luaRunning)
|
if (!L || !luaRunning)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -6177,8 +6177,6 @@ int FCEU_LoadLuaCode(const char *filename, const char *arg) {
|
||||||
//wasPaused = FCEUI_EmulationPaused();
|
//wasPaused = FCEUI_EmulationPaused();
|
||||||
//if (wasPaused) FCEUI_ToggleEmulationPause();
|
//if (wasPaused) FCEUI_ToggleEmulationPause();
|
||||||
|
|
||||||
// And run it right now. :)
|
|
||||||
FCEU_LuaFrameBoundary();
|
|
||||||
|
|
||||||
// Set up our protection hook to be executed once every 10,000 bytecode instructions.
|
// Set up our protection hook to be executed once every 10,000 bytecode instructions.
|
||||||
//lua_sethook(thread, FCEU_LuaHookFunction, LUA_MASKCOUNT, 10000);
|
//lua_sethook(thread, FCEU_LuaHookFunction, LUA_MASKCOUNT, 10000);
|
||||||
|
@ -6198,6 +6196,9 @@ int FCEU_LoadLuaCode(const char *filename, const char *arg) {
|
||||||
if (info_onstart)
|
if (info_onstart)
|
||||||
info_onstart(info_uid);
|
info_onstart(info_uid);
|
||||||
|
|
||||||
|
// And run it right now. :)
|
||||||
|
FCEU_LuaFrameBoundary();
|
||||||
|
|
||||||
// We're done.
|
// We're done.
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,7 @@
|
||||||
<li>Mutlitrack2.lua - Tracks future input that FCEUX promptly loses on state-load, for <a class="rvts18" href="ToolAssistedSpeedruns.html">TAS</a></li>
|
<li>Mutlitrack2.lua - Tracks future input that FCEUX promptly loses on state-load, for <a class="rvts18" href="ToolAssistedSpeedruns.html">TAS</a></li>
|
||||||
<li>Subtitler.lua - For easier use of FCEUX's built-in subtitles for <a class="rvts18" href="fm2.html">.fm2</a> files</li>
|
<li>Subtitler.lua - For easier use of FCEUX's built-in subtitles for <a class="rvts18" href="fm2.html">.fm2</a> files</li>
|
||||||
<li>Rewinder.lua - A way to rewind backwards by pressing a button</li>
|
<li>Rewinder.lua - A way to rewind backwards by pressing a button</li>
|
||||||
|
<li>Sprites.lua - Sprite debugging highlights all sprites on screen, with mouse hover to inspect.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p><br/></p>
|
<p><br/></p>
|
||||||
<p><br/></p>
|
<p><br/></p>
|
||||||
|
|
Loading…
Reference in New Issue