Submission Text Full Submission Page

Game objectives

  • Emulator used: lsnes rr2-β23
  • Aiming for fastest arbitrary code execution in the yellow version of the Japanese version.
  • Ensure that the highest possible quality Bad Apple! to be played.

Comments

I created this run based on the Amazing Run created in 2017 using the Yellow version and the Amazing Run created in 2024 using the NES version of Mario Bros. I was so impressed by the sheer precision of both runs and the beautiful graphics that I decided to try and create a similar run myself.
I had previously used BizHawk to create a TAS video playing BadApple, but BizHawk only allows one input per frame, so there were major issues with resolution and frame rate. Also, at this input speed, the data sent in real-time cannot be output directly to the screen in time, so the video is created by saving the data once in SRAM and rewriting the image based on it. Therefore, the capacity of the moving image depended on the storage capacity of the SRAM, and there was no choice but to create a moving image with an extremely low frame rate and resolution. Furthermore, it was extremely difficult to store even audio with such data capacity, so implementation was not possible.
The two runs referred to show that being able to input buttons in subframe units is a prerequisite. In this run, I reviewed the emulator and decided to use lsnes, which allows subframe-by-subframe input (I should have used this in the previous run, but I didn't know how to handle it due to my lack of knowledge). This freed me from the once-per-frame input limit and allowed me to send about 260 bytes of data per frame. The significant increase in the amount of data that could be sent solved the problems of low frame rate and resolution, and also enabled the successful output of sound.

Stage by stage comments

This run was based on one produced by MrWint, so in many respects the means used are similar.

ACE set-up

As with MrWing's, the execution is carried out in three phases.

First stage

After a successful SRAM glitch, swap the Pokémon in your possession as follows and run the map script execution. In the procedure below, the order is shown by (Pokémon number to swap->Pokémon number to swap to). The text next to it describes what is happening at the time.
  1. 1 -> 9 Expand the どうぐ
  2. 4 -> 21 0xFF chunks to set memory
  3. せってい(0xF5) 0xFF lumps to 0xF5
  4. 21 -> 14 Pull the 0xFF lump upwards
  5. Adjustment of どうぐ
    1. 4th わざマシン55 throw away everything
    2. 3rd わざマシン55 throw away everything
    3. 2nd わざマシン55 118 (76h)
    4. 3rd わざマシン45 240 (F0h)
    5. 4th わざマシン45 34 (22h)
  6. 21 -> 26 Script the name of the competitor
  7. 25 -> 15 Connecting separated rival names て(0xC3)
  8. 14 -> 24 Bump in the adjusted code
After completing this procedure, closing the menu and returning to the map immediately executes the map script and the 0xD2E1~ code that has been planted in the rival's name is executed. The push af and jr nc, D2EC with * on the way are rubbish that appears when replacing the equipment and can be ignored on execution.
WRA1:D2E1 76               halt
WRA1:D2E2 F5               push af ; *
WRA1:D2E3 F0 F5            ld   a,(ff00+F5)
WRA1:D2E5 22               ldi  (hl),a
WRA1:D2E6 F5               push af ; *
WRA1:D2E7 00               nop
WRA1:D2E8 00               nop
WRA1:D2E9 00               nop
WRA1:D2EA 30 00            jr   nc,D2EC ; *
WRA1:D2EC C3 E1 D2         jp   D2E1
By executing this code, the code 0xD2E1~ is rewritten using the button input, resulting in the following final code.
WRA1:D2E1 76               halt
WRA1:D2E2 00               nop
WRA1:D2E3 F0 F5            ld   a,(ff00+F5)
WRA1:D2E5 22               ldi  (hl),a
WRA1:D2E6 3C               inc  a
WRA1:D2E7 28 06            jr   z,D2EF
WRA1:D2E9 00               nop
WRA1:D2EA 00               nop
WRA1:D2EB 00               nop
WRA1:D2EC C3 E1 D2         jp   D2E1
This rewrite adds an exit condition to the original code, which had been an infinite loop, allowing it to express the end of execution. This code is used to write the second stage code into memory below.
The second stage code has 0xFF(rst 38) at the end, which is read to determine that the first stage has finished reading. The moment this is written, the second stage code of 0xD2EF~ is executed.

Second stage

Write the following code in the code created in the first stage directly below the code of the first stage.
From this code, all controller inputs in subframes are free and free from memory limitations.
This code receives the controller input in subframes and writes 0xD9B2~ the received number. This code is used to write the 593-byte third stage code.
WRA1:D2EF 3E 01            ld   a,01
WRA1:D2F1 EA 00 D0         ld   (D000),a
WRA1:D2F4 F3               di
WRA1:D2F5 21 B2 D9         ld   hl,D9B2
WRA1:D2F8 3E 10            ld   a,10
WRA1:D2FA E0 00            ld   (ff00+00),a
WRA1:D2FC F0 00            ld   a,(ff00+00)
WRA1:D2FE 47               ld   b,a
WRA1:D2FF CB 30            swap b
WRA1:D301 F0 00            ld   a,(ff00+00)
WRA1:D303 A8               xor  b
WRA1:D304 22               ldi  (hl),a
WRA1:D305 47               ld   b,a
WRA1:D306 FE FD            cp   a,FD ; Processing of the end of the Second stage
WRA1:D308 20 0E            jr   nz,D318
WRA1:D30A FA 1E D3         ld   a,(D31E)
WRA1:D30D 3C               inc  a
WRA1:D30E EA 1E D3         ld   (D31E),a
WRA1:D311 FE 03            cp   a,03
WRA1:D313 D2 B2 D9         jp   nc,D9B2
WRA1:D316 18 E4            jr   D2FC
WRA1:D318 AF               xor  a
WRA1:D319 EA 1E D3         ld   (D31E),a
WRA1:D31C 18 DE            jr   D2FC
WRA1:D31E 00               nop
WRA1:D31F FF               rst  38 ; First stage end command
In the second stage, as in the first stage, a termination condition is attached by a terminating character. The code in the third stage is terminated with three 0xFD characters to indicate the end of the code. Originally, this code should have been shortened to 1 byte, but in order to ensure flexibility in the code, we decided to use 3 bytes to indicate the end of the code. Between you and me, it was a pain to find the numbers I didn't use...

Third stage

It executes the code written in the second stage. It is responsible for initialising the tiles and outputting images and sound.
The set-up is now ready for arbitrary code execution up to video output.

Execution of code

It executes the code written in the second step.
What this code does is as follows.
  1. Rewriting tiles
  2. write the input at the controller to VRAM
  3. write the input at the controller to the waveform memory
  4. finish writing and rewrite the memory for the map, player's name, Pokémon status, etc. and watch the ending
While rewriting, the image is output by looping through 2 and 3. A single screen of images requires 360 bytes (18*20 squares). This code acquires 180 bytes per frame and updates the screen once every two frames to maintain approximately 30 fps.
The audio is output at approximately 9709 Hz, which consists of 4 bits per sample and requires approximately 80 bytes per frame. Adding up the image and sound data, a frame loop consumes 180 + 80 = 260 bytes, requiring input at approximately 16,000 Hz.
For further information, see source code.

ending

The Bad Apple! and head towards the ending.
To start the ending, rewrite the map data, player names, Pokémon status, Pokémon's kits, spending money, play time, etc., in advance.
The ending is performed by running the programme that originally exists in the ROM. The game is now complete, GG!

Ingenuity in production

This run was produced with various innovations and improvements from previous run. In particular, there are quite few documents on lsnes, and I could find very few articles (especially in Japanese) by people who actually use it, so I will leave them lightly here, including as a reminder, in the hope that they will be of use to someone else.

Combined use of emulators

lsnes is a very good emulator that supports subframe-based input and has high reproducibility in terms of audio and VRAM, but as a tool for creating TASvideo it is a little quirky and difficult to handle.
Therefore, I decided to use BizHawk in situations where I did not need to input data in units of subframes up to set-up. This is then read by the lua script and the controller input is executed from the script. Fortunately, the minimum necessary functions such as soft reset were also provided, so it was easy to create.
 -- Example of lua code
 function line_input(line)
     local input_flg = {["A"] = false, ["B"] = false, ["s"] = false, ["S"] = false, ["R"] = false, ["L"] = false, ["U"] = false, ["D"] = false}
     for i = 1, #line do
         local char = string.sub(line, i, i)
         local button = input_dict[char]
         if button == -1 then
             input.reset()
             return
         end
         if button ~= nil then
             input_flg[char] = true
         end
     end
     for key, value in pairs(input_flg) do
         if value then
             input.set(0, input_dict[key], 1)
         else
             input.set(0, input_dict[key], 0)
         end
     end
 end
However, the barrier here was the difference in the way the emulator worked. In the previous run, there were several occasions where the instrument with internal number 0x00 was selected or discarded, but the timing of the freeze here was quite severe, and it seemed that if there were slight differences in the emulation method, the emulator might freeze.
In fact, in BizHawk, when I tried to run lsnes with successful input data, it kept freezing and did not work as I wanted it to. We tried delaying the input by a few frames, but this also ended in failure. In addition to freezing, the time required for scrolling varies because the length of the name changes depending on the method of emulation of the 0x00 toy when moving the toy column, and this causes a large difference in movement. In the early version (r0), this is not a problem because the name of the 0x00 instrument is fixed, but only in the later version is it possible to input every frame to 0xFFF5, so there is no choice but to execute it in the later version
After some trial and error, we changed the set-up procedure slightly from the previous run, and developed a procedure whereby the 0x00 toy does not appear in the screen. As a result, the time has been reduced compared to the previous run, and the run is now more reliable. I can't say for sure that this is the best way to do it, but I'm pleased that I was able to come up with a reliable, version-independent way to run it.

Image

The image is represented by 36*40 dots, with tiles as the smallest unit; each tile consists of 4 squares of 2*2, each of which can have 4 colours: white, light grey, dark grey and black. 4 squares have 4 types, so there are 4^4 256 tile types, which just matches the Game Boy tiles' This matches the Game Boy tile types and fits perfectly within the VRAM.
I would have liked to use the original tiles as in OnehundredthCoin's video, but as there are only a few Pokémon tiles that use black, I decided that it would be difficult to express them nicely, and decided to rewrite the tiles as a whole.
For the conversion of the video, Python's Cv2 was used. The code for the conversion is as follows Here the conversion to the input text file is also done at the same time.
# Python code example.
tileDict = { 0: 0, 85: 1, 170: 2, 255: 3 }
inputDict = { 0: "A", 1: "B", 2: "s", 3: "S" }
for i in range(0, lenY):
    for j in range(0, lenX):
        byte = 0
        for k in range(0, 2):
            for l in range(0, 2):
                byte = byte * 4 + tileDict[image_4color[i * 2 + k][j * 2 + l][0]]
        for m in range(0, 2):
            writeStr = ""
            for key, value in inputDict.items():
                if (not (byte >> (0 if m == 0 else 4)) & (1 << key)) ^ (key == 1):
                    writeStr += value
                else:
                    writeStr += "."
            tileFile.write(writeStr + "\n")
The rewriting of the image is based on the video by OnehundredthCoin, and the window and BG are alternately rewritten half by half, the window display is enabled once every two frames, and the image is displayed at approximately 30 fps.
The video content is not compressed and is input as it is. As for the method of compression, I was thinking of performing differential compression similar to OnehundredthCoin's, but the lsnes specification impairs the stability of the input and the input may shift by 4 bits, or the amount of data required may vary greatly from frame to frame, so I had to abandon the idea. In fact, this should have been compressed as well...

Sound

I had very little knowledge of audio output and referred to MrWint's article, but this was the point where I had the most difficulty.
To summarise pretty well what we are doing, it is a simple story of rewriting the waveform memory at the right time. How MrWint timed the rewrites is a mystery, but I was able to get the timing right. I adjust the timer interrupt to write to the 16-byte waveform memory at once, just after all 32 samples in the waveform memory have been read. The frequency of ch3 is adjusted at 65536 / xHz for all 32 samples. In this case x = 216, so the audio output will be at 32 * 65536 / 216 = 9709Hz. The timer interrupt on the other hand is adjusted at 262144 / yHz, this time with y = 54, so the interrupt is triggered at 262144 / 54 = 4854Hz. If the timing of the 16 interrupts is the same as the frequency of ch3, the audio output can be adjusted successfully. The audio output can be synchronised with the interrupts by applying the equation x = 4y. The advantage of using timer interrupts is that they can be implemented separately from the screen output; MrWint article wrote that the rewriting of the waveform memory is synchronised to the V-Blank, but by using timer interrupts, there is no need to synchronise the image by itself and the timing can be automatically timed. This makes it possible to measure the timing automatically. This allows the sampling rate of the audio to be adjusted flexibly (although this is only a creative device and does not affect the quality of the video at all...).
The sound quality, as you can hear, is not very good due to the 4-bit quantisation and low sampling rate. Noise was especially bad at low frequencies, so I had to reduce the quality of the sound by applying a high-pass filter to the original source to reduce the low-frequency sounds.
In contrast, MrWint achieved quantisation of over 100 by adjusting the master volume, and the sampling rate is more than twice higher than my own, so the sound quality is quite good. I couldn't have copied this technique. What on earth is happening...? There is still room for improvement when it comes to sound.

source code

All the source code used in this run is available here.
Many of them were written temporarily when needed, so I may not be able to answer your questions.
In addition, the items compiled here have only been tested in my own environment and may not work properly.

At the end

We were able to produce a video of much better quality than our previous challenges in this run. Although we still have some work to do, we are happy with the improved resolution and frame rate, and the audio output. My regrets are that the video did not compress well and the audio quality is quite low. I tried my best to work on both, but with my knowledge and skills, the current quality was the limit. I am a little disappointed that I was able to surpass my previous goal, but not quite up to the quality of MrWint's and OnehundredthCoin's videos.
I would like to express my gratitude to both of them for inspiring me to create my own. I would also like to express my gratitude to Bad Apple! 's Kagee MV, I would like to pay tribute to all the people who produced it! Thank you for the wonderful video!

Memory: Replacing file with full since it was unable to fit under the limit


TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15909
Location: 127.0.0.1
CoolHandMike
He/Him
Editor, Judge, Experienced player (967)
Joined: 3/9/2019
Posts: 804
Bad Apple is now the standard for arbitrary code execution lol. Yet another system bad appled. Excellent work!
discord: CoolHandMike#0352
Spikestuff
They/Them
Expert player (2748)
Joined: 10/12/2011
Posts: 6501
Location: The land down under.
These apples seem bad. Yes vote.
WebNations/Sabih wrote:
+fsvgm777 never censoring anything.
Disables Comments and Ratings for the YouTube account. Something better for yourself and also others.
Challenger
He/Him
Skilled player (1756)
Joined: 2/23/2016
Posts: 1084
Bad Apple in high quality this time. Very good!
My homepage --Currently not much motived for TASing as before...-- But I'm still working.
Player (53)
Joined: 4/1/2016
Posts: 302
Location: Cornelia Castle
Hello and welcome to TASVideos! While this is a nice run, there are a couple things I should mention: 1. LSnes, while used for the previous ACE run, is not the best anymore. BizHawk has a SubGBHawk core, which also has subframe input, and allows you to use an official boot rom for console verification. 2. While the Japanese version may be faster, the US version is easier for most viewers to understand, which helps out for runs like this. 3. There's almost certainly a way to skip Oak's hall of fame speech and go straight to the pokemon registration screen. I'll hold off on voting until I know if any of this will be considered.
DJ Incendration Believe in Michael Girard and every speedrunner and TASer!
Memory
She/Her
Site Admin, Skilled player (1568)
Joined: 3/20/2014
Posts: 1779
Location: Dumpster
DJ_Incendration wrote:
Hello and welcome to TASVideos! While this is a nice run, there are a couple things I should mention: 1. LSnes, while used for the previous ACE run, is not the best anymore. BizHawk has a SubGBHawk core, which also has subframe input, and allows you to use an official boot rom for console verification. 2. While the Japanese version may be faster, the US version is easier for most viewers to understand, which helps out for runs like this. 3. There's almost certainly a way to skip Oak's hall of fame speech and go straight to the pokemon registration screen. I'll hold off on voting until I know if any of this will be considered.
1. Not really a requirement by any means 2. The submitter is Japanese, it's easier for them to understand Japanese. 3. Does it really matter in a playaround???
[16:36:31] <Mothrayas> I have to say this argument about robot drug usage is a lot more fun than whatever else we have been doing in the past two+ hours
[16:08:10] <BenLubar> a TAS is just the limit of a segmented speedrun as the segment length approaches zero
Player (53)
Joined: 4/1/2016
Posts: 302
Location: Cornelia Castle
1. I understand that it's not a requirement, but I am so used to movies beginning with the bios sound. Also, the audio on LSnes doesn't seem to be as good as that on BizHawk. 2. I get that it's easier for them to understand, but it's a lot harder for us. 3. I guess it doesn't.
DJ Incendration Believe in Michael Girard and every speedrunner and TASer!
Joined: 1/9/2023
Posts: 31
Location: Quebec Province
I don't think it being in japanese or in english change anything. A normal viewer will see the Bad Apple video and won't really care about what happen before (in the english ACE Pokemon TAS, you don't really understand either) and the author's explanation are in english for those who wanna dig further.
Bigbass
He/Him
Moderator
Joined: 2/2/2021
Posts: 211
Location: Midwest
DJ_Incendration wrote:
1. I understand that it's not a requirement, but I am so used to movies beginning with the bios sound. Also, the audio on LSnes doesn't seem to be as good as that on BizHawk.
lsnes is clearly defined as one of the preferred and accepted emulators for GB movie submissions. Additionally, the desired goal of this TAS was clearly achievable using lsnes despite any emulation differences that may exist. As such, implying that Bizhawk is a better option or that lsnes shouldn't be used, isn't warranted. You personally may not like lsnes being used for submissions, but people are completely allowed to use it if they wish to.
DJ_Incendration wrote:
2. I get that it's easier for them to understand, but it's a lot harder for us.
I doubt the language of the text matters given the goal of this submission. Regardless, I'd much rather the person putting in all the work to create the TAS be able to understand what the game is doing, than for the convenience of being able to read the text myself. In any case, the site's movie rules explain that "regional differences such as text and cutscene length are not counted as improvements or time losses." So no, the region choice will not be considered.
TAS Verifications | Mastodon | Github | Discord: @bigbass
Emulator Coder, Judge, Experienced player (905)
Joined: 2/26/2020
Posts: 824
Location: California
For more an actual criticism for this TAS. It's Bad Apple. As funny as that is as a meme... it's a well known old meme. As such, the actual playaround segment is effectively completely unoriginal in an artistic sense. And to be frank, this criticism also applies to the Super Mario Bros Bad Apple TAS. Even on a technical aspect, the TAS is somewhat unoriginal. It follows the same principle as MrWint's Yellow TAS and the other Bad Apple TAS: you turn the video game into a video. The originality then just becomes the setup for such (which is impressive mind you), but at such a point it seems kind of like wasted potential if it's just used for Bad Apple (something that the other Bad Apple TAS frankly has for a criticism, but slightly less so since they were "first" wrt doing it within a TAS). At the very least, MrWint's Yellow TAS was fairly original for what it was, and kept a semblance artistically of it still being a game (even if by a technical aspect it's not actually much different than playing a Bad Apple video).
Player (236)
Joined: 6/16/2020
Posts: 30
Very cool TAS! I also really appreciate the details you've written about how you created the TAS, as well as providing the source code! I'm going to build off what CasualPokePlayer said.
CasualPokePlayer wrote:
It follows the same principle as MrWint's Yellow TAS and the other Bad Apple TAS: you turn the video game into a video. The originality then just becomes the setup for such (which is impressive mind you), but at such a point it seems kind of like wasted potential if it's just used for Bad Apple (something that the other Bad Apple TAS frankly has for a criticism.)
I'll also accept the criticism for my own TAS, because yeah- it really is "just Bad Apple". (I initially had plans to tell a story similar to Mr. Wint's TAS, but got distracted.) But even though there's already an ACE playaround TAS of Pokemon Yellow, and even though there's already a playaround TAS of another game that plays the Bad Apple music video, I still think this run has merit. I'm paraphrasing here, but saying "you shouldn't do this because it has already been done" is pretty unhelpful. I strongly encourage people to make TASes similar to this one. It's a wonderful programming exercise that will teach you a lot about the hardware you're working with. You mentioned in your submission notes you recognize that there is room for improvement. For my Bad Apple TAS, I was also quite unhappy with the audio quality for a long time, so I did a bunch of research and rewrote my code countless times just to try new things and see what works. I initially created my TAS in early January of 2024, and planned to submit it in April, so that gave me a few months of time to make the graphics and audio cleaner. If you still think there's room for improvement, perhaps you should take more time researching the audio. This also brings up the discussion of what it means to "obsolete" a playaround TAS. Ideally this run wouldn't be replacing Mr. Wint's, but I don't see any reason why there can't be two simultaneously published ACE demonstrations. The story telling and humor of that run serve a completely different purpose than the technical feat of playing Bad Apple. Great work, and welcome to TASVideos!
Emulator Coder, Judge, Experienced player (905)
Joined: 2/26/2020
Posts: 824
Location: California
To be clear, I am not saying "you shouldn't do this because it has already been done." I'm saying the run becomes heavily devalued from an artistic perspective. Purely on the technical side, it isn't really devalued from that (even the "wasted potential" is more on the artistic side if anything).
Joined: 1/9/2022
Posts: 1
First of all, I would like to thank all those who have seen this TAS, voted for it and left comments. Thank you for watching my TAS. I am also glad that you all are so warmly welcoming to this wonderful community that is TASVideos.
CasualPokePlayer wrote:
Even on a technical aspect, the TAS is somewhat unoriginal. It follows the same principle as MrWint's Yellow TAS and the other Bad Apple TAS: you turn the video game into a video. The originality then just becomes the setup for such (which is impressive mind you), but at such a point it seems kind of like wasted potential if it's just used for Bad Apple (something that the other Bad Apple TAS frankly has for a criticism, but slightly less so since they were "first" wrt doing it within a TAS). At the very least, MrWint's Yellow TAS was fairly original for what it was, and kept a semblance artistically of it still being a game (even if by a technical aspect it's not actually much different than playing a Bad Apple video).
As I described in my submission note, I created this TAS based on the work of two great people. As you say, I myself feel that this TAS lacks originality, and as for Bad Apple's music video, of course I didn't make it, and I can't argue with the opinion that simply reproducing it is of little value from an artistic point of view (although I do think that this challenge MrWint's and OnehundredthCoin's work, which was the first to do so, is clearly original and very fine work). I fully understand that an artistic point of view is important as this is a playaround, and that my TAS is not very artistic. Thanks for your valuable input. However, I personally feel that there was no small amount of meaning in doing this run. For one thing, as OnehundredthCoin said, it was a very good programming experience to learn about the hardware. I see this challenge as a competition of sorts, where you have to project arbitrary graphics onto a game screen and output audio in sync with it. This requires a lot of knowledge and skill with the hardware and I believe it is tantamount to pushing the limits of the hardware. This should be no different from the challenge of aiming for a higher goal, like any% or any other category (although this time it was submitted as a playaround, so this idea may not be reflected in the same way). Also, while the challenge has the same look and underlying principles, it requires a completely different set of skills as it is different hardware, and this is my opinion that there should be one Bad Apple challenge per piece of hardware (Since MrWint has already achieved this on the GB, my TAS may lack novelty). I think it makes sense that Bad Apple TAS will continue to be made in the future, considering that new TAS knowledge and ideas will be born in the process of this challenge, and that this will be useful for subsequent TAS, such as mine, which was based on their run this time. I myself have become more knowledgeable about hardware through this challenge, and I realise that this will help me in my future activities.
OnehundredthCoin wrote:
You mentioned in your submission notes you recognize that there is room for improvement. For my Bad Apple TAS, I was also quite unhappy with the audio quality for a long time, so I did a bunch of research and rewrote my code countless times just to try new things and see what works. I initially created my TAS in early January of 2024, and planned to submit it in April, so that gave me a few months of time to make the graphics and audio cleaner. If you still think there's room for improvement, perhaps you should take more time researching the audio. Great work, and welcome to TASVideos!
OnehundredthCoin, thank you for your comments! When you see the work in person, it is clear that the commitment to audio quality is well reflected. The audio was really clear and excellent. The fact that you have been working on improving the audio for a long period of time also makes sense. The explanatory video is astonishing for all the extra effort and great ingenuity that has gone into it. I stopped exploring further once I confirmed that the sound was playing correctly... I have no excuse, and I think this was the limit of my technical ability. As you can see from my submission notes, I was inspired to make this TAS again after seeing your work. If anyone is going to create another Bad Apple TAS in the future, Your work will surely be recognized as one of the greatest and most influential Bad Apple TASes. Thank you for your truly wonderful work! After accepting all the opinions expressed here, I am happy to submit this TAS here. I thank the TASVideos community for the opportunity to be seen and even evaluated by different people. I don't know how this challenge will affect TASVideos in the future, but I believe it will help TAS in the future. I will accept the feedback I received here and I will try my best to make even more original TAS in the future. Thank you!
Player (41)
Joined: 1/11/2023
Posts: 10
Location: The Drop Zone
Hey, yo! I have seen quite a number of ACE's in the past - including the Pi, the SMW and even the GBC version of this game. It's that feeling of gray, black and white that gives nostalgia a whole new meaning and I have felt this one, too. All the Japanese arrangements, setup, and the execution of both the audio and video payloads were quite a huge surprise here! I can't wait to see more ACE's like this in the long run. But for now, you get a Y-vote from me. Cheers!
TiKevin83
He/Him
Ambassador, Moderator, Site Developer, Player (157)
Joined: 3/17/2018
Posts: 359
Location: Holland, MI
Man this is complicated. For one, I voted yes on entertainment. The run is cool in its own right. Building off of what others have said, I don't know practically how to handle something like this. Is the site in a good place now to handle playarounds with nearly identical game choice and goal, that is "turn Pokemon Yellow into a Video Player that is fed inputs for data"? I kinda want it to be, because here there's uniqueness enough possible between JPN vs ENG Yellow and as you said possible technical aspects of the video player (I am not enough of an assembly expert yet to validate that). In that vein it could be interesting technically to ACE in the GBVideoPlayer2 Pokemon Anime intro video. But at the same time, reductio would say it would be crazy to accept 50 TASes of Yellow like this that ACE in different videos. RE emulator choice, lsnes is fine since you can't console verify these anyways, GBI's playback format doesn't have the resolution to send inputs this fast.
Emulator Coder, Judge, Experienced player (905)
Joined: 2/26/2020
Posts: 824
Location: California
TiKevin83 wrote:
I kinda want it to be, because here there's uniqueness enough possible between JPN vs ENG Yellow and as you said possible technical aspects of the video player (I am not enough of an assembly expert yet to validate that).
The main reason why JPN and ENG would even have differences within the video player is just because JPN Yellow is a Game Boy game, while ENG Yellow is a Game Boy Color enhanced game. Even ignoring color (which you practically can do if you want to due to the way GBC graphics work), you have 2 very unique tools available on the GBC: double speed mode (doubling the amount of CPU cycles you have in a frame) and VRAM DMA (allowing for the fastest possible VRAM transfers). Bad Apple also technically itself gives a difference, it's mostly black and white, with some grayscale for aliasing. It mostly looks the same even if you reduce it down to 4 colors/2BPP (i.e. white/black and 2 shades of gray). It's also not exactly made so you can just easily replace it with normal tile based rendering (therefore the effective video resolution gets reduced if tile based rendering is done). So on the GBC, you could potentially substantially improve the video quality, depending on what you want to improve, what you're willing to sacrifice, and how carefully timed your code is.
TiKevin83 wrote:
RE emulator choice, lsnes is fine since you can't console verify these anyways, GBI's playback format doesn't have the resolution to send inputs this fast.
This being done on the GB ends up bringing up a different point which also "prevents" console verification. For these TASes, Channel 3 is abused in order to output effectively arbitrary PCM (although Bad Apple probably could be done "chiptune" regardless, but for completely arbitrary audio from completely arbitrary videos off the internet you want arbitrary PCM). In MrWint's TAS, he also abuses the volume register to turn the 4 bit Channel 3 PCM into roughly 7ish bit PCM (the volume register is a multiplier here, with 8 different values (3 bits), although it won't result in all sample values being available due to a lot of multiplications resulting in the same value). Why bring this all up? In order to create arbitrary PCM, MrWint's TAS abuses a quirk with wave ram here, one which is unavailable to the GBA. MrWint writes to wave ram while it's active, keeping it active forever constantly looping through values he writes. If you end up writing to wave ram while it's active, on the GBC (but not the GBA), the written byte will just go to wherever the channel last read wave ram. This only ends up played 32 samples later anyways since the last read sample is cached). On the GBA, instead the write just gets ignored, requiring the channel be disabled to write to wave ram (although you don't want to force disable the channel). The GB also mostly acts like the GBA here, except on the exact cycle which wave ram is read by the channel, which allows the write to go through (and redirects the write over to where the channel read wave ram, like on the GBC), requiring exact precise timing if this quirk is abused. However, that would end up creating some (minor?) distortion with the volume register abuse, since it couldn't be timed to the exact sample read (as that has to be delegated to the wave ram write rather). In the case of this TAS, neither of these quirks actually abused, somewhat like if it was done on the GBA, resulting in the very low quality PCM, especially so as wave ram has to be constantly reloaded. In the case of this TAS, it ends up disabling the DAC in order to disable the channel, which you don't really want to do as that would result in an audio pop (although, I'm not sure if old gambatte here is accurate enough for that or if it's just the audio being so crunchy it's not really noticable). And on the GBA, due to even more quirks with how channel 3 was implemented, this doesn't just cause an audio pop, it results in a loud spike (there are techniques to avoid this, but that of course consumes more precious CPU time, which is even more precious if you also want to abuse volume). Of course, a GB TAS can just be done on the GBC rather in its DMG mode and abuse this quirk. But either way, it prevents console verification being done on the GBA, even if the input rate was not an issue (unless you don't care about the audio here anyways and consider sync "good enough").
Emulator Coder, Judge, Experienced player (905)
Joined: 2/26/2020
Posts: 824
Location: California
TiKevin83 wrote:
But at the same time, reductio would say it would be crazy to accept 50 TASes of Yellow like this that ACE in different videos.
A better question here is actually, why Yellow? Why not Red/Blue, Gold/Silver/Crystal, maybe Link's Awakening, or even Shiren GB. Bad Apple itself has pretty much no connection to these games, just like Yellow, and all could potentially end up running nearly the exact same code. Of course, if you want to say "use the fastest ACE exploit," Japanese Yellow is likely not the fastest GB game in this case, Red/Blue is probably faster (language differences aside). Maybe even Shiren GB is even faster (although how much extra time is needed to gain full control is difficult to ascertain). "Use the fastest ACE exploit" would end up possibly being English Yellow for the GBC however (which is kind of partly a reason for MrWint to use that, but even then there's artistic reasons besides that). Of course, then again, you have the NES Bad Apple TAS which just decided to use Super Mario Bros with cartridge swapping to allow for ACE (and even that is somewhat sketchy since that was just abusing loading a savestate made in Super Mario Bros 3, which acts as a pseudo cart swap), which throws game choice even more out the window. The run technically had some gameplay before Bad Apple, although that is somewhat more shoehorned in before the actual ACE playaround (keeping in mind ACE already happened before that point, with Super Mario Bros 3). We also have this in the movie rules, which proceeds to make the above even more questionable
ACE is freely allowed in playarounds, though the spirit of the original game should be maintained, and copyright should not be infringed. Fair use applies here.
This rule is arguably violated by this run and the Super Mario Bros run, since the actual ACE playaround is just Bad Apple. Of course, this is if we're saying this is actually an ACE playaround. The fact it is devoid of originality and just effectively plays a video which has no connection to the game means it is more just a technical demonstration, like demoscene (which at that point these Bad Apple runs exactly matches such). Of course, if we're effectively just doing demoscene, why even use an actual game? Why not just create a custom ROM which streams video/audio from the joypad and play it back. With say Super Mario Bros 3 that's only a very very minor step away from an actual game. With such a custom ROM, you also could just "recreate" whatever game you want. Play back a video "doing ACE" in whatever game, play the video you would be playing in that ACE payload within that video, and have the end of the video being "completing the game," fanfare and all. As far as some YouTube viewer would tell, it would be exactly the same as doing ACE within the game. Only when you look at the description do you find how the game is no longer actually present. That last point is more hyperbole, as it is more like if you were to video edit some ACE segment within an existing movie video. The only difference is you have a movie file in the end, although you couldn't actually play it back in any actual game, only within this custom ROM which is not a video game. These points aren't necessarily against having this movie published nor for having Bad Apple NES unpublished (Bad Apple NES being published arguably marks precedent in itself which we would not want to reverse), but more shows there needs to be discussion on how to handle these TASes, if they don't actually qualify as ACE playarounds under the current rules, but are more just technical demonstrations.
Editor, Reviewer, Skilled player (1372)
Joined: 9/12/2016
Posts: 1648
Location: Italy
TiKevin83 wrote:
But at the same time, reductio would say it would be crazy to accept 50 TASes of Yellow like this that ACE in different videos.
I think any ACE payload TAS should be published as a new branch, as long as it features a new unique software. I think the real point behind this kind of ACE TASes is in the programming, not in the visual result. And since there there has been put a lot of effort and uniqueness in the technical aspects of this TAS, I think it achieves its actual purpose, and thus should be published. Unless anyone can point out if its code is too much similar to MrWint's ACE.
my personal page - my YouTube channel - my GitHub - my Discord: thunderaxe31 <Masterjun> if you look at the "NES" in a weird angle, it actually clearly says "GBA"

1741818019