Submission Text Full Submission Page

Introduction

This submission improves on [5327] NES Arkanoid "warpless" by eien86 in 10:56.12 by 2134 frames (~35.5 seconds).
I was satisfied with the result of my previous movie and thought no further improvements could be made without considerable effort. However, Sand mentioned I was forgetting to optimize the end-of-level score tallying into consideration. Even though he was right, I still didn't feel that justified entering a multi-month-long project once again -- not unless some other big discoveries appeared.
AND OH BOY DID THEY APPEAR!!!!!111one

Software + Hardware

Rom Information

  • Name: Arkanoid (USA)
  • ROM: Arkanoid (U) [!].nes
  • SHA1: 230FC31D2C2EB20E78711C82574F29F28117EBA3
  • MD5: 0CCC1A2FE5214354C3FD75A6C81550CC

Emulator

  • EmuHawk 2.9.1 (Core: NESHawk)

Routing Bot

  • Bot: JaffarPlus
  • Routing Core: QuickerArkBot
  • Platform:
    • 2 x AMD Epyc 7742 (128 cores, 256 threads) + 384Gb RAM
    • Exploration Rate: 1.5 Mstates/s

Encodes

Raw Input Movie

If you find the entertainment inputs too distracting, you can enjoy the following encode of my first draft that keeps the paddle static and only adds precise inputs to solve the levels.
Here you can find the corresponding movie file.

Comparison Movie

The following movie compares our solution to [5327] NES Arkanoid "warpless" by eien86 in 10:56.12
You can see this new movie improvements on all stages. That is, except for stage 28, where the same frame solution is achieved but presumably a 'lag' effect makes it finish one frame slower.

Improvements

Here is a list of ground-breaking improvements in this movie:

Consideration for End-Of-Stage Score Tallying

Took Sand's comment into account and added this factor into the bot to not finish exploration as soon as the last block break, but rather as soon as the tally ends. A simple optimization that saved a bunch of frames on those levels with plenty of silver blocks (huge uncounted score pikes).

Chef_Stef

