Has anyone ever considered creating a TAS of Die Hard, as made famous by Kirkq during AGDQ 2013?
Not sure if it would be entertaining enough for the moons teir, but a well optimized run would be worthy of the Vault at least.
I am tempted to make a TAS myself as a first project.
Any thoughts on the matter?
I remember Kirk talking about doing (or rather, not doing) a tas in like 2009 or something. I think he thought it was too boring. Without funny commentary and a lively crowd I suppose it's not much to look at by itself.
But yeah, there is a vault now so I don't see why not.
I have considered creating a TAS of Die Hard, as made famous by Kirkq during AGDQ 2013. I had plans on doing this eventually but I ran into some problems optimizing where crooks are at. I didn't want to throw together something mediocre and kill the hype.
- Fact: If you die and have health remaining (through hacking or presumably an undiscovered glitch), the game thinks you win.
- Fact: Holding left for 2 frames and right for two frames repeatedly will cause your character to cycle through all the sprites in the game. I think this is only a graphical change, and it stops once you stop the pattern.
- Side Note: There's a dumb debug code in the game to run down the timer, which I don't approve of.
Here's my lua script which displays some useful addresses and lists some random stuff in memory.
--Many values are copied into 4 locations
--0x0000
--0x0800
--0x1000
--0x1800
--0x003B -- changes from 1 to 2 every 3 frames when not loading
local CameraOffsetX = 0x0044 --from character
local CameraOffsetY = 0x0045
-- 0x0046 enemy X rounded to a multiple of 16 --this holds one guy sometimes?
-- 0x0047 enemy Y rounded to a multiple of 16 --start on reg floor
local SlowIncPosX = 0x0048 --character value related to above
local SlowIncPosY = 0x0049
local Floor = 0x0065
--0x006A = randomtimer
local CameraX = 0x006F
local CameraY = 0x0070
--0x0071 = new direction press
--0x0073 = counter
--0x0074 = buffercounter
--0x0077 -- = count by 3 to 256 not pause
local CharX = 0x00A1
local CharY = 0x00A3 --there is another value similar to this in memory
local LifeDiff = 0x00A6
local Crooks = 0x00AB
local Life = 0x00AC
local Lock = 0x00AD
local TimerFrames = 0x00AE
local Seconds = 0x00AF
local Minutes = 0x00B0
--0x00CD --west elevator open
--0x00CE --west elevator open
--0x0205 -- character animation glitch. Contains sprite ID, generally of top half
--0x04AA = direction change
--0x04AD = direction facing
--0x04B8 = character sprite?
--0x048F floor
--0x0497 floor
--0x0498 floor
-----------------------------------
--0x04D9 = charX
--0x04DB through 0x04E0 or so = Crook X positions --this floor only
--It appears there are slots for 6 enemies
--green guy right next to me = 04DB
--blue guy = 04DC tends east
--blue guy = 04DD tends southeast
--blue guy outside the door = 04DE
--karl = 04DF
--blue guy down the hall = 4E0
--Karl can be shot out the window
--Can push final boss
--Final Boss 04DA
--X is 16 and 30 for north elevator
--X is 32 for west elevator
--------------------------------
--0x051B = CharY
--0x051C through 0x0522 or so = Crook Y positions --this floor only
--0x06EA --this may be related to how enemy positions are stored
local Axe = 0x0772
local Pistol = 0x077A
local SMGA = 0x077B --current
local SMGB = 0x077C --num backups
local C4 = 0x077D
local Flash = 0x077E
local FeetUnit = 0x0797
--Foot power gets drained every 12 frames
--Running 6 frames then walking 6 only drains foot power as if you were walking, but you move faster than walking speed.
--Running 6 frames then stopping 6 does not drain foot power.
--Loading glass on screen can trigger a -8
local Feet = 0x0798 --8 feet bad, 0 feet good
--1006 = music
local FeetCurr = 0
local FeetDiff = 0
while true do
if (FeetCurr - memory.readbyte(FeetUnit)) < 0 then
FeetDiff = FeetCurr - memory.readbyte(FeetUnit)
end
FeetCurr = memory.readbyte(FeetUnit)
gui.text(0,10,"Feet: " .. memory.readbyte(Feet))
gui.text(35,10," " .. memory.readbyte(FeetUnit))
gui.text(75,10," " .. FeetDiff)
gui.text(0,20,"Pistol: " .. memory.readbyte(Pistol))
gui.text(0,30,"SMG: " .. memory.readbyte(SMGB) .. " ")
gui.text(0,40,"Flash: " .. memory.readbyte(Flash))
gui.text(40,30, memory.readbyte(SMGA))
gui.text(233,0, memory.readbyte(Life))
gui.text(0,0, "Crooks " .. memory.readbyte(Crooks))
gui.text(0,50, "Time " .. memory.readbyte(Minutes) .. " ")
gui.text(35,50, memory.readbyte(Seconds) .. " ")
gui.text(50,50, memory.readbyte(TimerFrames))
gui.text(0,60, "X " .. memory.readbyte(CharX))
gui.text(0,70, "Y " .. memory.readbyte(CharY))
--memory.writebyte(CharY,190)
--memory.writebyte(Life,15)
--memory.writebyte(Feet,1)
FCEU.frameadvance();
end
Here's a test run on beginner: http://www.youtube.com/watch?v=GELTQMyevn0
FM2: http://dehacked.2y.net/microstorage.php/info/151742259/DH.fm2
I'm still using the same lua script in my previous post, no improvements yet.
Final run will be played on advanced mode. If anyone is interested in discussing stuff feel free to contact me.
The rest of this post is a copy of the youtube video description:
Timing from power on to final shot fired. Most of the time to be gained is by better managing the elevators at the end. The elevator timings are quite random, and are affected largely by your position on the map or the act of you calling the elevators. Shooting doors/windows or picking up objects also seems to change elevator timings sometimes? I need to figure out how the elevators work better before I work on a final TAS.
Also it might be possible to kill more crooks before going to the final floor. This run will allow me to better estimate the time that could be expended to kill a crook before going to the final floor.
Of note: Before you drain your foot power the diagonal movement alternates between X,Y of 3,3 and 4,4, so fastest movement would always move on the frames that are 4,4. After you drain your foot power you always move 4,4 diagonally, but you only move half as often.
A TAS to submit to tasvideos would play on Advanced mode (enemies take ~2x as many hits to kill)
The Theo cutscene plays at the end because I accidentally grabbed a radio before the fight. It clears after a period of time and does not technically contribute to the final time. This will not be present in the final run.
(My personal best speedrun time on emulator with no lua/turbo/savestates is 4:55 by SDA timing.)