Comments
Thomadin4 years ago

Just to chime in with a clarification:

"if someone can make it, new load remover that detects a perfect match with the loading cycle, instead of black screen because its 8 static images instead of a changing fade out that can be messed up by really dark areas and have inconsistencies."

That is way easier said than done - you cannot simply compare some static images to the various different capture sources there are. You could do something similar to what AutoSplit does, which requires people to capture the reference images from their own capture source. However, that would increase the barrier to entry a lot by requiring users to perform some steps that can be very prone to error prior to a run. Different capture setups will never allow you to detect a perfect match unless you tune it to your capture setup. And as soon as you change things, you'll need to capture reference images again.

If you don't do that, you will have a much more inaccurate load remover compared to just detecting black screens as there will be people with different resolutions, different capture sources, etc., where the load remover will just fail because the "static image" is not similar enough. And if you make the detection criteria too loose, the load remover might fail because something looks similar to the load screen animation thing.

In the Crash (NST, Nitro Fueled) community I got around that by painstakingly collecting data from various different capture sources until the load remover was fully reliable. I'm not sure if that would be necessary for this game, given that detecting black screens should work fine?

If the black screen detector is done properly (it hasn't been done properly yet since it wasn't made for this game), I'm pretty sure you would not have issues with dark areas unless most of your screen is completely dark.

But other than that, I'm not a runner of this game so I won't actively participate in the discussion (I'd only provide details about potential load removers and their feasibility), just wanted to clarify some load-remover related things.

EDIT: about the accuracy of black screen detection: If you run the black screen detector multiple times on the same video to see if there are inaccuracies in across the same settings/run (I chose one of the leaderboards top runs for that experiment), you'll only get a difference of ~20-100 milliseconds. That means in ~13 minutes of real time, you can expect an inaccuracy of ~20-100 milliseconds with the same settings.

Thomadin7 years ago

I managed to do that thing with the abandoned cores. You can now customize splits for specific amounts of abandoned cores collected. Since the game autosaves when you collect a core, this might be pretty useful. While digging through the save file, I also added the possibility to split at specific checkpoint coordinates, although I don't have all the coordinates. If you want, you can dig through the game or the save file and customize your splits even more.

vars.splitAbandonedCores = new int[] {1, 3, 5, 9, 11};

vars.splitAbandonedCores contains a "Split list" for the amount of abandoned cores you collected. In this case, it would split when 1, 3, 5, 9 and 11 cores are collected.

vars.splitCPXCoordinates = new int[] {7, 8}; vars.splitCPYCoordinates = new int[] {5, 5};

The coordinates are a little more advances, as they require some knowledge on the internals of the game. On "Crash Site", the checkpoint/level coordinates start at X = 5 and Y = 5. Going right increases the X value, while going left decreases it. Similar behavior for the Y coordinate. If you want, you can use these checkpoint coordinates to specify custom checkpoints where you want to split.

Also, I'm terribly sorry for the messy code, the .asl scripting stuff doesn't let me define my own functions, so everything is pretty cluttered in the script. Still, I'm glad you're having fun with it.

PrettzL likes this
Thomadin7 years ago

Thanks for the list! If anyone encounters bugs with any of these, feel free to post them. (Although I'm not sure how fast I'll be able to fix occuring bugs, still got lots of other stuff to do as well ;-) )

I might take another look at the save file - I know that things such as the last Checkpoint position and probably other stuff such as the amount of abandoned cores collected are also in the save file. I've also made pretty good progress in analyzing the full save file structure.

Would anybody have interest in splits after a certain amount of cores are colected, for example?

PrettzL likes this
Thomadin7 years ago

I updated the script, it is found at the same link. I hope doubleposting is okay in this case ;-)

Both of rezoons' suggestions made it in. You can now customize the autosplitter a little bit more.

In the "Scriptable Auto Spliter" Layout Settings you can now enable/disable "Split every N Saves" and "Split on Save String". For "Split every N Saves", it basically splits every N times the save file is changed (autosave, save and exit, etc.). For "Split on Save String" it splits when the save file is changed and contains specific configurable strings found in the save file.

You can configure these options in more detail inside the script itself.

In line 27, you find the following:

vars.splitEveryNSaves = 1;

You can change this value to your liking, making it split every 1, 2, ... , N times the save file is changed. This was rezoons' first suggestion.

For the save string part, you have to change stuff in line 81:

vars.splitStrings = new string[] {"lava", "getAbandonedCore", "gauss", "autofire", "FIRST_HEART", "LINK_TO_THE_HEART", "SKIP_TREEMAN_DOMAIN", "getLightorb"};

In this line, you can add/remove as many strings which are found in the save file as you like. The ones I added by default are just examples I was using for testing. Make sure that the syntax is correct, each item has to be written inside double quotes, separated by a comma. The last item does not have a comma at the end.

You can also combine both splitting methods. As an example: you could split every 3 checkpoints or whenever a specific save string is found.

