Replies: 11 comments
-
When you use a .flow object in a .leaf or .lvl object, the associated "param_path_hash" is the magic number of the name of an external input script node. It is usually not reversible because there are no traces of the original name in either the .pc game files or the game executable. The only way to reverse it is to guess the original name and see if the string hashes into the same magic number. |
Beta Was this translation helpful? Give feedback.
-
Ah, that sucks. |
Beta Was this translation helpful? Give feedback.
-
Unlike the level select screen, the rail colors inside a level are set in a .flow object within the level .objlib itself. They can only be changed when I add support for .flow objects to the modding tool. It's going to take a very long time, since .flow objects are the most complicated object type. There's an example in the wiki to give you an idea of what a .flow object looks like. |
Beta Was this translation helpful? Give feedback.
-
Got another question; |
Beta Was this translation helpful? Give feedback.
-
"dissonant_bursts.flow" can be used directly because the custom levels references "global.objlib" in the global library list, and "global.objlib" references "global/dissonant_bursts.objlib". It should work as long as the sequencer object is formatted correctly in your custom level. |
Beta Was this translation helpful? Give feedback.
-
Got another question for you. Let's say we lost the wiki and we had to find a file: The current hash function only hashes into parameter paths for objects, unfortunately not file names. For example, 30291331 is level_9a.objlib, right? Well, what if we had to find that file without the wiki? Due to the hash function only doing parameter paths, we couldn't find it if we wanted. Is there a different hash function? |
Beta Was this translation helpful? Give feedback.
-
For .objlib files, the cache filename is generated by applying the hash function on the lowercase of the file path with a capital 'A' prepended to it. So for level_9a.objlib, the whole thing before the hash function is "Alevels/level9/level_9a.objlib", and it becomes "30291331.pc" afterwards. |
Beta Was this translation helpful? Give feedback.
-
Got another question. |
Beta Was this translation helpful? Give feedback.
-
While "LevelLib" is one of the object types, the game has never referenced a "LevelLib" as a global library or an external object from within. Even if you can reference .leaf or .lvl objects from the the official levels as external objects, I don't see how it's a huge breakthrough when you are only reusing the official objects. |
Beta Was this translation helpful? Give feedback.
-
Is it possible to grab any of the original files (.leaf, maybe .lvl, possibly master-sequin) from the original campaign? It's a bit of a pain having to recreate patterns from the original levels in our GUI while designing levels. |
Beta Was this translation helpful? Give feedback.
-
Rainbow, the github wiki went down. Do you still have it? There's currently a lot of work going on that is using it and the only wiki we have is out of date as it hasn't been updated since October 2020. I'm developing a tool that allows us to rip files and your formats help a bunch, but some useful information has been lost. |
Beta Was this translation helpful? Give feedback.
-
This is the hash function I currently have from the wiki.
uint32_t hash32(std::string s) {
uint32_t h = 0x811c9dc5;
for (std::string::size_type i = 0; i < s.length(); i++)
h = (h ^ s[i]) * 0x1000193;
h *= 0x2001;
h = h ^ (h >> 0x7);
h *= 0x9;
h = h ^ (h >> 0x11);
h *= 0x21;
return h;
}
Unfortunately, this function only gives us the hashed parameter names, not file names. Currently, I'm trying to find .flow files as there isn't any on the wiki (We're trying to find other flow objects like crakhed_colors.flow and we can use them, however we have to use the hashed magic numbers instead of the real parameters from the game. Any advice you could give us?
Long story short, we need to track down the original parameter paths, and the only way we think we can do it is by finding the original objlib file (for example french_horn_chords.flow from global/french_horn_chords.objlib, how would we locate french_horn_chords.objlib is the question?) and getting the parameters from there. Unfortunately stating an issue with the editor is the only way I can contact you. Any help? Much appreciated for the last fix!
Beta Was this translation helpful? Give feedback.
All reactions