User File #40567146695756786

Upload All User Files

#40567146695756786 - Quackshot, subtitles extraction assistant

Dooty_Quackshot_ConversionToSubtitles.lua
977 downloads
Uploaded 7/23/2017 10:26 PM by FatRatKnight (see all 245)
#5361: Dooty's Genesis QuackShot: Starring Donald Duck in 19:21.63
The script appears to be working. Just run that submission on the ROM the submission is for, and start this script on the first frame. I can't say with 100% certainty the script is working as intended, but it should be pretty good.
Spikestuff, please let me know if this script is good enough to automate data collection for that lua-assisted subtitles. I've isolated functions that I expect you to change at the very top, and other functions that might need to be changed near the top. Other stuff below includes me trying to hack in the code that will do the stuff, and some ctrl+H stuff to make things work.
--I have no illusion I guessed what output you want.
--This is all the information I could drag out of this script.
--I leave it up to you to modify this to fit what you want.
--By the way, as it is, the files will be sorted by when the subs finish.
local OutputMethod= {
  Text= function(File,Frame,Duration,Left,Top,Str,TextColor,BackColor)
    File:write(string.format("Frame:%7d Len:%4d X:%3d Y:%3d Color:%s BackColor:%s Text:%s\r\n",
      Frame,Duration,Left,Top,TextColor,BackColor,Str
    ))
  end,
  Box= function(File,Frame,Duration,Left,Top,Width,Height,Border,Fill)
    File:write(string.format("Frame:%7d Len:%4d X:%3d Y:%3d W:%3d H:%3d Border:%s Fill:%s\r\n",
      Frame,Duration,Left,Top,Width,Height,Border,Fill
    ))
  end,
  Line= function(File,Frame,Duration,x1,y1,x2,y2,Color)
    File:write(string.format("Frame:%7d Len:%4d X1:%3d Y1:%3d X2:%3d Y2:%3d Color:%s\r\n",
      Frame,Duration,x1,y1,x2,y2,Color
    ))
  end
}

--#############################################################################
--Setting up files. Also a good spot for you to look at.

local TextFile, BoxFile, LineFile, MessyText, MessyBox, err
TextFile ,err= io.open("Subs_TextOutput.txt"   ,"wb"); if err then error(err) end
BoxFile  ,err= io.open("Subs_BoxOutput.txt"    ,"wb"); if err then error(err) end
LineFile ,err= io.open("Subs_LineOutput.txt"   ,"wb"); if err then error(err) end
MessyText,err= io.open("Subs_MessTxtOutput.txt","wb"); if err then error(err) end
MessyBox ,err= io.open("Subs_MessBoxOutput.txt","wb"); if err then error(err) end

--If you want a file pre-merged, something like this can work:
--TextFile ,err= io.open("Subs_TextOutput.txt"   ,"w"); if err then error(err) end
--BoxFile      = TextFile
--LineFile     = TextFile
--MessyText    = TextFile
--MessyBox     = TextFile


--#############################################################################
--Functions whose output I'm not positive on. One more good spot to adjust.

--*****************************************************************************
local function ReplaceSpecialCharacters(t)
--*****************************************************************************
--Some things just ruin our formatting in the output.
--This function serves to replace certain things in the string.

  t= string.gsub(t,"\n","\\n") --NewLine

  return t
end

--*****************************************************************************
local function BlankTextToBox(w,h)
--*****************************************************************************
--Because a blank text is basically a box.
--Of course, default text size couldn't be in integer pixels. Just can't!
--w = Maximum detected characters in a line
--h = Number of detected lines

  return math.floor(w*(7.2)-1), math.floor(h*(13.60)-1.2)
end

--#############################################################################
--I did all this code below just to isolate the interface above.
--If you know lua stuff, enough to debug stuff I do, feel free to look.
--Otherwise, you might want to just leave the below alone.

local ActiveSubs= {}
--ActiveSubs[si] : si, Subtitle Index.
--  .Active   : Finalize resets this to nil. If already nil, Finalize kills it.
--  .Item[i]  : Existing items to the same si index.
--    .frame    : Frame it began existence
--    .File     : Usually the EasyFile, changes to MessyFile if changes noted
--    .Messy    : Output for when things aren't consistent between frames
--    .Out      : Output string, to select method as needed
--    .Params   : Table. Parameters given. Frankly don't care what's in it.
--    .Changed  : Whether or not this had a history of at least one change.

--*****************************************************************************
local function IsBlank(txt)
--*****************************************************************************
--Identifies if there's anything that isn't whitespace in there.
--Returns two parameters: Height and width, in number of characters.
--Returns nil if it detects something that isn't whitespace.
--This is so we know to treat it like a box instead of text.

  local Spaces, Lines, MaxSpaces= 0,1,0
  for i= 1, #txt do
    local s= string.sub(txt,i,i)
    if (s ~= " ") and (s ~= "\n") and (s ~= "\t") then return end
    if s == " " then
      Spaces= Spaces+1
      MaxSpaces= math.max(Spaces,MaxSpaces)
    elseif s == "\t" then --Okay, so you also use horizontal tabs.
      spaces= spaces+8 --TODO: find actual spacing, but it's not important here
      MaxSpaces= math.max(Spaces,MaxSpaces)
    else  --NewLine
      Spaces= 0
      Lines= Lines+1
    end
  end
  return Lines, MaxSpaces
end

--*****************************************************************************
local function ToColor(c)
--*****************************************************************************
  local t= type(c)

--Assume this is colorific.
  if t == "string" then return c end

--Nil works fine, so give something for it.
  if t == "nil"    then return "default" end

--Numbers don't show up how we want in tostring, so format it.
  if t == "number" then return string.format("#%08X",c) end

--I'm out of ideas. And frankly, if we're here, bad news.
  error("Not a recognized color",3)
end

--*****************************************************************************
local function Initialize(i)
--*****************************************************************************
  ActiveSubs[i]= ActiveSubs[i] or {}
  t= ActiveSubs[i]
  t.Active= (t.Active or 0)+1 --If we're given the same index, don't overwrite
  t.Item= t.Item or {}        --the same item!
  t.Item[t.Active]= t.Item[t.Active] or {}
  return t,t.Item[t.Active]
end

--*****************************************************************************
local function CompareTables(t1,t2)
--*****************************************************************************
--I won't bother checking if they are tables to begin with, that's your problem
--Or mine. I'm the one writing the code. Stop reading this and embarrassing me.

  if #t1 ~= #t2 then return false end  --Not equal length, therefore not equal
  for i= 1, #t1 do
    if t1[i] ~= t2[i] then return false end
  end
  return true
end

--*****************************************************************************
local function HandleArbitraryData(index, frame, params, OutStr,EasyFile,MessyFile)
--*****************************************************************************
  local Sub,Item= Initialize(index)

  if Item.frame then
    if CompareTables(Item.Params,params) then
      --Data is identical. No action

    else --Not equal. Ram the output now.
      print("Output: " .. Item.Out)
      OutputMethod[Item.Out](
        Item.Messy,         --Messy, messy...
        Item.frame,         --Time it begins.
        frame-Item.frame,   --Length of time
        unpack(Item.Params) --Stuff. By "luck", I hope it works out.
      )
      Item.frame  = frame
      Item.File   = MessyFile  --No going back from being altered.
      Item.Messy  = MessyFile  --In case we changed files somehow.
      Item.Out    = OutStr
      Item.Params = params
      Item.Changed= true
    end
  else --Initialize item
    Item.frame = frame
    Item.File  = EasyFile
    Item.Messy = MessyFile
    Item.Out   = OutStr
    Item.Params= params --Stuff my extra stuffs in here, yo!
  end
