synabler
He/Him
Player (178)
🇰🇷 South Korea
Joined: 7/11/2016
Posts: 26
Location: 🇰🇷 South Korea
UFO 50 is a collection of 50 games developed by Mossmouth. The in-game lore is that these 50 games were developed by a fictional video game company in the 80s, which were forgotten over time but recently rediscovered and ported to modern PC. UFO 50 TASes are made using the CoffeeTools mod. Here is my very early WIP for one of the 50 games: Link to video To make it TASVideos-compatible, there are two options. Option 1: It could be possible to add support CoffeeTools TASes and its file format to TASVideos. Parsing it is quite simple (I'll do that if needed), and the file consists of: - magic number and CoffeeTools version number - inputs, along with its length stored in the header - the list of randomise calls, each entry containing the frame it happened on and the seed value. This function is different from rolling an RNG with that seed, and usually only called in the beginning of something (new game, new scenario, etc.) Question: is there anything needed apart from parser support? Option 2: Since UFO 50 is made in GameMaker, it should be easy in theory to port it to Linux and redo it in LibTAS (or port the TAS as well if the run doesn't have large dependence on RNG). Unfortunately, I couldn't make it to work yet. I followed these steps: - Install GameMaker 2024.14 (the version used in the most recent UFO 50 build), create an empty game, set target to Ubuntu which downloads Linux runtime that contains runner. Basically the same procedure outlined in #9924: CasualPokePlayer's Web Undertale 10th Anniversary in 01:57.133. - Copy runner to a separate directory, and make an assets subdirectory. - The Steam download has audio, fonts, languages, and texture files already extracted. Copy them over to assets, and rename data.win to game.unx. But when I run runner in Linux Mint 21.3, all I get is a black screen. In addition, there are 53 audiogroups but the log mentions only 2, and it can't find a font even though it's in assets/fonts, maybe because it's mixing up slash and backslash. Using the Windows runner in Windows works fine, so I'm not sure what exactly I'm missing. Any help would be appreciated. (EDIT Feb 19: updated the procedure and the log below in accordance with the game update that rolled out today. Same black screen as before.)
***************************************
*     YoYo Games Linux Runner V1.3    *
***************************************	 
CommandLine: 
MemoryManager allocated: 51958

***************************************
 *     GameMaker v1.0.999.32908    *
