Posts for feos


1 2 213 214 215 439 440
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
A guy from sourceforge told me:
At 5 and 6 levels of the game it's possible to save huge chunk of time by damage boosting into the walls. At the 6 level by boosting of the red arremer you can start clipping upwards by jumping as shown in the movie. With good optimization this trick can save ~5 second over current TAS. At the beggining of the level 5 it's possible to perform the same trick and skip first part of the level (as shown in the movie). Also by doing this you prevent enemies from spawning. But I can't met platform cycle. So I end up saving not that much time. But if it possible to manipulate that platform... as i think it can save ~10 second.
https://www.dropbox.com/s/he757ao1gu97mlg/Ghosts%20%27N%20Goblins%20%28U%29%20%5B%21%5D-0.fm2?dl=0 https://www.dropbox.com/s/li22jhez2647ltp/Ghosts%20%27N%20Goblins%20%28U%29%20%5B%21%5D-7.fm2?dl=0
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
I think a sane option would be to blend fields in this case: it'll at least be semi-transparent.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
The question is, how does it look on tv? BTW I don't think deinterlacing psx bios is required since it is weird: 60 fps interlaced in octochock, not 30. So when running at full fps, interlacing isn't noticeable, while deinterlacing creates various artifacts or an blurred picture.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Post subject: Encode error reports
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
For any issue that might happen with encodes, my goal (at least consciously) has always been to help preventing them in future, because actual reencoding is annoying, and we don't want bad surprises. So to make it most productive, here's how a good error report is done:
  • Point out an error.
  • Explain why is it bad (proofs, videos, images, examples).
  • Evaluate how fatal it is, whether reencoding is outright required, or just desired.
  • Come up with a solution proposal.
Then together we will figure out what will be documented about the issue in question (on wiki or in a dedicated thread), and I'll probably add the solution to the universal encoding script I maintain (partly for work, partly for reference). Do not include emotions or accusation in your report, because that makes it less productive in the end. Don't assume the problem is already known and ignored. Let's get info provided, workflow fixed, and reencoders motivated!
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
I'd say that perfectly authentic ntsc artifacts aren't yet emulated. The most important thing would be color borders - moire on those is changing its phase during every 3 frames. 1 pixel wide vertical lines look distorted, vertical borders between solid colors look like a saw (that also shifts for every 3 frames). Also, there's a rainbow effect where on every luma (brightness) level change, there appears a tiny artifact of a semi-random color, and they also change their phase for every 3 frames. Finally, there are different artifacts of a notch filter, sometimes you can see a bit of moire even on solid colors, then, it might differ in how far from the color borders moire is clearly visible. Just record some footage from console, then launch that game in an emulator and try checking out various ntsc filters. If you record and compare, you'll see the difference. PS: I can't download the vid to look closely.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Warepire wrote:
That's because AVI isn't meant to contain video encoded to x264. It's outside of the AVI spec and a horrible practice, you're asking for trouble when you do this, like REALLY asking for trouble. Also, AVI is bloody ancient, use a better container like mp4 or matroska (mkv), for which x264 encoded video will be living very happily in.
Lossless AVI dump -> VirtualDub -> x264vfw (zero latency checked or it desyncs) -> youtube. This has been working for me for years perfectly.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
For games that run at 30 fps (duplicating every frame), reducing the framerate for youtube is required, due to YouDoot. The script I provide in TAS Encoding Package 2 has a halffps toggle, use it to cut every other frame out of the video. http://tasvideos.org/forum/viewtopic.php?t=18128 Also, we can't let YouPoop do aspect ratio correction for us, since it won't anymore. Update your scripts to include "manual" aspect ratio correction. http://tasvideos.org/forum/viewtopic.php?t=18100
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Mothrayas wrote:
any editor can add runs to Gruefood Obsolete Delight
I didn't do it because it requires wording, which I haven't ever been good at when it comes to movie descriptions.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
I'm retiring from seniorship because Spikestuff has never heard about respect. Post #408267 Post #430064 This happens every time I don't know about something in advance, because he didn't care enough to make sure I do, yet he believes he has all rights to act this way. This is unacceptable. But I survived those. What made up my decision was this:
IRC chat wrote:
[18:06] <SpikedMuffin> because you're a consistent lil bitch who keeps bringing it up [18:06] <SpikedMuffin> You sod.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Maybe it's the result of LZO. Gamer Maiden Sonia, try GZIP or a lossy codec.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
What's the file size of the final encode?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Ну да, если хочешь могу включить обратно. И вот поправил еще кое-что: Download TheAdventuresOfBatmanAndRobin.lua
Language: lua