end

--*****************************************************************************
local function FauxRect(index,frame, ...)
--*****************************************************************************
--FauxRect(index,frame,
--  [1]Left,[2]Top,[3]Width,[4]Height,[5]BorderColor,[6]FillColor)
  gui.drawRectangle(...) --visual

  local params= {...}

  params[5]= ToColor(params[5])  --These are colors.
  params[6]= ToColor(params[6])

  HandleArbitraryData(index, frame, params,"Box",MessyBox)
end

--*****************************************************************************
local function FauxBox(index,frame,...)
--*****************************************************************************
--FauxBox(index,frame,
--  [1]Left,[2]Top,[3]Right,[4]Bottom,[5]BorderColor,[6]FillColor)
--Best tweak the right and bottom a bit.
  gui.drawBox(...) --visual

  local params= {...}
  params[3]= params[3] - params[1]  --Get Width
  params[4]= params[4] - params[2]  --Get Height
  params[5]= ToColor(params[5])  --These are colors.
  params[6]= ToColor(params[6])

  HandleArbitraryData(index, frame, params,"Box",BoxFile,MessyBox)
end

--*****************************************************************************
local function FauxLine(index,frame,...)
--*****************************************************************************
--FauxLine(index,frame,
--  [1]x1,[2]y1,[3]x2,[4]y2,[5]Color)
  gui.drawLine(...) --Visual

  local params= {...}
  params[5]= ToColor(params[5])

--Just a note, MessyLine doesn't exist. Hope that ain't called.
  HandleArbitraryData(index, frame, params, "Line",LineFile,MessyLine)
end

--*****************************************************************************
local function FauxText(index,frame,...)
--*****************************************************************************
--FauxText(index,frame,
--  [1]Left,[2]Top,[3]Str,[4]TextColor,[5]BackColor)
  gui.drawText(...) --Visual

  local params= {...}
  params[4]= ToColor(params[4])  --Very colorful, I hope
  params[5]= ToColor(params[5])

--Wait a sec... Let's not call HandleArbitraryData just yet!
  local w,h= IsBlank(params[3])
  if w then --If we have a width, it's a box!!
--FauxRect(index,frame,
--  [1]Left,[2]Top,[3]Width,[4]Height,[5]BorderColor,[6]FillColor)
    --Left and Top are fine.
    params[3],params[4]= BlankTextToBox(w,h)
    --[5] is text:BackColor, which coincides with rect:BorderColor
    params[6]= params[5] --FillColor

    HandleArbitraryData(index, frame, params,"Box",BoxFile,MessyBox)
  else
    params[3]= ReplaceSpecialCharacters(params[3]) --Now replace newlines.
    HandleArbitraryData(index, frame, params,"Text",TextFile,MessyText)
  end
end

--*****************************************************************************
local function Finalize(frame)
--*****************************************************************************
  local c= 0
  for si,Subs in pairs(ActiveSubs) do
  c= c+1
    if Subs.Active then
      Subs.Active= nil
    else
      ActiveSubs[si]= nil --Remove it
      local Items= Subs.Item
      for i= 1, #Items do
        local Item= Items[i]
        print("Output: " .. Item.Out)
        OutputMethod[Item.Out](  --It's about to 'not exist', dump it now!
          Item.File,          --File
          Item.frame,         --When it began
          frame-Item.frame,   --How long it lasted
          unpack(Item.Params) --Stuff
        )
      end  --For each item
    end --Whether the subtitle is active
  end --For each active sub
  gui.text(80,0,c)
end --Function

--*****************************************************************************
local function CloseScript()
--*****************************************************************************
  TextFile:close()
  BoxFile:close()
  LineFile:close()
  MessyText:close()
  MessyBox:close()
  error("Script escape. Time limit exceeded.",0) --Errors close scripts just fine.
end

--#############################################################################
--ctrl+H replacement of various functions, and small insertions.
--Yep, here we are.

local gui= nil --In case I missed more references to the gui. Throw error!
--memory.usememorydomain("EWRAM")

while true do

 local si= 0
 Fct = emu.framecount()
 Dsx = mainmemory.read_s32_be(0xA2D8)
 Dsy = mainmemory.read_s32_be(0xA2DC)
 Dpx = mainmemory.read_u16_be(0xA2D0)
 Dpy = mainmemory.read_u16_be(0xA2D4)
 Scx = mainmemory.read_u16_be(0x852C)
 Scy = mainmemory.read_u16_be(0x8528)
 Hxr = mainmemory.read_u16_be(0x8F5A)
 Hyt = mainmemory.read_u16_be(0x8F54)
 Hyb = mainmemory.read_u16_be(0x8F5E)
 Hxl = mainmemory.read_u16_be(0x8F60)

--Title
  si= si+1; if Fct > 63 and Fct  < 341 then  FauxText(si,Fct,2,164,"One day, Donald found a map inside\none of uncle Scrooge's old books.","white","black");end
  si= si+1; if Fct > 340 and Fct  < 619 then  FauxText(si,Fct,2,164,"Then, he and his nephews got on a plane\nto search for \"The Great Duck Treasure.\"","white","black");end

--Mexico
 si= si+1; if Fct > 649 and Fct  < 3812 then
  si= si+1; if Fct > 650 and Fct < 891 then FauxText(si,Fct,2,164,"Mexico:\nHere Donald will get \"Some Information.\" ");end
  si= si+1; if Fct > 890 and Fct < 1191 then FauxText(si,Fct,2,164,"I assume you already know what a TAS is, \nbut here's the basics just in case.");end
  si= si+1; if Fct > 1190 and Fct < 1491 then FauxText(si,Fct,2,164,"First of all, to keep track of our speed \nand position we watch memory adresses.");end
  si= si+1; if Fct > 1490 and Fct < 1851 then FauxText(si,Fct,2,10,"Speed:\nX: "..Dsx.."\nY: "..Dsy.."\nPosition: \nX: "..Dpx.."\nY: "..Dpy);end
  si= si+1; if Fct > 1884 and Fct < 2185 then FauxText(si,Fct,2,164,"Pretty confusing in real time, isn't it? \nBut TASes are played frame by frame.");end
  si= si+1; if Fct > 2184 and Fct < 2465 then FauxText(si,Fct,2,164,"We no longer rely on reflexes to dodge \nbullets, or jump over bottomless pits.");end
  si= si+1; if Fct > 2464 and Fct < 2745 then FauxText(si,Fct,2,164,"But if a mistake is made, and we know how \nto fix it, save states are there for us.");end
  si= si+1; if Fct > 2746 and Fct < 3089 then FauxText(si,Fct,2,164,"Do you want to know more?\nPlease visit http://TASvideos.org  ");end
  si= si+1; if Fct > 3329 and Fct < 3370 then FauxRect(si,Fct,62,19,191,87,0xFF660000,0xFF660000);
    FauxBox(si,Fct,64,21,251,104,0xFFFF6666)
    FauxText(si,Fct,68,89,"                         ","white","black");
   FauxText(si,Fct,68,24,"\"WITHOUT THE HERO KEY,  \n THE DOOR WON'T OPEN.\n\n AN EXPLORER WENT TO \n DUCKBURG WITH IT.\"","white","black");end
  si= si+1; if Fct > 3369 and Fct < 3595 then FauxRect(si,Fct,62,19,191,87,0x55660000,0x55660000);
    FauxBox(si,Fct,64,21,251,104,0xFFFF6666)
   FauxText(si,Fct,68,24,"\"WITHOUT THE HERO KEY,  \n THE DOOR WON'T OPEN.\n\n AN EXPLORER WENT TO \n DUCKBURG WITH IT.\"","white",0x00000000);end
  si= si+1; if Fct > 3622 and Fct < 3811 then FauxText(si,Fct,10,164,"Mexico: 159 frames saved. \nTotal : 159 frames ahead.");end
 end

