Multiplayer icon indicating copy to clipboard operation
Multiplayer copied to clipboard

Patch for UndercaveMapComponent (pit gate)

Open SokyranTheDragon opened this issue 9 months ago • 4 comments

Info on UndercaveMapComponent:MapComponentTick and why it needs patching:

  • RNG calls after current map/visible camera area checks
  • Majority of the RNG calls are visual/audio effects only
  • TriggerCollapseFX does have an effect on simulation by spawning collapsed mountain roof
    • The collapsing rocks have minimal impact on the game, as they avoid player pawns

Fixing RNG is easy by just pushing/popping the state.

Fixing the collapsed mountain roof is more complex. Possible solutions:

  • Disable rock collapse completely
  • Disable current map checks (suboptimal for performance)
  • Disable the existing calls to TriggerCollapseFX and call it in a deterministic way (used in this PR)

Information about the patch:

  • The transpiler will make the call to Rand.MTBEventOccurs always fail, making so TriggerCollapseFX is never called
    • This could be further improved by removing the RNG call and the current map check altogether to improve performance, but would be more complex
  • The prefix and postfix push/pop RNG state, making sure the ticking code doesn't mess with the RNG state
  • The postfix re-implements the call to TriggerCollapseFX in a deterministic way
    • If the current player is not looking at the current map, it will be called with 0 as both arguments to prevent additional effects from triggering
    • The call to the method is surrounded by RNG push/pop state, as the amount of RNG calls will differ if the player is not looking at the map
      • It's safe as the simulation-affecting RNG calls happen first, followed by RNG calls that don't affect simulation and may be called a different amount of times
      • The call is currently unseeded, but could be easily seeded with Gen.HashCombineInt(Find.TickManager.TicksGame, __instance.map.uniqueID) if we care about having a seed here

Remaining issues with UndercaveMapComponent/Pit Gate:

  • The rock collapse has additional check to not drop rocks on player faction pawns. However, I assume this won't work properly with Multifaction, which could end up crushing pawns of some players.

SokyranTheDragon avatar May 18 '24 21:05 SokyranTheDragon