-- The Adventures of Batman and Robin -- 2013-2016, feos and r57shell -- GLOBALS -- MsgTable = {} MsgTime = 30 MsgOffs = 16 MsgCutoff = 60 RNGcount = 0 SpawnCount= 0 SpawnOpac = 192 SpawnX = 0 SpawnY = 0 Enemies = 0 Items = 0 Hearts = 0 -- SHORTCUTS -- rb = memory.readbyte rbs = memory.readbytesigned rw = memory.readword rws = memory.readwordsigned rl = memory.readlong rls = memory.readlongsigned rex = memory.registerexec getr= memory.getregister function GetCam() xcam = rws(0xFFDFC4) if rb(0xFFFFF6) == 50 then ycam= rws(0xFFDFE0)-20 else ycam = 0 end end function EnemyPos(Base) GetCam() x1 = rws(Base + 0x12) - xcam y1 = rws(Base + 0x14) - ycam x2 = rws(Base + 0x16) - xcam y2 = rws(Base + 0x18) - ycam hp = rws(Base + 0x1E) end function PlayerPos() local sbase1 = rw(0xFFAD5C) + 0xFF0000 local sbase2 = rw(0xFFADB6) + 0xFF0000 p1speedx = rls(sbase1 + 0x18) / 0x10000 p1speedy = rls(sbase1 + 0x1C) / 0x10000 p2speedx = rls(sbase2 + 0x18) / 0x10000 p2speedy = rls(sbase2 + 0x1C) / 0x10000 end function HandleMsgTable(clear) for i = 1, #MsgTable do if (clear) then MsgTable[i] = nil end if (MsgTable[i]) then GetCam() if (MsgTable[i].y_ > MsgCutoff) then MsgY1 = 0 MsgY2 = 6 else MsgY1 = 203 MsgY2 = 203 end local opacity = AND((MsgTable[i].timer_ - gens.framecount() + 2)*7, 0xFF) gui.line(i * MsgOffs + 3, MsgY2, MsgTable[i].x_ - xcam, MsgTable[i].y_, 0xFF000000+opacity) gui.text(i * MsgOffs , MsgY1, MsgTable[i].damage_, "red") if (MsgTable[i].timer_ < gens.framecount()) then MsgTable[i] = nil end end end end function HandleDamage() local damage = AND(getr("d0"), 0xFFFF) local base = AND(getr("a2"), 0xFFFFFF) EnemyPos(base) unit = { timer_ = gens.framecount() + MsgTime, damage_ = damage, x_ = x1 + xcam, y_ = y1 } for i = 1, 200 do if MsgTable[i] == nil then MsgTable[i] = unit break end end end function Collision() GetCam() local a0 = AND(getr("a0"), 0xFFFFFF) local a6 = AND(getr("a6"), 0xFFFFFF) local damage = rw(a6 + 0x12) local id = rw(a6 + 2) local wx2 = getr("d6") - xcam local wy2 = getr("d7") - ycam local wx1 = getr("d4") - xcam local wy1 = getr("d5") - ycam -- gui.text(wx2 + 2, wy1 + 1, string.format("%X",a6)) if (damage == 0) then damage = rw(a0 + 0x34) end if (DamageHitbox) then gui.box(wx1, wy1, wx2, wy2, "#FF000000") gui.text(wx1 + 2, wy1 + 1, damage) else gui.box(wx1, wy1, wx2, wy2, "#FFFF0000") if id == 0x53B4 then Hearts = Hearts + 1 end end end function InRange(var, num1, num2) if (var >= num1) and (var <= num2) then return true end end function Item() GetCam() local a6 = AND(getr("a6"), 0xFFFFFF) local x = rw(a6 + 0x3E) - xcam local y = rw(a6 + 0x42) local code = rb(a6 + 0x19) if InRange(code, 0, 1) then return elseif InRange(code, 7, 19) then item = "Amo" -- ammo elseif InRange(code, 21, 23) then item = "Cha" -- fast charge elseif InRange(code, 24, 26) then item = "Bom" -- bomb elseif InRange(code, 27, 29) then item = "Lif" -- life elseif InRange(code, 30, 47) then item = "HiP" -- hearts else item = tostring(code) end gui.text(x-7, y, string.format("%s" , item ), "yellow") -- gui.text(x-7, y, string.format("\n%X", a6+0x19), "yellow") end function Hitbox(address) local i = 0 local base = rw(address) while (base ~= 0) do base = base + 0xFF0000 if (rw(base + 2) == 0) then break end EnemyPos(base) if (address == 0xFFDEB2) then gui.box(x1, y1, x2, y2, "#00FF0000") elseif (address == 0xFFDEBA) then gui.box(x1, y1, x2, y2, "#00FFFF00") gui.text(x1 + 2, y1 + 1, hp, "#FF00FF") -- if (x2 < 0) then gui.text(x1 + 2, y2 - 7, "x:" .. x1 ) end -- if (x1 >= 320) then gui.text(x1 + 2, y2 - 7, "x:" .. x1 - 320) end -- if (y2 < 0) then gui.text(x2 + 2, y2 - 7, "y:" .. y2 ) end local offtext = "" if (x2 < 0) then offtext = offtext .. "x:" .. x1 end if (x1 >= 320) then offtext = offtext .. "x:" .. x1 - 320 end if (y2 < 0) then offtext = offtext .. "y:" .. y2 end if (y2 >= 224) then offtext = offtext .. "y:" .. y2 - 224 end if offtext ~= "" then gui.text(x1 + 2, y2 - 7, offtext) end end base = rw(base + 2) i = i + 1 if (i > 400) then break end end end function Objects() if rb(0xFFFFF6) ~= 50 then return end Enemies = 0 Items = 0 GetCam() local base = 0xFFAD54 for i=0,100 do local link = rw (base+ 6) local ptr1 = rw (base+0x0A)+0xFF0000 local x = rws(base+0x3E) local xsub = rb (base+0x40) local y = rws(base+0x42) local ysub = rb (base+0x44) local hp = rw (base+0x52) local ptr2 = rl (ptr1+0x2A) local code = rw (ptr2) if base > 0 then if ptr2 == 0x27DEE -- helicopter black or ptr2 == 0x27F9C -- helicopter red or ptr2 == 0x2804E -- plane black or ptr2 == 0x28134 -- helicopter green or ptr2 == 0x282B8 -- plane red or ptr2 == 0x2860A -- missile or ptr2 == 0x28DD2 -- helicopter red phase 1 or ptr2 == 0x28E08 -- helicopter red phase 2 then Enemies = Enemies + 1 elseif ptr2 == 0x13326 or ptr2 == 0x13BDE then Items = Items + 1 else -- gui.text(x - xcam, y - ycam, string.format("%X", ptr2), "green") end end base = link + 0xFF0000 local a5 = rl (base) if a5 == 0x88BE then return end end end function Spawns() if rb(0xFFFFF6) ~= 50 then return end local base = AND(getr("a6"), 0xFFFFFF) local ptr1 = rw(base+0x0A) + 0xFF0000 local ptr2 = rl(ptr1+0x2A) local code = rw(ptr2) SpawnX = rws(base+0x3E) - xcam SpawnY = rws(base+0x42) - ycam if code ~= 0xAE6 -- drone and code ~= 0xAF2 -- mini-missile and code ~= 0x2384 -- item then SpawnOpac = 192 SpawnCount = SpawnCount + 1 end end function Main() local color0 = "yellow" local color1 = "yellow" local color2 = "yellow" local base1 = 0xFFAD54 local base2 = 0xFFADAE -- local hp1 = rw (0xFFF654) -- local life1 = rw (0xFFF644) local X1 = rw (base1 + 0x3E) local X1sub = rb (base1 + 0x40) local Y1 = rws(base1 + 0x42) local Y1sub = rb (base1 + 0x44) local X2 = rw (base2 + 0x3E) local X2sub = rb (base2 + 0x40) local Y2 = rws(base2 + 0x42) local Y2sub = rb (base2 + 0x44) local RNG1 = rw (0xFFF5FC) -- local RNG2 = rl (0xFFF5FE) local Weapon1 = rb (0xFFF67B) local Weapon2 = rb (0xFFF6BB) local Charge1 = (rw(0xFFF658) - 0x2800) / -0x80 local Charge2 = (rw(0xFFF698) - 0x2800) / -0x80 local ScreenLock = rw(0xFFDFC0) if Charge1 <= 0 then Charge1 = 0; color1 = "red" end if Charge2 <= 0 then Charge2 = 0; color2 = "red" end if RNGcount > 1 then color0 = "red" end HandleMsgTable() PlayerPos() Objects() if rb(0xFFFFF6) == 50 then gui.line( 34, 37, SpawnX, SpawnY, 0x00FF0000+ SpawnOpac) gui.text( 0, 30, string.format("Obj: %d" , SpawnCount),"green") gui.text( 0, 38, string.format("%d %d %d" , Enemies, Items, Hearts/2)) end gui.text( 0, 210, string.format("\nRNG:%X" , RNG1)) gui.text( 40, 210, string.format("\nLock:%d" , ScreenLock)) gui.text( 34, 210, string.format("\n%d" , RNGcount), color0) gui.text( 80, 20, string.format("%2d" , Charge1), color1) gui.text(235, 20, string.format("%2d" , Charge2), color2) gui.text(180, 210, string.format("\n%2d" , Weapon1+1), "yellow") gui.text(300, 210, string.format("\n%2d" , Weapon2+1), "yellow") gui.text( 81, 210, string.format("Pos: %d.%d\nSpd: %.5f", X1, X1sub, p1speedx), "#AAAAAA") gui.text(137, 210, string.format("/ %d.%d\n/ %.5f" , Y1, Y1sub, p1speedy), "#AAAAAA") gui.text(203, 210, string.format("Pos: %d.%d\nSpd: %.5f", X2, X2sub, p2speedx), "#00BB00") gui.text(260, 210, string.format("/ %d.%d\n/ %.5f" , Y2, Y2sub, p2speedy), "#00BB00") Hitbox(0xFFDEB2) Hitbox(0xFFDEBA) RNGcount = 0 end emu.registerafter(function() SpawnOpac = SpawnOpac - 4 if SpawnOpac < 0 then SpawnOpac = 0 end end) emu.registerbefore(function() Hearts = 0 end) savestate.registerload(function() SpawnCount = 0 SpawnOpac = 192 Enemies = 0 Items = 0 Hearts = 0 return HandleMsgTable(1) end) gui.register(Main) rex(0x375A, function() DamageHitbox = false end) rex(0x375E, function() DamageHitbox = true end) rex(0x3768, function() DamageHitbox = false end) rex(0x376C, function() DamageHitbox = true end) rex(0x65C4, function() DamageHitbox = false end) rex(0x65C8, function() DamageHitbox = true end) rex(0x995C, function() RNGcount = RNGcount + 1 end) rex(0x4738, Item) rex(0x4534, Item) rex(0x8DE6, Spawns) rex(0x8DCE, Spawns) rex(0x8C9A, Collision) rex(0x1085A, HandleDamage) -- meelee rex(0x10CBA, HandleDamage) -- weapon rex(0x10CC4, HandleDamage) -- weapon
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Вощем так как за экраном видно врага начиная с первых версий скрипта (пофиксил низ), а считать мелкие сердески вместе с нормальными айтемами слишком мозголомно, счетчики такие: спавн, враги, айтемы, сердечки. Тести.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Archanfel wrote:
Для летательного уровня, пожалуй больше ничего и нет.
Какой смысл считать ракеты и дронов, если у них и так показывается удаленность, когда они за экраном, а на экране их и так видно?
Archanfel wrote:
Но, если распространить концепцию вторичных врагов на другие уровни, то сюда еще можно отнеси нейтральные разрушаемые объекты, урны/вазы/бочки/фонари, шляпу шляпника, сахар выпрыгивающий из сахарницы и прочее.
Губа не дура. Как насчет "нет"? Хитбоксы есть, удаленность есть, считать зачем?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Дерижабль нужен?
Второе значение - количество вторичных врагов на экране, выпущенных (ракеты, мины ловушек и т.п.).
В т.п. что входит?
Archanfel wrote:
Я придумал простой и элегантный способ как это можно организовать
Да уж, проще некуда.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
You don't need to compare those, just compare times spent in each room, as in, actual gameplay time.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
I don't think having a movie sync on a fixed emulation core has ever been a requirement. The only scenario close to that is when the run relies on emulation bugs in order to pull off some trick. When it's just a timing fix or something like that, I don't remember it being an issue, since no emulator is perfect.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Тестируй глобальный счетчик. Download TheAdventuresOfBatmanAndRobin.lua
Language: lua