Perhaps the most important drawback of my previous movie was the decision to go solo and not recruit the help of Chef_Stef who probably knows most about this game. As soon as I reached to him on Discord, he was extremely generous with his time and sharing his technical knowledge. He went as far as making Arkbot, his own bespoke Arkanoid emulator and brute forcer public on github for me to analyze.
We spent some time discussing the idea of a new movie (including all of other the improvements you'll read next) and we even had a call to polish some of those points. I am very grateful for his help; this movie wouldn't have been possible without it.

Arkbot's Core Emulator

Arkbot contains a core emulator that perfectly reproduces the game's logic without the need of a NES emulator. Just by using it, the emulation time went from several milliseconds to practically nothing. Furthermore, thanks to it being open source, I was able to to create QuickerArkBot, a state-reduced variant that allowed me to fit many more states in memory.

Use of Arkanoid controller.

During last year, I don't remember exactly why I decided to test how was it to play the game with Arkanoid's special controller using BizHawk. Since I didn't know you could bind the mouse to play with it, I started fooling around with manually inputting the potentiometer coordinates into TAStudio.
It took me a few seconds to realize... you can put ANY value into it and the paddle will go there immediately. This means that the game can be played with an infinite-speed paddle. The impact of this realization on botting is tremendous, as you can imagine.

Precise Decision Points

In my previous mode I had, at every node of the exploration tree, three options: "Left", "Right", and "Stay". You can imagine this very quickly exploded into an infinity of combinations that I had to tame with some heuristics.
Now, however, each node has a single option: "Stay". This keeps the exploration tree from growing out, until there is a decision point. These points are frames where the paddle's position has en effect.
Fortunately, these decision points happen very seldom and therefore it takes a lot of frames to full bring the exploration tree to fill my server's memory.
Decision points are:
  • A ball is low enough to be within the paddle reach. At this frame we decide between placing the paddle at one of the points that launch the ball in any of the 8 possible directions, or bring the paddle to the other side of the screen to not impact the ball now.
  • RNG events, as detailed below:

Full RNG Management

Thanks to Chef_Stef and the Arkbot I learned all the secrets about RNG manipulation in this game. These are the only events whose result depend on RNG:
  • Powerup Type (when you destroy a special tile)
  • Gate from which the new enemy will appear (left/right)
  • Enemy movement (when he hits a tile, left/right)
All these events will draw from the same RNG generator that takes as inputs several things, but crucially: (a) the current score's hundredth's value, and (b) the current position of the paddle.
The fact that score dictated the result was tragic because it meant that, to find a global optimum, you cannot just stitch each of the stage's optima together. You've got to consider what scores you start with and end for a total of 100 combinations.
HOWEVER, since we are using the Arkanoid controller, we have 160 ways to affect RNG arbitrarily. With this in mind, I developed an RNG manipulation logic that looked ahead and told me exactly which paddle positions returned the RNG value I needed for each event.
As a result of this optimization, we can be sure that reaching each stage optima will bring us the global optimum.

Entertainment inputs

After finishing the first draft of the movie, I felt the movie was missing some 'spice'. So I decided to develop an 'entertainment' algorithm that allows me to create some cool effects while checking that none of the additional inputs caused the solution to desync. I hope you like the effects I came up with!

nymx: Claiming for judging.
nymx: eien86...you've done it again!! Congratulations! The combined effort between you and Chef_Stef is waaaay beyond what I could have expected, when you first mentioned the idea of teaming up with the previous TASer. Now the hard work of both of you will stand for a LONG TIME! I am shocked at the cuts, and on top of that...you blew us all away with some incredible entertainment!
So, there is no reason to hold on to this submission. It speaks for itself.
Accepting over [5327] NES Arkanoid "warpless" by eien86 in 10:56.12!!!!!! and of course, it will earn the rating as with past submission....STARS!!!

EZGames69: Processing...


TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15709
Location: 127.0.0.1
This topic is for the purpose of discussing #9448: eien86 & Chef_Stef's NES Arkanoid "warpless" in 10:20.61
nymx
He/Him
Editor, Judge, Expert player (2267)
Joined: 11/14/2014
Posts: 945
Location: South Pole, True Land Down Under
Woah!! This is truly unexpected! I can't wait to dig into this!
I recently discovered that if you haven't reached a level of frustration with TASing any game, then you haven't done your due diligence. ---- SOYZA: Are you playing a game? NYMX: I'm not playing a game, I'm TASing. SOYZA: Oh...so its not a game...Its for real? ---- Anybody got a Quantum computer I can borrow for 20 minutes? Nevermind...eien's 64 core machine will do. :) ---- BOTing will be the end of all games. --NYMX
Dimon12321
He/Him
Editor, Reviewer, Experienced player (598)
Joined: 4/5/2014
Posts: 1258
Location: Romania
There was a special controller for this dilogy? Wow! Watching this TAS makes me feel like the game has the easiest difficulty where you can't lose any ball Yes vote
TASing is like making a film: only the best takes are shown in the final movie.
Asumeh
He/Him
Active player (294)
Joined: 7/18/2018
Posts: 92
Never knew Arkanoid allowed a special controller to be used instead of a regular NES controller. This was awesome. Definitely voting Yes :)
Yaaay, I'm an active player now! :D (as of 11/9/2024) Thanks to TASVideos for the support, they're awesome.
I'm Asumeh, semi-expert SMB1 TASer. :) Check out some of the TASes I don't submit/upload to TASVideos on my YouTube channel, if you'd like. In progress: - Extra Mario Bros. (redo) (with HappyLee and w7n) - I'm currently assisting with finding improvements before the boss. On hold; we're currently struggling to confirm that we have the fastest route. Some debugging may also help with finding glitch exits, but neither of us are experts in that field. - Record my older TASes (excluding any obsolete TASes) and upload to YouTube. - Pretty busy at the moment... Check out my other links here. (Mostly WIP hehe)
Post subject: Level 23 score tally
Sand
He/Him
Player (143)
Joined: 6/26/2018
Posts: 180
Great job. It's a yes vote for me. I was especially interested in the end-of-stage score tally. I recreated the graph from Post #522668 with this submission included. The graph, which shows the number of blocks remaining and the time required to tally the score for every frame in level 23, is attached below. To my surprise, this submission ties [5327] NES Arkanoid "warpless" by eien86 in 10:56.12 in level 23, taking 1588 frames. Both movies are 26 frames slower than [3943] NES Arkanoid "warpless" by Chef Stef in 11:11.18. If this submission takes the score tally into account, why is it that the optimizer did not find the faster solution? If I understand the submission notes correctly, it should be possible to teleport the paddle instantly to any required coordinate, and it should be possible to re-align the RNG sequence when earlier inputs change. Shouldn't it then be possible to import a known faster solution, even if it was not found automatically by the optimizer? Perhaps there is some important factor I am misunderstanding. I looked in the source code of QuickerArkBot to try and understand what was going on, but I may not have found the right places. I see UpdateScore, which does the tens-and-hundreds score tally logic on pendingScore. But I did not understand how it fits into determining when a level is finished. In the upstream arkbot, I see a place that checks for state.currentBlocks == 0 && state.pendingScore <= 0, but I did not find an analogous check in QuickerArkBot. I did not look at the code too hard, so it's possible I overlooked something. This is the graph that shows this submission and [5327] NES Arkanoid "warpless" by eien86 in 10:56.12 ultimately taking longer than [3943] NES Arkanoid "warpless" by Chef Stef in 11:11.18, even though they clear the final block faster, because they accumulate more pendingScore that takes time to burn down.
GamesFan2000
He/Him
Joined: 1/4/2019
Posts: 85
Location: Canada
Wait, all this time we were missing the fact that this game had a special NES controller that allowed for infinite-speed paddles AND better RNG manipulation? I'll be damned if I don't give this a yes vote for teaching me something new.
eien86
He/Him
Judge, Skilled player (1886)
Joined: 3/21/2021
Posts: 270
Location: Switzerland
Glad you're liking the movie so far ;)
Sand wrote:
I was especially interested in the end-of-stage score tally. I recreated the graph from Post #522668 with this submission included.
Ah, stage 23, my arch-nemesis xD I was so sure I had solved this issue on all levels that I didn't even care to check. You're right in your analysis: now that we have full control over the RNG, we should be able to optimally solve this level, but still won't budge. Now in hindsight, the most probable explanation is a combination of: * The exploration space is not big enough. I am limited by the size of my server's RAM (384Gb at the time). It is possible that this stage has a pending score tail that lasts so long that I end up trimming the global optimum off the exploration tree. * The reward function doesn't consider pending score negatively enough. I should increase the penalty for it so that states with large pending scores are more likely to be discarded. I pledge to come back to this and fix it for good in the future, when I buy a new (at least 2x bigger and faster) server. Probably not this year ;)
Sand wrote:
I looked in the source code of QuickerArkBot to try and understand what was going on, but I may not have found the right places.
I have not yet made publicly available what you were looking for here. Here is the software stack I used: * JaffarPlus The generic breadth-first TASing bot * NES Arkanoid-specific state evaluation and finalization criteria for JaffarPlus (what you looked for, private for now) * QuickerArkBot The game-specific emulator and RNG finder Stay tuned!
Editor, Expert player (2382)
Joined: 5/15/2007
Posts: 3942
Location: Germany
Insane movie. The special controller allowing any paddle position is... convenient. I've never heard of this controller before.
Challenger
He/Him
Skilled player (1707)
Joined: 2/23/2016
Posts: 1076
I knew about the special Arkanoid controller but I didn't expect to see another big improvement to this game. 2025 started very well. Excellent job guys!
My homepage --Currently not much motived for TASing as before...-- But I'm still working.
Editor, Expert player (2082)
Joined: 6/15/2005
Posts: 3287
I like how the Arkanoid paddle controller actually improves the TAS. 1080p60 encode, with input display: Link to video I recommend viewing at 720p60 or above, since the "entertainment" effects don't show up on 30-fps settings.
eien86
He/Him
Judge, Skilled player (1886)
Joined: 3/21/2021
Posts: 270
Location: Switzerland
FractalFusion wrote:
I like how the Arkanoid paddle controller actually improves the TAS. 1080p60 encode, with input display: Link to video I recommend viewing at 720p60 or above, since the "entertainment" effects don't show up on 30-fps settings.
Omg this encode gave me life. You can see exactly the logic behind the entertainment inputs I added. I'll use it as official encode. Thanks!
Invariel
He/Him
Editor, Site Developer, Player (172)
Joined: 8/11/2011
Posts: 546
Location: Toronto, Ontario
I don't think it's fair that you can lie to us and call this "warpless" when your paddle is clearly teleporting. Easy yes vote, great job.
I am still the wizard that did it. "On my business card, I am a corporate president. In my mind, I am a game developer. But in my heart, I am a gamer." -- Satoru Iwata <scrimpy> at least I now know where every map, energy and save room in this game is
Editor, Expert player (2082)
Joined: 6/15/2005
Posts: 3287
By the way, if you're wondering how I made the input display part of the encode (the left sidebar with the line-art paddle controller graphic), I generated the input display with a Lua script in BizHawk:
local joystick_posy=550
local fire_posy=300