--Duckburg
 si= si+1; if Fct > 3839 and Fct < 5402 then
  si= si+1; if Fct > 3840 and Fct < 4081 then FauxText(si,Fct,2,164,"Duckburg:\nHere Donald will take the \"Hero Key.\" "); end
  si= si+1; if Fct > 4080 and Fct < 4381 then FauxText(si,Fct,2,164,"Even being the smallest stage of the game, \nquite some time was saved here." ); end
  si= si+1; if Fct > 5200 and Fct < 5401 then FauxText(si,Fct,2,164,"Duckburg:  27 frames saved. \nTotal   : 186 frames ahead."); end
  si= si+1; if Fct > 4885 and Fct < 4957 then FauxRect(si,Fct,64,9,191,71,0xFF660066,0xFF660066);
    FauxBox(si,Fct,66,11,253,78,0xFFCC00CC)
    FauxText(si,Fct,70,63,"                         ","white","black");
    FauxText(si,Fct,70,14,"\"PLEASE TAKE THIS KEY.  \n\n I DON'T NEED TO GO TO\n THE RUINS ANYMORE.\"\n","white","black");end
  si= si+1; if Fct > 4956 and Fct < 5175 then FauxRect(si,Fct,64,9,191,71,0x55660066,0x55660066);
    FauxBox(si,Fct,66,11,253,78,0xFFCC00CC)
    FauxText(si,Fct,70,14,"\"PLEASE TAKE THIS KEY.  \n\n I DON'T NEED TO GO TO\n THE RUINS ANYMORE.\"\n","white",0X00000000);end
 end

--Mexico
 si= si+1; if Fct > 5429 and Fct < 10474 then
 Act = mainmemory.read_u16_be(0xA2E6)
  si= si+1; if Fct > 5430 and Fct < 5751 then FauxText(si,Fct,2,164,"Mexico:\nHere Donald will get the \"Red Plunger.\" "); end
  si= si+1; if Fct > 5784 and Fct < 7305 then FauxText(si,Fct,2,10,"Actions: "..Act.." "); end
  si= si+1; if Fct > 5784 and Fct < 6165 then FauxText(si,Fct,2,164,"I don't fully understand this address, \nbut it was helpful to create this TAS."); end
  si= si+1; if Fct > 6164 and Fct < 6545 then FauxText(si,Fct,2,164,"It controls some of Donald's actions, \nlike recover from damage animation."); end
  si= si+1; if Fct > 6544 and Fct < 6925 then FauxText(si,Fct,2,164,"The Belly Slide is also controlled by this \ntimer making it easier to start a new one."); end
  si= si+1; if Fct > 6924 and Fct < 7305 then FauxText(si,Fct,2,164,"In the previous run it was not found, \nso there's less trial and error now."); end
  si= si+1; if Fct > 7564 and Fct < 7945 then FauxText(si,Fct,2,164,"In this stage Donald must do something he \ndoesn't do very often; go to the left."); end
  si= si+1; if Fct > 7944 and Fct < 8325 then FauxText(si,Fct,2,164,"Not really a big deal, but I don't know \nwhy Donald moves so fast to the left."); end
  si= si+1; if Fct > 8472 and Fct < 8614 then FauxRect(si,Fct,58,95,191,71,0xFF004C99,0xFF004C99);
    FauxBox(si,Fct,60,97,247,164,0xFF0080FF)
    FauxText(si,Fct,64,149,"                         ","white","black");
    FauxText(si,Fct,64,100,"\"I FOUND THIS PLUNGER.  \n\n HERE, USE IT TO MEET\n GYRO IN DUCKBURG.\" ","white","black");end
  si= si+1; if Fct > 8613 and Fct < 8753 then FauxRect(si,Fct,58,95,191,71,0x55004C99,0x55004C99);
    FauxBox(si,Fct,60,97,247,164,0xFF0080FF)
    FauxText(si,Fct,64,100,"\"I FOUND THIS PLUNGER.  \n\n HERE, USE IT TO MEET\n GYRO IN DUCKBURG.\" ","white",0X00000000);end
  si= si+1; if Fct > 8862 and Fct < 9031 then FauxText(si,Fct,2,164,"Avoid this green block was not so hard..."); end
  si= si+1; if Fct > 9030 and Fct < 9199 then FauxText(si,Fct,2,164,"...but this one still needs to be shot."); end
  si= si+1; if Fct > 9272 and Fct < 9513 then FauxText(si,Fct,2,164,"Hit boxes are really useful sometimes, \nlike when Donald goes underground.");end
   si= si+1; if Fct > 9512 and Fct < 9815 then FauxBox(si,Fct,Hxl-Scx,Hyt-Scy,Hxr-Scx,Hyb-Scy,"blue"); end
  si= si+1; if Fct > 9816 and Fct < 9959 then FauxText(si,Fct,2,164,"How to go underground:\npress Up\+Down on ladders. "); end
  si= si+1; if Fct > 9992 and Fct < 10257 then FauxText(si,Fct,2,164,"Trivia: Donald made his debut in the 1934 \nshort film \"The Wise Little Hen.\""); end
  si= si+1; if Fct > 10284 and Fct < 10473 then FauxText(si,Fct,2,164,"Mexico: 168 frames saved. \nTotal : 354 frames ahead."); end
 end