Keep in mind that it is still only possible to split when the game saves, so even if you, for example, collect the light orb and use the "getLightorb" string to split, it will still only split the next time the game is saved.

Hope you guys enjoy the better customization options!

PrettzL likes this
Thomadin7 years ago

Glad you like it!

As far as I know, Livesplit does not allow for anything else than simple checkboxes for "true or false" configuration inside the settings, so everything you mentioned would have to be customized inside the script file itself.

Should be very well possible though!

The idea with the strings from the save file is great, I think I'll just make a customizable list inside the script containing all strings you want to split for. Then you can just add the strings you want and choose if you want it to split there or not.

Regarding the "split every N checkpoints" thing - this is also easy. I will probably add these things in in a day or two.

PrettzL likes this
Thomadin7 years ago

I should probably also mention one thing: You need to split after the final shmup boss fight yourself, since the savefile doesn't change afterwards. I don't think there is an "easy" way for me to add the final split, since the memory adresses of the game change dynamically every time it is loaded (flash/adobe air is just in time compiled). I might take a look at it again though. Same also goes for the start of the timer, since the savefile is created when entering "Crash site".

If anybody wants it, I can make the timer start configurable, so you have to manually start/reset it. That way you could manually start the timer upon "New Game". Just tell me what you guys need and I'll try to add it ;-)

EDIT: Just saw that you can already do that. If you want to manually start/reset the timer, just untick the "Start" and "Reset" Options in the Scriptable Auto Splitter Settings in your Livesplit Layout.

PrettzL likes this
Thomadin7 years ago

Hey guys,

I recently played through OTS and had a lot of fun, so I casually started doing some faster runs through it. I know that it is timed by using the IGT, but in order to see my improvements, I made an Autosplitter Script for Livesplit for OTS.

You can find it here: http://www.mediafire.com/download/omj1d9m8kk5mw5r/OutThereSomewhereV2.asl

IMPORTANT EDIT: The old version (without the abandoned core / checkpoint splitting functions) can still be found here:

http://www.mediafire.com/download/fpd334qdi494c4a/OutThereSomewhere.asl

In order to use it, you can basically just follow the Instructions for the Autosplitter Component of Livesplit on

https://github.com/LiveSplit/LiveSplit/blob/master/Documentation/Auto-Splitters.md

You also need to change the script to point it to your speedrunning-savefile of OTS.

In order to do this, open the .asl Script file with any text editor and change the following line:

var path = "YOUR_SAVEFILE_PATH";

Put the full path to your OTS savefile there. The script will automatically check if the File exists or not, and start the run-timer as soon as the save file is created. This will cause runs to start after the shmup-section in the beginning. (Which is not equal to the IGT, but since the splits are only used to show differences in runs and not for timing, that doesn't really matter.)

It also automatically resets your run if you delete your savefile.

The script will split every time the savefile changes, e.g. when using a checkpoint or picking up an alien artifact.

In the new versions, you can configure your savefile by editing the .asl file.

You can change and modify the following things to your liking:

vars.splitEveryNSaves = 1;

vars.splitEveryNSaves determines after how many save file changes the program should split, if the 'Split every N Saves' option is enabled in the layout settings. For 1, it splits every time the file changes. For 2, every other time...

vars.splitStrings = new string[] {"lava", "getAbandonedCore", "gauss", "autofire", "FIRST_HEART", "LINK_TO_THE_HEART", "SKIP_TREEMAN_DOMAIN", "getLightorb"};

vars.splitStrings contains the strings found in the save file which the program should split. Make sure the syntax stays correct here.

vars.splitAbandonedCores = new int[] {1, 3, 5, 9, 11};

vars.splitAbandonedCores contains a "Split list" for the amount of abandoned cores you collected. In this case, it would split when 1, 3, 5, 9 and 11 cores are collected.

vars.splitCPXCoordinates = new int[] {7, 8}; vars.splitCPYCoordinates = new int[] {5, 5};

The coordinates are a little more advances, as they require some knowledge on the internals of the game. On "Crash Site", the checkpoint/level coordinates start at X = 5 and Y = 5. Going right increases the X value, while going left decreases it. Similar behavior for the Y coordinate. If you want, you can use these checkpoint coordinates to specify custom checkpoints where you want to split.

I hope some of you find it useful, it's at least a lot of fun to casually play it that way :-)

EDIT: fixed a bug where the script splitted instantly, that was not supposed to happen ;) Newer version can be downloaded at the same link.

EDIT2: More bugfixes. Didn't actually test what happens if you pick up artifacts or kill enemies. Should work now. The splitter now should split whenever the savefile changes.

EDIT3: ¤sigh¤ should work now. I finished a whole run with correctly detected splits, hopefully it works for all categories :-)

thisishowmymindworks, PrettzL and 3 others like this
About Thomadin
Joined
7 years ago
Online
4 years ago
Runs
4
Games run
Out There Somewhere
Out There Somewhere
Last run 7 years ago
3
Runs
Assault Android Cactus
Assault Android Cactus
Last run 7 years ago
1
Run