(Link to video)
Submission Text Full Submission Page

Introduction

As I felt Generation II of the Pokémon games has been neglected in terms of TASing, I decided to look into it and maybe do a TAS of it myself. At that time, there was only FractalFusion's glitchless run (see here). But during the making of this run, interest in Gen II TASing increased significantly, and I was beat to the punch twice by TheZZAZZGlitch's run (here) and later bobmario511's run (here). I decided to continue anyway, as I planned on using a different route that promised to beat the game even faster, and this is the final result.
It is using the Coin Case glitch which was already used in TheZZAZZGlitch's submission, but it uses a different strategy to achieve an arbitrary code execution out of it.

Categories

  • Aims for the fastest completion time
  • Heavy luck manipulation
  • Heavy glitch abuse
  • Executes arbitrary code
Used emulator: BizHawk 1.5.3

About the run

Emulator choice

I already did my emulator research for my Pokémon Blue TAS (see here), so I knew that BizHawk would be the only suitable emulator for this run. Unfortunately, BizHawk had an awful desync problem with this game. I dug into the source code and found out that the RTC code was broken (bug report), and the BizHawk team was nice enough to include my fix for it. That means that you will need at least version 1.5.3 of BizHawk to run this movie without desyncs. Sadly, that does not mean you can create movies in BizHawk without encountering desyncs now, I found that rewinding, at least in the TASEditor, can still be somewhat buggy (due to an apparently unrelated bug). But since I'm using using BizHawk merely as a playback device for the movie file I create with an external program, and at least the movie playback works correctly now, it does all I need it to do.

Version choice

Pokémon Gold and Silver are considered the same category and there is no significant difference between them in terms of speed. The version differences in terms of encounters are irrelevant to this run, so I went with the version that was used in all the previous movies.

The goal

Unfortunately, this game does not have a very well defined end state, since rolling the credits does not actually mark the end of the game. The credits are played twice, once after beating the Elite Four, and once after beating Red. To make it even worse, beating Red does not actually do anything to your game state other than hiding his sprite on the map and rolling the credits, so there is no such thing as tricking the game into believing you beat Red, since it doesn't keep track of it anyway.
It's easy to see that having the goal defined as "beat Red" is not a good position to be in, since it is not clear whether a run actually beats the game. Here are some examples, gradually skipping more and more of the game:
  • Fight the Elite Four, go to Mt. Silver and beat Red.
  • Go to Mt. Silver and beat Red without beating the Elite Four by tricking the game into making him appear.
  • Go to Mt. Silver, talk to Red, but trick the game into skipping the fight.
  • Manipulating another NPC to become Red and therefore beat Red without going to Mt. Silver.
  • Don't talk to Red at all and jump straight to the text script that plays when he is defeated.
  • Ignore Red completely, and just manipulate the bytes to make him visible (simulates beating the Elite Four), invisible again (simulates beating Red) and jump to the credits.
It's obvious that there needs to be a line somewhere. The rules I used in this run are chosen to both be compatible with what the currently published runs do and also provide adequate visual feedback that you actually just beat Red.
  • You must be in Mt. Silver on the map Red is in.
  • You must talk to Red and run his unaltered NPC scripts until the credits roll.

Luck manipulation

As in any Pokémon TAS, luck manipulation is an important factor. The RNG is basically the same as in Gen I: a hardware clock is used to generate the two random bytes at 0xFFE3 and 0xFFE4, which are used to determine all random events in the game. As in Gen I, the RNG is considered to be unpredictable, so in order to get the results you want there is pretty much no other way than to try out different input combinations until you find one that works. To aid me in grinding this out, and also to do common tasks like walking or scrolling through text optimally, I used a computer program (which is a modified version of the one I wrote for my Pokémon Blue TAS). This run was entirely generated using it, which is also the cause for the high rerecord count.

The Coin Case Glitch

Unlike Gen I, Gen II is generally considered to be solidly programmed and contains only a few known useful glitches. This run uses only a single glitch, named Coin Case glitch.
When displaying the amount of coins the player has in his coin case, the developers accidentally put the wrong termination character at the end of the text string. Incidentally, this minuscule mistake of getting a single byte wrong in an otherwise pretty solid game can be used to rip the game apart and execute arbitrary code. The glitch itself was known to exist for a long time, but the actual research on what is going on and how to exploit it was initiated by Sanqui on the Glitch City forums (see here).