--Duckburg
 si= si+1; if Fct > 10501 and Fct < 16144 then
 if Hyt > 10000 then Hyt = 1; end
  si= si+1; if Fct > 10502 and Fct < 10725 then FauxText(si,Fct,2,164,"Duckburg:\nHere Donald will take the \"Bubblegum Ammo.\" "); end
  si= si+1; if Fct > 10758 and Fct < 11139 then FauxText(si,Fct,2,164,"One of the new tricks, the \"Long Jump,\" \nadds a lot of speed to Donald's jumps."); end
  si= si+1; if Fct > 11138 and Fct < 11519 then FauxText(si,Fct,2,164,"But some times you can only do a normal \njump as it needs some room to perform."); end
  si= si+1; if Fct > 11518 and Fct < 11724 then FauxText(si,Fct,2,164,"You must press C\+Down to Belly Slide, \njump and then hold C\+Down."); end
  si= si+1; if Fct > 11756 and Fct < 12105 then FauxText(si,Fct,2,164,"There's a long zip-line section coming, \nand the only thing to do is hang on..."); end
  si= si+1; if Fct > 12104 and Fct < 12361 then FauxText(si,Fct,2,164,"Um... what about that hit box again?\nIt'll sure make it more entertaining. ");end
   si= si+1; if Fct > 12104 and Fct < 14583 then FauxBox(si,Fct,Hxl-Scx,Hyt-Scy,Hxr-Scx,Hyb-Scy,"blue");end
  si= si+1; if Fct > 12476 and Fct < 12755 then FauxText(si,Fct,2,164,"Ah, I've got something else to show; \nthe long jump seems to have a buffer.");end
  si= si+1; if Fct > 12476 and Fct < 13245 then FauxText(si,Fct,Hxl-Scx,Hyb-Scy,"X:"..string.sub(Dsx,1,2).." ");end
  si= si+1; if Fct > 12754 and Fct < 13037 then FauxText(si,Fct,2,164,"Donald jumped from the last zip-line \nwith a speed of 19."); end
  si= si+1; if Fct > 13036 and Fct < 13245 then FauxText(si,Fct,2,164,"Now it's back to a normal zip-line \njumping speed of 15."); end
  si= si+1; if Fct > 13293 and Fct < 13398 then FauxRect(si,Fct,59,17,191,87,0xFF660066,0xFF660066);
    FauxBox(si,Fct,61,19,248,102,0xFFCC00CC)
    FauxText(si,Fct,65,87,"                         ","white","black");
    FauxText(si,Fct,65,22,"\"DONALD, PLEASE TRY OUT\n MY NEW BUBBLEGUM AMMO.\n\n WITH IT, YOU CAN BREAK\n WALLS IN TRANSYLVANIA.\" ","white","black");end
  si= si+1; if Fct > 13397 and Fct < 13573 then FauxRect(si,Fct,59,17,191,87,0x55660066,0x55660066);
    FauxBox(si,Fct,61,19,248,102,0xFFCC00CC)
    FauxText(si,Fct,65,22,"\"DONALD, PLEASE TRY OUT\n MY NEW BUBBLEGUM AMMO.\n\n WITH IT, YOU CAN BREAK\n WALLS IN TRANSYLVANIA.\" ","white",0x00000000);end
  si= si+1; if Fct > 14300 and Fct < 14581 then FauxText(si,Fct,2,164,"There are two more stages with zip-lines, \nand I'll try to use that \"buffer\" again."); end
  si= si+1; if Fct > 14740 and Fct < 14981 then FauxText(si,Fct,2,164,"Are you wondering why this ladder was \nnot used to go underground here?"); end
  si= si+1; if Fct > 14980 and Fct < 15221 then FauxText(si,Fct,2,164,"It's not possible to reach the start\nof this stage doing the Ladder Trick. "); end
  si= si+1; if Fct > 15220 and Fct < 15461 then FauxText(si,Fct,2,164,"Not really useful, but he can go to the \nzip-line section while down there."); end
  si= si+1; if Fct > 15685 and Fct < 15949 then FauxText(si,Fct,2,164,"Trivia: Donald's full name is \n\"Donald Fauntleroy Duck.\""); end
  si= si+1; if Fct > 15976 and Fct < 16143 then FauxText(si,Fct,2,164,"Duckburg: 149 frames saved. \nTotal   : 503 frames ahead."); end
 end

--Transylvania
 si= si+1; if Fct > 16175 and Fct < 26188 then
 Bss = mainmemory.read_u8(0x9039)
  si= si+1; if Fct > 16176 and Fct < 16417 then FauxText(si,Fct,2,164,"Transylvania:\nHere Donald gets the \"Real Treasure Map.\" "); end
  si= si+1; if Fct > 16416 and Fct < 16717 then FauxText(si,Fct,2,164,"Jump just to shoot an enemy was one \nof many mistakes of the old run."); end
  si= si+1; if Fct > 16716 and Fct < 17017 then FauxText(si,Fct,2,164,"Now I'm trying to plan farther ahead \nand shoot whenever I have to jump."); end
  si= si+1; if Fct > 17285 and Fct < 17443 then FauxRect(si,Fct,130,12,175,63,0xFF006600,0xFF006600);
    FauxBox(si,Fct,132,14,303,73,0xFF66CC00)
    FauxText(si,Fct,136,58,"                       ","white","black");
    FauxText(si,Fct,136,17,"\"WOW! THIS IS THE     \n FAMOUS DRACULA'S\n CASTLE....\"\n ","white","black");end
  si= si+1; if Fct > 17476 and Fct < 17777 then FauxText(si,Fct,2,164,"Pausing before a chat is older than \nthe old run, but it's still useful."); end
  si= si+1; if Fct > 18236 and Fct < 18537 then FauxText(si,Fct,2,164,"There are places where it would just \nwaste time to avoid damage..."); end
  si= si+1; if Fct > 18536 and Fct < 18837 then FauxText(si,Fct,2,164,"...but waiting here saves 15 frames \ncompared to taking damage."); end
  si= si+1; if Fct > 18978 and Fct < 19191 then FauxText(si,Fct,2,164,"The Long Jump is even more effective \nunderwater. "); end
  si= si+1; if Fct > 19426 and Fct < 19727 then FauxText(si,Fct,2,164,"Here's a place where it's easy to avoid \ntaking damage but it's not worth it."); end
  si= si+1; if Fct > 20300 and Fct < 20541 then FauxText(si,Fct,2,164,"If you import the old run into BizHawk, \nyou'll get a desync at this point."); end
  si= si+1; if Fct > 20540 and Fct < 20893 then FauxText(si,Fct,2,164,"There is much more lag in this stage now, \nbut I tried to reduce it when possible."); end
  si= si+1; if Fct > 21584 and Fct < 21885 then FauxText(si,Fct,2,164,"The strategy used in this section comes \nfrom the RTA World Record of Quack Shot."); end
  si= si+1; if Fct > 22130 and Fct < 22471 then FauxText(si,Fct,2,164,"The RTA runner jumps inside this wall and  \nDonald zips to the end of this area."); end
  si= si+1; if Fct > 22656 and Fct < 22957 then FauxText(si,Fct,2,164,"The drawback; he dies in the process... \nStill, faster than the old strategy."); end
  si= si+1; if Fct > 23278 and Fct < 23369 then FauxText(si,Fct,2,164,"Boss: \nDracula. "); end
  si= si+1; if Fct > 23400 and Fct < 23641 then FauxText(si,Fct,2,164,"Dracula: But enough talk... \nHave at you!"); end
  si= si+1; if Fct > 23400 and Fct < 25535 then   FauxRect(si,Fct,2,8,84,18,0xFFFF6666,0xFF660000);
   FauxText(si,Fct,5,11,"Dracula: "..Bss.." ","white","black");end
  si= si+1; if Fct > 23640 and Fct < 23921 then FauxText(si,Fct,2,164,"Donald: Die monster.\nYou don't belong in this world! "); end
  si= si+1; if Fct > 25544 and Fct < 25675 then FauxRect(si,Fct,58,9,191,71,0xFF006600,0xFF006600);
    FauxBox(si,Fct,60,11,247,78,0xFF66CC00)
    FauxText(si,Fct,64,63,"                         ","white","black");
    FauxText(si,Fct,64,14,"\n DONALD TAKES THE REAL  \n TREASURE MAP.\n\n","white","black");end
  si= si+1; if Fct > 25708 and Fct < 25971 then FauxText(si,Fct,2,164,"Trivia: In the Kingdom Hearts series, \nDonald has the highest Magic stat."); end
  si= si+1; if Fct > 26000 and Fct < 26187 then FauxText(si,Fct,2,164,"Transylvania:  603 frames saved. \nTotal       : 1176 frames ahead."); end
 end

