User File #4651470046428950

Upload All User Files

#4651470046428950 - Chatty subtitles for Alien Hominid (3867S)

AHsubs.lua
1357 downloads
Uploaded 2/17/2013 11:05 AM by FatRatKnight (see all 245)
Be warned: The subtitles are awfully chatty. Probability of being distracted from the run is high, recommend a second watching.
Curious how encoders will handle this.
--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?