***************************************
-game not provided, defaulting to game.unx
ExeName= /home/jh/Desktop/Game/ufo50linux/runner
Game path: /home/jh/Desktop/Game/ufo50linux/assets/game.unx
Reading File /home/jh/Desktop/Game/ufo50linux/assets/game.unx took 30 ms
SavePrePend /home/jh/.config/ufo50// 
dlopen(Steamworks_x64.dll) failed with error: "libSteamworks_x64_linux_arm64-v8a.so: cannot open shared object file: No such file or directory"
display=0x30b86c70
Display Size(Pixels): 1366,768
CreateDesktopWindow 384,216
Win #1
XF86VidModeExtension-Version 2.2
Got Doublebuffered Visual!
glX-Version 1.4
Root window 2309
Creating window of width 384, height 216
WindowCentre: 491,276
Depth 24
Congrats, you have Direct Rendering!
sync = 0
**** GLX Extensions ***
GLX_ARB_context_flush_control GLX_ARB_create_context GLX_ARB_create_context_no_error GLX_ARB_create_context_profile GLX_ARB_create_context_robustness GLX_ARB_fbconfig_float GLX_ARB_framebuffer_sRGB GLX_ARB_get_proc_address GLX_ARB_multisample GLX_EXT_buffer_age GLX_EXT_create_context_es2_profile GLX_EXT_create_context_es_profile GLX_EXT_fbconfig_packed_float GLX_EXT_framebuffer_sRGB GLX_EXT_no_config_context GLX_EXT_swap_control GLX_EXT_swap_control_tear GLX_EXT_texture_from_pixmap GLX_EXT_visual_info GLX_EXT_visual_rating GLX_INTEL_swap_event GLX_MESA_copy_sub_buffer GLX_MESA_query_renderer GLX_MESA_swap_control GLX_OML_swap_method GLX_OML_sync_control GLX_SGIS_multisample GLX_SGIX_fbconfig GLX_SGIX_pbuffer GLX_SGIX_visual_select_group GLX_SGI_make_current_read GLX_SGI_swap_control GLX_SGI_video_sync 
Checking for GLX_EXT_swap_control
Vsync: GLX_EXT
DOUBLE BUFFERED
Display mode: 1366x768@59.789539Hz
XFixes extension version 6.0 found
OpenGL: version string 4.6 (Compatibility Profile) Mesa 23.2.1-1ubuntu3.1~22.04.3
OpenGL: vendor string Intel
OpenGL GLSL: version string 4.60
OpenGL version - detected 4.6
OpenGL: VBOs supported
OpenGL: Non-power-of-two textures supported
OpenGL: packed 24bit depth/8bit stencil supported
OpenGL: seperate 8bit stencil supported
Anisotropic filtering supported, max aniso 16
OpenGL: 1 and 2 channel integer surface formats supported
OpenGL: 4 channel half-float surface formats supported
OpenGL: 1 and 2 channel half-float surface formats supported
OpenGL: 4 channel float surface formats supported
OpenGL: 1 and 2 channel float surface formats supported
This is where it would have set them fullscreen= 0, they are 384,216    displaywidth/h 1366,768
Collision Event time(microsecs)=3776
Variable_Global_Init()
PrepareGame()
Audio_Init()
Audio group 0 -> Loaded
GAMEPAD: Initialising Ubuntu support
Attempting to set gamepadcount to 32
Game_Prepare()
Script_Prepare() 
TimeLine_Prepare() 
Object_Prepare() 
Room_Prepare() 
Finished PrepareGame() 
Run_Start
Done g_EffectsManager.Init()
Done RenderStateManager
CreateColPairs took 0.004000s 4175 usecs for 4258 object types obj_col_numb=0 physobjcount=293 resizes 0 final size 23196
Done ObjectLists
Done Extension_Initialize
About to startroom
FreeType :: unable to find font file /home/jh/Desktop/Game/ufo50linux/assets/fonts\JF-Dot-ShinonomeMin12-Alt.ttf
sync = 1
**** GLX Extensions ***
GLX_ARB_context_flush_control GLX_ARB_create_context GLX_ARB_create_context_no_error GLX_ARB_create_context_profile GLX_ARB_create_context_robustness GLX_ARB_fbconfig_float GLX_ARB_framebuffer_sRGB GLX_ARB_get_proc_address GLX_ARB_multisample GLX_EXT_buffer_age GLX_EXT_create_context_es2_profile GLX_EXT_create_context_es_profile GLX_EXT_fbconfig_packed_float GLX_EXT_framebuffer_sRGB GLX_EXT_no_config_context GLX_EXT_swap_control GLX_EXT_swap_control_tear GLX_EXT_texture_from_pixmap GLX_EXT_visual_info GLX_EXT_visual_rating GLX_INTEL_swap_event GLX_MESA_copy_sub_buffer GLX_MESA_query_renderer GLX_MESA_swap_control GLX_OML_swap_method GLX_OML_sync_control GLX_SGIS_multisample GLX_SGIX_fbconfig GLX_SGIX_pbuffer GLX_SGIX_visual_select_group GLX_SGI_make_current_read GLX_SGI_swap_control GLX_SGI_video_sync 
Checking for GLX_EXT_swap_control
Vsync: GLX_EXT
Set Fullscreen 1
Setting audio channel count to 32
Audio group 1 -> Loading...
Audio group 2 -> Loading...
Decoding bgm00_alpha_end...
Total memory used = 295527552 (0x119d6480) bytes 281.84MB
Free memory = 6286208 (0x005feb80) bytes 5.99MB
Peak memory used = 295527552 (0x119d6480) bytes 281.84MB
**********************************.
Entering main loop.
**********************************.
Audio group 1 -> Loaded
GraphicsResetM called with g_NewWindowWidth=-1 g_NewWindowHeight=-1 g_WindowWidth=384 g_WindowHeight=216 g_ClientWidth=384 g_ClientHeight=216
Window Size w=1366 h=768
Data too large and INCR mechanism not implemented
Decoding bgm00_alpha_intro...
Decoding bgm00_alpha_stingStart...
Decoding bgm00_alpha_stingWin...
Decoding bgm00_boss01...
Decoding bgm00_boss02...
Decoding bgm00_cracktro...
Decoding bgm00_libraryGarden...
Decoding bgm00_libraryInfinity...
Decoding bgm00_libraryNormal...
Decoding bgm00_lonestar_stingTitle...
Decoding bgm00_stingLX...
Decoding bgm00_stingTitleA...
Decoding bgm00_stingTitleB...
Decoding bgm00_stingUFOSoft...
Audio group 2 -> Loaded
ikuyo
She/Her
Admin Assistant, Senior Judge, Experienced player (621)
🇨🇱 Chile
Joined: 7/8/2021
Posts: 186
Location: 🇨🇱 Chile
Hi! This is awesome to hear! Regarding the feasibility of the options: 1) To make a CoffeeTools TAS file readable to our site, we would need to have a parser file for it. The parser file would have to be able to count frames and framerate, and gives us the total length of the movie in seconds and miliseconds. This, once it gets deployed on our end, would be enough to allow all .CTAS files to be uploaded to The whole site is open source, and if you or anyone else in the community wants to make said parser, you are more than welcome! However, for the purposes of having said tool acceptable for publication, we would need a bit more. In particular, we would need to know the current state of the tool and, crucially for us, its reliability (as in, how reliably one of our judges can get the movie files to sync on their copies of the game in their computers, provided they download the file and try to run the tool themselves). If the tool is reliable enough to allow for the judging process to run without major hiccups, we should be able to accept it for publication. I took the initiative to already ask some questions about these issues in the UFO 50 community Discord, and if you or anyone else has any info they can provide us, please do! 2) Regarding issues with libTAS, it's probably best to raise an issue on their github repo or discord server.
GuanlongX wrote:
auuuugh my face when games are creative and cool and don't fit arbitrary rulesets
synabler
He/Him
Player (178)
🇰🇷 South Korea
Joined: 7/11/2016
Posts: 26
Location: 🇰🇷 South Korea
Thanks! For clarification about option 2, I encountered that problem when running runner directly, so it's probably a problem somewhere with my porting rather than LibTAS.
ikuyo
She/Her
Admin Assistant, Senior Judge, Experienced player (621)
🇨🇱 Chile
Joined: 7/8/2021
Posts: 186
Location: 🇨🇱 Chile
O Oops! I know some people in TASVideos and or libtas should be familiar with the porting process for game maker. I dont know much about the potential issues, but they might!
GuanlongX wrote:
auuuugh my face when games are creative and cool and don't fit arbitrary rulesets
Sand
He/Him
Editor, Player (142)
Joined: 6/26/2018
Posts: 225
Wow! I'm excited about the possibility of UFO 50 TASing. I'm curious what RNG manipulation could accomplish in games like Planet Zoldath and Party House. Other games that come do mind that could have interesting TAS strategies are Onion Delivery, Rail Heist, Porgy, Overbold, and Mortol II.
ikuyo wrote:
1) To make a CoffeeTools TAS file readable to our site, we would need to have a parser file for it. The parser file would have to be able to count frames and framerate, and gives us the total length of the movie in seconds and miliseconds. This, once it gets deployed on our end, would be enough to allow all .CTAS files to be uploaded to The whole site is open source, and if you or anyone else in the community wants to make said parser, you are more than welcome!
Here are some past pull requests that add new parsers, to give you an idea of what's involved:
Samsara
She/They
Site Admin, Expert player (2403)
Location: Northern California
Joined: 11/13/2006
Posts: 2905
Location: Northern California
Quick Windows documentation for the setup/playback process:
  • Download UFO 50 Mod Loader and extract wherever.
  • Download CoffeeTools and Save to Different File from the Mod Loader. The former is the TAS tools, the latter just ensures a fresh file without touching any vanilla save data.
  • Win+R > %localappdata% > ufo50. Create a folder named coffeetools here.
  • Place a play.ctas in the coffeetools folder and it will play back automatically when the game is run through the Mod Loader.
  • Note: The file HAS to be named play.ctas for it to play back.
  • Delete save1_modding.ufo from ufo50 to ensure a fresh save for future TASes.
