Skip to content

Conversation

@mitchell-merry
Copy link
Contributor

Why this change?

Cuphead runs are done across many different versions (4 major versions). These use different versions of unity and such different versions of mono. The auto version detection does not work for Cuphead, it always picks V1, when some versions use V1Cattrs.

What changed?

The issue lies here. When iterating over class tables, we do an extra dereference at 0x0. This causes us to load Int32 from mscorlib.dll as the first class, which of course has a different address at it's image address than Assembly-CSharp.dll, so it detects it as not V1Cattrs (if you recall, the mono version detection works by checking if the first class in the default image's image offset (using v1cattrs) matches the default image's address (bleh). if it does, v1cattrs, otherwise v1).

Not doing the extra dereference (which, is what I've seen every other unity introspection library not do, including voxelse which is linked as a reference in code) causes it to load ButtonIdentifier, which does have the Assembly-CSharp.dll as it's image, so it correctly identifies v1cattrs.

I've manually set the version as V1Cattrs and printed out the list of classes that this function loads in order with and without this patch. I think it's pretty clear that this change is correct.

auto_splitter_logs without.txt
auto_splitter_logs with.txt

Without:

[20:44:22][Auto Splitter][INFO] class Ok("Int32")
[20:44:22][Auto Splitter][INFO] class Ok("BaronessLevelCupcake")
[20:44:22][Auto Splitter][INFO] class Ok("Int32")
[20:44:22][Auto Splitter][INFO] class Ok("InputFieldInfo")
[20:44:22][Auto Splitter][INFO] class Ok("BaronessLevelGumball")
[20:44:22][Auto Splitter][INFO] class Ok("InputRow")
[20:44:22][Auto Splitter][INFO] class Ok("Int32")
[20:44:22][Auto Splitter][INFO] class Ok("LanguageData")
[20:44:22][Auto Splitter][INFO] class Ok("BaronessLevelGumballProjectile")
[20:44:22][Auto Splitter][INFO] class Ok("CustomEntry")
[20:44:22][Auto Splitter][INFO] class Ok("BaronessLevelJawbreaker")
[20:44:22][Auto Splitter][INFO] class Ok("Int32")
[20:44:22][Auto Splitter][INFO] class Ok("ScrollbarVisibilityHelper")
[20:44:22][Auto Splitter][INFO] class Ok("ScrollRectSelectableChild")
[20:44:22][Auto Splitter][INFO] class Ok("BaronessLevelJawbreakerGhost")
[20:44:22][Auto Splitter][INFO] class Ok("ThemedElement")
[20:44:22][Auto Splitter][INFO] class Ok("BaronessLevelJawbreakerMini")
[20:44:22][Auto Splitter][INFO] class Ok("ElementInfo")
[20:44:22][Auto Splitter][INFO] class Ok("Int32")
[20:44:22][Auto Splitter][INFO] class Ok("ThemeSettings")
[20:44:22][Auto Splitter][INFO] class Ok("BaronessLevelMiniBossBase")
[20:44:22][Auto Splitter][INFO] class Ok("SelectableSettings_Base")
[20:44:22][Auto Splitter][INFO] class Ok("OnDamageTakenHandler")
[20:44:22][Auto Splitter][INFO] class Ok("SelectableSettings")

With:

[20:42:35][Auto Splitter][INFO] class Ok("ButtonIdentifier")
[20:42:35][Auto Splitter][INFO] class Ok("BaronessLevelCupcake")
[20:42:35][Auto Splitter][INFO] class Ok("State")
[20:42:35][Auto Splitter][INFO] class Ok("InputFieldInfo")
[20:42:35][Auto Splitter][INFO] class Ok("BaronessLevelGumball")
[20:42:35][Auto Splitter][INFO] class Ok("InputRow")
[20:42:35][Auto Splitter][INFO] class Ok("State")
[20:42:35][Auto Splitter][INFO] class Ok("LanguageData")
[20:42:35][Auto Splitter][INFO] class Ok("BaronessLevelGumballProjectile")
[20:42:35][Auto Splitter][INFO] class Ok("CustomEntry")
[20:42:35][Auto Splitter][INFO] class Ok("BaronessLevelJawbreaker")
[20:42:35][Auto Splitter][INFO] class Ok("State")
[20:42:35][Auto Splitter][INFO] class Ok("ScrollbarVisibilityHelper")
[20:42:35][Auto Splitter][INFO] class Ok("ScrollRectSelectableChild")
[20:42:35][Auto Splitter][INFO] class Ok("BaronessLevelJawbreakerGhost")
[20:42:35][Auto Splitter][INFO] class Ok("ThemedElement")
[20:42:35][Auto Splitter][INFO] class Ok("BaronessLevelJawbreakerMini")
[20:42:35][Auto Splitter][INFO] class Ok("ElementInfo")
[20:42:35][Auto Splitter][INFO] class Ok("State")
[20:42:35][Auto Splitter][INFO] class Ok("ThemeSettings")
[20:42:35][Auto Splitter][INFO] class Ok("BaronessLevelMiniBossBase")
[20:42:35][Auto Splitter][INFO] class Ok("SelectableSettings_Base")
[20:42:35][Auto Splitter][INFO] class Ok("OnDamageTakenHandler")
[20:42:35][Auto Splitter][INFO] class Ok("SelectableSettings")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant