Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
I've looked at that boss battle for a bit. Nope, doesn't seem like I can save any more frames, at least, not with how I see things. So far, just studying the RNG after the battle. The run I posted has rolled the RNG 3229 times. I've made a new attempt which rolls the RNG as much as I could in the boss battle, and ended with 3401 rolls. Wonder how Team Totally Awesome Syzygy managed 3461 rolls. Huh. Anyway, the two nearest grenade drops (from an enemy without any RNG trickery) around these rolls happen to be 3217 rolls and 3516 rolls. Unfortunately, 3217 is too early a drop for me to get the grenades from the next agent I kill. Besides that, the run I posted here already went past that many rolls, so even if I look for ways to reduce the RNG rolls, I still likely won't be able to reach an agent before I fly past the target rolls. More bad news, 3516 is still over a hundred rolls away even with my best attempt to roll that RNG like crazy. Getting grenades as a drop from an agent doesn't look easy. The RNG trickery would involve a charged shot or a grenade. The time spent charging said shot is time spent not rolling but walking, and grenades take too long to hit the ground. I'll likely scrap the idea of getting a grenade drop from an agent and just get it from the building. But I do see a nice spread shot drop I can try to get instead! At 3315 rolls and 3366 rolls. Certainly well within reach, and building drops tend to be far easier to manipulate as they always drop their item. So, grenades from building, spread from enemy agent. I can tell this stuff because of a script I made during the DTC3. In case everyone already forgot such a script existed. It's difficult to explain how the RNG trickery works, though. I'll be trying the Totally Awesome Syzygy route through 1-2, meaning that I'll be punching through the shields rather than jumping over. Certainly gave the impression that it beat Team 5's attempt, but I'll be double-checking of course.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
I'm still on it, but slow as ever. I'm still puzzling over how I can beat this frame rule... The .vbm in question. When I first reached the scene where I must slay the random agents to proceed, the spawn timer (Address 0300031A) read 12. So I decide to try to save a bunch of frames, hopefully at least 18, in order to beat the frame rule. So I did, but I ended up starting the spawn timer 6 frame earlier. After the movie ends, straight rolls into the next scene will have the camera lock with the spawn timer at 25. I need it to be 30. Right now I haven't a clue where I can save another 5 frames. Which leaves me thinking over how I can possibly make the spawn timer read 0 by the time I complete the first scene (where I destroy the first metal wall), even if it means sacrificing 10 or so frames before triggering the spawn timer. After all, if I beat the 31-frame rule, then that's 26 frames I'm not losing to it. If I mess around for 25 frames just to have the right timer value, I still win out by a frame. It's kind of frustrating, though. I'm losing 26 frames because I can't find where I can save another 5. I'm going to cool my thoughts for a bit and later try to mess with that timer again. Although I may have to accept the frame rule due to spawn timer.
Post subject: I beat the frame rule! I rule!
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
Yep, there was indeed something I missed. The Tank #2 scene was suboptimal... By 5 frames! As such, I made it within that frame rule! Take note as the kills left to unlock scene, at address 03000328, begins at 5 instead of 6! That is due to a frame-perfect kill and a manipulated death animation (the fact a grenade pack pops out is simply a byproduct of said manipulation). And an enemy agent also spawns, proving I was under the agent limit at the right moment. Frame perfection at last! Well, I'm happy with this result. Anyone who says I can save a single frame at this point clearly wants to drive me insane. Current frame savings for 1-2: 115 frames off of T5's run, and 71 frames off of T1's run. I project around another 80 frames from this scene alone thanks to how I handled the frame rule so perfectly... If I can time the kills in this scene right.
Experienced Forum User, Moderator
Joined: 8/4/2005
Posts: 5745
Location: Moscow, Russia
Wow, congrats! You're really giving this run your all. :)
Warp wrote:
Edit: I think I understand now: It's my avatar, isn't it? It makes me look angry.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
Don't you think frame 11995 would make for a neat picture? I sure think so. Up until the boss, I've shaved off 300 frames off T5's run and 131 frames off the more optimal T1's run. Adding 1-1 savings to that, it's a total of 313 frames off T5's run and 381 off T1. I do not wish to count the fact T1 didn't eat the boss. That's 3318 frames from the boss alone, by the way. I did try a slightly different path involving fire/ice shots. Didn't work out so well against the upcoming tanks compared to spread. Bah, the CloudStacking trick, as I call it, isn't advantageous here. I still have some things to check, though. I really hate that tank shot, in case you're curious. I may have to mess with the RNG a little for the next stage. T1 and T5 have 5929 and 5929 RNG rolls at this time, coincidentally enough. This run has 5286 RNG rolls, hundreds fewer than the noted runs, and I'm not sure how that's going to turn out.
Experienced Forum User, Skilled player (1223)
Joined: 9/7/2007
Posts: 1354
Location: U.S.
Sega TASer of 2021Sega TAS of 2021Sega TASer of 2011Sega TAS of 2011
Ultra nice work so far FatRat. It will definitely be GBx TAS of the Year when it is finished.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
Found another three frames. Or maybe I removed them. Or perhaps saved them. Or... Gah, silly words. In any case, I just had to jump on that building. I thought something was fishy about it. And indeed, after messing with the RNG some more, an agent would conveniently drop a spread for me, and I reached the Tank4&5 scene a few frames earlier. I think it looks a touch more stylish, in any case. Now to look at 1-3 and see what sort of RNG I'll need to begin well.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
No real progress. Just dumping this script on to you for your viewing pleasure. There are two glitches with this script, but they are not of high priority to fix. Besides, said glitches are pretty out of the way for me anyway. EDIT: Some extra stuff to the script. Some of the additions are hacked in, but the current need is to identify helicopter stuff in 1-4. Download AHscan.lua
Language: lua