TASvideos' Third Strongest Site Admin 🩵 Currently working in limited capacity.
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
synabler
He/Him
Player (178)
🇰🇷 South Korea
Joined: 7/11/2016
Posts: 26
Location: 🇰🇷 South Korea
Sand wrote:
Wow! I'm excited about the possibility of UFO 50 TASing. I'm curious what RNG manipulation could accomplish in games like Planet Zoldath and Party House. Other games that come do mind that could have interesting TAS strategies are Onion Delivery, Rail Heist, Porgy, Overbold, and Mortol II.
Yesterday I experimented with a few games to see how RNG behaves, since CoffeeTools has a feature to display RNG information. Unfortunately, Party House RNG seems harder to manipulate than I had hoped for. Each day starts with the Rolodex pre-shuffled, and inviting, peeking, etc. simply extracts the next guest from the list. A saving grace though is Magician: trying to use his ability advances the RNG, even if it fails due to having no star guests. So I imagine scenario 5 would be easier to manipulate luck compared to other standard scenarios. Overbold, on the other hand, is an RNG gold mine. For some reason, a whole new seed is generated whenever an enemy spawns in the arena!
Sand
He/Him
Editor, Player (142)
Joined: 6/26/2018
Posts: 225
synabler wrote:
Yesterday I experimented with a few games to see how RNG behaves, since CoffeeTools has a feature to display RNG information. Unfortunately, Party House RNG seems harder to manipulate than I had hoped for. Each day starts with the Rolodex pre-shuffled, and inviting, peeking, etc. simply extracts the next guest from the list. A saving grace though is Magician: trying to use his ability advances the RNG, even if it fails due to having no star guests. So I imagine scenario 5 would be easier to manipulate luck compared to other standard scenarios.
I see, how interesting. Still, even if the rolodex order is fixed, it should be possible to optimize any given day for cash and/or pop. Being able to see the order in advance, you would never draw one too many guests and overrun the trouble budget, slash you wouldn't have to spend resources on trouble mitigation when you know you won't need it. Conceivably, it could make sense in some cases to buy "chaff" guests, like old friend, purely for the effect they would have on shuffle (if you need a particular guest on the first turn of the next day, say). Since the game is so discrete, it's the kind of thing that might be amenable to offline optimization, reimplementing the RNG and shuffle algorithm and using computer search to find good seeds or good strategies per seed. I'm guessing that the RNG seed is somehow randomized at the start of a new game, even if is not changeable within or between rounds (excepting the magician).
synabler
He/Him
Player (178)
🇰🇷 South Korea
Joined: 7/11/2016
Posts: 26
Location: 🇰🇷 South Korea
Updates: Starting today, with the parser implemented by ikuyo, TASVideos recognizes the .ctas format. Thanks to everyone for the support! Currently the displayed movie length may have slight deviation from the actual length. The reason is that the game changes framerate briefly for certain freeze-frame effects, and CoffeeTools currently doesn't track that, so the parser assumes a constant 60 FPS for now. The CoffeeTools devs are planning to add a deterministic timer for the next update, as well as rerecord counts. I uploaded the first ctas file: User movie #639093466508806347 Link to video Those numbers in the video are from a separate mod I'm making to aid in TAS-ing, which I plan to share in a near future after adding some more numbers. It's a purely cosmetic mod, and I checked that my TAS plays correctly with or without it. I'm also writing a Game Resources page for UFO 50: https://tasvideos.org/GameResources/Windows/UFO50 Meanwhile, if someone figures out how to make the libTAS method work, that would be a nice plus since both options have their pros and cons. I find CoffeeTools very convenient to work with though, so I'm glad to have brought it up.
Sand
He/Him
Editor, Player (142)
Joined: 6/26/2018
Posts: 225
Wow this is so cool :) I did not know about those Mortol glitches, the jump out of the parachute and the jump on spikes.
synabler
He/Him
Player (178)
🇰🇷 South Korea
Joined: 7/11/2016
Posts: 26
Location: 🇰🇷 South Korea
I finished the TAS of the next 3 levels of Mortol. Bad news: it desynced!! The way I did it is by making individual level TASes (using the OPEN-TOMB terminal codes that unlocks all levels), one per level, then programmatically stitching them together. Then I realized that this affects the RNG. I thought each level started from a fixed RNG state because that's what CoffeeTools' RNG UI displayed, but the situation was a bit more complex. I needed to know how the boss RNG works anyway, so I investigated what is happening, and documented it in the Game Resources page for Mortol, along with most of the tricks and glitches I've known so far.
Samsara
She/They
Site Admin, Expert player (2403)
Location: Northern California
Joined: 11/13/2006
Posts: 2905
Location: Northern California
I've mirrored the Game Resources page over to Wiki: EmulatorResources/CoffeeTools just to have it ready for when CoffeeTools updates and we approve it for site submissions. Thank you for all the work you've put into this, synabler!
TASvideos' Third Strongest Site Admin 🩵 Currently working in limited capacity.
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.

1778296347