I'm posting some information I collected, though it's formatted like submission comments, so it will probably look a bit odd. Also included an updated script me and Electrospecter are working on. Speaking of which, Electrospecter is my hero.
==========================
!!Introduction
Jurassic Park 2: The Chaos Continues is one of those games I enjoyed as a child, and so it holds a lot of nostalgia factor for me. Naturally, seeing as there’s no run of the game currently published, I decided to take on the challenge of TASing this game.
For the most part, the run is surprisingly easy to optimize.
*No horizontal acceleration
*Jumping doesn’t affect horizontal speed
*Only subpixel values involved in x position are 0 and 128
*Corner boosting always has the same effect frame-wise
*Almost no RNG to speak of
*Almost no lag to speak of
*Very easy game to hex edit
*Fairly trivial to synchronize 2 player input
*Ladders can be ascended at a uniform pace equal to your maximum jump speed
Basically, so long as you run right for justice, dispose of enemies in your way, climb ladders properly, and corner boost whenever possible, you will achieve an optimal time. However, producing this run was far from trivial because of the efforts to make the run as entertaining as possible.
__Optimizing Entertainment__
Below is a list of ways I attempt to make the run as entertaining as possible.
*Hit some enemies on the earliest frame possible
*Hit other enemies on the latest frame possible
*Shoot human enemies with tranquilizer weapons, even though they do no damage
*Time shots to create cool sounding firing sequences
*Use a variety of burst shooting and continuous shooting
*Use multiple weapons on the same enemy
*Jump on the earliest/latest frame possible while achieving a corner boost
*Making the most out of idle time (eg/ T-Rex auto-scroller fight)
!!Frame Data
*Running = 2 pixels / frame
*Corner boost by jumping onto a block = 9 pixels
*Corner boost by falling off a block = 5 frames
*Time to partially charge cattle prod = 35 frames
*Time to fully charge cattle prod = 70 frames
!!Weapon Firing Restrictions
Unfortunately you cannot fire weapons indefinitely in this game. There is a limit to how many bullets can appear on-screen at any given time, and it varies based on the weapon chosen.
*Default weapons: 3 bullets
*Rapid firing weapons: 5 bullets
*Power weapons: 1 bullet
In general at least 2 bullets must impact an enemy before firing can re-commence. An exception is the tranq bazooka where you can fire again 3 frames after the first missile has visually impacted the enemy.
__Combinations__
Below are the weapon firing combinations I’ve determined.
*Default + 4 rapid-fire / shotgun
*2 Default + 3 rapid-fire / shotgun
*3 Default + 2 rapid-fire
*Rapid fire + 2 default / shotgun
*2 Rapid fire + 1 default / shotgun
*3 Rapid fire (no combination)
*Shotgun + 2 rapid-fire
*Bazooka + 2 default/ 4 rapid-fire / shotgun
The rules governing this behavior are quite simple. Basically, each bullet fired has a certain value, and the maximum value allowed at any given point is 5. Below is a list of each individual weapon’s value.
*Default: 1.5
*Rapid-fire: 1
*Shotgun: 3
*Bazooka: 5
In addition, when you fire a bullet and switch weapons, the already fired bullet takes on the same value as the weapon you have equipped. This is what allows the freedom to fire a bazooka shot followed by 4 rapid-fire shots, for instance. Normally the bazooka shot has a value of 5, but by switching to a rapid-fire weapon, it changes to a value of 1, thus allowing for another 4 rapid-fire shots to reach the maximum of 5.
__Weapon Damage__
*Default: 2
*Rapid-fire: 2
*Shotgun: 15 (5 / hit)
*Bazooka: 14
*Partially charged cattle prod: 8
*Fully charged cattle prod: 16
__Enemy HP__
*Bat/little orange pests: 4
*Generic enemy: 6
*Generic black enemy: 10
*Grenade throwing enemies: 14
*Bazooka enemy: 20
*Flamethrower enemy: 22
*Blue outfit enemy: 42
*Dilophosaurus: 12
*Green raptor: 10
*Brown raptor: 22
*Grey raptor: 42
==========================
Now for the code. At the moment it shows things like character position (+sub-pixel pos), speed, player/enemy hp, and weapon usage. The enemy hp is very bugged at the moment, but this should be fixed soon enough.
Download Jurassic Park 2.luaLanguage: lua
while true do
xpos = memory.readword(0x7EB017)
xsub = memory.readbyte(0x7EB016)
ypos = memory.readword(0x7EB01B)
ysub = memory.readbyte(0x7EB01A)
xspd = memory.readwordsigned(0x7EB01E)
yspd = memory.readwordsigned(0x7EB022)
xpos2 = memory.readword(0x7EB07C)
xsub2 = memory.readbyte(0x7EB07B)
ypos2 = memory.readword(0x7EB080)
ysub2 = memory.readbyte(0x7EB07F)
xspd2 = memory.readwordsigned(0x7EB083)
yspd2 = memory.readwordsigned(0x7EB087)
weapon = memory.readbyte(0x7EB040)
bullets = memory.readbyte(0x7EB033)
weapon2 = memory.readbyte(0x7EB0A5)
bullets2 = memory.readbyte(0x7EB098)
HP = memory.readbyte(0x7EB03F)
HP2 = memory.readbyte(0x7EB0A4)
camx = memory.readword(0x7E006A)
camy = memory.readword(0x7E006C)
gui.text(209,47,"XSpd: "..xspd)
gui.text(209,57,"YSpd: "..yspd)
gui.text(138,47,"XPos: "..xpos)
gui.text(138,57,"YPos: "..ypos)
gui.text(183,47,": "..xsub)
gui.text(183,57,": "..ysub)
gui.text(134,37,"X2Pos: "..xpos2)
gui.text(183,37,": "..xsub2)
gui.text(48,2,""..HP)
gui.text(201,2,""..HP2)
local i
for i = 0, 40 do
enmyx = memory.readword(0x7EB146+i*0x65)
enmyy = memory.readword(0x7EB14A+i*0x65)-10
enmyHP = memory.readbytesigned(0x7EB161+i*0x65)-1
HPx = enmyx - camx
HPy = enmyy - camy
if enmyHP > 0 then
gui.text(HPx,HPy,""..enmyHP)
end
end
if weapon == 0 then
gui.text(43,24,"/ 3")
gui.text(34,24,""..bullets)
if bullets == 3 then
gui.text(57,24,"X","red")
end
end
if weapon == 1 then
gui.text(43,24,"/ 5")
gui.text(34,24,""..bullets)
if bullets == 5 then
gui.text(57,24,"X","red")
end
end
if weapon == 2 then
gui.text(43,24,"/ 3")
gui.text(34,24,""..bullets)
if bullets == 3 then
gui.text(57,24,"X","red")
end
end
if weapon == 3 then
gui.text(43,24,"/ 3")
gui.text(34,24,""..bullets)
if bullets == 3 then
gui.text(57,24,"X","red")
end
end
if weapon == 4 then
gui.text(43,24,"/ 5")
gui.text(34,24,""..bullets)
if bullets == 5 then
gui.text(57,24,"X","red")
end
end
if weapon == 5 then
gui.text(43,24,"/ 1")
gui.text(34,24,""..bullets)
if bullets == 1 then
gui.text(57,24,"X","red")
end
end
if weapon2 == 8 then
gui.text(211,24,"/ 3")
gui.text(202,24,""..bullets2)
if bullets2 == 3 then
gui.text(225,24,"X","red")
end
end
if weapon2 == 9 then
gui.text(211,24,"/ 5")
gui.text(202,24,""..bullets2)
if bullets2 == 5 then
gui.text(225,24,"X","red")
end
end
if weapon2 == 10 then
gui.text(211,24,"/ 3")
gui.text(202,24,""..bullets2)
if bullets2 == 3 then
gui.text(225,24,"X","red")
end
end
if weapon2 == 11 then
gui.text(211,24,"/ 3")
gui.text(202,24,""..bullets2)
if bullets2 == 3 then
gui.text(225,24,"X","red")
end
end
if weapon2 == 12 then
gui.text(211,24,"/ 5")
gui.text(202,24,""..bullets2)
if bullets2 == 5 then
gui.text(225,24,"X","red")
end
end
if weapon2 == 13 then
gui.text(211,24,"/ 1")
gui.text(202,24,""..bullets2)
if bullets2 == 1 then
gui.text(225,24,"X","red")
end
end
snes9x.frameadvance()
end