Code execution goals

In this run, the goal is to execute code such that we are able to beat Red (using the definition above) as fast as possible. In order to be able to beat Red we need to do several things:
  • Make Red appear in Mt. Silver: This is controlled by bit 2 of flag $d8a3. It is initially set ( = hidden) and is usually reset upon beating the Elite Four.
  • Teleport to Mt. Silver: Maps are specified using a map group and an index. Red is on map 0x44 in map group 3. To get there, we manipulate the map we are in to contain a warp straight to this map.
  • Skip the fight with Red: The Game has several fail-safes that will skip a fight. We can make the game believe we have no Pokémon in our party to trigger such a fail-safe by setting the number of Pokémon in our party to 0.

Code execution setup

In order to escalate a single faulty byte into an arbitrary code execution, some setup is required. After failing to finish processing the text properly, the game reads an invalid pointer and jumps to address $e112, which is in ECHO RAM and is actually $c112. In this chunk of RAM the game stores parameters for playing sound effects, more specifically SFX channels 5-8. Those parameters are reset frequently and are therefore usually filled with 0s (read: NOPs) and by chance end in a "ret" instruction eventually. That is the reason the bug is unnoticeable most of the time. If the game happened to play a sound effect right before you use the coin case, however, the parameters will contain data which will be interpreted as machine instructions. Most of the sound effects are harmless (read: not useful), with 5 exceptions: The cries of Bellsprout, Machop, Machoke, Omanyte and Celebi all happen to contain an "inc sp" instruction which corrupts the stack pointer (stack entries are 2 byte wide, but the stack pointer is incremented by only 1 byte). After corrupting the stack, the execution jumps to $eb12 (which is ECHO RAM for $cb12).
The memory $cb12 until $cbff is the end bit of a segment that stores the (meta-)tiles the current map is composed of. It is safe to assume that this is filled this 0s, since almost no map is big enough to acutally use the whole segment, so the execution will simply slide through to the next addresses.
Starting at $cc20, the game stores the new tiles the game needs to load when the player moves in the overworld. Every time a player moves, the newly visible tiles are loaded to here before transferring them to Video RAM. These are 40 (20x2) tiles when moving vertically, and 36 (2x18) tiles when moving horizontally. The addresses $cc20 to $cc48 contain the index numbers of the tiles in the current tileset. These values can only go up to 0x7f, which makes it impossible to trigger a (far) jump instruction, not to mention you would need to find a spot on some map that actually contains the data you want. The addresses $cc48 to $cc70 contain the corresponding palette IDs and are also way too small and too hard to manipulate for our purposes. The following addresses are what is useful to us: $cc70 to $cc98 contain pointers to the positions where the newly loaded tiles should be inserted in the BG map. The BG map is a 32x32 tile buffer located at $9800-$9C00 which holds the current background tiles. It features a "window", that defines the (20x18 tiles) portion of the buffer that is actually visible on screen. When moving, the new tiles are inserted at the respective edge of the window and then the window is moves smoothly to that side to create the moving effect. The position of this window resets every time the whole screen needs to be redrawn, which is every time something partially covers the screen, like menus, text boxes, battle screens, etc, so its position can be manipulated easily. If moving in a particular way, we can make these pointers include $98DA, $98FA, which spell out to the machine code "jp c,FA98".
So our journey continues at $da98 ($fa98 is ECHO RAM again), which is in the middle of the data for the third Pokémon in the players party. The next bytes look roughly as follows:
$da97-$da98   Attack EV
$da99-$da9a   Defense EV
$da9b-$da9c   Speed EV
$da9d-$da9e   Special EV
$da9f         Attack and Defense DVs
$daa0         Speed and Special DVs
Up to now we just bounced around in the game's RAM randomly, this is the first place where we can manipulate the data so that we go where we want it to. We can manipulate the DVs to be a RAM address we want to go to and the lower byte of the Special EV to be a jump instruction to bring us there. This run uses DVs 0xe3d8 and special EV 0x4c2 to spell out "jp nz,d8e3". Note that this is not the only address that would have worked, but it was the fastest DVs to manipulate and also the DV differences are irrelevant during the battles fought in this run.
So we arrived at our final destination, $d8e3, which is the name of the fifth PC Box. PC boxes can be renamed individually and their names are a single block of memory, which is ideal for manipulation. We can name the boxes to spell out any code we want, but we are limited to the characters in the alphabet that is provided. For some odd reason, you can actually use more different characters for box names than for other names, like the player name or the nickname for Pokémon. This is why other such blocks of names, like the nicknames of the party Pokémon, are not as useful.

