Posts for zhangsongcui


Experienced Forum User
Joined: 6/27/2008
Posts: 49
Does anyone have the RNG address of MMBN6 J version? EDIT:
02001120
020013f0
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Yes vote I never don't know 0HP wrap can be that powerful. Can we wrap into Black Panther room using 0HP without fighting Graham?
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Memory wrote:
EDIT: Also Bizhawk is far from unstable I have no idea where you got that idea from.
What's this?
Memory wrote:
Also Bizhawk is far from unstable
I never said far.
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Tremane wrote:
i dont really know what you mean with TAS editor
I mean edit the movie file directly.
Tremane wrote:
this run was started, as mothrayas mentioned, before we could use the SGB mode in Bizhawk.
So why we must use Bizhawk? It's unstable (currently at least) as you metioned. VBA-rr is still acceptable, has no obvious bugs playing this game and, is good, easy-to-use enough. Yes we have made the movie using bizhawk. I just suggest that if we could switch to bizhawk 2 for SGB mode.
Tremane wrote:
literally nothing except a border around the game and some color palettes - nothing gameplay-wise changes.
Some color palettes are still much better than only black-and-white screen, in my opinion.
Tremane wrote:
idk i feel a little irritated that you vote "no" on this submission purely because of GB-mode instead of SGB-mode.
I'm sorry for making you feel bad, but it's my thoughts.
Experienced Forum User
Joined: 6/27/2008
Posts: 49
No vote. Can we switch back to SGB ver using TAS editor or something else?
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Well done Rolanmen1! Very impressive. I still don't like Bishawk because it desyncs every version. I had to download the old version to watch your movie, but it's worthy.
Experienced Forum User
Joined: 6/27/2008
Posts: 49
After some testing: It's easy to make it work, but not easy to make it look good. Original: Converted:
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Rolanmen1 wrote:
These scripts are very helpful zhangsongcui. Any plans on doing these for BizHawk?
I'm not familiar with BizHawk. I'll have a try when I have free time
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Lua script for MMZ3 (U) on VBA 23.6
Language: lua

