--S(start,end,left,top,line1, line2, ..., lineN)
--Subtitle. Displays text
--B(start,end,left,top,right,bottom,FillColor,BorderColor)
--Box. Paints a colored box at selected area.
--R1U(start,end,left,top,text,address)
--ReadAddress. Displays one line of text and displays value at address.
--Full list of related functions: R1U, R2U, R4U, R1S, R2S, R4S
--A(start,end,left,top,FillColor,BorderColor, line1, line2, ..., lineN)
--Auto Box&Subtitle. Displays text and a text-fitting box around it.
--F(start,end,left,top,text,function[,FillColor,BorderColor])
--Function. The provided function should return needed pieces for text.format
--Additionally, I provide a lowercase letter version of each function.
--The end parameter for lowercase is relative to start, so inserting 300 there
--means that the subtitle will last 300 frames. Additionally, lowercase also
--makes the box routine ask for width and height instead of right-side and
--bottom-side.
local Subbies= {}
local WID= 6 -- Width of each character. DeSmuME uses 6.
local HGT= 9 -- Height. I'm arbitrarily using 9 here.
if stylus then --DeSmuME. Platform: DS
WID= 6; HGT= 9
elseif snes9x then --Snes9x. Platform: SNES
WID= 4; HGT= 8
elseif vba then --VisualBoy Advance. Platforms: GBA, GB, GBC, SGB
WID= 4; HGT= 8
elseif FCEU then --FCE Ultra / FCEUX. Platform: NES.
WID= 2; HGT= 9
end
-- Array based functions.
--#############################################################################
--*****************************************************************************
local function DispMsg(T)
--*****************************************************************************
for i= 1, #T do
gui.text(T.x,T.y+HGT*(i-1),T[i],T.c1,T.c2)
end
end
--*****************************************************************************
local function DispAddr(T)
--*****************************************************************************
gui.text(T.x,T.y, string.format(T.txt, T.rv(T.v)) , T.c1,T.c2)
end
--*****************************************************************************
local function DispBox(T)
--*****************************************************************************
gui.box(T.x,T.y,T.x2,T.y2 , T.c1,T.c2)
end
--*****************************************************************************
local function DispFn(T)
--*****************************************************************************
gui.text(T.x,T.y, string.format(T.txt, T.FnCall()),T.c1,T.c2)
end
--#############################################################################
local CurrentIndex= 1
local ActiveSubs= {}
--*****************************************************************************
local function HandleArray()
--*****************************************************************************
-- I'll leave the intelligence of add/removal here.
--Add
while Subbies[CurrentIndex] and (Subbies[CurrentIndex].t <= movie.framecount()) do
table.insert(ActiveSubs,Subbies[CurrentIndex])
CurrentIndex= CurrentIndex+1
end
--Execute/remove
local i= 1
while ActiveSubs[i] do
if ActiveSubs[i].e >= movie.framecount() then
ActiveSubs[i]:fn()
i= i+1
else
table.remove(ActiveSubs,i)
end
end
end
--*****************************************************************************
local function ResetArray()
--*****************************************************************************
CurrentIndex= 1
ActiveSubs= {}
end
--*****************************************************************************
local function AddToSubbies(T)
--*****************************************************************************
for i= #Subbies, 1, -1 do
if T.t >= Subbies[i].t then
table.insert(Subbies,i+1,T)
return -- Escape, as we have inserted it!
end
end
table.insert(Subbies,1,T) -- If we go here, the loop failed to insert.
end
--#############################################################################
--#############################################################################
-- [S]ubtitle
-- Can take an arbitrary number of lines
-- Its name is one letter long to save bytes. Lots of them.
-- I don't have a proper syntax for coloring the text. But the core is capable
-- of using colored text.
--*****************************************************************************
function S(start,End , left,top , ...)
--*****************************************************************************
-- This is a CAPITAL S. Use absolutes.
if arg.n <= 0 then return end -- Sanity; Must have text!
local NewSub= {
fn= DispMsg,
t= start, e= End,
x= left, y= top
}
for i= 1, arg.n do
NewSub[i]= arg[i]
end
AddToSubbies(NewSub)
end
--*****************************************************************************
function s(start,length , left,top , ...)
--*****************************************************************************
-- Lowercase s. Use relatives where it makes sense (frame end is it).
if arg.n <= 0 then return end -- Sanity; Must have text!
local NewSub= {
fn= DispMsg,
t= start, e= start+length,
x= left, y= top
}
for i= 1, arg.n do NewSub[i]= arg[i] end
AddToSubbies(NewSub)
end
--*****************************************************************************
local function ReadMem(start,End , left,top , str,addr , NewFn)
--*****************************************************************************
-- Not for end-user; Call the R#U/S series instead!
-- The usual start,end,left,top applies
AddToSubbies{
fn= DispAddr,
t= start, e= End,
x= left, y= top,
txt= str, v= addr,
rv= NewFn
}
end
--=============================================================================
function R1U(start,End , x1,y1 , str,addr)
ReadMem(start,End , x1,y1 , str,addr , memory.readbyteunsigned)
end
function R2U(start,End , x1,y1 , str,addr)
ReadMem(start,End , x1,y1 , str,addr , memory.readwordunsigned)
end
function R4U(start,End , x1,y1 , str,addr)
ReadMem(start,End , x1,y1 , str,addr , memory.readdwordunsigned)
end
function R1S(start,End , x1,y1 , str,addr)
ReadMem(start,End , x1,y1 , str,addr , memory.readbytesigned)
end
function R2S(start,End , x1,y1 , str,addr)
ReadMem(start,End , x1,y1 , str,addr , memory.readwordsigned)
end
function R4S(start,End , x1,y1 , str,addr)
ReadMem(start,End , x1,y1 , str,addr , memory.readdwordsigned)
end
function r1u(start,length , x1,y1 , str,addr)
ReadMem(start,start+length , x1,y1 , str,addr , memory.readbyteunsigned)
end
function r2u(start,length , x1,y1 , str,addr)
ReadMem(start,start+length , x1,y1 , str,addr , memory.readwordunsigned)
end
function r4u(start,length , x1,y1 , str,addr)
ReadMem(start,start+length , x1,y1 , str,addr , memory.readdwordunsigned)
end
function r1s(start,length , x1,y1 , str,addr)
ReadMem(start,start+length , x1,y1 , str,addr , memory.readbytesigned)
end
function r2s(start,length , x1,y1 , str,addr)
ReadMem(start,start+length , x1,y1 , str,addr , memory.readwordsigned)
end
function r4s(start,length , x1,y1 , str,addr)
ReadMem(start,start+length , x1,y1 , str,addr , memory.readdwordsigned)
end
--=============================================================================
-- [B]ox
--*****************************************************************************
function B(start,End , left,top , right,bottom , cf,cb)
--*****************************************************************************
AddToSubbies{
fn= DispBox,
t= start, e= End,
x= left, y= top,
x2= right, y2= bottom,
c1= cf, c2= cb
}
end
--*****************************************************************************
function b(start,length , left,top , width,height , cf,cb)
--*****************************************************************************
AddToSubbies{
fn= DispBox,
t= start, e= start+length,
x= left, y= top,
x2= left+width, y2= top+height,
c1= cf, c2= cb
}
end
-- [A]uto
-- Boxes and subtitles, wrapped in one.
-- Calculates the box size for you!
--*****************************************************************************
function A(start,End , left,top , cf,cb , ...)
--*****************************************************************************
if arg.n <= 0 then return end -- Sanity
local NewSub= {
fn= DispMsg,
t= start, e= End,
x= left, y= top
}
local len= 0
for i= 1, arg.n do
NewSub[i]= arg[i]
len= math.max(len, string.len(arg[i]))
end
B(start,End , left-1,top-1 , left+len*WID,top+arg.n*HGT, cf,cb)
AddToSubbies(NewSub)
end
--*****************************************************************************
function a(start,length , left,top , cf,cb , ...)
--*****************************************************************************
if arg.n <= 0 then return end -- Sanity
local NewSub= {
fn= DispMsg,
t= start, e= start+length,
x= left, y= top
}
local len= 0
for i= 1, arg.n do
NewSub[i]= arg[i]
len= math.max(len, string.len(arg[i]))
end
B(start,start+length , left-1,top-1 , left+len*WID,top+arg.n*HGT, cf,cb)
AddToSubbies(NewSub)
end
-- [F]unction
-- Takes a string for a string.format and calls a function to
-- fill in the pieces neccessary for the string.format call.
-- Examples will be needed for clarity, but this file won't hold them.
--*****************************************************************************
function F(start,End , left,top , str,Fn , cf,cb)
--*****************************************************************************
AddToSubbies{
fn= DispFn,
t= start, e= End,
x= left, y= top,
txt= str, FnCall= Fn,
c1= cf, c2= cb
}
end
--*****************************************************************************
function f(start,length , left,top , str,Fn , cf,cb)
--*****************************************************************************
F(start,start+length , left,top , str,Fn , cf,cb)
end
--#############################################################################
--#############################################################################
local LastFC= 0
--*****************************************************************************
local function FrameCountSanity()
--*****************************************************************************
local FC= movie.framecount()
if FC < LastFC then ResetArray() end
LastFC= FC
end
--*****************************************************************************
local function HandleSubs()
--*****************************************************************************
FrameCountSanity()
HandleArray()
end
gui.register(HandleSubs)
--End subtitles script
--#############################################################################
--#############################################################################
--Begin usage of subtitles script
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 dash 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, dashing 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 13263 T5+ 50 T1+3368 T2+3369 T4+3369")
a(13589,100 , 4,150 , RGf,RGb, "1-2 at 13589 T5+353 T1+3502 T2+3880 T4+3948")
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 one kill.","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(16785,17325, 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+ 16 T1+ 10 T2+138")
a(19881,100 , 4,150 , RGf,RGb, "1-4 H4 at 19881 T5+ 1 T1+ 3 T2+100")
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 BackGun","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 No Lock 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.","I wasn't successful doing that.")
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, I do use CloudStacking twice.",
"3-1 needed it for a single cycle kill.",
"3-4 made the kill in just over 5 seconds."
)
--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, 98 , 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, 30906, 210, 4 , "...Oh,","wait...") -- Keh, faked you out!
R2S(31978,32257, 210, 4 , "HP:%3d",0x030003F6) -- The 2-2 boss.
S( 32258,32720, 210, 4 , "HP: 0")
S( 32258,32280, 210, 12 , "15/10")
S( 32258,32310, 210, 20 , "15/10")
S( 32258,32400, 210, 28 , "15/10")
S( 32258,32490, 210, 36 , "15/10")
R2S(32281,32352, 210, 12 , "%2d/10",0x02034840)
R2S(32311,32390, 210, 20 , "%2d/10",0x02034D50)
R2S(32401,32504, 210, 28 , "%2d/10",0x02038B54)
R2S(32491,32568, 210, 36 , "%2d/10",0x0203DD98)
R2S(32353,32445, 210, 12 , " 0/%2d",0x02036A6C)
R2S(32391,32471, 210, 20 , " 0/%2d",0x02038644)
R2S(32505,32635, 210, 28 , " 0/%2d",0x0203E530)
R2S(32569,32637, 210, 36 , " 0/%2d",0x0203F460)
S( 32446,32720, 210, 12 , " 0/ 0")
S( 32472,32720, 210, 20 , " 0/ 0")
S( 32636,32720, 210, 28 , " 0/ 0")
S( 32638,32720, 210, 36 , " 0/ 0")
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, 18 , RBf,RBb, "For a moment, you can see","two yellow aliens. It's","lovely abusing glitches.")
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")
R2S(34143,34518, 210, 4 , "HP:%3d",0x030003F6)
R2S(35510,36110, 210, 4 , "HP:%3d",0x030003F6)
A(33500,34500, 4, 4 , RBf,RBb, "I both like and hate this stage...")
A(33650,33900, 8, 14 , RBf,RBb, "For one thing, luck manipulation is minimal.","Far less acrobatic stuff to do here!")
A(33950,34200, 8, 14 , RBf,RBb, "On the other hand, I only have access to","three items in this entire stage.")
A(34250,34500, 8, 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")
R2S(37000,38500, 210, 14 , "Kill%2d",0x030016D6)
R2S(38147,38900, 210, 4 , "HP:%3d",0x030003F6)
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(44500,100 , 4,150 , RGf,RGb, "3-1: 7 at 44500 T5+231 T1+264 T2+302")
a(44582,100 , 4,140 , RGf,RGb, "CHECK: at 44582 T5+ 19 T1+ 19 T2+ 59")
a(44808,100 , 4,150 , RGf,RGb, "3-1 at 44808 T5+346 T1+850 T2+813")
R2S(44007,44581, 210, 4 , "HP:%3d",0x030003F6)
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 threw a total of 97 grenades in this stage.","I have 16 to spare. One grenade pack too many.")
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,
"My info script helped me by showing:",
" * 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(45294,100 , 4,150 , RGf,RGb, "CHECK: at 45294 T5 0 T1 0 T2 0")
a(45635,100 , 4,150 , RGf,RGb, "3-2: 1 at 45635 T5+ 3 T1+ 45 T2+ 7")
a(45763,100 , 4,150 , RGf,RGb, "3-2: 2 at 45763 T5+ 23 T1+ 11 T2+ 8")
a(45880, 61 , 4,150 , RGf,RGb, "3-2: 3 at 45880 T5+ 3 T1- 17 T2- 14")
a(45943,100 , 4,150 , RGf,RGb, "3-2: 4 at 45943 T5+ 30 T1+ 14 T2+ 14")
a(46319,100 , 4,150 , RGf,RGb, "3-2: 5 at 46319 T5+ 15 T1+ 7 T2+165")
a(46484,100 , 4,150 , RGf,RGb, "3-2: 6 at 46484 T5- 9 T1- 10 T2+ 63")
a(47039,100 , 4,150 , RGf,RGb, "3-2: 7 at 47039 T5+ 51 T1- 7 T2+ 42")
a(47518,100 , 4,150 , RGf,RGb, "3-2: 8 at 47518 T5+ 52 T1+131 T2+ 66")
a(47733,100 , 4,150 , RGf,RGb, "3-2: 9 at 47733 T5+ 74 T1+ 79 T2+123")
a(47750,100 , 4,140 , RGf,RGb, "CHECK: at 47750 T5+ 0 T1+ 1 T2 0")
a(47976,100 , 4,150 , RGf,RGb, "3-2 at 47976 T5+236 T1+248 T2+368")
R2S(47178,47435, 210, 4 , "HP:%3d",0x030003F6)
R2S(47609,47750, 210, 4 , "HP:%3d",0x030003F6)
A(45440,45660, 4, 4 , RGf,RGb, "Paratroopers can die while parachuting.","Earlier, agents were invincible while on a rope.")
A(45680,45900, 4, 4 , RBf,RBb, "Bug bots here: 10 HP per.","Also, these mines force me to jump or die.")
A(45940,46120, 4, 4 , RBf,RBb, "Overhead, I'm shooting someone.","It now rains grenades.")
A(46140,46360, 4, 4 , GBf,GBb, "Yes, grenades literally fell right out","of the sky! Imagine my luck!")
A(46380,46650, 4, 4 , RBf,RBb, "As seen, the anti-alien mines' explosions","can be avoided with perfect timing.")
A(46550,46650, 8, 24 , RGf,RGb, "Uncollectable life flower here.")
A(46700,46940, 4, 4 , RGf,RGb, "Throughout this stage, digging into the","ground is instant death. Giant worm eats you.")
A(46960,47260, 4, 4 , RBf,RBb, "I'm burning through random numbers really,","really fast. The needed RNG is far away.")
A(47280,47500, 4, 4 , RGf,RGb, "The RNG only advances when an action needs it.","Certain values are required for needed items.")
A(47540,47760, 4, 4 , RBf,RBb, "Hundreds of random numbers were spent.","All of them no good. The one I have: Good.")
A(47800,48530, 4, 4 , RBf,RBb,
"Manipulating luck isn't always as simple as",
"saying 'I want this' and boom. There it is.",
"You need the RNG to be in the right spot for it.",
"To do that, you need to know how to affect it.",
"In fact, to even know the right spot at all,",
"you need to figure out what the RNG even means.",
"To produce my RNG script, I didn't magically",
"know how to make the script, I had to work at",
"desciphering the RNG thoroughly.",
"",
"No one ever said luck manipulation is easy.")
--Stage 3-3
a(48460,100 , 4,150 , RGf,RGb, "CHECK: at 48460 T5+ 1 T1+ 1 T2+ 1")
a(49460,100 , 4,150 , RGf,RGb, "3-3: 1 at 49460 T5+ 68 T1+ 56 T2+ 39")
a(49827,100 , 4,150 , RGf,RGb, "3-3: 2 at 49827 T5+ 63 T1- 23 T2+ 32")
a(50055,100 , 4,150 , RGf,RGb, "3-3: 3 at 50055 T5- 1 T1+ 14 T2+ 44")
a(50376,100 , 4,150 , RGf,RGb, "3-3: 4 at 50376 T5- 14 T1- 9 T2+ 40")
a(50652,100 , 4,150 , RGf,RGb, "3-3: 5 at 50652 T5+ 30 T1+ 18 T2+ 80")
a(50983,100 , 4,150 , RGf,RGb, "3-3: 6 at 50983 T5- 4 T1- 3 T2+ 74")
a(51523,100 , 4,150 , RGf,RGb, "3-3: 7 at 51523 T5+ 1 T1+ 19 T2+ 47")
a(51843,100 , 4,150 , RGf,RGb, "CHECK: at 51843 T5+ 26 T1- 2 T2+ 3")
a(52065,100 , 4,150 , RGf,RGb, "3-3 at 52065 T5+170 T1+ 71 T2+362")
A(48570,48780, 4, 4 , RBf,RBb, "I am very much ahead of the","DTC3 navigating these stompers.")
A(48800,49000, 4, 4 , RBf,RBb, "At least I pick up spread shots again.")
A(49030,49300, 4, 4 , RGf,RGb, "There are no bosses in this stage.","There are still durable enemies to kill.")
A(49320,49580, 4, 4 , GBf,GBb, "I also designed my house hallways with","some death traps and repeating stompers!")
A(49600,49850, 4, 4 , RBf,RBb, "Mostly, I just wanted to get through this","place to finish at long, long last.")
A(49870,50100, 4, 4 , RBf,RBb, "I'll just improve it later, I think to","myself. I checked, and couldn't improve.")
A(50150,50400, 4, 4 , RBf,RBb, "Starting around now, there are known","improvements, but only if the RNG behaves.")
A(50420,50620, 4, 4 , RBf,RBb, "I've already looked, and well...","So far, no 'luck' with the RNG.")
A(50640,50900, 4, 4 , RGf,RGb, "A jump takes 71 frames.","4 shots take 25 frames.","Those bombs have 10 HP.")
A(50920,51180, 4, 4 , RBf,RBb, "As jumps take a long time, it's faster","to manipulate more spread shots.")
A(51200,51500, 4, 4 , RBf,RBb, "There's quite a few minuses showing up","in my comparison down there.")
A(51360,51500, 8, 24 , GBf,GBb, "You ARE aware of that, right? ... Right?")
A(51520,51760, 4, 4 , RBf,RBb, "This is my best run with the needed RNG.","There are a few sacrifices needed.")
A(51900,52600, 4, 4 , RGf,RGb,
"This run did beat all DTC3 teams in every stage.",
"There are some scenes where this run is slower,",
"but in total, no full stage was slower,",
"regardless of the compared team.",
"",
"Difficulty of reducing further time is high, for",
"in many stages, there is a frame rule based on an",
"enemy spawn timer. Improving time in those cases",
"mean improving beyond a 31-frame barrier.")
--Stage 3-4
a(52551,100 , 4,150 , RGf,RGb, "CHECK: at 52551 T5 0 T1 0 T2 0")
a(52823,100 , 4,150 , RGf,RGb, "LOCK: at 52823 T5+ 2 T1+ 47 T2 0")
a(53388,100 , 4,150 , RGf,RGb, "Kill: at 53388 T5+ 6 T1+164 T2+130")
a(54523,100 , 4,150 , RGf,RGb, "Victory 54523 T5+ 8 T1+211 T2+130")
S( 52900,53063, 210, 4 , "HP:200")
R2S(53064,53500, 210, 4 , "HP:%3d",0x030003F6)
A(52620,52860, 4, 4 , RGf,RGb, "This is the final stage.")
A(52680,52860, 8, 14 , RBf,RBb, "It's time we finish this.")
A(52740,52860, 8, 24 , GBf,GBb, "This can only end badly.")
A(52880,53100, 4, 4 , RBf,RBb, "The RNG made things... Painful here.","I'm still faster than T5, however.")
A(53120,53450, 4, 4 , RBf,RBb, "Less a matter of lazy luck watching.","Nothing good within 200 'dice rolls'!")
A(53280,53450, 4, 24 , RBf,RBb, "The spot I'm at is the best it'll get.")
A(53480,53700, 4, 4 , GBf,GBb, "In the time it took to explain the","RNG, the boss is already dead.","Means I'm slower than myself!")
A(53720,54000, 4, 4 , RBf,RBb, "I'm not sure if there's a way to speed","this up faster. Without insane luck, anyway.")
A(54020,54200, 4, 4 , RBf,RBb, "Oh well. Thanks for reading these comments.")
A( 54300, 61700, 4, 4 , RGf,RGb,
"Frame counts, from stage end to stage end:",
"",
"### Me |--T5- --T1- --T2- --T4-",
"1-1 7180| 7193 7430 7966 8346 T5- 13",
"1-2 6409| 6762 9911 10289 10357 T5-353",
"1-3 3999| 4056 4121 6511 DNF T5- 57",
"1-4 3755| 3917 4003 4291 T5-162",
"2-1 4200| 4664 4747 5193 T5-464",
"2-2 7327| 7476 7525 7477 T5-149",
"2-3 3587| 3782 3642 3730 T1- 55",
"2-4 2806| 3110 3058 4022 T1-252",
"3-1 5550| 5896 6400 6363 T5-346",
"3-2 3168| 3404 3416 3636 T5-236",
"3-3 4089| 4259 4160 4451 T1- 71",
"3-4 2458| 2466 2669 2588 T5- 8",
"---------+-----------------------",
"END 54523|56985 61082 66517 DNF")
--Provides numbers of where your mouse is.
while true do
-- local n= input.get()
-- gui.text(20,136,n.xmouse)
-- gui.text(40,136,n.ymouse)
emu.frameadvance()
end
-- Suggested screenshots
-- 11991: Escape from the jaws!
-- 31726: Oh, a second alien?