Posts for InfoTeddy

Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
Turns out it was my fault and I had the virtual screen resolution set to 640 x 480 (in my defense, I didn't think it would persist). If you have the screen resolution set this way, then --width and --height won't work anyway. Edit: The movie syncs fine but my dump has slightly noticeable audio lag compared to the temp encode provided. Not sure where it is coming from. My encode settings are:
  • Video codec: H264
  • Video bitrate (kbps): 4000
  • Audio codec: AAC (Advanced Audio Coding)
  • Audio bitrate (kbps): 128
  • ffmpeg options: -c:v libx264 -b:v 4000k -c:a aac -b:a 128k -crf 0
Is this something you just fixed with video editing?
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
Randomno wrote:
I don't understand this since they're on opposite sides of the screen. The game is 750x600 which is what I'm running it at. The first mouse coordinate is 550, 530. How does that click the left side of the screen? I have another version for 1500x1200 if that helps. I double checked the ruffle version and the file I uploaded and they're correct.
The window for me opens in 640 x 480, not 750 x 600. Not sure why. I double-checked and the MD5 hashes of the SWF files are the same, and I'm using the same Ruffle nightly version specified in the submission.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
coolman wrote:
Did you try on Bluemaxima's Flashpoint? They might have the right version in there.
The only result for Puffle Launch links to a dead link and I'm not sure how to download it. Edit: Nevermind, was looking at the wrong link. Edit 2: I have the correct menus.swf now, but it still desyncs the same as before. It's clicking on the "Visit Club Penguin" button instead of "Start Game". Seems to be an issue related to mouse coordinates and window size that affects the entire movie even if I fix the first mouseclick.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
I am unsure how to obtain a copy of the correct version of the game. I found a website with the game (many search results are about the iOS/Android version of Puffle Launch, which is not what we want), and used browser tools to grab the SWF and related assets. The main game SWF matches the MD5 hash listed in the submission, however the menus.swf file does not, and unfortunately, that results in the movie being unable to sync. The Disney LOL version appears defunct (just redirects to the homepage) and the archived version on the Wayback Machine does not appear to have the necessary assets. All search results for Puffle Launch on archive.org return files for the mobile version of the game.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
zaphod77 wrote:
here's the actual original disk. converted to .d64 format. yes, its' actually the original. direct from c64pp.
Please do not post direct links to ROMs. That is piracy, which is prohibited on this site. Thank you.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
lmao nice meme
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
mindnomad wrote:
I'd love to see a Pizza Tower TAS at some point. the game just came out on steam, and it was made for speedrunning. any% and 100% runs would be great but IL runs would be fun to watch too
Game appears to be made in GameMaker, so it might be able to be ported over to Linux and TASed.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
I think the problem Spikestuff is pointing out is that your run is effectively duplicate content of the existing run, even if your run does technically complete the game in the fastest possible time.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
Automanager wrote:
That's fine with me. Can somebody set this submission to delayed? Thanks
I can't actually set the submission to delayed until the 72-hour grace period is up. Until then we'll just have to make sure to check the thread.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
feos wrote:
Wouldn't that result in upscaling by the factor of 4, as opposed to adding 0-3 pixels so it becomes the nearest multiple of 4? Here's how I do it in avisynth:
Language: avs

# rounds an integer up or down to the nearest multiple of mod function ForceModulo( \ int number, \ int mod, \ bool up \){ return (up \ ? (int(number + mod - 1) / mod) * mod \ : int(number / mod) * mod) }
Hm, looks like there's a force_divisible_by option for scale. So it would be scale=ih*4/3:ih:force_divisible_by=4 then. Though I'm not sure if it will always add or subtract pixels.
despoa wrote:
Is it possible to get something close to feos's encoding package for windows by shell scripting with variables and conditionals?
It should be. feos's encoding package is already just batch shell scripting anyway.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
If it isn't then FFmpeg will error and then you can adjust the dimensions accordingly (by adding *4, etc.).
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
My bad, it should be ih*4/3:ih then.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
feos wrote:
What would be the -filter_complex for cases when you need to upscale 2x with neighbor and then lanczos width to be 4/3 of height?
Probably something like [2]scale=iw*2:ih*2:flags=neighbor,scale=iw*4/3:ih:flags=lanczos[v], but I haven't tried.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
I use Linux as my daily driver and have done so for the past 6 years. I believe it's the best operating system. So I figured out the best way to encode on it. FFmpeg is my tool of choice. Previously, I used to have a bunch of commands to do one encode, which also generated a bunch of intermediate, temporary files, but when it came time to encode [5036] Linux Cyber Shadow by keylie in 42:24.12, I figured that I could just use one script and thus have only one file generated, which would be most convenient. So here's the encode script I used: Download encode.sh
Language: shell

#!/usr/bin/env bash ffmpeg \ \ -t 2 -f lavfi -i anullsrc \ \ -t 2 -loop 1 -r 60 -i /B/P/tasencodelogos/logo_16to9_3840x2160.png \ \ -t 49:01.500 -i 'cybershadow_dump.avi' \ \ -qp 0 -pix_fmt yuv420p \ -filter_complex '[2]ass=cybershadow_dump.ass,scale=3840:2160:flags=neighbor[v];[1]setsar=1[im];[im][0][v]concat=n=2:v=1:a=1' \ -c:a flac \ \ cybershadow_encode.mkv
Make sure to chmod +x ./encode.sh before running it with ./encode.sh (you'll want to change the path to the logo .png too). For the subtitles (cybershadow_dump.ass), I used Aegisub (which on Fedora can be installed with sudo dnf install aegisub). For the dump (cybershadow_dump.avi), I dumped with UTVideo for the video codec and FLAC for the audio codec. Now this might look a bit complicated, but this is actually as simple as I could make it. In shell scripting, ending a line with a backslash (\) escapes the newline so the current line actually continues to the next line, and I use that to make the ffmpeg invocation be spread out across multiple lines. If it was one line, it would be
ffmpeg -t 2 -f lavfi -i anullsrc -t 2 -loop 1 -r 60 -i /B/P/tasencodelogos/logo_16to9_3840x2160.png -t 49:01.500 -i 'cybershadow_dump.avi' -qp 0 -pix_fmt yuv420p -filter_complex '[2]ass=cybershadow_dump.ass,scale=3840:2160:flags=neighbor[v];[1]setsar=1[im];[im][0][v]concat=n=2:v=1:a=1' -c:a flac cybershadow_encode.mkv
which is harder to read. So here's what each line does:
  • -t 2 -f lavfi -i anullsrc: FFmpeg takes a series of inputs. Each input in FFmpeg is specified with -i, followed by the name (in most cases this will be a filename on your disk), and the options preceding it are specifying information about that input. In this case, -t 2 means to only take 2 seconds of the input, and -f lavfi specifies that the format is lavfi. With -i anullsrc, this means to create an input that is 2 seconds of blank audio. As you may have guessed, this is needed to place 2 seconds of blank audio underneath the 2 seconds of logo, which will be the next input.
  • -t 2 -loop 1 -r 60 -i /B/P/tasencodelogos/logo_16to9_3840x2160.png: Again, -t 2 specifies a length of only 2 seconds. -loop 1 means that the resulting video should loop (1 meaning 'true', as opposed to 0). -r 60 specifies that the framerate should be 60 frames per second (matching the dump of Cyber Shadow), and of course -i is followed by the path to the image. As you may have guessed, the image is my logo file.
  • -t 49:01.500 -i 'cybershadow_dump.avi': This is the dump itself. -t 49:01.500 means to cut it off at timecode 49:01.500 (which is right when the ending music loops in the dump).
  • -qp 0 -pix_fmt yuv420p: -qp 0 means that the quality should be lossless (if it was higher, it would be more lossy). This is needed because we haven't specified a video codec for the output file, so FFmpeg will default to x264. -pix_fmt yuv420p specifies that the pixel format should be YUV420p.
  • -filter_complex '[2]ass=cybershadow_dump.ass,scale=3840:2160:flags=neighbor[v];[1]setsar=1[im];[im][0][v]concat=n=2:v=1:a=1': Okay, this is the big line. -filter_complex is basically just a grab bag of letting you use every filter at once. It's what lets me put this all in one script instead of having to have multiple scripts and a bunch of intermediate temporary files laying around. Each entry in the following string is separated with a semicolon (;), and follows the format [input]filter[output]. There can be multiple inputs, and multiple filters are separated by commas (,). So let's look at each entry:
    • [2]ass=cybershadow_dump.ass,scale=3840:2160:flags=neighbor[v]: This takes the stream named 2, hardcodes the subtitles (from cybershadow_dump.ass), then scales it up to 4K resolution (I dumped the game at 1x native resolution to save disk space), and puts the result in a stream named v. In this case, 2 refers to the third -i input from earlier, and FFmpeg automatically numbers each -i input for you (starting from 0).
    • [1]setsar=1[im]: This takes the 1 stream (the logo .png), sets its sample aspect ratio to 1, and then puts it in a stream named im. I'm not actually sure why this is here, but it's probably needed for concatenation.
    • [im][0][v]concat=n=2:v=1:a=1: This takes the im, 0, and v streams (the im and v streams are the same streams we created in previous entries), and concatenates them. n=2 because there are two segments to concatenate (the logo and the dump), and v=1:a=1 because there should only be 1 video and 1 audio track in the end. There is no stream specified at the end because this will end up being the output of the entire FFmpeg command itself.
  • -c:a flac: Sets the audio codec to FLAC.
  • cybershadow_encode.mkv: If there's an argument that isn't preceded by a flag, FFmpeg will interpret it as the name of the output file. So this is the output file.
With this, I could just let my computer encode the file and then upload the file straight to YouTube when it was done. Of course, I tested it by doing -t 30 just to make sure everything encoded fine, before I did the full encode (which took ~2 hours). Here's something slightly more complex, the script I used to make the downloadable uploaded to archive.org: Download downloadable.sh
Language: shell

#!/usr/bin/env bash ffmpeg \ \ -t 2 -f lavfi -i anullsrc \ \ -t 2 -loop 1 -r 60 -i /B/P/tasencodelogos/logo_16to9_800x450.png \ \ -t 49:01.500 -i 'cybershadow_dump.avi' \ \ -f srt -i CyberShadow.srt \ -crf 20 -pix_fmt yuv420p -x264opts keyint=600:merange=64:colormatrix=smpte170m \ -filter_complex '[0]aresample=48000,atrim=start_sample=5060[a];[2]ass=cybershadow_dump.ass,scale=800:450:flags=neighbor[v];[1]setsar=1[im];[im][a][v]concat=n=2:v=1:a=1' \ -c:a aac -vbr 2 \ -c:s mov_text \ \ cybershadow-tas-keylie.mp4
It's similar to the previous script, except there's now a fourth input (the commentary subtitles, named CyberShadow.srt) which is embedded using -c:s mov_text. There's also extra filters on the audio and extra options for the video to cut down on file size. For my future encodes, I'm going to just make copies of these scripts and then tweak things as needed, which is the simplest thing that works for me.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
While I'm able to sync this on the provided version (-app 242820 -depot 242824 -manifest 4541605642527131830), the game seems to softlock whenever I try to dump it and will stop advancing at a certain point. One attempt softlocked at 12:06 and another softlocked at 19:40. I'm unsure of the cause of these softlocks other than perhaps CPU slowdown from dumping. That's also not to mention that the resulting dump seems to be a black screen most of the time, but that seems like a separate issue. The console constantly prints [libTAS f:82085] Thread 1827603 (main) ERROR: glBindFramebuffer failed with error 1282 but I'm not sure if that's related. Is anyone else able to dump this EDIT: Turns out I needed to get software rendering working.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
EZGames69 wrote:
If Mario were to bounce off enemies like that, would he need to have stronger legs or would the enemies need to have mini trampolines on their heads?
Yes.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
I'd like to encode the publication for this.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
sinphy wrote:
the "without eating any ghosts" was just a thought for another cat, shoulda put a comma also yeah i partially see where i did mess up, for example that loop that i kept just passing and then couldnt get the fruit for 2-4k i dont remember if it changes or not but again im gonna be taking this into consideration for my next tas ill research the ghost manipulation because it sounds kinda cool to use and routing will be changed because it was really just weird, like that one pause at the first tas for like a second at the start ill research them now man thanks
If you want to submit improvements, do you want this submission (and the other one) canceled in the meantime?
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
Elomavi wrote:
On the debugging version of VVVVVV that Info Teddy sent me, I appear to be experiencing the exact same RNG that you two are based on the video she sent me.
Hmm, if the debug version works then (besides the potential issue of SDL_GetTicks()) there's probably a problem with compiler optimizations (and maybe floating-point numbers too). I'll try to rectify this in 2.4. Actually, that doesn't make sense if we were all using the same release build of 2.3.6... I'm not sure what's causing the difference, then.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
I also gave the debug version to him too so he'll be back with his printed RNG values when he gets around to it.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
p0008874 wrote:
If you want to recreate this miracle,
This is not a "miracle" in the slightest. As far as I know, they never got it working (or working well) with anything other than Terraria, which is literally the exact same situation as Hourglass with Cave Story.
p0008874 wrote:
Learn Rust and C#
I fail to see how either of those languages would help solve the fundamental problem of Windows in any way. They may be better languages to use, but they're not magic and they're not silver bullets. You would still need to, y'know, actually deal with the obstacles that Windows creates, no matter what language you use.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
Another person asked yet again about a Windows TAS tool in the libTAS server, and I vaguely remembered this guy and their attempt to make such a tool. So I decided to check on it. Well, it's not looking good. It doesn't look like FishLordSilvers has posted any updates on either Reddit nor YouTube in 3 months, and both of the videos they posted have been deleted.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
Elomavi wrote:
Just for redundency, here are the options I have on libTAS:
  • Force Software Rendering
  • Prevent Writing to disk
  • System time: 1 second (at Power On)
The way I implemented it, none of these should really matter except for system time. Since 2.3, Gravitron uses its own deterministic Xoshiro RNG completely separate from all other uses of randomness, and it is seeded by using the value of SDL_GetTicks() on the frame that you enter any game mode and load in. In hindsight, I probably should have used the game's internal frame counter in case the values of SDL_GetTicks() were somehow not consistent.
Elomavi wrote:
Would it be possible for you to send a video of the TAS desyncing in Gravitron?
Okay, sure: Link to video
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
dsiware wrote:
this is ruffle i know its for flash games but does it let you tas pc games with it
No. In fact, Ruffle can't be TASed just by itself, and people need to use libTAS to TAS it. libTAS can TAS certain PC games, but not all of them.
Experienced Forum User, Judge, Moderator, Player (196)
Joined: 7/15/2021
Posts: 110
Location: United States
Thank you for all your work Noxxa!