local box = { width = 15, height = 3, }; local enemies = { -- 0x3004F34, -- 0x3004FF8, -- 0x30050BC, -- 0x3005180, 0x03005244, 0x03005308, 0x03005490, 0x030053CC, 0x03005554, 0x03005618, 0x030056DC, 0x030057A0, 0x03005864, 0x03005928, -- 0x30059EC, -- 0x3005AB0, }; local lastDash = 255; print("MMZ3 - Memory viewer script for VBA, created by zhangsongcui"); function drawCharge(pos, val, y, text) if val < 5 then return false; end local headEquip = memory.readbyte(0x020366C4); local maxVal = 120; -- if headEquip == 4 then -- Q-Charge1 -- maxVal = 100; -- elseif headEquip == 5 then -- Q-Charge2 -- maxVal = 80; -- elseif headEquip == 6 then -- Q-Charge3 -- maxVal = 60; -- end local var = math.min(maxVal, val); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X + box.width, pos.Y + box.height + y, nil, "black"); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X - box.width * (1 - var / maxVal * 2), pos.Y + box.height + y, var < maxVal / 3 and "white" or (var < maxVal and "green" or "yellow"), "clear"); gui.text(pos.X - box.width - 17, pos.Y - box.height + y, text); gui.text(pos.X + box.width + 3, pos.Y - box.height + y, val); return true; end function drawRemain(pos, val, y, maxVal, text) if val <= 0 then return false; end gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X + box.width, pos.Y + box.height + y, nil, "black"); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X - box.width * (1 - val / maxVal * 2), pos.Y + box.height + y, "white", "clear"); gui.text(pos.X - box.width - 17, pos.Y - box.height + y, text); gui.text(pos.X + box.width + 3, pos.Y - box.height + y, val); return true; end gui.register(function() gui.opacity(.8); local rng = memory.readlong(0x0202F608); if rng == 0 then return; -- 游戏还没开始 end gui.text(2, 10, string.format(" RNG: 0x%08X (0x%08X)", rng, (rng * 0x000343FD + 0x00269EC3) % 0x80000000)); gui.text(82, 152, "Ingame Time: " .. memory.readlong(0x02030168)); local isPlaying = memory.readword(0x02031130) ~= 0x03C0; -- 主角血条下面的 Z 字 if not isPlaying then lastDash = 255; return; end local camera = { X = memory.readlongsigned(0x020302B8), Y = memory.readlongsigned(0x020302BC), }; local hero = { X = (memory.readlongsigned(0x02037FF4) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x02037FF8) - camera.Y) / 0x0100 + 80, SpeedX = memory.readwordsigned(0x02037FFC), SpeedY = memory.readwordsigned(0x02038000), HP = memory.readbyte(0x02038044), Invisible = memory.readbyte(0x02038034), Charge1 = memory.readbyte(0x0203807C), Charge2 = memory.readbyte(0x0203807D), Dash = memory.readbyte(0x020380B0), }; if hero.HP <= 0 then return; end for i, enemy in pairs(enemies) do local hp = memory.readbyte(enemy); if hp > 0 then local x = (memory.readlong(enemy - 0x50) - camera.X) / 0x0100 + 120; local y = (memory.readlong(enemy - 0x4C) - camera.Y) / 0x0100 + 80; gui.text(x, y, hp); end end gui.text(2, 18, string.format("WpnUse: [%d, %d, %d, %d]", memory.readword(0x0203017C), memory.readword(0x0203017E), memory.readword(0x02030180), memory.readword(0x02030182))); gui.text(2, 26, string.format(" Speed: (%+.1f, %+.1f)", hero.SpeedX / 0x100, hero.SpeedY / 0x100)); if hero.Dash == _G.lastDash then hero.Dash = 255; else _G.lastDash = hero.Dash; end local dy = 4; local offsety = 7; if drawCharge(hero, hero.Charge1, dy, 'Crg1') then dy = dy + offsety end; if drawCharge(hero, hero.Charge2, dy, 'Crg2') then dy = dy + offsety end; if drawRemain(hero, hero.Invisible, dy, 90, 'Invi') then dy = dy + offsety end; if hero.Dash ~= 255 and drawRemain(hero, hero.Dash, dy, 27, 'Dash') then dy = dy + offsety end; gui.text(hero.HP > 9 and 7 or 8, 35, hero.HP, "red"); local boss = { X = (memory.readlongsigned(0x0203BDF4) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x0203BDF8) - camera.Y) / 0x0100 + 80, HP = memory.readword(0x0203BE44), Invisible = memory.readbyte(0x0203BE34), InvisibleLevel = memory.readbyte(0x0203BE36), }; if boss.HP > 0 then if memory.readword(0x02031168) ~= 0x03C0 then -- 指定右侧 Boss 血条下的 W 图标显示 -- Boss 战 gui.text(boss.HP > 9 and 226 or 228, 4, boss.HP, "red", "black"); else -- 中 Boss 战 gui.text(boss.X, boss.Y, boss.HP, "red", "black"); end drawRemain(boss, boss.Invisible, 5, 90, "Invi"); if (boss.Invisible > 0) then gui.text(boss.X - box.width - 17, boss.Y + 9, "Invi Level: " .. boss.InvisibleLevel); end end local bossAnother = { -- 蓝精灵 X = (memory.readlongsigned(0x0203BD10) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x0203BD14) - camera.Y) / 0x0100 + 80, HP = memory.readword(0x0203BD60), Invisible = memory.readbyte(0x0203BD50), InvisibleLevel = memory.readbyte(0x0203BD52), }; if bossAnother.HP > 0 then if boss.HP == 0 then -- 这个是本尊 gui.text(bossAnother.HP > 9 and 226 or 228, 0, bossAnother.HP, "red", "black"); end drawRemain(bossAnother, bossAnother.Invisible, 6, 90, "Invi"); if (bossAnother.Invisible > 0) then gui.text(bossAnother.X - box.width - 17, bossAnother.Y + 11, "Invi Level: " .. bossAnother.InvisibleLevel); end end end)
Experienced Forum User
Joined: 6/27/2008
Posts: 49
My lua script for MMZ 1, tested U ver on VBA-RR 23.6. It's strange that Zero's X speed is always positive, but here it is.
Language: lua