The executed code

Disclaimer: The paragraphs below describe in detail what code is executed to achieve the goals stated above and how it works. It is very lengthy and technical, so if you're not interested you can just call it magic and skip the rest of this section.
The names used in this run are:
Box 5: 'v O  é  1  2  D  i  ♀
Box 6: T  é  2  2  T  é  7  2
Box 7: pk 's X  Y  Q  4  g  9
Box 8: Z  'm 0  2  p  1
which give the following block of bytes:
d6 8e ea f7 f8 83 a8 f5 50
93 ea f8 f8 93 ea fd f8 50
e1 d4 XX XX 90 fa a6 ff 50 // XX means that the values are actually irrelevant, they will be overwritten.
99 d2 f6 f8 af f7 50
and spell out the following code:
Bytes Instruction Comment
Box 5
d6 8e sub 8e a is bc initially -> a := 2e
ea f7 f8 ld (f8f7),a alter third byte in box 7
83 add e e is e1 -> a := 0f
a8 xor b b is eb -> a := e4
f5 push af push e400 on to stack
50 ld d,b end of string byte, harmless
Box 6
93 sub e e is e1 -> a := 03
ea f8 f8 ld (f8f8),a alter fourth byte in box 7
93 sub e e is e1 -> a := 22
ea fd f8 ld (f8fd),a alter ninth byte in box 7
50 ld d,b end of string byte, harmless
Box 7
e1 pop hl pop e400 from stack
d4 (2e) (03) call nc,032E this function delays the game by one frame; carry will never be set here
90 sub b a is 0 after the call returns, this sets the carry flag
fa a6 ff ld a,(FFA6) reads the joypad buttons that were pressed (which are fetched during the frame transition)
(22) ldi (hl),a writes joypad input to hl (e4XX) and increments hl
Box 8
99 sbc c c is always 0, subtract with carry will set the carry flag if a is 0
d2 f6 f8 jp nc,(F8F6) jumps back to "call nc,032E" if the joypad input was not 0
af xor a a := 0
f7 rst 30 execute code from e400
50 ld d,b dead code
This piece of code is a fully functional bootstrapping program for executing (almost) arbitrary code. It uses the joypad input as its code (note that there are exactly 8 buttons on a Gameboy that correspond to the 8 bits in the input byte). It continues reading inputs until the input is 0 (no buttons are pressed) for one frame and then executes the inputs. Most bytes can be inputed using this method, with the exception of the byte 0 (marks the end of the input sequence) and all bytes with a lower nibble of 0xf (i.e. 0x0f, 0x1f, 0x2f...), because pressing A+B+START+SELECT is used by the game for soft resets.
The code relies heavily on the initial values of the registers, which depends on every byte we went through during the coin case glitch, but is ultimately deterministic. The "rst 30" which is used to execute the code is not an actual reset handler function but the end bit of the actual reset handler at $28. What is does is essentially a "ld l,a" followed by "jp (hl)". That means as long as the number of written bytes is smaller than 256, this will bring us to the start of our written code.
The memory from $c400 onwards belongs to the tiles which are currently shown on the screen. I chose this memory location because it both is harmless to write to and gives nice visual feedback when the bytes are written literally on the screen.
The actual bytes which are written in this run are:
21 46 d9 36 18 23 36 c4
3e 76 ea 0b d2 97 ea 22
da ea a3 d8 f8 25 f9 c9
19 03 17 03 44 00
which spell out:
ld hl,d946     // stores pointer to warp data
ld (hl),18
inc hl
ld (hl),c4     // overwrite warp data pointer with $c418 (which is the address of the bytes after the "ret")
ld a,76
ld (d20b),a    // $d20b contains the tile the player currently stands on, tile $76 allows the warp we are going to perform.
sub a          // a := 0 (Note that "xor a" or "ld a,0" can't be used because of the limitations on the bytes we can input).
ld (da22),a    // $da22 stores the number of Pokémon currently in our party. Settings this to 0 will allow us to skip the Red fight.
ld (d8a3),a    // $d8a3 contains the flag that determines whether Red is visible on the map. Resetting the flag makes him visible.
ld hl,sp+25
ld sp,hl       // fixes the (still corrupted) stack pointer and lets us return straight to the overworld without leaving the main menu first.
ret            // return to the normal game code
19 03          // Position of the warp on the map. ($3,$19) is the exact position we will be standing when executing this code.
17 03 44       // Where the warp takes us. This is "entrance 0x17 of map 0x44 in map group 3". The map only has one intended entrance,
               //     entrance 0x17 reads invalid coordinates which happen to put us right next to Red.