--Maharajah
 si= si+1; if Fct > 26219 and Fct < 31006 then
 Tux = mainmemory.read_u16_be(0x90D0)
 Tuy = mainmemory.read_u16_be(0x90D4)
 Tup = mainmemory.read_u16_be(0x90C4)
 if Tup < 2 then Tuh = 15 else Tuh = 1; end
 Bss = mainmemory.read_u8(0x9038)
  si= si+1; if Fct > 26220 and Fct < 26461 then FauxText(si,Fct,2,164,"Maharajah:\nHere Donald will get the \"Sphinx Tear.\" "); end
  si= si+1; if Fct > 26460 and Fct < 26741 then FauxText(si,Fct,2,164,"As you can see, I won't collect all five \nPeppers here, just four of them."); end
  si= si+1; if Fct > 26740 and Fct < 27021 then FauxText(si,Fct,2,164,"Why not? Well, the Peppers are not so \nuseful here as they were in Duckburg."); end
  si= si+1; if Fct > 27020 and Fct < 27321 then FauxText(si,Fct,2,164,"And in Egypt they are pretty much useless \nsince the last one is almost at the end."); end
  si= si+1; if Fct > 27404 and Fct < 27599 then FauxRect(si,Fct,130,11,175,79,0xFF006600,0xFF006600);
    FauxBox(si,Fct,132,13,303,88,0xFF66CC00)
    FauxText(si,Fct,136,73,"                       ","white","black");
    FauxText(si,Fct,136,17,"\"WOW! THIS IS THE     \n BIG MAHARAJARA'S\n PALACE...\"\n\n ","white","black");end
  si= si+1; if Fct > 27632 and Fct < 27827 then FauxText(si,Fct,2,164,"More hit box fun, \nfor every one!");
    FauxBox(si,Fct,110,130,142,162,"red");end
  si= si+1; if Fct > 27632 and Fct < 28757 then FauxBox(si,Fct,Hxl-Scx,Hyt-Scy,Hxr-Scx,Hyb-Scy,"blue");end
  si= si+1; if Fct > 27860 and Fct < 28095 then FauxText(si,Fct,2,164,"In most places jumping around ledges \nis slower than falling off of them."); end
  si= si+1; if Fct > 28128 and Fct < 28349 then FauxText(si,Fct,2,164,"Shooting makes Donald's hit box smaller, \nbut it was overlooked in the old run.");
   FauxBox(si,Fct,Tux-15-Scx,Tuy-15-Tuh-Scy,Tux+15-Scx,Tuy-Scy,"red");end
  si= si+1; if Fct > 28383 and Fct < 28637 then FauxBox(si,Fct,144-Scx,464-Scy,176-Scx,460-Scy,"red");
   FauxText(si,Fct,103-Scx,355-Scy,"a small hit box \n       V")end
  si= si+1; if Fct > 28790 and Fct < 29071 then FauxText(si,Fct,2,164,"Not using the Peppers in Maharajah forced \nme to find better ways to kill some foes."); end
  si= si+1; if Fct > 29148 and Fct < 29243 then FauxText(si,Fct,2,164,"Boss:\nShere Khan. "); end
  si= si+1; if Fct > 29274 and Fct < 29755 then   FauxRect(si,Fct,2,8,105,18,0xFFFFB266,0xFFCC6600);
   FauxText(si,Fct,5,11,"Shere Khan: "..Bss.." ","white","black");end
  si= si+1; if Fct > 29274 and Fct < 29515 then FauxText(si,Fct,2,164,"Shere Khan: Did you think \nI would let you grow old?"); end
  si= si+1; if Fct > 29514 and Fct < 29755 then FauxText(si,Fct,2,164,"Donald: You don't scare me! \nI don't run from anyone!");end
  si= si+1; if Fct > 30301 and Fct < 30485 then FauxRect(si,Fct,64,11,191,71,0xFF990000,0xFF990000);
    FauxBox(si,Fct,66,13,253,80,0xFFFF3333)
    FauxText(si,Fct,70,65,"                         ","white","black");
    FauxText(si,Fct,70,16,"\"AS I PROMISED, I WILL  \n GIVE YOU THE SPHINX\n TEAR.\"\n\n","white","black");end
  si= si+1; if Fct > 30518 and Fct < 30781 then FauxText(si,Fct,2,164,"Trivia: In Finland, Donald's comics were \nbanned due to \"inappropriate clothing.\""); end
  si= si+1; if Fct > 30810 and Fct < 31005 then FauxText(si,Fct,2,164,"Maharajah:   83 frames slower. \nTotal    : 1093 frames  ahead."); end
 end

--Egypt 
 si= si+1; if Fct > 31035 and Fct < 38176 then
  si= si+1; if Fct > 31036 and Fct < 31277 then FauxText(si,Fct,2,164,"Egypt:\nHere Donald will get the \"Scepter of Ra.\" "); end
  si= si+1; if Fct > 31276 and Fct < 31557 then FauxText(si,Fct,2,164,"And here we are with a strategy that will \nput these Peppers to good use at last."); end
  si= si+1; if Fct > 31742 and Fct < 32021 then FauxText(si,Fct,2,164,"The Long Jump was found here during \na \"play around\" to enter this door."); end
  si= si+1; if Fct > 32054 and Fct < 32335 then FauxText(si,Fct,2,164,"By the way, you can not enter this door \nbefore the flag is set, not matter what."); end
  si= si+1; if Fct > 32778 and Fct < 33059 then FauxText(si,Fct,2,164,"Here you can jump at the top of this \nladder, but in Mexico you can not."); end
  si= si+1; if Fct > 33212 and Fct < 33493 then FauxText(si,Fct,2,164,"I almost forgot to say it, but shooting \nafter a Long Jump makes it even faster."); end
  si= si+1; if Fct > 33492 and Fct < 33773 then FauxText(si,Fct,2,164,"So, if you see me shooting for no apparent \nreason, it is to gain that extra boost."); end
  si= si+1; if Fct > 34212 and Fct < 34493 then FauxText(si,Fct,2,164,"It's also kinda late to say it, but it's \nnot possible to slide on steep slopes."); end
  si= si+1; if Fct > 34492 and Fct < 34773 then FauxText(si,Fct,2,164,"And without a slide, it's impossible to \nstart a new Power Walk, unfortunately."); end
  si= si+1; if Fct > 35570 and Fct < 35667 then FauxText(si,Fct,2,164,"How to Power Walk:\nPress C\+Down then Up\+Down\+Right\+A\+C "); end
  si= si+1; if Fct > 35905 and Fct < 35911 then FauxRect(si,Fct,60,16,191,71,0xFF006600,0xFF006600);
    FauxBox(si,Fct,62,18,249,85,0xFF66CC00)
    FauxText(si,Fct,66,70,"                         ","white","black");
    FauxText(si,Fct,66,21,"\n DONALD GETS THE        \n SCEPTER OF RA.\n\n","white","black");end
  si= si+1; if Fct > 35910 and Fct < 36135 then FauxRect(si,Fct,60,16,191,71,0x55006600,0x55006600);
    FauxBox(si,Fct,62,18,249,85,0xFF66CC00)
    FauxText(si,Fct,66,21,"\n DONALD GETS THE\n SCEPTER OF RA.","white",0x00000000);end
  si= si+1; if Fct > 36494 and Fct < 36795 then FauxText(si,Fct,2,164,"Wow, Egypt is a huge stage! The Hideout \nis longer, but there we have a boss..."); end
  si= si+1; if Fct > 37220 and Fct < 37519 then FauxText(si,Fct,2,164,"If you go slower at the end Donald starts \na death animation but doesn't lose a life."); end
  si= si+1; if Fct > 37696 and Fct < 37959 then FauxText(si,Fct,2,164,"Trivia: Donald has black eyes and \nsuffers from color blindness."); end
  si= si+1; if Fct > 37986 and Fct < 38175 then FauxText(si,Fct,2,164,"Egypt:  696 frames saved.\nTotal: 1789 frames ahead."); end
 end

