Patch for UndercaveMapComponent (pit gate)
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
TriggerCollapseFXdoes 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
TriggerCollapseFXand call it in a deterministic way (used in this PR)
Information about the patch:
- The transpiler will make the call to
Rand.MTBEventOccursalways fail, making soTriggerCollapseFXis 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
TriggerCollapseFXin a deterministic way- If the current player is not looking at the current map, it will be called with
0as 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
- If the current player is not looking at the current map, it will be called with
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.
@Zetrith if you'd prefer me to change something here or use a different approach to patching this let me know.
Looks fine though it conflicts with latest merges
Yup, I'll handle it tomorrow (or the day after, depending if I'll have the time).
I've rebased the branch, so it should now be safe to merge to master.