00             // ends inputting bytes and starts execution.
A short explanation of warps in this game: There are two kinds of warps, "tile warps" and "edge warps". Tile warps are triggered when walking onto a specific position on the map. These are used e.g. for stairs or doors. Edge warps on the other hand are triggered when standing on it and moving towards a certain direction. They are used e.g. when exiting buildings. Which type some warp belongs to is determined by the index of the tile. By setting the current tile to $76, we enable an edge warp when walking to the left.

Comments on the route

Intro

  • I set the text speed to fast, turn off battle animations and set the battle style to "SET" to make the overall game play faster.
  • Date and time are irrelevant, so I simply go with the defaults.
  • I name the player "I". Like in Gen I, each character printed on the screen cost one frame, making shorter names faster.

New Bark Town

  • Totodile is the fastest starter for this route, very closely followed by Cyndaquil (they might actually be about the same).
  • I manipulate the DVs to be 14 Attack, 3 Defense, 13 Speed and 8 Special, which spell out the address $d8e3 needed to the arbitrary code execution. Having a suboptimal Special DV of 8, however, means that we will lose a total of three turns during the course of this run compared for having a DV of 15. Also, it is by far the hardest luck manipulation in this run.

Route 30

  • After beating Youngster Mikey, a wild Caterpie is fought in order to increase Totodile's special EV by 20. As explained above, we will need a specific amount of Special EV in order to be able to perform our arbitrary code execution out of the Coin Case glitch. Doing all mandatory fights, Croconaw ends up exactly 50 EV short (other EV values are possible but slower), so wild encounters are used to compensate. Unfortunately, you can't get 50 Special EV with a single wild encounter until Route 36, and we'll never get there in this run.

Violet City

  • The AI of Bird Keepers forces them to use a damaging move whenever possible, so taking damage from Spearow's Peck and Pidgeotto's Gust is unavoidable.
  • After beating Falkner and talking to the lab assistant in the Pokémon Center, I rename the Boxes to spell out the program I want to run during the Coin Case glitch, since this is the closest I'll get to a PC in this run.

Route 32

  • After beating Albert, I catch a Bellsprout. This Bellsprout serves several functions:
    • Adding Bellsprout to my PokeDex. This allows me to play Bellsprout's cry whenever I want, which is important to triggering the Coin Case glitch.
    • Increasing the number of party Pokémon to 3. I need to manipulate the third Pokémon's data, so I need to have at least 3 Pokémon.
    • Beating Russell. His Geodudes take a long time to kill using Totodile, since it doesn't know Water Gun yet. Using Bellsprout in the Russell fight is actually important to this route: Totodile's resulting Special EV, when using it instead, would require at least 3 wild encounters to fix.

Union Cave

  • After Russell is beaten using Bellsprout, a wild Zubat is fought in order to increase Totodile's special EV by 30. Now the Special EV will be 0x4c2 (1218) at the end, the exact value we need.

Slowpoke Well

  • The first Rocket has two identical Rattatas, but the first one needs two hits whereas the second one only needs one. The level-up to 13 after the first Rattata provides us with the extra damage needed.

Azalea City

  • In Azalea Gym you can choose between fighting Bug Catcher Josh or Al. Josh is about 7 seconds faster. I considered fighting Al nonetheless, because the resulting Special EV differs by 10, but it won't help in reducing the number of wild encounters.
  • The Bugsy fight is the only occasion in this run where using Rage is actually faster, but only because my DVs are suboptimal and 3 Water Gun crits won't kill.
  • Besides increasing our Special DV, fighting the wild Caterpie and Zubat help Totodile to reach level 18 after Bugsy and evolve into Croconaw, which saves time in the upcoming rival fight.