--Southpole
 si= si+1; if Fct > 38205 and Fct < 39810 then
  si= si+1; if Fct > 38206 and Fct < 38447 then FauxText(si,Fct,2,164,"South Pole:\nHere donald will take the \"Viking Key.\" "); end
  si= si+1; if Fct > 38446 and Fct < 38727 then FauxText(si,Fct,2,164,"Another small stage full of improvements; \na lot more damage was taken, for example."); end
  si= si+1; if Fct > 38726 and Fct < 39007 then FauxText(si,Fct,2,164,"The trick to collect the Viking Key and \ncall the Airplane was also improved."); end
  si= si+1; if Fct > 39491 and Fct < 39599 then FauxRect(si,Fct,58,12,191,71,0xFF006600,0xFF006600);
    FauxBox(si,Fct,60,14,247,81,0xFF66CC00)
    FauxText(si,Fct,64,66,"                         ","white","black");
    FauxText(si,Fct,64,17," DONALD TAKES THE       \n VIKING KEY.\n\n\n","white","black");end
  si= si+1; if Fct > 39626 and Fct < 39809 then FauxText(si,Fct,2,164,"South Pole:  113 frames saved.\nTotal     : 1902 frames ahead."); end
 end

--Viking Ship 
 si= si+1; if Fct > 39839 and Fct < 45694 then
 Bss = mainmemory.read_u8(0x92A1)
 Pla = mainmemory.read_s16_be(0x90D4)-16
  si= si+1; if Fct > 39840 and Fct < 40081 then FauxText(si,Fct,2,164,"Viking Ship:\nHere Donald will take the \"Green Plunger.\" "); end
  si= si+1; if Fct > 40080 and Fct < 40361 then FauxText(si,Fct,2,164,"Plungers... not the best ammo of the game, \nthen, why is it the most used one?"); end
  si= si+1; if Fct > 40360 and Fct < 40641 then FauxText(si,Fct,2,164,"The reason is pretty simple; it's not \npossible to manipulate enemy drops."); end
  si= si+1; if Fct > 40800 and Fct < 41081 then FauxText(si,Fct,2,164,"Gunshots interupt some of the other sound \neffects, but the opposite is also true."); end
  si= si+1; if Fct > 41594 and Fct < 41875 then FauxText(si,Fct,2,164,"Remember the speed buffer? It's impossible \nto use it here, but I'll keep trying."); end
  si= si+1; if Fct > 41990 and Fct < 42271 then FauxText(si,Fct,2,164,"Some platforms drop your speed to zero. \nYou must slowdown a bit to avoid it.");
   FauxText(si,Fct,2629-Scx,Pla-Scy,"STOP!");end
  si= si+1; if Fct > 42412 and Fct < 42557 then FauxText(si,Fct,2,164,"Hit boxes, again? ");
   FauxBox(si,Fct,Hxl-Scx,Hyt-Scy,Hxr-Scx,Hyb-Scy,"blue");
    FauxBox(si,Fct,314-Scx,130,330-Scx,176,"red");end
  si= si+1; if Fct > 42720 and Fct < 43001 then FauxText(si,Fct,2,164,"I have been saving Popcorn Ammo for some \ntime and it's time to find out why."); end
  si= si+1; if Fct > 43286 and Fct < 43369 then FauxText(si,Fct,2,164,"Boss:\nViking Ghost."); end
  si= si+1; if Fct > 43402 and Fct < 44931 then   FauxRect(si,Fct,2,8,120,18,0xFFC0C0C0,0xFF606060);
   FauxText(si,Fct,5,11,"Viking Ghost: "..Bss.." ","white","black");end
  si= si+1; if Fct > 43402 and Fct < 43683 then FauxText(si,Fct,2,164,"Viking Ghost:\nLet another's wounds be your warning. "); end
  si= si+1; if Fct > 43682 and Fct < 43963 then FauxText(si,Fct,2,164,"Donald:\nOverconfidence has brought many to death. "); end
  si= si+1; if Fct > 45104 and Fct < 45477 then FauxRect(si,Fct,62,24,191,87,0xFF990000,0xFF990000);
    FauxBox(si,Fct,64,26,251,109,0xFFFF3333)
    FauxText(si,Fct,68,94,"                         ","white","black");
    FauxText(si,Fct,68,29,"\"WITH THIS PLUNGER,\n THE CHASM NEAR THE\n SOUTH POLE SHALL NOT\n STOP YOU FROM FINDING  \n THE VIKING DIARY.\"","white","black");end
  si= si+1; if Fct > 45502 and Fct < 45693 then FauxText(si,Fct,2,164,"Viking Ship:  220 frames saved.\nTotal      : 2122 frames ahead."); end
 end