local box = { width = 15, height = 3, }; local enemies = { -- 0x0300420C, -- 0x030042D8, 0x030043A4, 0x03004470, 0x0300453C, 0x03004608, 0x030046D4, 0x030047A0, 0x0300486C, 0x03004938, 0x03004A04, 0x03004AD0, -- 0x03004B9C, -- 0x03004B9C, -- 0x03004D2C, -- 0x03004EBC, -- 0x0300504C, -- 0x03005114, 0x030051DC, 0x030052A4, 0x0300536C, 0x03005434, 0x030054FC, 0x030055C4, 0x0300568C, 0x03005754, 0x0300581C, 0x030058E4, -- 0x030059AC, -- 0x03005B3C, }; local lastDash = 255; print("MMZ1 - Memory viewer script for VBA, created by zhangsongcui"); function drawCharge(pos, val, y, text) if val < 5 then return false; end local maxVal = 120; -- TODO: maxVal = 90; local var = math.min(maxVal, val); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X + box.width, pos.Y + box.height + y, nil, "black"); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X - box.width * (1 - var / maxVal * 2), pos.Y + box.height + y, var < maxVal / 3 and "white" or (var < maxVal and "green" or "yellow"), "clear"); gui.text(pos.X - box.width - 17, pos.Y - box.height + y, text); gui.text(pos.X + box.width + 3, pos.Y - box.height + y, val); return true; end function drawRemain(pos, val, y, maxVal, text) if val <= 0 or val > maxVal then return false; end gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X + box.width, pos.Y + box.height + y, nil, "black"); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X - box.width * (1 - val / maxVal * 2), pos.Y + box.height + y, "white", "clear"); gui.text(pos.X - box.width - 17, pos.Y - box.height + y, text); gui.text(pos.X + box.width + 3, pos.Y - box.height + y, val); return true; end gui.register(function() gui.opacity(.8); local rng = memory.readlong(0x02022890); if rng == 0 then return; -- 游戏还没开始 end -- 90 290 850 -- 210 gui.text(2, 10, string.format(" RNG: 0x%08X", rng)); gui.text(82, 152, "Ingame Time: " .. memory.readlong(0x0202A5D8)); local isPlaying = memory.readword(0x0202396C) ~= 0x03C0; -- 主角血条下面的 Z 字 if not isPlaying then lastDash = 255; return; end local camera = { X = memory.readlongsigned(0x02022C74), Y = memory.readlongsigned(0x02022C78), }; local hero = { X = (memory.readlongsigned(0x0202B5EC) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x0202B5F0) - camera.Y) / 0x0100 + 80, SpeedX = memory.readlongsigned(0x0202B5F4), SpeedY = memory.readlongsigned(0x0202B5F8), HP = memory.readbyte(0x0202B62C), Crystal = memory.readword(0x0202B79E), Invisible = memory.readbyte(0x0202B634), Charge1 = memory.readbyte(0x0202B6C2), Charge2 = memory.readbyte(0x0202B6C3), Dash = memory.readbyte(0x0202B6B8), Abtn = memory.readbyte(0x0202B6C5), Invisible2 = memory.readbyte(0x0202B6C6), }; if hero.HP <= 0 then return; end for i, enemy in pairs(enemies) do local hp = memory.readbyte(enemy); if hp > 0 then local x = (memory.readlong(enemy + 0x0C) - camera.X) / 0x0100 + 120; local y = (memory.readlong(enemy + 0x10) - camera.Y) / 0x0100 + 80; gui.text(x, y, hp); end end -- gui.text(2, 18, string.format("WpnUse: [%d, %d, %d, %d]", memory.readword(0x02022B3C), memory.readword(0x02022B3E), memory.readword(0x02022B40), memory.readword(0x02022B42))); gui.text(2, 18, string.format("WpnExp: [%d, %d, %d, %d]", memory.readwordsigned(0x0202B72C), memory.readwordsigned(0x0202B72E), memory.readwordsigned(0x0202B730), memory.readwordsigned(0x0202B732))); gui.text(2, 26, string.format(" Speed: (%+.1f, %+.1f)", hero.SpeedX / 0x100, hero.SpeedY / 0x100)); if hero.Dash == _G.lastDash then hero.Dash = 255; else _G.lastDash = hero.Dash; end local dy = 4; local offsety = 7; if drawCharge(hero, hero.Charge1, dy, 'Crg1') then dy = dy + offsety end; if drawCharge(hero, hero.Charge2, dy, 'Crg2') then dy = dy + offsety end; if drawRemain(hero, hero.Invisible, dy, 90, 'Invi') then dy = dy + offsety end; if drawRemain(hero, hero.Dash, dy, 27, 'Dash') then dy = dy + offsety end; gui.text(hero.HP > 9 and 7 or 8, 35, hero.HP, "red"); local boss = { X = (memory.readlongsigned(0x0202CBFC) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x0202CC00) - camera.Y) / 0x0100 + 80, HP = memory.readword(0x0202CC3C), Invisible = memory.readbyte(0x0202CC44), }; if boss.HP > 0 then if memory.readword(0x020239A4) ~= 0x03C0 then -- 指定右侧 Boss 血条下的 Ω 图标显示 -- Boss 战 gui.text(boss.HP > 9 and 226 or 228, 4, boss.HP, "red", "black"); else -- 中 Boss 战 gui.text(boss.HP > 9 and boss.X - 3 or boss.X - 1, boss.Y - 5, boss.HP, "red", "black"); end drawRemain(boss, boss.Invisible, 5, 90, "Invi"); end local bossAnother = { -- 大象的数值 X = (memory.readlongsigned(0x0202CB6C) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x0202CB70) - camera.Y) / 0x0100 + 80, HP = memory.readword(0x0202CB54), Invisible = memory.readbyte(0x0202CB5C), }; if bossAnother.HP > 0 then if boss.HP == 0 then -- 这个是本尊 gui.text(bossAnother.HP > 9 and 226 or 228, 4, bossAnother.HP, "red", "black"); end drawRemain(bossAnother, bossAnother.Invisible, 5, 90, "Invi"); end end)
EDIT: Fix elephant's HP
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Here is my lua script for MMZ2 It works for both U ver and J ver, tested on VBA-RR v23.6
Language: lua