Ilex Forest

  • When hunting Farfetch'd, the route used here is not the shortest route in terms of steps, but it is faster by around 1.5 seconds (assuming you get no encounters of course).
  • Cut is taught to Bellsprout, since it still has an empty move slot.

Goldenrod City

  • Super Nerd Eric is the last trainer before finally getting the Coin Case and performing the glitch.
  • The text box for picking up the Coin Case resets the BG map window, so taking 3 steps to the left puts us in the right position to enable the jump to $fa98 when activation the Coin Case.
  • Croconaw is swapped to the third spot in our party. His special EV ans DVs contain values to allow jumping to $d8e3, where our code we put in as the Box names waits to be executed.
  • Bellsprout's cry is played by checking its stats and the Coin Case glitch is triggered. The glitchy characters that appear on the screen is the actual code written by the bootstrapping program.
  • Due to the executed code, there now is an edge warp to Mt. Silver directly to our left, so by walking to the left we end up in Mt. Silver right in front of Red. Also, because we returned directly to the overworld without leaving the item menu first, the screen is not redrawn and we see the item menu instead of the overworld until the map transition is done.
  • When I talk to Red, the fight is skipped since the game thinks we have no Pokémon in our party, and the credits roll.

Nach: Judging.
FractalFusion: Add Youtube.
FractalFusion: Replaced movie file with one that is about 10 seconds faster, and replaced temp Youtube encode.

TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 14873
Location: 127.0.0.1
This topic is for the purpose of discussing #4205: MrWint's GBC Pokémon: Gold/Silver/Crystal Version in 31:20.79
Editor, Skilled player (1938)
Joined: 6/15/2005
Posts: 3246
I'll look into this, as it is quite interesting. But I wish you had told us you were working on this. I was just about to get started on a Pokemon Gold TAS.
Skilled player (1019)
Joined: 7/24/2013
Posts: 175
Sorry about that. I wasn't exactly working on this regularily, and I even made a break for 2 months, so I wasn't sure whether I will finish it anyway and I didn't want to get anyone's hopes up or stop them from working on this game theirselves. You can see this movie as some sort of reference for your TAS if you like ;)
Editor, Skilled player (1938)
Joined: 6/15/2005
Posts: 3246
Now that I watched it, I have a question. When talking to Prof. Elm's Assistant (the one that gives the Egg), is it really faster to talk from the front (below)? I thought it would have been faster to talk from the left; the steps your player takes remains the same and the Assistant takes one less step. Oh, and also this movie syncs on BizHawk 1.6.0a.
Skilled player (1019)
Joined: 7/24/2013
Posts: 175
It actually isn't. I also noticed that, sadly only way too late when I re-watched the complete movie. When I noticed it, I did a comparison, It costs 7 frames (the assistant moves at double speed, and you need to turn in place in order to talk to him from the side which costs frames), and I decided it's not worth doing it all over just for it, as 7 frames can easily be lost in luck manipulation. It did bug me a lot, though, thanks for pointing it out, I guess I missed it in the submission text.
Active player (434)
Joined: 2/5/2012
Posts: 1687
Location: Brasil
encode?
TAS i'm interested: megaman series: mmbn1 all chips, mmx3 any% psx glitched fighting games with speed goals in general
Editor, Skilled player (1938)
Joined: 6/15/2005
Posts: 3246
grassini wrote:
encode?
I'm encoding right now. But it might take a while.
Player (12)
Joined: 6/17/2006
Posts: 501
I feel that the goal requirements is rather arbitrary and end up becoming a waste of time. As FractalFusion pointed out, I think you would have greatly benefited in sharing your thoughts and WIPs with the community while creating your run. Also, I can only disagree with the speed-entertainment trade-offs, since fastest speed is always more impressive and therefore more entertaining to me. That said, I can only congratulate you in shaving off almost half the time of the current publication. Kudos! :)
Skilled player (1019)
Joined: 7/24/2013
Posts: 175
You're right, the goal requirements are arbitrary, that's essentially what I tried to say in the paragraph of the submission text, but so would be any other set of rules. Also, the loss of time is not that important, as soon as the arbitrary code execution is set up you can basically consider any goal done. If you define a different set of rules, all it takes it to change the written code accordingly. It might be easier to see the arbitrary code execution itself as the goal of the run, everything after that can be achieved in mere seconds. It just so happens that using arbitrary code execution is currently the fastest means of beating the game. About the speed-entertainment tradeoffs: My primary goal is entertainment, and in my (subjective) point of view, perceived optimality is therefore way more important than the actual frame count. Taking hits for example does not make the movie look more optimized, you won't see the difference at all, the impressiveness of not taking hits weighs way more than that for me. Of course if the difference is any noticable (like in the Bugsy fight), all bets are off. That is also why my blunder messing up talking to the assistant and losing 7 frames is way worse for me than losing a frame here and there due to suboptimal luck manipulation (a.k.a. "maybe letting the bot grind for 5 more hours will shave another frame off..."), since this mistake is actually perceivable when watching the movie. EDIT EDIT: I posted an actual comparison for hitting vs. missing a few posts below.
Player (26)
Joined: 8/29/2011
Posts: 1206
Location: Amsterdam
MrWint wrote:
You're right, the goal requirements are arbitrary,
I'll wait with voting until I see the encode, but I'm not generally in favor of runs with arbitrary goals. If the endgame credits play twice, doesn't that mean that beating the Elite Four means you've won the game, and that beating Red is the good ending, or a bonus boss? I'd say that if you're going for speed, anything that triggers the credits counts as a win; and if you're not going for speed, you'd need to make it an interesting playaround.
Editor, Skilled player (1938)
Joined: 6/15/2005
Posts: 3246
As for goal choices or "speed/entertainment tradeoff", the only thing that I think is of issue is aiming not to be hit at certain times. I should mention that being hit by status moves is some number of frames (~20) faster than not being hit. I think there is nothing wrong about the ending of this TAS compared to any other glitched Pokemon Gold TAS that has been submitted to this site. Personally, I feel that the run is over once the arbitrary execution has begun, since at that point, the game has been violated beyond its integrity. (Arbitrary execution means just that. You can do anything.) Oh, and I'll be posting an encode soon. Edit: Here are the encodes: Edit 2: These are encodes for the older (31:31) version of the TAS. The newer (31:21) version of the TAS is here. Youtube: http://www.youtube.com/watch?v=Mfxb5hy3ws8 Nicovideo (account): http://www.nicovideo.jp/watch/sm23030721 Nicovideo (no account): http://www.nicozon.net/watch/sm23030721
Spikestuff
They/Them
Editor, Publisher, Expert player (2292)
Joined: 10/12/2011
Posts: 6337
Location: The land down under.
Mine to do final encodes + publish for obvious reasons (One being Nach judging, 2 being Pokemon). anyways YES vote.
WebNations/Sabih wrote:
+fsvgm777 never censoring anything.
Disables Comments and Ratings for the YouTube account. Something better for yourself and also others.
Joined: 6/6/2004
Posts: 223
If you taught Cut to Bellsprout instead (since it has vacant move slots), does Croconaw still have the Grimers down in 1 with its other moves? That could be another minor saver, overcoming the 8-12 frames from longer attack names.
Skilled player (1019)
Joined: 7/24/2013
Posts: 175
Mr. Pwnage wrote:
If you taught Cut to Bellsprout instead (since it has vacant move slots), does Croconaw still have the Grimers down in 1 with its other moves? That could be another minor saver, overcoming the 8-12 frames from longer attack names.
Have I mentioned yet that I'm an idiot? I looked at my damage calculation sheet and it says that Grimer has 41 HP and a max crit Water Gun does 39 dmg, so it won't kill and I decided I need Cut to kill. When I was doing the actual fight, though, I realized I forgot to change the Trainer DVs back (the rival has better DVs than the Super Nerd) and Water Gun does in fact OHKO, but instead of reverting my decision to use Cut on Croconaw, I just used Cut anyway because "hey, it's faster than Water Gun"... Luckily it's an easy fix, but I can't take care of it right now, probably later today. Anyway, thank you very much for pointing it out!
FractalFusion wrote:
As for goal choices or "speed/entertainment tradeoff", the only thing that I think is of issue is aiming not to be hit at certain times. I should mention that being hit by status moves is some number of frames (~20) faster than not being hit.
I wouldn't be too surprised considering how badly I apparently screwed up my calculations on it. If it turns out to be true, I will consider doing the whole run over (which would probably take about 2.-4 days of computation), I will also check that later today.
Editor
Joined: 11/3/2013
Posts: 506
I love how nobody has even bothered to mention the absurd rerecord count. It's a MrWint TAS, it's to be expected :p
Former player
Joined: 6/30/2010
Posts: 1093
Location: Zurich, Switzerland
I liked the run, it really offers everything that a good Pokémon TAS should: Luck-manipulation and crazy glitches. I'm fine with the ending, although I think it would also be acceptable to skip anything just to get to the credits.
Current project: Gex 3 any% Paused: Gex 64 any% There are no N64 emulators. Just SM64 emulators with hacky support for all the other games.
Active player (434)
Joined: 2/5/2012
Posts: 1687
Location: Brasil
it's faster than the current,therefore it should be accepted,let the competition go on
TAS i'm interested: megaman series: mmbn1 all chips, mmx3 any% psx glitched fighting games with speed goals in general
Joined: 5/14/2007
Posts: 525
Location: Pisces-Cetus filament
Since it looks like you are going to redo the TAS, I'm going to try to change your mind about a few things. :)
MrWint wrote:
The version differences in terms of encounters are irrelevant to this run, so I went with the version that was used in all the previous movies.
I would say that's a good reason to add variety via using Silver Version. However, FractalFusion said above that he was about to start TASing Gold Version, and I know he has been looking into version differences, so maybe he chose the latter because it's faster overall for some reason.
MrWint wrote:
Also, using names other than "A" costs some frames, but naming everything in the run the same does not exactly add to the overall entertainment value.
Actually, I think that would be hilarious and would add to the entertainment value of the run.
Radiant wrote:
MrWint wrote:
You're right, the goal requirements are arbitrary,
If the endgame credits play twice, doesn't that mean that beating the Elite Four means you've won the game, and that beating Red is the good ending, or a bonus boss? I'd say that if you're going for speed, anything that triggers the credits counts as a win
FractalFusion wrote:
Personally, I feel that the run is over once the arbitrary execution has begun
I agree with this, and since you don't even fight Red, I recommend you not including that part in your next movie.
AzumaK wrote: I swear my 1 year old daughter's favorite TASVideo is your R4MI run :3 xxNKxx wrote: ok thanks handsome feos :D Help improving TASVideos!
Skilled player (1019)
Joined: 7/24/2013
Posts: 175
Ok, I did an actual comparison now, not by calculating the frames for one move (which I failed miserably the first time), but in a real-world example by using the Cherrygrove Rival with different possible hit/miss combinations:
    - Growl miss, Tackle miss: 19208 (current strategy, reference) - Growl miss, Tackle hit: 19242 (+34 frames, e.g. way slower) - Growl hit, Tackle miss: 19194 (-14 frames, e.g. faster) - Growl hit, Tackle hit: 19230 (+22 frames, more or less the difference)