--South Pole 
 si= si+1; if Fct > 45725 and Fct < 99999 then
  si= si+1; if Fct > 45726 and Fct < 45921 then FauxText(si,Fct,2,164,"South Pole:\nHere Donald will take the \"Viking Diary.\" "); end
  si= si+1; if Fct > 45954 and Fct < 46255 then FauxText(si,Fct,2,164,"The Long Jump buffer, as one would expect, \ndoesn't work with Green Plungers."); end
  si= si+1; if Fct > 46254 and Fct < 46555 then FauxText(si,Fct,2,164,"In any case, it's a good idea to grab the \nPlunger as high as you possibly can."); end
  si= si+1; if Fct > 46554 and Fct < 46855 then FauxText(si,Fct,2,164,"Why? Well, that's the height you're going \nto release the Plunger no matter what."); end
  si= si+1; if Fct > 46854 and Fct < 47135 then FauxText(si,Fct,2,164,"I'll freeze his hit box at the position \nhe will release it as an example.");end
  si= si+1; if Fct > 47134 and Fct < 47415 then FauxText(si,Fct,2,164,"If I jump, take damage or go all the way\ndown, Donald appears at the green square. ");end
  si= si+1; if Fct > 46854 and Fct < 48355 then FauxBox(si,Fct,Hxl-Scx,Hyt-Scy,Hxr-Scx,Hyb-Scy,"blue");end
  si= si+1; if Fct > 46854 and Fct < 48299 then FauxBox(si,Fct,Hxl-Scx,330-Scy,Hxr-Scx,314-Scy,"green");end
  si= si+1; if Fct > 48382 and Fct < 48491 then FauxText(si,Fct,2,164,"How to Get Low:\nPress Up\+Down on Birds. "); end
  si= si+1; if Fct > 48522 and Fct < 48803 then FauxText(si,Fct,2,164,"Here comes a barrage of Long Jumps! \nI'll shut up for a while, enjoy. "); end
  si= si+1; if Fct > 50032 and Fct < 50313 then FauxText(si,Fct,2,164,"New South Pole skip strategy, and again, \nit's from the RTA World Record."); end
  si= si+1; if Fct > 50544 and Fct < 50550 then FauxRect(si,Fct,64,9,191,71,0xFF006600,0xFF006600);
    FauxBox(si,Fct,66,11,253,78,0xFF66CC00)
    FauxText(si,Fct,70,63,"                         ","white","black");
    FauxText(si,Fct,70,14,"\n DONALD TAKES THE       \n VIKING DIARY.\"\n\n","white","black");end
  si= si+1; if Fct > 50549 and Fct < 50752 then FauxRect(si,Fct,64,9,191,71,0x55006600,0x55006600);
    FauxBox(si,Fct,66,11,253,78,0xFF66CC00)
    FauxText(si,Fct,70,14,"\n DONALD TAKES THE       \n VIKING DIARY.\"\n\n","white",0X00000000);end
  si= si+1; if Fct > 51135 and Fct < 51401 then FauxRect(si,Fct,103,7,215,79,0xFF990000,0xFF990000);
    FauxBox(si,Fct,105,9,316,84,0xFFFF3333)
    FauxText(si,Fct,108,68,"                             ","white","black");
    FauxText(si,Fct,108,12,"\"DONALD, IF YOU WANT TO\n SAVE YOUR NEPHEWS, YOU'D   \n BETTER GIVE ME THAT\n TREASURE MAP AND DIARY!\"\n  ","white","black");
    FauxLine(si,Fct,315,10,315,83,0xFF990000);
    FauxLine(si,Fct,314,10,314,83,0xFF990000);end
  si= si+1; if Fct > 51498 and Fct < 51671 then FauxText(si,Fct,2,164,"South Pole:  203 frames saved.\nTotal     : 2325 frames ahead."); end
 end

--Hideout 
 si= si+1; if Fct > 51703 and Fct < 99999 then
 Bss = mainmemory.read_u8(0x90F9)
  si= si+1; if Fct > 51704 and Fct < 51945 then FauxText(si,Fct,2,164,"Hideout:\nHere Donald gets back the \"Viking Diary.\" "); end
  si= si+1; if Fct > 51944 and Fct < 52225 then FauxText(si,Fct,2,164,"That's right, Donald won't get the \n\"Map\" back as Pete has promised..."); end
  si= si+1; if Fct > 52224 and Fct < 52505 then FauxText(si,Fct,2,164,"...otherwise it would be possible to go \nback to \"Duckburg,\" for example."); end
  si= si+1; if Fct > 52798 and Fct < 53079 then FauxText(si,Fct,2,164,"Like in South Pole, Donald releases the \nPlunger as high as he grabbed it.");end
  si= si+1; if Fct > 52798 and Fct < 53181 then FauxBox(si,Fct,Hxl-Scx,Hyt-Scy,Hxr-Scx,Hyb-Scy,"blue");
   FauxText(si,Fct,Hxl-Scx,Hyb-Scy,"H:"..Dpy.." ");end
  si= si+1; if Fct > 53280 and Fct < 53561 then FauxText(si,Fct,2,164,"It's possible to shoot upward and keep \nall your speed while doing so."); end
  si= si+1; if Fct > 53560 and Fct < 53841 then FauxText(si,Fct,2,164,"This is a pretty basic trick, but I just \nfound it at this point in the run."); end
  si= si+1; if Fct > 53866 and Fct < 53959 then FauxText(si,Fct,2,164,"How to Shoot Up:\nPress Right\+A\+B\+C then Up\+Down\+C "); end
  si= si+1; if Fct > 53994 and Fct < 54275 then FauxText(si,Fct,2,164,"The physics of these mine carts and how \nit messes with Donald's speed is crazy."); end
  si= si+1; if Fct > 53994 and Fct < 54581 then FauxText(si,Fct,Hxl-Scx,Hyb-Scy,"X:"..string.sub(Dsx,1,2).." ");
   FauxBox(si,Fct,Hxl-Scx,Hyt-Scy,Hxr-Scx,Hyb-Scy,"blue");end
  si= si+1; if Fct > 54734 and Fct < 55015 then FauxText(si,Fct,2,164,"Thanks to faster movements, one phase of \nthese moving platforms is now skipped."); end
  si= si+1; if Fct > 55014 and Fct < 55295 then FauxText(si,Fct,2,164,"Something I have tried for quite some time \nin the old run, but couldn't make happen."); end
  si= si+1; if Fct > 56120 and Fct < 56401 then FauxText(si,Fct,2,164,"There are Big Bad Pete faces everywhere.\nI wonder what \"B.B.P\" stands for though... "); end
  si= si+1; if Fct > 56932 and Fct < 57213 then FauxText(si,Fct,2,164,"The muscle bound thugs are invincible, \nso it's faster to just take damage."); end
  si= si+1; if Fct > 99999 and Fct < 99999 then FauxText(si,Fct,2,164,""); end
  si= si+1; if Fct > 99999 and Fct < 99999 then FauxText(si,Fct,2,164,""); end
  si= si+1; if Fct > 57240 and Fct < 57339 then FauxText(si,Fct,2,164,"Boss:\nBig Bad Pete. "); end
  si= si+1; if Fct > 57646 and Fct < 61031 then   FauxRect(si,Fct,2,8,120,18,0xFF0080FF,0xFF0000CC);
   FauxText(si,Fct,5,11,"Big Bad Pete: "..Bss.." ","white","black");end
  si= si+1; if Fct > 57400 and Fct < 57647 then FauxRect(si,Fct,63,10,191,71,0xFF60000CC,0xFF0000CC);
    FauxBox(si,Fct,65,12,252,79,0xFF0080FF)
    FauxText(si,Fct,69,64,"                         ","white","black");
    FauxText(si,Fct,69,15,"\"IF YOU DEFEAT ME,\n I'LL GIVE YOU THE MAP  \n AND THE VIKING DIARY.\n HA,HA,HA...\"\n","white","black");end
  si= si+1; if Fct > 57646 and Fct < 57926 then FauxText(si,Fct,2,164,"Donald: You won't trick me, Pete! \nI know you don't have any map. "); end
  si= si+1; if Fct > 61176 and Fct < 61429 then FauxText(si,Fct,2,164,"Hideout:  321 frames saved.\nTotal  : 2646 frames ahead."); end
  si= si+1; if Fct > 99999 and Fct < 99999 then FauxText(si,Fct,2,164,""); end
 end