local box = { width = 15, height = 3, }; local enemies = { -- 0x3004F34, -- 0x3004FF8, -- 0x30050BC, -- 0x3005180, 0x03005244, 0x03005308, 0x03005490, 0x030053CC, 0x03005554, 0x03005618, 0x030056DC, 0x030057A0, 0x03005864, 0x03005928, -- 0x30059EC, -- 0x3005AB0, }; local lastDash = 255; print("MMZ2 - Memory viewer script for VBA, created by zhangsongcui"); function drawCharge(pos, val, y, text) if val < 5 then return false; end local maxVal = 120; -- TODO: maxVal = 90; local var = math.min(maxVal, val); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X + box.width, pos.Y + box.height + y, nil, "black"); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X - box.width * (1 - var / maxVal * 2), pos.Y + box.height + y, var < maxVal / 3 and "white" or (var < maxVal and "green" or "yellow"), "clear"); gui.text(pos.X - box.width - 17, pos.Y - box.height + y, text); gui.text(pos.X + box.width + 3, pos.Y - box.height + y, val); return true; end function drawRemain(pos, val, y, maxVal, text) if val <= 0 or val > maxVal then return false; end gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X + box.width, pos.Y + box.height + y, nil, "black"); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X - box.width * (1 - val / maxVal * 2), pos.Y + box.height + y, "white", "clear"); gui.text(pos.X - box.width - 17, pos.Y - box.height + y, text); gui.text(pos.X + box.width + 3, pos.Y - box.height + y, val); return true; end gui.register(function() gui.opacity(.8); local rng = memory.readlong(0x0202E188); if rng == 0 then return; -- 游戏还没开始 end -- 90 290 850 -- 210 gui.text(2, 10, string.format(" RNG: 0x%08X", rng)); gui.text(82, 152, "Ingame Time: " .. memory.readlong(0x0202EBF8)); local isPlaying = memory.readword(0x0202FB78) ~= 0x03C0; -- 主角血条下面的 Z 字 if not isPlaying then lastDash = 255; return; end local camera = { X = memory.readlongsigned(0x0202ED48), Y = memory.readlongsigned(0x0202ED4C), }; local hero = { X = (memory.readlongsigned(0x02037D44) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x02037D48) - camera.Y) / 0x0100 + 80, SpeedX = memory.readlongsigned(0x02037D4C), SpeedY = memory.readlongsigned(0x02037D50), HP = memory.readbyte(0x02037D94), Invisible = memory.readbyte(0x02037D84), Charge1 = memory.readbyte(0x02037E78), Charge2 = memory.readbyte(0x02037E79), Dash = memory.readbyte(0x02037E74), }; if hero.HP <= 0 then return; end for i, enemy in pairs(enemies) do local hp = memory.readbyte(enemy); if hp > 0 then local x = (memory.readlong(enemy - 0x50) - camera.X) / 0x0100 + 120; local y = (memory.readlong(enemy - 0x4C) - camera.Y) / 0x0100 + 80; gui.text(x, y, hp); end end -- gui.text(2, 18, string.format("WpnUse: [%d, %d, %d, %d]", memory.readword(0x0202EC0C), memory.readword(0x0202EC0E), memory.readword(0x0202EC10), memory.readword(0x0202EC12))); gui.text(2, 18, string.format("WpnExp: [%d, %d, %d, %d]", memory.readword(0x02037F0A), memory.readword(0x02037F0C), memory.readword(0x02037F0E), memory.readword(0x02037F10))); gui.text(2, 26, string.format(" Speed: (%+.1f, %+.1f)", hero.SpeedX / 0x100, hero.SpeedY / 0x100)); if hero.Dash == _G.lastDash then hero.Dash = 255; else _G.lastDash = hero.Dash; end local dy = 4; local offsety = 7; if drawCharge(hero, hero.Charge1, dy, 'Crg1') then dy = dy + offsety end; if drawCharge(hero, hero.Charge2, dy, 'Crg2') then dy = dy + offsety end; if drawRemain(hero, hero.Invisible, dy, 90, 'Invi') then dy = dy + offsety end; if drawRemain(hero, hero.Dash, dy, 27, 'Dash') then dy = dy + offsety end; gui.text(hero.HP > 9 and 7 or 8, 35, hero.HP, "red"); local boss = { X = (memory.readlongsigned(0x0203BBA4) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x0203BBA8) - camera.Y) / 0x0100 + 80, HP = memory.readword(0x0203BBF4), Invisible = memory.readbyte(0x0203BBE4), InvisibleLevel = memory.readbyte(0x0203BBE6), }; if boss.HP > 0 then if memory.readword(0x0202FBB0) ~= 0x03C0 then -- 指定右侧 Boss 血条下的 Ω 图标显示 -- Boss 战 gui.text(boss.HP > 9 and 226 or 228, 4, boss.HP, "red", "black"); else -- 中 Boss 战 gui.text(boss.HP > 9 and boss.X - 3 or boss.X - 1, boss.Y - 5, boss.HP, "red", "black"); end drawRemain(boss, boss.Invisible, 5, 90, "Invi"); if (boss.Invisible > 0) then gui.text(boss.X - box.width - 17, boss.Y + 9, "Invi Level: " .. boss.InvisibleLevel); end end local bossAnother = { -- 电狼、钳子兄弟的数值 X = (memory.readlongsigned(0x0203BAC0) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x0203BAC4) - camera.Y) / 0x0100 + 80, HP = memory.readword(0x0203BB10), Invisible = memory.readbyte(0x0203BB00), InvisibleLevel = memory.readbyte(0x0203BB02), }; if bossAnother.HP > 0 then if boss.HP == 0 then -- 这个是本尊 gui.text(bossAnother.HP > 9 and 226 or 228, 4, bossAnother.HP, "red", "black"); end drawRemain(bossAnother, bossAnother.Invisible, 5, 90, "Invi"); if (bossAnother.Invisible > 0) then gui.text(bossAnother.X - box.width - 17, bossAnother.Y + 9, "Invi Level: " .. bossAnother.InvisibleLevel); end end end)
EDIT: Fix "<0>" by disabling HTML in this post o_o
Experienced Forum User
Joined: 6/27/2008
Posts: 49
I made a lua script for anyone who are interested. Tested: 2166 - Megaman Zero 4 (U).gba on VBA-RR v23.6
Language: lua