These results are dependent on the length of the move animation of course (i.e. the type of screen jitter), so they may differ slightly for other moves, and the actual numbers might be off by 1 or 2 frames because of luck manipulation, but the differences are significant. That means I will reconfigure the fight goals and generate a new run. Of course I will fix the other two silly mistakes as well while I'm at it. This might take a few days to compute, so it would be great if the judgment of this submission could be delayed until I can provide an updated version. The route shouldn't change at all because of this.
Joined: 10/1/2013
Posts: 98
Location: My Basement
Zeupar wrote:
Since it looks like you are going to redo the TAS, I'm going to try to change your mind about a few things. :)
MrWint wrote:
The version differences in terms of encounters are irrelevant to this run, so I went with the version that was used in all the previous movies.
I would say that's a good reason to add variety via using Silver Version. However, FractalFusion said above that he was about to start TASing Gold Version, and I know he has been looking into version differences, so maybe he chose the latter because it's faster overall for some reason.
I agree here. If all the console runners use Gold and the TAS uses Gold, people are going to think Gold is faster. Just shake things up a bit :)
Zeupar wrote:
MrWint wrote:
Also, using names other than "A" costs some frames, but naming everything in the run the same does not exactly add to the overall entertainment value.
Actually, I think that would be hilarious and would add to the entertainment value of the run.
I like having unique nicknames. If you can't think of funny names, try "T" for Totodile and "B" for Bellsprout (as it is).
Zeupar wrote:
Radiant wrote:
MrWint wrote:
You're right, the goal requirements are arbitrary,
If the endgame credits play twice, doesn't that mean that beating the Elite Four means you've won the game, and that beating Red is the good ending, or a bonus boss? I'd say that if you're going for speed, anything that triggers the credits counts as a win
FractalFusion wrote:
Personally, I feel that the run is over once the arbitrary execution has begun
I agree with this, and since you don't even fight Red, I recommend you not including that part in your next movie.
This is where we differ. Console runners require Red, so the TAS should too.
Skilled player (1706)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Fishaman P wrote:
This is where we differ. Console runners require Red, so the TAS should too.
I agree, but only because it'll make the commenters on Youtube stop saying "now make a run that beats Red" or something. :P
Patashu
He/Him
Joined: 10/2/2005
Posts: 4016
In Symphony of the Night, you could go for the bad ending where you beat Richter without the holy glasses - it runs credits, it's faster than going to Dracula and killing him, etc. So why don't people do it? Because it's not considered by players and speedrunners of the game to be the end of the main storyline. Same goes for GSC.
My Chiptune music, made in Famitracker: http://soundcloud.com/patashu My twitch. I stream mostly shmups & rhythm games http://twitch.tv/patashu My youtube, again shmups and rhythm games and misc stuff: http://youtube.com/user/patashu
Editor, Skilled player (1938)
Joined: 6/15/2005
Posts: 3246
By the way, when I said that "I feel that the run is over once the arbitrary execution has begun", I'm not advocating changing timing/ending rules for this reason (obviously one can argue that if a TAS doesn't look complete, then it shouldn't be considered complete). What I mean is that arbitrary execution renders discussion of what constitutes a proper ending to be rather pedantic. Not just arbitrary execution, but any sufficiently game-breaking glitch, does this. See Pokemon Red/Blue/Yellow.
MrWint wrote:
Ok, I did an actual comparison now, not by calculating the frames for one move (which I failed miserably the first time), but in a real-world example by using the Cherrygrove Rival with different possible hit/miss combinations:
    - Growl miss, Tackle miss: 19208 (current strategy, reference) - Growl miss, Tackle hit: 19242 (+34 frames, e.g. way slower) - Growl hit, Tackle miss: 19194 (-14 frames, e.g. faster) - Growl hit, Tackle hit: 19230 (+22 frames, more or less the difference)