--Constants we might want to change: local MAX_RNGLIST= 20 --How many RNGs to show? --0x8AA7C5B0 6000 RNG rolls --0x3FB02DC9 6499 RNG rolls --Acmlm's piece of work identifying some things, with some changes from me. local types={ [ 0]={"Particle" }, [ 1]={"Player" ,color= 0x00FF00FF}, [ 2]={"1-1 boss 2's eye" }, [ 5]={"Back shots" }, [ 6]={"Monster" }, [ 7]={"Enemy" }, [ 8]={"Fire gunner 1" ,HP= 0xEE}, [ 9]={"Ice gunner 1" ,HP= 0xEE}, [ 10]={"Fire gunner 2" ,HP= 0xEE}, [ 11]={"Ice gunner 2" ,HP= 0xEE}, [ 14]={"Heli rider" }, [ 15]={"Tank rider" }, [ 16]={"Heli holding part",HP= 0xF0}, [ 17]={"Tower enemy" }, [ 18]={"KGB rider" }, [ 19]={"Jetpack guy" }, [ 20]={"Helicopter 1" ,HP= 0xEC}, [ 21]={"Helicopter 2" ,HP= 0xF0}, [ 22]={"KGB" }, [ 23]={"Metal wall" ,HP= 0xEA}, [ 24]={"Brick wall" }, [ 25]={"Bag wall" }, [ 26]={"Big missile" }, [ 27]={"Car" }, [ 28]={"3-2 boss" }, [ 29]={"Monster chain 1" }, [ 30]={"Monster chain 2" }, [ 31]={"Grenade thrower 1",HP= 0xEA}, [ 32]={"Grenade thrower 2"}, [ 33]={"Tank 1" ,HP= 0xEE}, [ 34]={"Tank 2" ,HP= 0xEE}, [ 41]={"Fly" }, [ 45]={"Crusher" }, [ 46]={"Runner" }, [ 47]={"1-1 boss 1" }, [ 48]={"1-1 boss 2" }, [ 53]={"Normal shot" ,color= -0x0000FF01}, [ 54]={"Bio shot" ,color= -0x0000FF01}, [ 55]={"Fire shot" ,color= -0x0000FF01}, [ 56]={"Ice shot" ,color= -0x0000FF01}, [ 57]={"Laser shot" ,color= -0x0000FF01}, [ 58]={"Ball shot" ,color= -0x0000FF01}, [ 59]={"3-shot" ,color= -0x0000FF01}, [ 60]={"Spread shot" ,color= -0x0000FF01}, [ 61]={"Charged shot" ,HP= 0xEC,color= -0x0000FF01}, [ 62]={"Fire splash" ,color= -0x0000FF01}, [ 63]={"Ice splash" ,color= -0x0000FF01}, [ 64]={"Grenade 1" ,color= -0x0000FF01}, [ 65]={"Grenade 2" ,color= -0x0000FF01}, [ 66]={"Grenade 3" ,color= -0x0000FF01}, [ 67]={"Grenade 4" ,color= -0x0000FF01}, [ 68]={"Grenade 5" ,color= -0x0000FF01}, [ 69]={"Grenade 6" ,color= -0x0000FF01}, [ 70]={"Grenade 7" ,color= -0x0000FF01}, [ 71]={"Grenade 8" ,color= -0x0000FF01}, [ 74]={"Monster grab" }, [ 75]={"Enemy bullet" }, [ 76]={"Enemy grab 1" }, [ 77]={"Enemy grab 2" }, [ 78]={"Thrown enemy" }, [ 79]={"Fire ball" }, [ 80]={"Ice ball" }, [ 81]={"Cannon ball" }, [ 82]={"Bullet" }, [ 83]={"Beam 1" }, [ 84]={"Beam 2" }, [ 85]={"Ground shake" }, [ 88]={"Missile" }, [ 89]={"Barrel bomb" }, [ 90]={"Mine" }, [ 91]={"Toxic barrel" }, [ 92]={"Building 1" ,HP= 0xEC}, [ 93]={"Building 2" ,HP= 0xEC}, [ 94]={"Building 3" ,HP= 0xEC}, [ 95]={"Building 4" ,HP= 0xEC}, [ 96]={"Building 5" ,HP= 0xEC}, [ 97]={"Building 6" ,HP= 0xEC}, [ 98]={"Building 7" ,HP= 0xEC}, [ 99]={"Building 8" ,HP= 0xEC}, [100]={"Building 9" ,HP= 0xEC}, [102]={"Building 11" ,HP= 0xEC}, [103]={"Building 12" ,HP= 0xEC}, [104]={"Building 13" ,HP= 0xEC}, [105]={"Building 14" ,HP= 0xEC}, [106]={"Building 15" ,HP= 0xEC}, [108]={"Vehicle 1" ,HP= 0xEC}, [109]={"Vehicle 2" }, [110]={"Bus 1" }, [111]={"Bus 2" ,HP= 0xEC}, [112]={"Bus 3" }, [122]={"Weapon gift" ,color= 0x00FFFFFF}, [123]={"Weapon drop" ,color= 0x00FFFFFF}, [132]={"Flower" ,color= 0x00FFFFFF}, [133]={"30 grenades" ,color= 0x00FFFFFF}, [134]={"Weapon giver 1" ,color= 0x00FFFF80}, [135]={"Weapon giver 2" ,color= 0x00FFFF80}, [157]={"Bullet shooter" }, [159]={"Tornado" }, [160]={"Scorpion" }, [161]={"Vulture" }, [162]={"Robot bomb" }, [163]={"Vulture feather" }, [164]={"Robot" }, [168]={"Sludge hand" }, [170]={"Falling sludge" }, [173]={"Big sludge" }, [176]={"Water splasher" }, [177]={"Pudding sign" }, [180]={"1-2 boss?" }, [181]={"2-3 boss" }, [185]={"2-3 boss missile" }, [186]={"2-1 boss part 1" }, [187]={"2-1 boss part 2" }, [188]={"2-1 boss part 3" }, [189]={"2-1 boss part 4" }, [195]={"2-2 boss" }, [199]={"2-2 boss small" }, [203]={"2-2 boss tiny" }, [205]={"3-1 boss head" }, [206]={"3-1 boss claws" }, [207]={"3-1 boss body" }, [208]={"3-1 boss tail" }, [214]={"Final boss" }, [219]={"Large shot" }, [222]={"Alien piece" }, [223]={"Large grenade" }, [224]={"Large red grenade"} } --Second, a few sanities I want to make: local R4s= memory.readdwordsigned --Read 4 bytes, signed local R4u= memory.readdword --Read 4 bytes, unsigned local R2u= memory.readword --Read 2 bytes, unsigned local green= 0x00FF00FF local green2= 0x00A000FF local cyan= 0x00FFFFFF local white= -0x00000001 local violet=-0x00FF0001 local red= -0x00DFFF01 local orange=-0x005FFF01 local fade= -0x00000080 local shade= 0x000000D0 local PXpos,PYpos,PXspd,PYspd= 0,0,0,0 local CamX = 0 local CamY = 0 local function NULLfn() end --***************************************************************************** local function RefreshStats() --***************************************************************************** spacemode= R2u(0x030016DB) if spacemode == 0 then cooldown = R2u(0x03000476) + R2u(0x03000478)*8 ammo = R2u(0x03000472) grenades = R2u(0x03000474) .. ":" .. R2u(0x03000310) CamX = R4s(0x03000170) CamY = R4s(0x03000370) -- CamY = 0x58000 if R2u(0x03000470) == 7 then ammo= ammo/6 end else cooldown = R2u(0x030016CC) ammo = R2u(0x030016B4) grenades = R2u(0x030016C8) CamX = R4s(0x03000248) CamY = R4s(0x0300024C) end charge = R2u(0x0300047E) scoreL = R4s(0x03000484) scoreT = R4s(0x03000134) tokill = R2u(0x03000328) bosshp = R2u(0x030003F6) end --############################################################################# --############################################################################# --Object detection Module local LinkSel= 3 local BaseLink= { {0x03000500, "Objects"}, --All ingame objects that need tracking is here. {0x0300050C, "Vehicle"}, --Naturally, these drive around. {0x03000518, "Hit me!"}, --Hitboxes. The kinds that are actually used! {0x03000524, "Shots" }, --Projectiles of all sorts. {0x03000530, "Enemy" }, --Apparently the low-class enemies. {0x0300053C, "Alt?" } --Alternate of "Objects". } --My favorite base is one marked as "Hit me!". --***************************************************************************** local function NextLink(ptr) --***************************************************************************** --Returns two values: An object pointer (possibly nil) and a link pointer. local PTR= R4s(ptr) local OBJ= R4s(PTR+8) if OBJ == 0 then OBJ= nil end return OBJ, PTR end local H= {} --***************************************************************************** local function PutHitbox(obj,index) --***************************************************************************** local Xpos,Ypos= R4s(obj+0x80),R4s(obj+0x84) local X_hitbox= R4s(obj+0x70) local Y_hitbox= R4s(obj+0x74) local Y_offset= R4s(obj+0x6C) local Left= Xpos - X_hitbox local Right= Xpos + X_hitbox local Up= Ypos - Y_hitbox/2 + Y_offset local Down= Ypos + Y_hitbox/2 + Y_offset local tbl= H[index] or {} tbl.obj= obj tbl.L= (Left -CamX)/1024 --By pixel, in relation to camera tbl.R= (Right-CamX)/1024 tbl.U= (Up -CamY)/1024 tbl.D= (Down -CamY)/1024 local T= types[R4s(R4s(obj+0x68))] if T then tbl.color= T.color or -0x00FFFF01 if T.HP then tbl.HP= R2u(obj+T.HP) else tbl.HP= nil end else tbl.color= 0x0080FFFF end H[index]= tbl end local PlPosX, PlPosY, HiPosX, HiPoxY, DistanceEst --***************************************************************************** local function WalkList() --***************************************************************************** local obj, ptr= NextLink(BaseLink[LinkSel][1]) local count= 0 PlPosX, PlPosY, HiPosX, HiPoxY= nil, nil, nil, nil while obj do count= count+1 if count > 200 then error("FRK goofed, shutting down") end --Panic. PutHitbox(obj,count) --H[count].HP= R4s(R4s(obj+0x68)) if R4s(R4s(obj+0x68)) == 1 then PlPosX,PlPosY= R4s(obj+0x80),R4s(obj+0x84) elseif R4s(R4s(obj+0x68)) == 16 then HiPosX,HiPosY= R4s(obj+0x80),R4s(obj+0x84) end obj, ptr= NextLink(ptr) end H[count+1]= nil if PlPosX and HiPosX then local Xdelta, Ydelta= PlPosX-HiPosX , PlPosY-HiPosY DistanceEst= (Xdelta^2 + Ydelta^2)^(0.5) else DistanceEst= nil end end --############################################################################# --############################################################################# --RNG Module local RNGaddr= 0x030019E0 local BigNum= 0xFFFFFFFF +1 --Using 0x100000000 directly fails somehow. --***************************************************************************** local function Roll(v) return ((v*0x0019660D)+0x3C6EF35F) % BigNum end -- function Unroll(v) return ((v*0xFEE058C5)+0x25D60FE5) % BigNum end --***************************************************************************** --***************************************************************************** local function Unroll(v) --***************************************************************************** --Inverse of Roll; Goes backwards through the RNG. --This expanded function is needed for the fact double-precision float fails. local LowWord= v % 0x10000 --Splitting the value into two. local HighWord= v - LowWord --Double-precision float not good enough! HighWord= (HighWord*0x011FA73B) % BigNum --Using the negative. Fewer LowWord= (LowWord *0x011FA73B) % BigNum --bits, but not enough... return ( 0x25D60FE5 - (HighWord + LowWord) ) % BigNum end local CurrentRNG= 0x00020080 local RNGcount= 0 local RNGpanic= false --***************************************************************************** local function CountRolls(RN) --***************************************************************************** if RN == CurrentRNG then return 0 end local Next,Prev= CurrentRNG, CurrentRNG for i= 1, 2000 do --Create a MAX_COUNTRNG variable? Next= Roll(Next) if Next == RN then return i end Prev= Unroll(Prev) if Prev == RN then return -i end end return false -- Uh, I'm not searching anymore, this is where you panic. end --***************************************************************************** local function CountRollsFromScratch() --***************************************************************************** local R= 0x00020080 local T= R4u(RNGaddr) for i= 0, 200000 do if R == T then RNGcount= i; return end R= Roll(R) end RNGcount= -99 end --***************************************************************************** local function FindType(RN) --***************************************************************************** --Takes in RNG state. --Returns new RNG state, and rolls to find type local rolls= 0 repeat rolls= rolls+1 RN= Roll(RN) until bit.band(RN,0x00070000) == 0x00070000 -- Known constant, but... return RN, rolls end --***************************************************************************** local function FindDrop(RN) --***************************************************************************** --Takes in RNG state. --Returns new RNG state, rolls to reach RNG state, and rolls to determine type. local rolls= 0 repeat rolls= rolls+1 RN= Roll(RN) until bit.band(RN,0x000F0000) == 0x00000000 -- Uh, might change... local junk, type= FindType(RN) return RN, rolls, type end local RList= {} local TList= {} TList[0]= 0 --***************************************************************************** local function RefreshRNGList(RN) --***************************************************************************** local rollR, rollT= 0, 0 local R2= RN for i= 1, MAX_RNGLIST do local roll, type RN, roll, type= FindDrop(RN) rollR= rollR + roll local tbl= RList[i] or {} tbl.roll= rollR tbl.type= type RList[i]= tbl R2, type= FindType(R2) rollT= rollT + type TList[i]= rollT end RList.RNG= RN TList.RNG= R2 end --***************************************************************************** local function AdvanceRNGList(rolls) --***************************************************************************** local len= MAX_RNGLIST if (RList[len].roll < rolls) then RefreshRNGList(CurrentRNG); return end local i= 1 while RList[i] do RList[i].roll= RList[i].roll-rolls if RList[i].roll <= 0 then table.insert(RList,table.remove(RList,i)) local R, rl, ty= FindDrop(RList.RNG) RList[len].roll= RList[len-1].roll+rl RList[len].type= ty RList.RNG= R else i= i+1 end end i= 1 while TList[i] do TList[i]= TList[i]-rolls if TList[i] <= 0 then table.remove(TList,i) local R, rl= FindType(TList.RNG) TList[len]= TList[len-1] + rl TList.RNG= R else i= i+1 end end end --***************************************************************************** local function HandleRNG() --***************************************************************************** local NewRNG= R4u(RNGaddr) local rolls= CountRolls(NewRNG) CurrentRNG= NewRNG if not rolls then RNGcount= 0 --Panic. Use some substitute. RefreshRNGList(NewRNG) --Full refresh. Can't even guess where we are. else RNGcount= RNGcount + rolls if rolls < 0 then RefreshRNGList(NewRNG) elseif rolls > 0 then AdvanceRNGList(rolls) end end end --Immediate code to execute. CountRollsFromScratch() CurrentRNG= memory.readdword(RNGaddr) RefreshRNGList(CurrentRNG) --0x8AA7C5B0 6000 RNG rolls --0x3FB02DC9 6499 RNG rolls --0x01E196B8 7000 RNG rolls --***************************************************************************** local function CheatModifyRNG(v) --***************************************************************************** local r= 0x01E196B8 for i= 1, v do r= Roll(r) end CurrentRNG= r if r >= 0x80000000 then r= r-BigNum end memory.writedword(RNGaddr,r) RNGcount= 7000+v end --############################################################################# --############################################################################# --Display Module --***************************************************************************** local function GuiTextRight(x,y,str,c1,c2) --***************************************************************************** str= tostring(str) x= x - (#str)*4 gui.text(x,y,str,c1,c2) end --***************************************************************************** local function HexStr(v) --***************************************************************************** local str= "" if v < 0 then str= "-" v= -v end return str .. string.upper(string.format("%x",v)) end --local zzxx= 0x00020080 --for i= 1, 7200 do -- zzxx= Roll(zzxx) --end --for i= 7201, 7226 do -- zzxx= Roll(zzxx) -- print(i .. " - " .. HexStr(zzxx) ) --end --***************************************************************************** local function HexVal(a) return HexStr(R4s(a)) end --***************************************************************************** local ObjTrace= nil --***************************************************************************** local function WatchObj() --***************************************************************************** if not ObjTrace then return end GuiTextRight(190, 0,HexStr(ObjTrace), green) GuiTextRight(190, 8,HexVal(ObjTrace+0x90)) GuiTextRight(190, 16,HexVal(ObjTrace+0x94)) GuiTextRight(190, 24,HexVal(ObjTrace+0x98)) GuiTextRight(190, 32,HexVal(ObjTrace+0x9C)) GuiTextRight(190, 40,HexVal(R4s(ObjTrace+0x68)),cyan) end local XSCR, YSCR= 240, 160 local offX, offY= 0, 0 local Sc= 1 --***************************************************************************** local function PaintHitboxes(scale) --***************************************************************************** if scale > 1 then gui.box(offX,offY,offX+XSCR/scale,offY+YSCR/scale,0,fade) end local i= 1 while H[i] do local x1= math.floor(H[i].L/scale)+offX local x2= math.floor(H[i].R/scale)+offX local y1= math.floor(H[i].U/scale)+offY local y2= math.floor(H[i].D/scale)+offY gui.box(x1,y1,x2,y2,0,H[i].color) if H[i].HP then gui.text(x1,y2+1,H[i].HP) end i=i+1 end end local TypeClr= { [0]= green, --Grenade pack green2,--Green cloud gun orange,--Flame cyan, --Ice fade, --Bleh fade, --Also Bleh violet,--Humn red, --Yay } --***************************************************************************** local function RNGHUD() --***************************************************************************** for i= 1, MAX_RNGLIST do local clr= TypeClr[RList[i].type%8] GuiTextRight(240,7*(i-1), string.format("%d:%2d",RList[i].roll,RList[i].type),clr,shade) clr= fade; if TList[i] >= TList[i-1]+8 then clr= white end GuiTextRight(210,7*(i-1), TList[i],clr,shade) end end local CrgLvl= {51,72,98,128,162,200 ,200} --***************************************************************************** local function BasicHUD() --***************************************************************************** -- gui.text(1,1,spacemode) WatchObj() if cooldown == 0 then gui.text(0,1,"Ready",green) else GuiTextRight(20,1,cooldown) end GuiTextRight( 20, 9,ammo) GuiTextRight( 20,17,grenades) GuiTextRight(240,152,HexStr(CamX)) -- GuiTextRight(180,152,HexStr(CamY)) --Later, I'll separate them out... local a= R2u(0x03000332) --Camera lock flag if bit.band(a,1) == 1 then gui.text(120,152,"LOCK",red) a= R2u(0x03000328) -- Kills left if a ~= 0 then gui.text(140,152,a,green) end end if charge ~= 0 then GuiTextRight(21,30,charge) local b= 7 for i= 1, 6 do if charge < CrgLvl[i] then b= i; break end end gui.text(21,30,string.format("/%3d",CrgLvl[b])) if b == 1 then GuiTextRight(21,38,"Wait",red) else GuiTextRight(21,38,b+3,green) end end a= R2u(0x0300031A) -- Enemy spawn timer if a == 30 then gui.text(120,144,"SPAWN",red) else gui.text(120,144,"Spawn") end a= string.format("Timer: %2d",a) gui.text(144,144,a) GuiTextRight(240,142,RNGcount,green) if bosshp ~= 0 then GuiTextRight(152,6,bosshp,fade,shade) end end --############################################################################# --############################################################################# --User Control Module local keys, lastkeys= input.get(), input.get() --So we have some default state --***************************************************************************** local function UpdateKeys() lastkeys= keys; keys= input.get() end local function Press(k) return keys[k] and not lastkeys[k] end --***************************************************************************** --***************************************************************************** local function Rescale(adj) --***************************************************************************** -- Affects the Display Module; Hitbox scaling for off-screen viewing. Sc= math.max(Sc+adj,1) offX= XSCR*(1 - 1/Sc) / 2 offY= YSCR*(1 - 1/Sc) / 2 end --***************************************************************************** local function Trace() --***************************************************************************** local i= 1 local mX, mY= keys.xmouse, keys.ymouse while H[i] do if (mX >= H[i].L) and (mX <= H[i].R) and (mY >= H[i].U) and (mY <= H[i].D) then ObjTrace= H[i].obj return end i= i+1 end end local Obox= 1 local OHUD= 1 local ShowBoxes= PaintHitboxes local ShowRNG= RNGHUD --***************************************************************************** local function KeyScan() --***************************************************************************** UpdateKeys() if keys.numpad6 then LinkSel= (LinkSel%6)+1 end if keys.numpad7 then Rescale( .125) end if keys.numpad1 then Rescale(-.125) end if keys.numpad8 then Obox= math.min(Obox+.125 , 1); ShowBoxes= PaintHitboxes end if keys.numpad2 then Obox= math.max(Obox-.125 , 0); if Obox <= 0 then ShowBoxes= NULLfn end end if keys.numpad9 then OHUD= math.min(OHUD+.125 , 1); ShowRNG= RNGHUD end if keys.numpad3 then OHUD= math.max(OHUD-.125 , 0); if OHUD <= 0 then ShowRNG= NULLfn end end if keys.leftclick then Trace() end if keys.numpad5 then CountRollsFromScratch() end if keys.numpad0 then RNGcount= 0 end end --############################################################################# --############################################################################# -- Immediate local zZz= 0 --***************************************************************************** local function Fn() --***************************************************************************** local h= R2u(0x020087C6) if h < 300 then gui.text(1,132,movie.framecount()-299+h,cyan) end end local ScM,ScE,ScB,ScS= 0, 0, 0, 0 --***************************************************************************** local function ScoreCalc() --***************************************************************************** -- Because I'm feeling silly today --*0484 -- Primary score --*0488 -- ( 11 E_S) Kill count --*048C -- Usual kills --*0490 -- Grenade kills --*0494 -- ( 51 __S) Bites --*0498 -- ( 5 E_S) Knife kills --*049C -- ?? --*04A0 -- ?? --*04A4 -- ( 11 _BS) Damage to bosses, for boss score --*04A8 -- (100 __S) Buildings destroyed --*04AC -- ?? ScM= R4s(0x03000484) ScE= 11*R4s(0x03000488) + 5*R4s(0x03000498) ScB= 11*R4s(0x030004A4) ScS= 51*R4s(0x03000494) +100*R4s(0x030004A8) + ScE + ScB end --***************************************************************************** local function DispScore() --***************************************************************************** GuiTextRight( 60, 1,ScM,cyan) GuiTextRight( 60, 9,ScE,red) GuiTextRight( 60, 17,ScB,violet) GuiTextRight( 60, 25,ScS,green) GuiTextRight( 60, 34,ScM+ScE+ScB+ScS) end --############################################################################# --############################################################################# --Main loop --***************************************************************************** local function GuiStuff() --***************************************************************************** gui.opacity(Obox); ShowBoxes(Sc) gui.opacity(OHUD); RNGHUD() gui.opacity(1); BasicHUD() -- Fn() -- DispScore() if DistanceEst then GuiTextRight( 60, 1,math.floor(DistanceEst/1024),fade) GuiTextRight( 60, 9,math.floor((PlPosX-HiPosX)/1024)) GuiTextRight( 60,17,math.floor((PlPosY-HiPosY)/1024)) GuiTextRight( 90, 9,PlPosX-HiPosX) GuiTextRight( 90,17,PlPosY-HiPosY) end end gui.register(GuiStuff) --***************************************************************************** local function FrameUpdates() --***************************************************************************** RefreshStats() -- ScoreCalc() KeyScan() WalkList() HandleRNG() -- if Press("Z") then CheatModifyRNG(zZz); zZz= zZz+1 end end emu.registerafter(FrameUpdates) FrameUpdates()
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
Progress! But I am going insane with that last missed shot at frame 15820. Use my script, hold numpad7 for one frame, then run the movie to that frame. Note the hitboxes... The miracles that happened up to that point: - I kill an agent using a well-timed grenade. - Said grenaded agent got the right death animation to be counted in the 5-frame window of opportunity - Another agent managed to get hit by my charged shot before re-vanishing to the screen edge - The helpful kid spawned Weapon6, the purple auto-firing weapon with the shortest death animation - I managed to squeeze in one more shot while still rolling into scene 6 in time. I just need one more miracle, that is it. That "one more shot" needs to hit something. If that works out, I will likely hit the perfect theoretical limit for 1-3. There is no manipulating the agent elsewhere -- That agent WILL jump in from the left side. This is because the helpful kid forces the RNG to one of several specific values, thanks to how the silly RNG works. All changing the RNG (by no more than a few rolls) would do is change what the kid gives me, not where the agent spawns. So, anyone is free to try to beat what I've got. I don't know how I can change the circumstances a bit more at this point. I'm so close... So close.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
Don't bother looking for April Fools' pranks in here. Or maybe I'm just saying that so you'll specifically waste time looking for a prank where there is none, thus I am successful in a prank anyway! Anyway, turns out I needed to use the charged shot to hit the mail box a second time. Of all the power of a charged shot, ready to kill, it's spent on watching it vanish into the infinite depths of the mail box. Trust me, the fact it shakes is manipulating luck. I couldn't use a regular shot because I would be propelled upward by shooting down. Yet, a high-powered charged shot doesn't even have the kick of a gnat, let alone what the regular shots would do. Ah, the physics of this game. Where ultra-high powered shots have no recoil, whereas a pea-shooter is enough to significantly change your momentum.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
While it comes late, this movie file must surely have... A small fraction of 1-4. Eh, sorry about that. But I'm having some trouble handling the RNG to make the next helicopter appear in just the right place. That is, straight up, straight left, or straight right. Diagonals are certainly slower, as the helicopter travels diagonally away from the player, and if we can get it to appear straight in some direction, we can slow down the helicopter by moving back and forth around some axis, getting us to the heli sooner. If I did have perfect luck, the second helicopter might look like this. Only trouble is telling the RNG to behave. If anyone needs an updated script, I'll be sure to post or edit an update in. EDIT: Here, edited the current script. Anyone from the DTC3 willing to take a look? I now realize why I've been putting off this run for as long as I did, and trying to get the closest thing to a perfect run is proving rather tricky here. I'm having a difficult time judging how to tweak the RNG perfectly here.
Experienced Forum User
Joined: 2/15/2009
Posts: 329
FatRatKnight wrote:
While it comes late, this movie file must surely have... A small fraction of 1-4. Eh, sorry about that. But I'm having some trouble handling the RNG to make the next helicopter appear in just the right place. That is, straight up, straight left, or straight right. Diagonals are certainly slower, as the helicopter travels diagonally away from the player, and if we can get it to appear straight in some direction, we can slow down the helicopter by moving back and forth around some axis, getting us to the heli sooner. If I did have perfect luck, the second helicopter might look like this. Only trouble is telling the RNG to behave. If anyone needs an updated script, I'll be sure to post or edit an update in. EDIT: Here, edited the current script. Anyone from the DTC3 willing to take a look? I now realize why I've been putting off this run for as long as I did, and trying to get the closest thing to a perfect run is proving rather tricky here. I'm having a difficult time judging how to tweak the RNG perfectly here.
The quest for perfection has caused everyone to quit many runs... I say save it for v2 in a few years. I don't want you to completely quit TASing again.
Working on: Legend of Legaia, Vagrant Story
Experienced Forum User, Skilled player (1636)
Joined: 11/15/2004
Posts: 2200
Location: Killjoy
Arcade TASer of 2010PCE TASer of 2010Arcade TAS of 2010Lucky TAS of 2009Lucky TAS of 2007
FatRatKnight wrote:
While it comes late, this movie file must surely have... A small fraction of 1-4. Eh, sorry about that.
I'll try and post an encode once you finish level 1-4, if you are cool with that.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
exileut, part of the problem is that messing with the RNG for a decent result is particularly difficult, let alone perfect results. Awful results come easy, but those would be less optimal than the DTC3 runs, and possibly slower than the theoretical optimal case by a few seconds overall. On the other hand, I probably need to kick myself into finishing anything at this point. DarkKobold, I would gladly accept a public encode from you (or anyone else) when I finish this level. I would also gladly accept help from anyone on this stage, as my last post was a call for help, but if no one does come, I'll work out the stage anyway. Part of it is the fact I wish to work with someone, as a way to keep some sense of motivation. But another part is the fact others will have thoughts I don't have, a source of inspiration. Working in a team generally goes a long way, from my experience in the Dream Team Contest.
Experienced Forum User, Skilled player (1223)
Joined: 9/7/2007
Posts: 1354
Location: U.S.
Sega TASer of 2021Sega TAS of 2021Sega TASer of 2011Sega TAS of 2011
I could try & help but I dont remember much from working on it for the DTC3. Best of luck Fat Rat!
Experienced Forum User, Skilled player (1636)
Joined: 11/15/2004
Posts: 2200
Location: Killjoy
Arcade TASer of 2010PCE TASer of 2010Arcade TAS of 2010Lucky TAS of 2009Lucky TAS of 2007
FatRatKnight wrote:
I would also gladly accept help from anyone on this stage, as my last post was a call for help, but if no one does come, I'll work out the stage anyway.
I doubt anyone who joins will live up to the level of perfection you've set.
Sage advice from a friend of Jim: So put your tinfoil hat back in the closet, open your eyes to the truth, and realize that the government is in fact causing austismal cancer with it's 9/11 fluoride vaccinations of your water supply.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
DarkKobold wrote:
I doubt anyone who joins will live up to the level of perfection you've set.
While that is likely true, I'm not actually looking for someone who is equally or more capable as myself, or capable of meeting my visions of what is perfection. I don't expect having someone else help will be the magic antidote to this. I'm merely looking for someone who is willing to go through any frustrations with me in IRC. Even if the person isn't highly productive during this time, at least having someone interested in any progress constantly watching and prodding me (and attempting to ask relevant questions about the run itself, occasionally) would keep me better in track. Some effort in a TAS attempt would be rather appreciated, I'm hoping the person at least opens VBA and runs the movie. I've reached helicopter 2 and got its power-up at frame 19424. In the travel between first and second helicopters, I'm 4 frames ahead of the leading DTC3 run, at 390 frames between pick-ups, but the theoretical best I could come up with runs at 367 frames, a difference of 23 (although that 367 test is likely suboptimal, so the difference is even worse). This is a decent result, at least, and I'll likely continue with this result. Either as comparison while still optimizing 1-4 or as my final run. Trust me, I will not go back and fix it for v2 after I move on to 2-1, ever. I'll be at my computer for the next several hours, hopefully TASing something up, in case anyone watching wants to say hi in IRC.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
While it has only been a short time since my last post, I think it's important enough for a new post. I figured out how to affect the RNG in 1-4! I was looking in the wrong place for what is affecting the RNG. The flying agent has a simple method of flying towards (or away from) the player, no RNGs there. I look at the helicopter, and it has a simple method of flying away from the player, no RNGs here either. The player character has no way to roll the RNG here. Yet despite that, the RNG has been rolling like crazy. After ruling out the local agent, the helicopter, and myself, that leaves... Clouds. Yes, clouds. The white puffy things. Clouds. The thing that hid from my script's default state. Clouds. The thing which I can't blast away. Freaking clouds. As long as there exists 4 clouds, somewhere, the RNG will not roll. If there are 3 or less, the game will roll the RNG once per frame. It will keep rolling until it spawns enough clouds to fill the maximum of 4. Clouds vanish when they are far enough offscreen. I'm never going to trust another cloud, ever again... But at least I know how to control the RNG once more. We'll see what I can do now!
Experienced Forum User, Moderator
Joined: 8/4/2005
Posts: 5745
Location: Moscow, Russia
Fight, FRK! For everlasting peace!
Warp wrote:
Edit: I think I understand now: It's my avatar, isn't it? It makes me look angry.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
1-4 .vbm It is done. And I attack a vicious cloud at the end. They're vicious, I tell you! I wish to put this stage behind me at last. I'll get back into rolling through the stages ahead, we'll see what's ahead. ... As for the RNG... I may have to deal with whatever I got. I don't see any easy manipulations I can do from the 1-4 side at the boss.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
Here's my current progress into 2-1. Over halfway through so far. A "just in case" online backup copy, mainly. But I figure the audience should know what I'm doing. I made a change to the end of 1-4 to have the proper RNG. The boss battle is somewhat less entertaining for what amounts to roughly 1.5 seconds of savings in the next stage. However, I still attack a cloud at the end. I know of a Cloud who has destroyed a powerful figure...
Experienced Forum User, Skilled player (1223)
Joined: 9/7/2007
Posts: 1354
Location: U.S.
Sega TASer of 2021Sega TAS of 2021Sega TASer of 2011Sega TAS of 2011
Any news FattyRat?
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
I haven't made much progress. I stopped here shortly after my last update. Then I lost interest again and went on to other things. Such as writing a new FAQ on a different game. But it helps to have reminders. I'll try to push myself back into this game. What I was stuck on is that, while I did beat the DTC3 runs significantly (370 frames ahead of leading [T1] DTC3 run), I was stopped at a wall when I couldn't find a frame-perfect way to collect a more optimal weapon. While that purple shot does have short death animations, it lacks the power of spread or even fire/ice weapons. I had gone back to scene 7, the helicopter scene starting around frame 23452. I was gunning for a different RNG and hoping for another grenade pack by blowing up a building I ignored previously. I haven't continued since. Strictly speaking, the run I posted is the backup in case this new route I want to try fails horribly. Now that I talked about it, the fact this run exists is fresh in my mind. I will see to any progress I can make.
Experienced Forum User, Skilled player (1223)
Joined: 9/7/2007
Posts: 1354
Location: U.S.
Sega TASer of 2021Sega TAS of 2021Sega TASer of 2011Sega TAS of 2011
Its good to hear that you still have your mind on this run. Im eagerly waiting it to be finished & submitted.
Post subject: Don't mind me, just updating my subtitles script.
Editor, Experienced Forum User, Skilled player (1164)
Joined: 9/27/2008
Posts: 1072
Finally, got back into things. 464 frames faster than the leading DTC3 run! Will add entertainment to the wait after the boss when I finish my own victory dance at this progress. I'm a bit slow at the wall, 13 frames slow, but I got the desired spread shots in time for the wall and boss. The boss is slain 6 frames faster than T5. Which halfway makes up for slowness at the wall. Incidentally, every last shot and grenade count. Every last one. When the boss is slain, I was down to 0 spreads and 0 grenades. In fact, when I ran out of ammo, the boss was at 1 HP, to which I destroyed with the basic shot. Thanks to the fact I switch guns, the cooldown is refreshed and I can fire that last shot in 2 frames instead of 8. Maybe this time I can keep momentum long enough to clear the game... EDIT: I'll even throw in a pile of subtitles! Still working my charisma, but 1-1 is now all wordy. Please include this script in the same directory. Let me know if anything breaks horribly. Download AHSubs.lua
Language: lua