local controller={}

gui.clearGraphics("emucore")
gui.clearGraphics("client")
gui.use_surface("client")

function circlebyradius(cx, cy, radius, col1, col2)
	gui.drawEllipse(cx-radius, cy-radius, 2*radius, 2*radius, col1, col2)
end

gui.drawBox(0,0,256,224,0xFF000000,0xFF000000,"emucore")

while true do
	console.clear()
	gui.drawBox(0,0,256,700, nil, 0xFF000040)
	gui.drawBox(20,220,256-20,700-20)
	gui.drawLine(123,220,123,0)
	gui.drawLine(133,220,133,0)
	circlebyradius(128,joystick_posy,80, nil, 0xFF000060)
	
	local prev_value=controller.Paddle
	local prev_fire=controller.Fire
	if not prev_value then
		prev_value=80
		prev_fire=nil
	end
	controller=joypad.getwithmovie(1)
	
	local pangle=(math.pi/180 * (180.5+(prev_value-80)*160/80))
	local angle=(math.pi/180 * (180.5+(controller.Paddle-80)*160/80))
	
	gui.drawLine(128,joystick_posy,128-80*math.sin(pangle),joystick_posy+80*math.cos(pangle), 0x40FFFFFF)
	gui.drawLine(128,joystick_posy,128-80*math.sin(angle),joystick_posy+80*math.cos(angle))
	gui.drawBox(127,joystick_posy+3,129,joystick_posy+77,0x8000FF00,0x8000FF00)	
	if controller.Fire then
		circlebyradius(128,fire_posy,30, 0xFFFF0000, 0xFFFF0000)
	elseif prev_fire then
		circlebyradius(128,fire_posy,30, 0xFFFF0000, 0x70FF0000)
	else
		circlebyradius(128,fire_posy,30, 0xFFFF0000, 0x20FF0000)
	end
	
	emu.frameadvance()
end
Then (separately from a normal encode of the TAS) record AVI with the options "Capture OSD" and "Capture Lua" enabled and do some editing with something like AviSynth. I didn't explore all the Lua gui options so there might be a better way to set this up.
CoolHandMike
He/Him
Editor, Judge, Experienced player (937)
Joined: 3/9/2019
Posts: 774
This is very superhuman looking with the paddle teleporting all over the place and very fast clears. Despite that it seems to me that certain levels should be able to be done a little faster. Some levels look amazingly fast with all the balls zipping and bouncing off blocks rapidly and everything coming to a close about the same time. However a couple stages it seems the balls kind of struggle at the end to get the final block. Some levels also seem like it would be faster if more balls were shot through holes to bounce off the top of the map and the top of the blocks since the bouncing distance is less than the distance between the paddle and the nearest blocks on the bottom. I don't know if there is a way of directing the bot, but could be something to consider (or if improving is even possible). Still looks great though!
discord: CoolHandMike#0352

1736330069