I forgot to mention. There is no rule that Rival's Chikorita has to use Growl first and Tackle second. Chikorita could use and miss Tackle both times. It also seems that a Tackle miss is maybe 3 or so frames faster than a Growl hit. But I could be wrong.
Skilled player (1019)
Joined: 7/24/2013
Posts: 175
FractalFusion wrote:
I forgot to mention. There is no rule that Rival's Chikorita has to use Growl first and Tackle second. Chikorita could use and miss Tackle both times. It also seems that a Tackle miss is maybe 3 or so frames faster than a Growl hit. But I could be wrong.
I know, the rival can use any move at any time. I used the same moves to be able to compare in this example. Also, Growl hit seems to be a frame or two faster than Tackle miss to me. Anyway, I guess it doesn't matter between those two, whatever is faster will depend on the situation. But they're much faster than Growl miss or Tackle hit in any case. The Cherrygrove Rival fight in the updated movie will use 3 crits (7HP) instead of 2 crits and a non-crit btw. The necessary luck manipulation to get 2 max crits and and a max non-crit plus two enemy tackle misses (or growl hits, but then you are committed on the order of your own attacks) was too much and taking the additional crit text box turned out to be a couple of frames faster overall. It's hard to decide to go for it, since you can theoretically do the firght faster, just not from the position I was in. It's still 26 frames faster than the original fight.
Glitcher
He/Him
Joined: 3/24/2007
Posts: 216
Location: London, U.K.
Wow, that's quite a big improvement! Yes vote from me.