dofile("SubtitleDisplayer.lua") local RGf,RGb= 0x7F7F0060, 0x7F7F00C0 local RBf,RBb= 0x7F007F60, 0x7F007FC0 local GBf,GBb= 0x007F7F60, 0x007F7FC0 A( 2, 400, 4, 4 , RGf,RGb, "Any comparisons to the Dream Team Contest 3 runs", "will be in reference to T1, T2, T4, and T5.", "1st: T5 ((nameless))", "2nd: T1 'Totally Awesome Syzygy'", "3rd: T2 'Tortoise'", "4th: T4 'Tastards' (did not finish)") A( 30, 1530, 100, 130 , RGf,RGb, " Using (E) ROM.","Reason: No (U) ROM exists") A( 240, 480, 8, 58 , RBf,RBb, "There were two other teams (T3, T6),", "but they never submitted.") A( 500, 1100, 4, 4 , RBf,RBb, "First, set the difficulty to hard. As a TAS, it's", "usually best to show our mastery over the game.") A( 626, 1530, 80, 150 , RGf,RGb, "Difficulty: HARD") A( 710, 1160, 8, 24 , RGf,RGb, "Difficulty affects whether you have a shield,", "how many lives you have, how many continues,", "and grenades per life.") A( 910, 1160, 8, 52 , RBf,RBb, "Mostly, the grenades is what affects me in a TAS.", "I didn't check if difficulty has other effects.") A( 1220, 1530, 4, 4 , RGf,RGb, "This run aims for fastest time.") -- Stage 1-1. a( 1538,100 , 4,150 , RGf,RGb, "CHECK: at 1538 T5+ 1 T1+ 4 T2 0 T4 0") a( 2674,100 , 4,150 , RGf,RGb, "1-1: 1 at 2674 T5 0 T1 0 T2+ 22 T4+ 27") a( 2884,100 , 4,150 , RGf,RGb, "1-1: 2 at 2884 T5 0 T1+ 4 T2+ 62 T4+107") a( 3039,100 , 4,150 , RGf,RGb, "1-1: 3 at 3039 T5 0 T1+ 27 T2+ 91 T4+ 53") a( 3245,100 , 4,150 , RGf,RGb, "1-1: 4 at 3245 T5+ 2 T1+ 2 T2+ 17 T4+ 62") a( 3653,100 , 4,150 , RGf,RGb, "1-1: 5 at 3653 T5- 2 T1+ 16 T2- 4 T4+207") a( 3814,100 , 4,150 , RGf,RGb, "1-1: 6 at 3814 T5+ 1 T1+ 46 T2+168 T4+ 87") a( 4844,100 , 4,150 , RGf,RGb, "1-1: 7 at 4844 T5 0 T1+ 62 T2+129 T4+128") a( 5302,100 , 4,150 , RGf,RGb, "1-1: 8 at 5302 T5 0 T1+ 15 T2+ 35 T4+ 14") a( 5526,100 , 4,150 , RGf,RGb, "1-1: 9 at 5526 T5 0 T1- 15 T2+151 T4+ 46") a( 5705,100 , 4,150 , RGf,RGb, "1-1:10 at 5705 T5 0 T1+ 70 T2+ 69 T4+ 96") a( 6463,100 , 4,150 , RGf,RGb, "1-1:11 at 6463 T5+ 11 T1+ 19 T2+ 46 T4+339") a( 7180,100 , 4,150 , RGf,RGb, "1-1 at 7180 T5+ 13 T1+250 T2+786 T4+1166") S(3200, 3302, 210, 4 , "HP:150") -- Boss1 R2S(3303, 3560, 210, 4 , "HP:%3d",0x030003F6) S(6100, 6184, 210, 4 , "HP:170") -- Boss2 R2S(6185, 6600, 210, 4 , "HP:%3d",0x030003F6) A( 1600, 1800, 4, 4 , RBf,RBb, "In the DTC3, I made a nice RNG and hitboxes script.","It sees a lot of use.") A( 1930, 2200, 4, 4 , GBf,GBb, "Huh. Bad drivers get their vehicle","taken by the FBI nowadays, eh?") A( 2240, 2480, 4, 4 , GBf,GBb, "Hey! You forgot the bad driver!") A( 2520, 2770, 4, 4 , GBf,GBb, "Now look! You made the bad driver upset!") A( 2920, 3080, 4, 4 , RBf,RBb, "I like how this scene went.","Kills were PERFECTLY timed here.") A( 3120, 3280, 4, 4 , RBf,RBb, "This is the only time I use a vehicle.","But it lets me shoot while moving fast.") A( 3300, 3640, 4, 4 , RBf,RBb, "This boss dies so fast, it didn't attack.","Its 150 HP doesn't live to spread+grenades!") A( 3460, 3700, 8, 24 , RBf,RBb, "An alternate strat was 'CloudStacking'","using ice. Lag killed any improvements.") A( 3900, 4100, 4, 4 , RBf,RBb, "There's a spawn timer. It ticks every 31 frames.","Improvements need to beat that for any gains.") A( 4150, 4350, 4, 4 , RBf,RBb, "Off screen, I collect 20 grenades.","Who cares if I can't see what I'm doing!") A( 4500, 4800, 4, 4 , RBf,RBb, "Note: I maintain charge while still shooting.","The frame you exit a roll or backflip, you can shoot!") A( 4860, 5060, 4, 4 , GBf,GBb, "Actually, that's an aura of pure stylishness.","It just LOOKS like I'm charging!") A( 5070, 5330, 4, 4 , GBf,GBb, "He couldn't take concentrated style.","That's why he's freaked out.") A( 5220, 5330, 8, 24 , GBf,GBb, "... And exploding...") A( 5360, 5560, 4, 4 , RBf,RBb, "Spawn timer was 25. I'm 5 frames short.","Frame rule knocks off 26 frames. Nuts.") A( 5720, 6120, 4, 4 , RGf,RGb, "The charge-up shot deals 5 to 10 damage.","Strongest (10 damage) after 200 frames of charging.") A( 5900, 6120, 8, 24 , RGf,RGb, "However, rolling freezes the charge counter.") A( 6500, 6800, 4, 4 , RBf,RBb, "Normally, the boss flies up, then slams back down.","I win too fast, sorry about that.") A( 6900, 7150, 4, 4 , RGf,RGb, "At the end of each stage, the game tallies up your score...") A( 7200, 7650, 4, 4 , RGf,RGb, "Enemy bonus: Just uses your kill count.", "Boss bonus: Times you hit the boss", "Style points: HOW you killed/attacked enemies", "", "Although, the game also gives a bunch of", "points up front as you kill things.", "My score was 18335 before these bonuses.", "", "Relevant addresses begin roughly at 0x03000484") --Stage 1-2 a( 7664,100 , 4,150 , RGf,RGb, "CHECK: at 7664 T5 0 T1 0 T2 0 T4 0") a( 8013,100 , 4,150 , RGf,RGb, "1-2: 1 at 8013 T5+ 32 T1+ 26 T2+113 T4- 2") a( 8104,100 , 4,140 , RGf,RGb, "1-2: 2 at 8104 T5+ 34 T1+ 10 T2+ 48 T4+ 10") a( 8309,100 , 4,150 , RGf,RGb, "1-2: 3 at 8309 T5+ 13 T1+ 11 T2+ 53 T4+ 17") a( 8460,100 , 4,150 , RGf,RGb, "1-2: 4 at 8460 T5+ 32 T1+ 12 T2+ 27 T4+ 59") a( 8730,100 , 4,150 , RGf,RGb, "1-2: 5 at 8730 T5+ 7 T1+ 15 T2+ 25 T4+ 44") a( 8952,100 , 4,150 , RGf,RGb, "1-2: 6 at 8952 T5+ 27 T1+ 36 T2+104 T4+157") a( 9183,100 , 4,150 , RGf,RGb, "1-2: 7 at 9183 T5+ 13 T1+ 9 T2+ 22 T4+ 34") a( 9600,100 , 4,150 , RGf,RGb, "1-2: 8 at 9600 T5- 3 T1+ 1 T2+ 94 T4+ 24") a( 10048,100 , 4,150 , RGf,RGb, "1-2: 9 at 10048 T5+ 13 T1+ 1 T2+ 7 T4+ 43") a( 10566,100 , 4,150 , RGf,RGb, "1-2:10 at 10566 T5+ 51 T1 0 T2+ 5 T4+ 60") a( 10790,100 , 4,150 , RGf,RGb, "1-2:11 at 10790 T5+ 76 T1 ?? T2 ?? T4+120") a( 11235,100 , 4,150 , RGf,RGb, "1-2:12 at 11235 T5+ 8 T1+ 10 T2+ 10 T4+ 6") a( 11852,100 , 4,150 , RGf,RGb, "1-2:13 at 11852 T5 0 T1+ 1 T2 0 T4 0") a( 13263,100 , 4,150 , RGf,RGb, "1-2:14 at 13313 T5 0 T1+3318 T2+3319 T4+3319") a( 13589,100 , 4,150 , RGf,RGb, "1-2 at 13639 T5+303 T1+3452 T2+3830 T4+3898") S(11800,11899, 210, 4 , "HP:800") R2S(11900,13450, 210, 4 , "HP:%3d",0x030003F6) A( 7750, 8000, 4, 4 , RGf,RGb, "There are 12 stages in this game.","1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4") A( 8050, 8300, 4, 4 , RBf,RBb, "The scoring is pretty silly. Especially since","you can find a safe spot and keep killing forever.") A( 8350, 8600, 4, 4 , RBf,RBb, "Anyone suggesting I go for highest score will","be met with an absurdly dull movie.") A( 8650, 8900, 4, 4 , RBf,RBb, "Everything up to this scene went perfect.","Not a frame to spare for that Spawn Timer.") A( 9050, 9300, 4, 4 , GBf,GBb, "Oh, they send another tank.","Clearly, the first two weren't enough.") A( 9350, 9700, 4, 4 , RGf,RGb, "Agents have 1/16 chance to drop an item.","TASes have them drop when it's most important.") A( 9800, 10100, 4, 4 , GBf,GBb, "I'm so cool!") A( 9950, 10100, 8, 14 , GBf,GBb, "Oh, snap. He's even cooler than I am!") A( 10150, 10550, 4, 4 , RGf,RGb, "Current weapon: Wpn1, the green cloud gun.","This leaves a large lingering hitbox.") A( 10350, 10550, 8, 24 , RBf,RBb, "Buildings react poorly to this type of hitbox.","My advantage.") A( 10710, 10880, 4, 4 , GBf,GBb, "I'd say something's fishy about that","building, but that's too obvious.") A( 10890, 11050, 20, 4 , RBf,RBb, "Note, I got my spread shot back.") A( 11100, 11400, 4, 4 , RBf,RBb, "I looked for a way to do this scene without jumping.","Seems I must jump thanks to the tank shell.") A( 11500, 12100, 4, 4 , GBf,GBb, "Oh, instant puddin'!") A( 11600, 12100, 8, 14 , GBf,GBb, "I wonder what I will find in there!") A( 11700, 12100, 8, 24 , GBf,GBb, "I'm sure it's something good!") A( 11800, 12100, 8, 34 , GBf,GBb, "It... Exploded. What caused it?") A( 11900, 12100, 8, 44 , GBf,GBb, "Of course! Giant pudding monster! Who else?") A( 12150, 12350, 4, 4 , GBf,GBb, "Eh, can't be too picky about food.") A( 12400, 12700, 4, 4 , RBf,RBb, "Mugg, you have my thanks in finding out how","to use that hydrant the second time.") A( 12800, 13100, 4, 4 , RBf,RBb, "With optimizations, it was 50 frames improved.","Splicing the inputs maintained sync, too.") A( 13300, 13450, 4, 4 , RBf,RBb, "By the way, the pudding monster could eat you.") A( 13470, 13720, 4, 4 , RGf,RGb, "Boss bonus suffers -- It counted only the grenade.","The bites only count for style.") A( 13750, 14150, 4, 4 , GBf,GBb, "Who cares about the points?", "I'm pretty sure they're pointless.", "Earlier, I made a point about it.", "Endless kills, I had to point out.") --Stage 1-3 a( 14075,100 , 4,150 , RGf,RGb, "CHECK: at 14075 T5 0 T1 0 T2 0 T4 0") a( 14505,100 , 4,150 , RGf,RGb, "1-3: 1 at 14505 T5- 4 T1+ 31 T2+ 42 T4+ 44") a( 14825,100 , 4,150 , RGf,RGb, "1-3: 2 at 14825 T5 0 T1- 1 T2+ 1 T4 0") a( 15187,100 , 4,150 , RGf,RGb, "1-3: 3 at 15187 T5 0 T1+ 2 T2+ 12 T4 0") a( 15336,100 , 4,150 , RGf,RGb, "1-3: 4 at 15336 T5+ 7 T1+ 10 T2+ 67 T4+ 7") a( 15460,100 , 4,150 , RGf,RGb, "1-3: 5 at 15460 T5 0 T1+ 30 T2+ 63 T4 0") a( 15863,100 , 4,150 , RGf,RGb, "1-3: 6 at 15863 T5+ 31 T1+ 32 T2+ 72 T4+ 31") a( 16409,100 , 4,150 , RGf,RGb, "CHECK: at 16409 T5+ 10 T1+ 13 T2+ 13 T4+ 20") a( 17294,100 , 4,150 , RGf,RGb, "1-3: 7 at 17294 T5+ 13 T1+ 1 T2+2242 --T4--") a( 17588,100 , 4,150 , RGf,RGb, "1-3 at 17588 T5+ 57 T1+122 T2+2512") R2S(16735,17275, 210, 4 , "HP:%3d",0x030003F6) A( 14170, 14390, 4, 4 , RGf,RGb, "That tank is a vehicle you can enter.","You can fire its tank shells.") A( 14450, 14700, 4, 4 , RBf,RBb, "Yes, that was a wall in vehicle form.","Some designs get pretty silly.") A( 14750, 15000, 4, 4 , GBf,GBb, "I am not just subtitling for the sake","of fillers! I'm... Okay, I am.") A( 15050, 15350, 4, 4 , RBf,RBb, "As is usual for waiting in TAS,","one should wait with entertainment.") A( 15450, 15770, 4, 4 , RBf,RBb, "I begin charging up my shot...") A( 15650, 15770, 8, 14 , RBf,RBb, "... Only to have it absorbed by the mailbox.") A( 15800, 16150, 4, 4 , RBf,RBb, "This scene required major luck manipulation.","Shooting the mailbox, with a charged shot,","tweaked the RNG just right for me.") A( 16170, 16390, 4, 4 , RGf,RGb, "Shooting downwards pushes you upward.","Shooting a charged shot doesn't, for some reason.") A( 16420, 16550, 4, 4 , GBf,GBb, "Happy Fun Minigame Time! ... I think.") A( 16570, 16750, 4, 4 , RGf,RGb, "Goal: Destroy enemy tank with its own fireball.") A( 16790, 17200, 4, 4 , RGf,RGb, "Glitches abused:","'Burying' the random agents.","Repeated hits using the same fireball.","Staying in control after winning.") A( 17220, 17500, 4, 4 , RBf,RBb, "Those agents have only one gameplay effect:","Tweaking the RNG. They don't even","boost your score! I still use 'em.") A( 17520, 18050, 4, 4 , RGf,RGb, "The RNG uses a 'roll until success' system for a", "variety of effects. This includes weapon drops.", "Flawed system means effective drop rates are:", "19.04% - Wpn1: Green cloud", "16.66% - Wpn2: Fire shot & cloud", "14.58% - Wpn3: Ice shot & cloud", "12.76% - Wpn4: Red slicey", "11.16% - Wpn5: Big shots", " 9.77% - Wpn6: Purple auto", " 8.55% - Wpn7: Spread shot", " 7.48% - Grenade pack") A( 18080, 18310, 4, 4 , RBf,RBb, "If it were intended for 12.50% per","drop, I'd use modulo and only one roll.") --Stage 1-4 a( 18267,100 , 4,150 , RGf,RGb, "CHECK: at 18267 T5+ 1 T1- 4 T2 0") a( 18684,100 , 4,150 , RGf,RGb, "1-4dmg at 18684 T5+ 55 T1+ 37 T2+ 67") a( 18984,100 , 4,150 , RGf,RGb, "1-4 H1 at 18984 T5 0 T1 0 T2 0") a( 19362,100 , 4,150 , RGf,RGb, "1-4 H2 at 19362 T5+ 26 T1+ 16 T2+ 50") a( 19730,100 , 4,150 , RGf,RGb, "1-4 H3 at 19730 T5+ 9 T1+ 3 T2+131") a( 19881,100 , 4,150 , RGf,RGb, "1-4 H4 at 19881 T5- 2 T1 0 T2+ 97") a( 20024,100 , 4,150 , RGf,RGb, "1-4 H5 at 20024 T5+ 2 T1+ 5 T2+ 60") a( 20172,100 , 4,150 , RGf,RGb, "1-4 H6 at 20172 T5- 2 T1+ 25 T2+ 87") a( 20510,100 , 4,150 , RGf,RGb, "1-4Kil at 20510 T5+ 53 T1+127 T2+ 19") a( 20923,100 , 4,150 , RGf,RGb, "1-4Bos at 20923 T5+ 5 T1+ 24 T2+ 10") a( 21338,100 , 4,150 , RGf,RGb, "1-4 at 21338 T5+162 T1+248 T2+536") R2S(20510,20990, 210, 4 , "HP:%3d",0x030003F6) A( 18984, 20450, 138, 4 , RGf,RGb, "#1 Gun","Allows shots","11 damage") A( 19362, 20450, 190, 4 , RGf,RGb, "#2 Armor","New HP: 20","It was 5...") A( 19730, 20450, 138, 34 , RGf,RGb, "#3 Rocket","Faster now!","Uses fuel.") A( 19881, 20450, 190, 34 , RGf,RGb, "#4 NewGun","+2 damage","shot upgrade") A( 20024, 20450, 138, 124 , RGf,RGb, "#5 Back","Two 9 damage","back shots.") A( 20172, 20450, 190, 124 , RGf,RGb, "#6 Missile","Two 2 damage","homing shots") A( 18350, 18550, 4, 4 , RGf,RGb, "This shaking is to keep the target copter","moving slower than normal.") A( 18650, 18900, 4, 4 , RGf,RGb, "Without a gun, one must wait out","the first copter's destruction.") A( 18950, 19200, 4, 4 , RBf,RBb, "With the gun, I can just","shoot the next copters.") A( 19250, 19550, 4, 4 , RBf,RBb, "I had trouble with the RNG in","this stage. Turns out I needed","to look at background clouds.") A( 19580, 19850, 4, 4 , RBf,RBb, "From this point on, I will","never trust another cloud.") A( 19900, 20150, 4, 4 , RGf,RGb, "The RNG determines where the","next copter will spawn.") A( 20200, 20450, 4, 4 , RBf,RBb, "Now I kill stuff. To spawn","the boss quick.") A( 20550, 20950, 4, 4 , RBf,RBb, "The clouds are evil, I tell you! EVIL!", "I couldn't dance with this boss.", "It's the clouds' faults, I tell you!", "That, and I needed the right RNG.") A( 20990, 21249, 4, 4 , GBf,GBb, "Yikes! A cloud!") A( 21070, 21249, 8, 14 , GBf,GBb, "This is for my sanity!") A( 21150, 21249, 8, 24 , GBf,GBb, "(Add FF7 reference here)") A( 21250, 21900, 4, 4 , RBf,RBb, "I had, in fact, adjusted my script specifically", "to track these evil clouds. As they were key to", "getting a good RNG, I had to track when they", "disappear offscreen in order to get the RNG to", "behave. It was a glorious day when the clouds", "were at last defeated and the RNG in my control.") --Stage 2-1 a( 22014,100 , 4,150 , RGf,RGb, "CHECK: at 22014 T5- 1 T1- 1 T2- 1") a( 22276,100 , 4,150 , RGf,RGb, "2-1: 1 at 22276 T5+ 35 T1+ 34 T2+ 77") a( 22379,100 , 4,150 , RGf,RGb, "2-1: 2 at 22379 T5+ 33 T1+ 3 T2 ??") a( 22555,100 , 4,150 , RGf,RGb, "2-1: 3 at 22555 T5+ 25 T1+ 58 T2+178") a( 22962,100 , 4,150 , RGf,RGb, "2-1: 4 at 22962 T5 0 T1 0 T2+ 44") a( 23086,100 , 4,150 , RGf,RGb, "2-1: 5 at 23086 T5+ 89 T1+ 70 T2+154") a( 23250,100 , 4,150 , RGf,RGb, "2-1: 6 at ?? T5 ?? T1 ?? T2 ??") a( 23527,100 , 4,150 , RGf,RGb, "2-1: 7 at 23527 T5+ 25 T1- 5 T2- 13") a( 23733,100 , 4,150 , RGf,RGb, "2-1: 8 at 23733 T5+ 11 T1+ 30 T2+138") a( 23919,100 , 4,150 , RGf,RGb, "2-1: 9 at 23919 T5+ 70 T1+ 64 T2+ 35") a( 24068,100 , 4,150 , RGf,RGb, "2-1:10 at 24068 T5+ 24 T1+ 30 T2+ 25") a( 24386,100 , 4,150 , RGf,RGb, "2-1:11 at 24386 T5+160 T1+ 88 T2+128") a( 24575,100 , 4,150 , RGf,RGb, "2-1:12 at 24575 T5- 13 T1+ 3 T2+ 2") a( 25111,100 , 4,150 , RGf,RGb, "2-1:13 at 25111 T5+ 6 T1+173 T2+226") a( 25538,100 , 4,150 , RGf,RGb, "2-1 at 25538 T5+464 T1+547 T2+993") R2S(24772,25221, 210, 4 , "HP:%3d",0x030003F6) A( 21950, 22190, 4, 4 , RGf,RGb, "As far as damage goes, each bullet","deals 1 damage. Each grendae does 3.") A( 22230, 22470, 4, 4 , RGf,RGb, "It doesn't matter what gun.","All 8 guns have 1 damage bullets.") A( 22510, 22750, 4, 4 , RGf,RGb, "However, Wpn2(fire), Wpn3(ice), and","Wpn7(spread) have 2 or 3 bullet shots.") A( 22790, 23050, 4, 4 , RGf,RGb, "The spread shots graphically show","6 shots, but it's really 3 sprites.") A( 23070, 23350, 4, 4 , RBf,RBb, "Even so, the spread does have three distinct","bullets. That makes it optimal for most bosses.") A( 23410, 23710, 4, 4 , RBf,RBb, "The fire and ice weapons do leave clouds.","These clouds can glitch the hit detection a bit.") A( 23750, 24150, 4, 4 , RBf,RBb, "The 'CloudStacking' glitch lets these clouds","hit more than once. The difficult set-up makes","it impractical for most bosses, however.") A( 24190, 24450, 4, 4 , RBf,RBb, "When fully set-up, however... The damage can be","a thing of sheer beauty.") A( 24490, 24750, 4, 4 , RBf,RBb, "The best set-up requires around 3 weapon drops,","all next to each other. Each of fire or ice.","Not easy...") A( 24770, 25100, 4, 4 , RBf,RBb, "Even without optimal set-up, straight fire/ice","can still push 4 damage/attack. Beyond spread","power, if you got the time and close the distance.") A( 25150, 25350, 4, 4 , RBf,RBb, "By the way, this boss was not fire/ice friendly...") A( 25400, 26100, 4, 4 , RBf,RBb, "For being a potentially devastating glitch,", "CloudStacking only ended up useful twice in this run.", "The set-up is what makes it impractical, as either I", "lag horribly, the strange up/down hitboxes miss, or", "the HP vanishes faster with just spreads.", "", "That said, however...", "The weak version is used in 3-1. One cycle kill!", "The super version is planned for 3-4." ) --Stage 2-2 a( 26023,100 , 4,150 , RGf,RGb, "CHECK: at 26023 T5 0 T1 0 T2 0") a( 27188,100 , 4,150 , RGf,RGb, "2-2: 1 at 27188 T5 0 T1+ 33 T2- 57") a( 27429,100 , 4,150 , RGf,RGb, "2-2: 2 at 27429 T5+ 30 T1 0 T2+ 3") a( 29603,100 , 4,150 , RGf,RGb, "2-2: 3 at 29603 T5+ 2 T1 0 T2 0") a( 29766,100 , 4,150 , RGf,RGb, "2-2: 4 at 29766 T5+ 43 T1+ 40 T2+ 40") a( 30132,100 , 4,150 , RGf,RGb, "2-2: 5 at 30132 T5+ 46 T1+ 4 T2+ 18") a( 30201,100 , 4,140 , RGf,RGb, "2-2: 6 at 30201 T5- 14 T1- 4 T2- 10") a( 30255,100 , 4,150 , RGf,RGb, "2-2: 7 at 30255 T5 0 T1+ 5 T2+ 7") a( 30309,100 , 4,140 , RGf,RGb, "2-2: 8 at 30309 T5+ 11 T1+ 5 T2+ 5") a( 30491,100 , 4,150 , RGf,RGb, "2-2: 9 at 30491 T5- 2 T1 0 T2+ 13") a( 30592,100 , 4,150 , RGf,RGb, "2-2:10 at 30592 T5+ 1 T1+ 6 T2+ 12") a( 30784,100 , 4,150 , RGf,RGb, "2-2:11 at 30784 T5+ 11 T1+ 2 T2+ 2") a( 32639,100 , 4,150 , RGf,RGb, "2-2:12 at 32639 T5+ 21 T1+107 T2+ 56") a( 32865,100 , 4,150 , RGf,RGb, "2-2 at 32865 T5+149 T1+198 T2+150") S(30580, 30785, 210, 4 , "HP:20000") -- The Yeti S(30786, 31000, 210, 4 , "...Oh,","wait...") -- Keh, faked you out! A( 26200, 26500, 4, 4 , RBf,RBb, "Bah, this level. Full of forced waits.","At least I can show off without wasting time.") A( 26520, 26770, 4, 4 , RBf,RBb, "And already we're stuck waiting!","See what I mean? Forced waits.") A( 26800, 27100, 4, 4 , RBf,RBb, "Although, T2 beat me here by 57 frames.","I haven't a clue how that happened.") A( 27120, 27400, 4, 4 , RBf,RBb, "At least I still improve other parts.","I am quite ahead elsewhere, at least.") A( 27420, 27700, 4, 4 , RBf,RBb, "Between the forced waits, I can travel","quickly to the next forced wait.") A( 27800, 28100, 4, 4 , GBf,GBb, "Let it rain items!","Who cares if I can't use it all!","We like impractically many drops!") A( 28120, 28700, 4, 4 , RGf,RGb, "Buildings drop items 100% of the time.","Agents drop items 6.25% of the time.") A( 28400, 28700, 8, 24 , RBf,RBb, "The stuff dropping here would make you think","I'm lying about the agent drop rate...") A( 28800, 29600, 4, 4 , RBf,RBb, "You probably noticed I use three different","colors for these text boxes.") A( 29000, 29600, 8, 24 , RGf,RGb, "This color box is strictly informative.") A( 29150, 29600, 8, 34 , RBf,RBb, "I use this color for a variety of thoughts.") A( 29300, 29600, 8, 44 , GBf,GBb, "Sacrificing relevance for humor. Totally practical!") A( 29700, 30000, 4, 4 , GBf,GBb, "Oh, yeah! Yellow can still be funny","by stating the plainly obvious!") A( 30050, 30610, 4, 4 , RBf,RBb, "No, this is not an invitation to put","'snow is white' in a yellow box.","I'm not THAT silly.") A( 30370, 30610, 8, 34 , GBf,GBb, "Besides, the snow is more like #C8D0F8.","Totally not white, #FFFFFF") A( 30650, 30850, 4, 4 , GBf,GBb, "In fact, the Yeti is whiter than the snow!") A( 30900, 31380, 4, 4 , RGf,RGb, "The Yeti has no HP to track.","Bullets literally do nothing to it.") A( 31080, 31380, 8, 24 , GBf,GBb, "Can't you find a funnier fact?") A( 31450, 31750, 4, 4 , RBf,RBb, "For a moment, you can see two yellow aliens.","It's lovely abusing glitches, eh?") A( 31800, 32100, 4, 4 , RBf,RBb, "This boss has a detrimental glitch I must","avoid, forcing me to delay smashing it in.") A( 32120, 32580, 4, 4 , RGf,RGb, "If one brings Phase 1 of boss to zero HP","before the fourth piece shows up, then","the battle can't be completed.") A( 32700, 33450, 4, 4 , GBf,GBb, "Any and all missed shots can be attributed to:", " * I needed to adjust the RNG some.", " * The weapon made me do it!", " * I didn't miss! It just looked like I missed!", " * It gets me movin', yeah!", " * ... Er, it's 'entertainment'! What else?", " * The bullets went to a better place...", " * That bullet had a mission to do.", " * It's so I have something to talk about here!") --Stage 2-3 a( 33349,100 , 4,150 , RGf,RGb, "CHECK: at 33349 T5 0 T1 0 T2 0") a( 34518,100 , 4,150 , RGf,RGb, "2-3: 1 at 34518 T5+ 16 T1+ 8 T2- 16") a( 34937,100 , 4,150 , RGf,RGb, "2-3: 2 at 34937 T5 0 T1+ 3 T2+ 25") a( 36110,100 , 4,150 , RGf,RGb, "2-3: 3 at 36110 T5+180 T1+ 44 T2+ 88") a( 36170,100 , 4,140 , RGf,RGb, "CHECK: at 36170 T5- 1 T1 0 T2+ 46") a( 36452,100 , 4,150 , RGf,RGb, "2-3 at 36452 T5+195 T1+ 55 T2+143") A( 33500, 34500, 4, 4 , RBf,RBb, "I both like and hate this stage...") A( 33650, 33900, 4, 14 , RBf,RBb, "For one thing, luck manipulation is minimal.","Far less acrobatic stuff to do here!") A( 33950, 34200, 4, 14 , RBf,RBb, "On the other hand, I only have access to","three items in this entire stage.") A( 34250, 34500, 4, 14 , RBf,RBb, "If it weren't for that, I'd kill bosses","in this stage much faster...") A( 34600, 34900, 4, 4 , RBf,RBb, "The stage is relatively easy compared to others.","It just isn't all fun and acrobatic, though.") A( 34920, 35100, 4, 4 , GBf,GBb, "Ah, a use for worn down cars! Barracades!") A( 35150, 35350, 4, 4 , RBf,RBb, "I slow down for a moment for a bullet here.") B( 35150, 35350, 200, 108 , 239,124, 0,0x00FF00FF) A( 35380, 35680, 4, 4 , RBf,RBb, "And there's my third and last item. I looked.","No other destructables for item drops.") A( 35700, 36000, 4, 4 , RBf,RBb, "Running out of ammo here is a guarantee.","There simply aren't enough destructables to abuse.") A( 36050, 36250, 4, 4 , RBf,RBb, "But lack of destructables means easy optimization...") A( 36300, 37000, 4, 4 , RBf,RBb, "It's mostly one person working on this TAS.", "FatRatKnight is this person's online alias.", "Said person was part of T5 during the DTC3.", "I, FatRatKnight, have done these subtitles.", "You can imagine why I appreciate some ease.", "Regardless, the TAS shouldn't look so easy.", "It takes a lot of effort to optimize a TAS.") --Stage 2-4 a( 36937,100 , 4,150 , RGf,RGb, "CHECK: at 36937 T5 0 T1 0 T2 0") a( 38147,100 , 4,150 , RGf,RGb, "2-4: K at 38147 T5+228 T1+108 T2+314") a( 38842,100 , 4,150 , RGf,RGb, "2-4: B at 38842 T5+ 76 T1+144 T2+902") a( 39258,100 , 4,150 , RGf,RGb, "2-4 at 39258 T5+304 T1+252 T2+1216") A( 37050, 37300, 4, 4 , RGf,RGb, "This is the second flying stage,","out of the two found in this game.") A( 37350, 37600, 4, 4 , RGf,RGb, "You begin with all power-ups this time.","There is nothing to collect here.") A( 37650, 37900, 4, 4 , RGf,RGb, "Progress depends on enemy kills.","Asteroids don't count as an enemy.") A( 37950, 38300, 4, 4 , RBf,RBb, "I did my best to ensure I don't stop firing.","And making sure I hit every time.","Though, I still delay a moment at one point.") A( 38400, 38700, 4, 4 , RBf,RBb, "I wanted to do this strategy in the DTC3.","Time constraints meant optimizing it was infeasible.") A( 38750, 39000, 4, 4 , RBf,RBb, "In the end, this is faster and far more","stylish than just sitting in one spot.") A( 39050, 40000, 4, 4 , RBf,RBb, "The Dream Team Contest at TASVideos simply pits", "teams of TASers against one another on a game.", "A team of Tool-Assisted Superplayers works", "together to create the fastest game-winning", "input file. The whole frame advance and save", "state thing does allow multiple people to", "contribute in playing through the same run.", "", "This was the game chosen for DTC3.", "I, FatRatKnight, was a player in DTC3, under T5.") --Stage 3-1 a( 39931,100 , 4,150 , RGf,RGb, "CHECK: at 39931 T5 0 T1 0 T2 0") a( 40412,100 , 4,150 , RGf,RGb, "3-1: 1 at 40412 T5+ 27 T1+158 T2+ 1") a( 40782,100 , 4,150 , RGf,RGb, "3-1: 2 at 40782 T5+ 22 T1+ 98 T2+ 99") a( 41269,100 , 4,150 , RGf,RGb, "3-1: 3 at 41269 T5+ 1 T1+ 1 T2+ 2") a( 41710,100 , 4,150 , RGf,RGb, "3-1: 4 at 41710 T5+ 1 T1+140 T2+ 82") a( 42526,100 , 4,150 , RGf,RGb, "3-1: 5 at 42526 T5+ 25 T1+ 3 T2+ 21") a( 43174,100 , 4,150 , RGf,RGb, "3-1: 6 at 43174 T5+ 20 T1+167 T2+227") a( 44486,100 , 4,150 , RGf,RGb, "3-1: 7 at 44486 T5+245 T1+278 T2+316") a( 44833,100 , 4,150 , RGf,RGb, "3-1 at 44833 T5+321 T1+825 T2+788") A( 40020, 40500, 4, 4 , RGf,RGb, "Unlike the agents in previous levels (1/16),","scorpions have a 1/4 drop rate.") A( 40220, 40500, 8, 24 , RBf,RBb, "Handy advantage, as it means I can have the","good drops like grenades more frequently.") A( 40550, 40850, 4, 4 , RBf,RBb, "The RNGScan functions of my script were","particularly handy to have. Grenades! Yes!") A( 40900, 41300, 4, 4 , RGf,RGb, "Only way to survive the tornado is to dig","underground, or be dead before it hits you.") A( 41100, 41300, 8, 24 , GBf,GBb, "Yes! Humor at last! Be dead to avoid dieing!") A( 41320, 41600, 4, 4 , GBf,GBb, "Though, I fear for the wildlife who promtly","die in the environment they live in.") A( 41650, 41950, 4, 4 , RBf,RBb, "As far as luck goes, I often got my drops","while on the run. Without losing time.") A( 42000, 42300, 4, 4 , RBf,RBb, "I like how this stage went! Every scene,","I beat the DTC3 runs in some way.") A( 42400, 42700, 4, 4 , RBf,RBb, "Those birds each have 60 HP. Makes you wonder","if bullets or grenades really do 1 or 3.") A( 42800, 43000, 4, 4 , RBf,RBb, "Yes, they really do 1 and 3 damage respectively.","Charged shots up to 10.") A( 43100, 43400, 4, 4 , RBf,RBb, "I just pile so many shots in such a short","span of time. Doing things the TAS way!") A( 43500, 43850, 4, 4 , GBf,GBb, "It's a desert. Of course it would be","an empty, endless expanse of sand!","What did you expect?") A( 43900, 44200, 4, 4 , RBf,RBb, "I have 18 grenades to spare. Seems I","manipulated a few more than needed.") A( 44300, 44600, 4, 4 , RBf,RBb, "One cycle kill. The DTC3 runs failed to","do this. Go CloudStacking and grenades!") A( 44620, 45400, 4, 4 , RBf,RBb, "Information my script gives you:", " * Weapon ID, cooldown, ammo, grenade count", " * Length of charge for charged shot (and power)", " * Spawn timer, camera lock, enemies onscreen", " * Hitboxes, including numbers indicating HP", " * Detailed RNG information predicting when things drop", " * Adjustable HUD opacity and hitbox scaling", " (see offscreen stuff)", "", "Sadly, it still doesn't color dinosaurs.") --Stage 3-2 a( 49999,100 , 4,150 , RGf,RGb, "CHECK: at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 1 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 2 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 3 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 4 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 5 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 6 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 7 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 8 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2: 9 at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "CHECK: at 4.... T5+... T1+... T2+...") a( 49999,100 , 4,150 , RGf,RGb, "3-2 at 4.... T5+... T1+... T2+...") --Stage 3-3 a( 54999,100 , 4,150 , RGf,RGb, "CHECK: at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "3-2: 1 at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "3-2: 2 at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "3-2: 3 at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "3-2: 4 at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "3-2: 5 at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "3-2: 6 at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "3-2: 7 at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "CHECK: at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "3-2 at ..... T5+... T1+... T2+...") --Stage 3-4 a( 54999,100 , 4,150 , RGf,RGb, "CHECK: at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "LOCK: at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "Kill: at ..... T5+... T1+... T2+...") a( 54999,100 , 4,150 , RGf,RGb, "Victory ..... T5+... T1+... T2+...") A( 55000, 65000, 4, 4 , RGf,RGb, "### Me |--T5- --T1- --T2- --T4-", "1-1 7800| 7193 7430 7966 8346", "1-2 6409| 6762 9911 10289 10357", "1-3 3999| 4056 4121 6511 DNF", "1-4 3755| 3917 4003 4291", "2-1 4200| 4664 4747 5193", "2-2 7327| 7476 7525 7477", "2-3 3587| 3782 3642 3730", "2-4 2806| 3110 3058 4022", "3-1 5575| 5896 6400 6363", "3-2 ....| 3404 3416 3636", "3-3 ....| 4259 4160 4451", "3-4 ....| 2466 2669 2588", "---------+-----------------------", "END 5....|56985 61082 66517 DNF")
Edit2: Uh, an update. To my subtitles. For those from IRC peeking in, you would be correct in assuming I just finished 2-2, and will be making a new post shortly. Edit3: This time, I'm just updating the subtitles to remain aligned with the 50 frame improvement, and to be real chatty up through 3-1. No progress into 3-2 yet, what with the holidays. Trying to keep my mind on this, at least.