--The Island 
 si= si+1; if Fct > 61461 and Fct < 69716 then
 Bss = mainmemory.read_u8(0x9079)
  si= si+1; if Fct > 61462 and Fct < 61703 then FauxText(si,Fct,2,164,"The Island:\nHere Donald finally beats \"The Guardian.\" "); end
  si= si+1; if Fct > 61702 and Fct < 61983 then FauxText(si,Fct,2,164,"When a video of a guy beating him in one \nphase was shown, little detail was given."); end
  si= si+1; if Fct > 61982 and Fct < 62263 then FauxText(si,Fct,2,164,"It was all figured out and explained much \nlater, after the old run was published."); end
  si= si+1; if Fct > 62262 and Fct < 62543 then FauxText(si,Fct,2,164,"Now, imagine how frustrating it is to know \nthat your TAS is not on par with an RTA...");end
  si= si+1; if Fct > 62542 and Fct < 62823 then FauxText(si,Fct,2,164,"Please don't get me wrong, I'm not saying \n\"TASes must be better,\" no, it's not it."); end
  si= si+1; if Fct > 62822 and Fct < 63103 then FauxText(si,Fct,2,164,"But since it uses all sorts of tools, \nit should at a very least be faster."); end
  si= si+1; if Fct > 63580 and Fct < 63861 then FauxText(si,Fct,2,164,"Here comes the last zip-line of the game. \nIt's now or never for that buffer..."); end
  si= si+1; if Fct > 63744 and Fct < 64027 then FauxBox(si,Fct,Hxl-Scx,Hyt-Scy,Hxr-Scx,Hyb-Scy,"blue");
   FauxText(si,Fct,Hxl-Scx,Hyb-Scy,"X:"..string.sub(Dsx,1,2).." ");end
  si= si+1; if Fct > 64026 and Fct < 64307 then FauxText(si,Fct,2,164,"It worked! Long Jumps do have a buffer \nif you can grab a zip-line afterwards."); end
  si= si+1; if Fct > 64440 and Fct < 64721 then FauxText(si,Fct,2,164,"Earlier I said; \"to the left is faster,\"\nbut how much faster is it anyway?"); end
  si= si+1; if Fct > 64720 and Fct < 65001 then FauxText(si,Fct,2,164,"It's so fast I can reach the last platform \nbefore it goes to the right this time."); end
  si= si+1; if Fct > 65000 and Fct < 65325 then FauxText(si,Fct,2,164,"Here's an estimate of the maximum speeds: \nto the Right: 31, to the Left: 37!"); end
  si= si+1; if Fct > 65460 and Fct < 65735 then FauxText(si,Fct,2,164,"What lies ahead is a good example of how \nTAS and RTA can benefit from each other."); end
  si= si+1; if Fct > 65896 and Fct < 66177 then FauxText(si,Fct,2,164,"Guardian:\nYou're strangely dressed, for a knight. "); end
  si= si+1; if Fct > 66176 and Fct < 66457 then FauxText(si,Fct,2,164,"Donald:\nA knight? What do you mean? "); end
  si= si+1; if Fct > 65762 and Fct < 65863 then FauxText(si,Fct,2,164,"Boss:\nGuardian. "); end
  si= si+1; if Fct > 65896 and Fct < 69221 then FauxRect(si,Fct,2,8,91,18,0xFFCC99FF,0xFF4C0099);
   FauxText(si,Fct,5,11,"Guardian:   ","white","black");
    FauxText(si,Fct,70,11,Bss);end
  si= si+1; if Fct > 69230 and Fct < 69471 then FauxRect(si,Fct,60,9,191,71,0xFF4C0099,0xFF4C0099);
    FauxBox(si,Fct,62,12,249,78,0xFFCC99FF)
    FauxText(si,Fct,66,63,"                         ","white","black");
    FauxText(si,Fct,66,15,"\"FINALLY, SOMEONE WHO   \n IS WORTHY OF THE\n TREASURE.\"\n\n","white","black");end
  si= si+1; if Fct > 69470 and Fct < 69715 then FauxRect(si,Fct,60,9,191,71,0xFF006600,0xFF006600);
    FauxBox(si,Fct,62,12,249,78,0xFF66CC00)
    FauxText(si,Fct,66,63,"                         ","white","black");
    FauxText(si,Fct,66,15,"\"OH MY GOSH! IT IS\n JUST A PLAIN STONE     \n FIGURINE OF A DUCK\n PRINCESS!!\"\n","white","black");end
 end

--Credits
 si= si+1; if Fct > 72023 and Fct < 76980 then
  si= si+1; if Fct > 72024 and Fct < 75899 then FauxText(si,Fct,2,144,"\n\n\n\n\n                                           ","white","black"); end
  si= si+1; if Fct > 72024 and Fct < 75899 then FauxText(si,Fct,92,156,"SPECIAL THANKS TO:"); end
  si= si+1; if Fct > 72024 and Fct < 72447 then FauxText(si,Fct,15,170,"\t        mklip2001 \nFor bringing this game to my attention."); end
  si= si+1; if Fct > 72504 and Fct < 72927 then FauxText(si,Fct,14,170,"\t\t   Mitjitsu \nFor pointing out the Final Boss Glitch \n  and sugesting the use of sub pixels."); end
  si= si+1; if Fct > 73014 and Fct < 73437 then FauxText(si,Fct,14,170,"\t\t   sicanjal \nFor figuring out the Final Boss Glitch."); end
  si= si+1; if Fct > 73494 and Fct < 73917 then FauxText(si,Fct,30,170,"\t\t PPLToast \nFor his Wall Trick in Transylvania.\n \n "); end
  si= si+1; if Fct > 74006 and Fct < 74429 then FauxText(si,Fct,37,170,"\t    FatRatKnight\nFor his tutorial about sub pixels.\n \n "); end
  si= si+1; if Fct > 74486 and Fct < 74909 then FauxText(si,Fct,36,170,"\t\tmarzojr \nFor sharing his memory addresses."); end
  si= si+1; if Fct > 74996 and Fct < 75419 then FauxText(si,Fct,21,170,"\t\t  Reeve \n    For support on the forum and\nsuggestions of possible improvements."); end
  si= si+1; if Fct > 75476 and Fct < 75899 then FauxText(si,Fct,66,170,"\t  Evil_3D \nFor support on the forum.\n "); end
  si= si+1; if Fct > 75996 and Fct < 76277 then FauxText(si,Fct,51,156,"Tool Assisted Submission Text\n\t    by Dooty"); end
  si= si+1; if Fct > 76276 and Fct < 76979 then FauxText(si,Fct,73,156,"Thank you for watching,\nand see you next time!");end
 end
 Finalize(Fct)
 if Fct > 80000 then CloseScript() end
emu.frameadvance();
end