local box = { width = 15, height = 3, }; local enemies = { -- 0x3004F34, -- 0x3004FF8, -- 0x30050BC, -- 0x3005180, 0x03005244, 0x03005308, 0x03005490, 0x030053CC, 0x03005554, 0x03005618, 0x030056DC, 0x030057A0, 0x03005864, 0x03005928, -- 0x30059EC, -- 0x3005AB0, }; local lastDash = 255; print("MMZ4 - Memory viewer script for VBA, created by zhangsongcui"); function drawCharge(pos, val, y, text) if val < 5 then return false; end local headEquip = memory.readbyte(0x020366C4); local maxVal = 120; if headEquip == 4 then -- Q-Charge1 maxVal = 100; elseif headEquip == 5 then -- Q-Charge2 maxVal = 80; elseif headEquip == 6 then -- Q-Charge3 maxVal = 60; end local var = math.min(maxVal, val); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X + box.width, pos.Y + box.height + y, nil, "black"); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X - box.width * (1 - var / maxVal * 2), pos.Y + box.height + y, var < maxVal / 3 and "white" or (var < maxVal and "green" or "yellow"), "clear"); gui.text(pos.X - box.width - 17, pos.Y - box.height + y, text); gui.text(pos.X + box.width + 3, pos.Y - box.height + y, val); return true; end function drawRemain(pos, val, y, maxVal, text) if val <= 0 or val > maxVal then return false; end gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X + box.width, pos.Y + box.height + y, nil, "black"); gui.box( pos.X - box.width, pos.Y - box.height + y, pos.X - box.width * (1 - val / maxVal * 2), pos.Y + box.height + y, "white", "clear"); gui.text(pos.X - box.width - 17, pos.Y - box.height + y, text); gui.text(pos.X + box.width + 3, pos.Y - box.height + y, val); return true; end gui.register(function() gui.opacity(.8); local rng = memory.readlong(0x0202DC38); if rng == 0 then return; -- 游戏还没开始 end gui.text(2, 10, string.format(" RNG: 0x%08X (0x%08X)", rng, (rng * 0x000343FD + 0x00269EC3) % 0x80000000)); gui.text(82, 152, "Ingame Time: " .. memory.readlong(0x0202E8E8)); local isPlaying = memory.readword(0x0202F8E0) ~= 0x03C0; -- 主角血条下面的 Z 字 if not isPlaying then lastDash = 255; return; end local camera = { X = memory.readlongsigned(0x0202EA28), Y = memory.readlongsigned(0x0202EA2C), }; local hero = { X = (memory.readlongsigned(0x02036654) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x02036658) - camera.Y) / 0x0100 + 80, SpeedX = memory.readwordsigned(0x02036720), SpeedY = memory.readwordsigned(0x02036660), HP = memory.readbyte(0x020366A4), Invisible = memory.readbyte(0x02036694), Charge1 = memory.readbyte(0x020366E4), Charge2 = memory.readbyte(0x020366E5), Dash = memory.readbyte(0x0203673A), }; if hero.HP <= 0 then return; end for i, enemy in pairs(enemies) do local hp = memory.readbyte(enemy); if hp > 0 then local x = (memory.readlong(enemy - 0x50) - camera.X) / 0x0100 + 120; local y = (memory.readlong(enemy - 0x4C) - camera.Y) / 0x0100 + 80; gui.text(x, y, hp); end end gui.text(2, 18, string.format("WpnUse: [%d, %d, %d]", memory.readword(0x0202E8FC), memory.readword(0x0202E8FE), memory.readword(0x0202E900))); gui.text(2, 26, string.format(" Speed: (%+.1f, %+.1f)", hero.SpeedX / 0x100, hero.SpeedY / 0x100)); if hero.Dash == _G.lastDash then hero.Dash = 255; else _G.lastDash = hero.Dash; end local dy = 4; local offsety = 7; if drawCharge(hero, hero.Charge1, dy, 'Crg1') then dy = dy + offsety end; if drawCharge(hero, hero.Charge2, dy, 'Crg2') then dy = dy + offsety end; if drawRemain(hero, hero.Invisible, dy, 90, 'Invi') then dy = dy + offsety end; if drawRemain(hero, hero.Dash, dy, 27, 'Dash') then dy = dy + offsety end; gui.text(hero.HP > 9 and 7 or 8, 35, hero.HP, "red"); local boss = { X = (memory.readlongsigned(0x0203A494) - camera.X) / 0x0100 + 120, Y = (memory.readlongsigned(0x0203A498) - camera.Y) / 0x0100 + 80, HP = memory.readword(0x0203A4E4), Invisible = memory.readbyte(0x0203A4D4), InvisibleLevel = memory.readbyte(0x0203A4D6), }; if boss.HP > 0 then if memory.readword(0x0202F8D8) ~= 0x03C0 then -- 指定右侧 Boss 血条下的 W 图标显示 -- Boss 战 gui.text(boss.HP > 9 and 226 or 228, 4, boss.HP, "red", "black"); else -- 中 Boss 战 gui.text(boss.X, boss.Y, boss.HP, "red", "black"); end drawRemain(boss, boss.Invisible, 5, 90, "Invi"); if (boss.Invisible > 0) then gui.text(boss.X - box.width - 17, boss.Y + 9, "Invi Level: " .. boss.InvisibleLevel); end end end)
EDIT: Fix "<0>"
Experienced Forum User
Joined: 6/27/2008
Posts: 49
lxx4xNx6xxl wrote:
Any thoughts on doing a Glitched Dawn of Sorrow "All Souls" TAS?
I'm thinking about it too. First, we must forbid in-game suspending, which generally prevents data corruption, or "All Souls" run gets meanless. Zipping glitches do exist in DoS (horizontally and vertically), but far less powerful then bat zipping in AoS. I can image the route becomes obtaining Black Panther AFAP no mater the cost.
Experienced Forum User
Joined: 6/27/2008
Posts: 49
That route was truly unexpected. Well done and big yes vote. How many frames did it save using Fly Fish instead of Big Armor?
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Samsara wrote:
The verification file required for the most optimal run is going to take at least a couple of months by itself unless I can get the script to cooperate.
Thanks for your reply. Well, As a movie for verification, I think it's ok to use inputs from the submitted run ( the first 100% souls run I think, which gets Claimh Solais and uses no glitches ). The remaining necessory items to get are not too many.
Experienced Forum User
Joined: 6/27/2008
Posts: 49
How's the BR run going, Samsara?
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Yes vote for the whole run; star for Wily 3! Well done!
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Don't know if you can watch it, but here is the original movie of 1:07:86 version ( Chinese site ) http://www.tudou.com/v/JRp-mfK-YTU/&resourceId=0_04_05_99/v.swf
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Samsara wrote:
TehBerral wrote:
I just wanted to pose a question (I figured it'd be better posted here rather than in the submission poll of the All Souls TAS). Is there any reason why no one is using BizHawk for this game - if for nothing else, for accuracy? I realize almost all of the runs use SRAM to skip cutscenes, so is making a verification file the issue, or is there something else? I'm just curious if there's some technical hoo-hah I don't know about.
Not many people use BizHawk for GBA as it is. I don't know if there's a specific reason or anything, though I'd assume it's simply because people are more used to VBA. Speaking of verification files and using BizHawk for this game, I think I've convinced myself to start preparing for a Boss Rush TAS. Making a proper verification file for the most optimal Boss Rush will probably take far longer than it'll take to actually make the TAS, but I've got enough affection for the game to take it on. Probably a reposted video, but here's the best TAS I could find (though I wasn't having any luck on Nico so there might be a faster one there): Link to video
There is a version made by me several years ago: http://dehacked.2y.net/microstorage.php/info/171653208/AoS%20BR%20Run.vbm (VBA 23.6) Although tricks used in two movies are almost the same, mine is more than 2 seconds faster. If I remember currectly, the fastest non-glitched BR run I've watched is 1:07:86 Original post can be found here: http://tasvideos.org/forum/viewtopic.php?t=4194&postdays=0&postorder=asc&start=600 PS: I've been waiting an AoS BR run for LONG time. Anyone please do it!
Experienced Forum User
Joined: 6/27/2008
Posts: 49
I'm not very glad to see the existing all souls run will get obsoleted by this, as the existing run shows more such as using of Catoblepas soul & Julius fight.
Experienced Forum User
Joined: 6/27/2008
Posts: 49
If allots MP appropriately, there will be more MP left to be used to zip to Claimh Solais room. In this movie, we cannot do that since we don't have enough MP. Before we got to Chaos room, Soma had run out of all his MP.
So the problem is: We don't have enough MP, oh god... So can we save some MP ( or maybe MindUps ) by using less Lightning Doll or something else?
Pike wrote:
So let's expect the better version together.
Great! Then we should find a way to beat Dead Crusader fast to GET THE BLOCKING MALL. Since Soma is very weak at that time, any better weapon should be helpful. Try to get Combat Knife ( ATT +24 ) by killing another Zombie Soldier ( or ignore its soul at the beginning ). Another suggestion: I saw you used Rotten Meat immediately after using the Potion. Can we use it later to allow Soma taking damage ( when fighting Dead Crusader )? I know Soma is not strong enough to take 1 hit; a better body equipment is needed ( maybe Leather Plate from Axe Armor ). I know its low possibility, but it's worth trying. If it works, we don't need to use Rotten Meat!
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Pike wrote:
That may be our mistake though I would not like to admit. Allow me to quibble that the time we spend in getting Black Belt and wearing it may be longer than the time it will save. If we try to get it, it will be difficult to get red crow's and imp's souls. You know Soma can only meet them once. Because Soma uses Final Sword, ATT+5 does not seem to be important. Legion has its own 128-frame rule. I think it cannot help save rounds in every following battle except the battle with Graham.
You have to admit that you missed it, or there's no reason to get Death's Robe either.
As for Claimh Solais, to use it we have to zip to the room to get it, switch into it and then switch into Final Sword. Actually it works in normal play instead of TAS play. Soma can only attack enemies once with Claimh Solais every jump. Although I like it, too, it is almost useless in this run.
But the fact is: The existing all souls run uses Mystletain and did save some time. The old first version of all souls run [1428] GBA Castlevania: Aria of Sorrow "all souls" by Kriole in 28:01.58 even got this weapon ( but the road is too long to save time ). If zipping to the room doesn't cost much time, I think it's worth getting it. The Shadow Knight (TOLERANCE: Sword element) fight and maybe Demon Lord can be greatly improved EDIT: You have to open menu before fighting the last boss, switch back to Final Sword that time is not too late. You just need to spend time open menu to equip Claimh Solais ( maybe the time when switching to Black Panther? )
Experienced Forum User
Joined: 6/27/2008
Posts: 49
I noticed that you didn't get Black Belt, though 3 Werewolves were beaten. Why? You may equip it together with Death's Robe, which should be helpful in the last half part of the movie. Note: Black Belt gives you ATT+5 & STR+5, even better than Death's Robe ( which only gives ATT+4 & STR+4 ) Another suggestion: Can we zip into the Claimh Solais's room somehow? It should be useful to fight those dark enemies in Chaos (and we all love it just like the Chaos Ring ^_^)
Experienced Forum User
Joined: 6/27/2008
Posts: 49
Pike wrote:
At the beginning, Soma is too weak to beat Dead Crusades quickly.
How many frames will cost to fight Dead Crusades?
Let's expect the next version together.
That means: this run will be updated? Another question: Julius battle can be totally ignored, why Graham can't?
Experienced Forum User
Joined: 6/27/2008
Posts: 49
No Blocking Armor? Oh no... To be honest, this run doesn't entertain me like the existing all souls run by Kriole, since no new glitches / tricks are found / used. In addtion, I don't know whether it's technological possible, but not getting Black Panther early in the game truly disappoint me. But this run is still worth publishing because of, though I knew before, the speed of bat zipping and... you guys get Chaos Ring! Small yes vote from me. GET THE BLOCKING ARMOR PLEASE!