-- The Adventures of Batman and Robin -- 2013-2016, feos and r57shell -- GLOBALS -- MsgTable = {} MsgTime = 30 MsgOffs = 16 MsgCutoff = 60 RNGcount = 0 SpawnCount= 0 SpawnOpac = 192 SpawnX = 0 SpawnY = 0 -- SHORTCUTS -- rb = memory.readbyte rbs = memory.readbytesigned rw = memory.readword rws = memory.readwordsigned rl = memory.readlong rls = memory.readlongsigned rex = memory.registerexec getr= memory.getregister function GetCam() xcam = rws(0xFFDFC4) if rb(0xFFFFF6) == 50 then ycam= rws(0xFFDFE0)-20 else ycam = 0 end end function EnemyPos(Base) GetCam() x1 = rws(Base + 0x12) - xcam y1 = rws(Base + 0x14) - ycam x2 = rws(Base + 0x16) - xcam y2 = rws(Base + 0x18) - ycam hp = rws(Base + 0x1E) end function PlayerPos() local sbase1 = rw(0xFFAD5C) + 0xFF0000 local sbase2 = rw(0xFFADB6) + 0xFF0000 p1speedx = rls(sbase1 + 0x18) / 0x10000 p1speedy = rls(sbase1 + 0x1C) / 0x10000 p2speedx = rls(sbase2 + 0x18) / 0x10000 p2speedy = rls(sbase2 + 0x1C) / 0x10000 end function HandleMsgTable(clear) for i = 1, #MsgTable do if (clear) then MsgTable[i] = nil end if (MsgTable[i]) then GetCam() if (MsgTable[i].y_ > MsgCutoff) then MsgY1 = 0 MsgY2 = 6 else MsgY1 = 203 MsgY2 = 203 end local opacity = (MsgTable[i].timer_ - gens.framecount() + 2)*7 gui.line(i * MsgOffs + 3, MsgY2, MsgTable[i].x_ - xcam, MsgTable[i].y_, 0xFF000000+opacity) gui.text(i * MsgOffs , MsgY1, MsgTable[i].damage_, "red") if (MsgTable[i].timer_ < gens.framecount()) then MsgTable[i] = nil end end end end function HandleDamage() local damage = AND(getr("d0"), 0xFFFF) local base = AND(getr("a2"), 0xFFFFFF) EnemyPos(base) unit = { timer_ = gens.framecount() + MsgTime, damage_ = damage, x_ = x1 + xcam, y_ = y1 } for i = 1, 200 do if MsgTable[i] == nil then MsgTable[i] = unit break end end end function Collision() GetCam() local a0 = AND(getr("a0"), 0xFFFF) local a6 = AND(getr("a6"), 0xFFFF) local damage = rw(a6 + 0xFF0012) local wx2 = getr("d6") - xcam local wy2 = getr("d7") - ycam local wx1 = getr("d4") - xcam local wy1 = getr("d5") - ycam --gui.text(wx2 + 2, wy1 + 1, string.format("%X",a6)) if (damage == 0) then damage = rw(a0 + 0xFF0034) end if (DamageHitbox) then gui.box(wx1, wy1, wx2, wy2, "#FF000000") gui.text(wx1 + 2, wy1 + 1, damage) else gui.box(wx1, wy1, wx2, wy2, "#FFFF0000") end end function InRange(var, num1, num2) if (var >= num1) and (var <= num2) then return true end end function Item() GetCam() local a6 = AND(getr("a6"), 0xFFFF) local x = rw(a6 + 0xFF003E) - xcam local y = rw(a6 + 0xFF0042) local code = rb(a6 + 0xFF0019) if InRange(code, 0, 1) then return elseif InRange(code, 7, 19) then item = "Amo" -- ammo elseif InRange(code, 21, 23) then item = "Cha" -- fast charge elseif InRange(code, 24, 26) then item = "Bom" -- bomb elseif InRange(code, 27, 29) then item = "Lif" -- life elseif InRange(code, 30, 47) then item = "HiP" -- hearts else item = tostring(code) end gui.text(x-7, y, string.format("%s" , item ), "yellow") -- gui.text(x-7, y, string.format("\n%X", a6+0x19), "yellow") end function Hitbox(address) local i = 0 local base = rw(address) while (base ~= 0) do base = base + 0xFF0000 if (rw(base + 2) == 0) then break end EnemyPos(base) if (address == 0xFFDEB2) then gui.box(x1, y1, x2, y2, "#00FF0000") elseif (address == 0xFFDEBA) then gui.box(x1, y1, x2, y2, "#00FFFF00") gui.text(x1 + 2, y1 + 1, hp, "#FF00FF") --if (x2 < 0) then gui.text(x1 + 2, y2 - 7, "x:" .. x1 ) end --if (x1 >= 320) then gui.text(x1 + 2, y2 - 7, "x:" .. x1 - 320) end --if (y2 < 0) then gui.text(x2 + 2, y2 - 7, "y:" .. y2 ) end local offtext = "" if (x2 < 0) then offtext = offtext .. "x:" .. x1 end if (x1 >= 320) then offtext = offtext .. "x:" .. x1 - 320 end if (y2 < 0) then offtext = offtext .. "y:" .. y2 end if (y2 >= 224) then offtext = offtext .. "y:" .. y2 - 224 end if offtext ~= "" then gui.text(x1 + 2, y2 - 7, offtext) end end -- gui.text(x1 + 2, y1 + 1, string.format("\n%X", base + 0x1E - 0xFF0000), "#FF00FF") base = rw(base + 2) i = i + 1 if (i > 400) then break end end end function Objects() GetCam() local base = 0xFFAD54 for i=0,100 do local a5 = rl (base) local link = rw (base+ 6) local ptr1 = rw (base+0x0A)+0xFF0000 local x = rws(base+0x3E) local xsub = rb (base+0x40) local y = rws(base+0x42) local ysub = rb (base+0x44) local hp = rw (base+0x52) local ptr2 = rl (ptr1+0x2A) local code = rw (ptr2) if a5 == 0x88BE then return end if base == 0xFFC320 then -- gui.text(x - xcam, y - ycam, string.format("%X", base)) end base = link + 0xFF0000 end end function Counters() local base = AND(getr("a6"), 0xFFFFFF) local ptr1 = rw(base+0x0A) + 0xFF0000 local ptr2 = rl(ptr1+0x2A) local code = rw(ptr2) SpawnX = rws(base+0x3E) - xcam SpawnY = rws(base+0x42) - ycam if code ~= 0xAE6 -- helicopter bomb and code ~= 0xAF2 -- mini-missile and code ~= 0x2384 -- item then SpawnOpac = 192 SpawnCount = SpawnCount + 1 print(string.format("%X", code)) end end function Main() local color0 = "yellow" local color1 = "yellow" local color2 = "yellow" local base1 = 0xFFAD54 local base2 = 0xFFADAE -- local hp1 = rw (0xFFF650) / 0x10 -- local life1 = rw (0xFFF644) local X1 = rw (base1 + 0x3E) local X1sub = rb (base1 + 0x40) local Y1 = rws(base1 + 0x42) local Y1sub = rb (base1 + 0x44) local X2 = rw (base2 + 0x3E) local X2sub = rb (base2 + 0x40) local Y2 = rws(base2 + 0x42) local Y2sub = rb (base2 + 0x44) local RNG1 = rw (0xFFF5FC) -- local RNG2 = rl (0xFFF5FE) local Weapon1 = rb (0xFFF67B) local Weapon2 = rb (0xFFF6BB) local Charge1 = (rw(0xFFF658) - 0x2800) / -0x80 local Charge2 = (rw(0xFFF698) - 0x2800) / -0x80 local ScreenLock = rw(0xFFDFC0) if Charge1 <= 0 then Charge1 = 0; color1 = "red" end if Charge2 <= 0 then Charge2 = 0; color2 = "red" end if RNGcount > 1 then color0 = "red" end -- HandleMsgTable() PlayerPos() Objects() gui.line( 34, 37, SpawnX, SpawnY, 0x00FF0000+SpawnOpac) gui.text( 0, 30, string.format("Spawns: %d",SpawnCount),"green") gui.text( 0, 210, string.format("\nRNG:%X" , RNG1)) gui.text( 40, 210, string.format("\nLock:%d", ScreenLock)) gui.text( 34, 210, string.format("\n%d" , RNGcount), color0) gui.text( 80, 20, string.format("%2d" , Charge1), color1) gui.text(235, 20, string.format("%2d" , Charge2), color2) -- gui.text(180, 210, string.format("%2d" , Charge1), color1) -- gui.text(300, 210, string.format("%2d" , Charge2), color2) gui.text(180, 210, string.format("\n%2d" , Weapon1+1), "yellow") gui.text(300, 210, string.format("\n%2d" , Weapon2+1), "yellow") gui.text( 81, 210, string.format("Pos: %d.%d\nSpd: %.5f", X1, X1sub, p1speedx), "#AAAAAA") gui.text(137, 210, string.format("/ %d.%d\n/ %.5f" , Y1, Y1sub, p1speedy), "#AAAAAA") gui.text(203, 210, string.format("Pos: %d.%d\nSpd: %.5f", X2, X2sub, p2speedx), "#00BB00") gui.text(260, 210, string.format("/ %d.%d\n/ %.5f" , Y2, Y2sub, p2speedy), "#00BB00") Hitbox(0xFFDEB2) -- Hitbox(0xFFDEBA) RNGcount = 0 end emu.registerafter(function() SpawnOpac = SpawnOpac - 4 if SpawnOpac < 0 then SpawnOpac = 0 end end) savestate.registerload(function() SpawnCount = 0 SpawnOpac = 192 return HandleMsgTable(1) end) gui.register(Main) rex(0x375A, function() DamageHitbox = false end) rex(0x375E, function() DamageHitbox = true end) rex(0x3768, function() DamageHitbox = false end) rex(0x376C, function() DamageHitbox = true end) rex(0x65C4, function() DamageHitbox = false end) rex(0x65C8, function() DamageHitbox = true end) rex(0x995C, function() RNGcount = RNGcount + 1 end) rex(0x4738, Item) rex(0x4534, Item) rex(0x8DE6, Counters) rex(0x8DCE, Counters) --rex(0x8C9A, Collision) rex(0x1085A, HandleDamage) -- meelee rex(0x10CBA, HandleDamage) -- weapon rex(0x10CC4, HandleDamage) -- weapon
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Alyosha wrote:
I'm not sure what the rules are regarding this, are runs from dev builds submittable?
They are required to sync on official releases, with exceptions for things like Dolphin. This might get delayed until the new release as well, but having it published as is is up to a judge and the authors if its optimal.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
I got a 3D overdose from these Portals.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Well, that was nice 15 minutes.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Who doesn't work, doesn't evolve.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
Language: c

// function pointer type typedef uint8 (*readfunc)(uint32 A); typedef void (*writefunc)(uint32 A, uint8 V); // macro to define the body #define DECLFR(x) uint8 x(uint32 A) #define DECLFW(x) void x(uint32 A, uint8 V) // example region static DECLFR(ARAM) { return RAM[A]; } void SetReadHandler(int32 start, int32 end, readfunc func) { // do all needed checks here, when emu starts // go through all cells for (x = end; x >= start; x--) // declare a function ARead[x] = func; } // example call for a region SetReadHandler(0, 0x7FF, ARAM); // and this is used in opcodes static __inline uint8 RdMem(unsigned int A) { return(_DB=ARead[A](A)); }
It doesn't really make for an impression of good and stable architecture.
It's probably written oddly, the core is old and not many people wanted to refactor it, but its just regular C, and I see no harm in having an array of functions. And if it speeds things up, that's actually a benefit, since this is probably not the case when being slow is critical and required.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
zeromus, what do you think about the fceux approach I mentioned?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Experienced Forum User, Published Author, Site Admin, Skilled player (1236)
Joined: 4/17/2010
Posts: 11269
Location: RU
А знать, какой враг своим спавном увеличил счетчик, надо?
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
1 2 213 214 215 439 440