Skip to content

native: divergence at tic 143, a damaged thing keeps its old frame #459

Description

@MarcusKainth

ROM sha256

9a6a47d01119f67580e48e9875207186c25efd56ff93019df331eb307cfaa5d9

WAD sha256

1d7d43be501e67d927e415e0b8f3e29c3bf33075e859721816f652a526cac771

ClickHouse version

26.7.5.10

First divergent tic (gametic)

143

First divergent frame, if a frame differs

No response

What disagrees

A mobj field

The divergence report

clickdoom: error: tic 143 mobj slot 118 m_x: 8272000 against the probe's 8245976

native diff stops on the first field, so the report names m_x. Comparing
every mobj column at that tic gives the whole set:

col       slots       ours                 probe
m_frame   [118,258]   [2,2]                [7,7]
m_momx    [118,258]   [-26024,47238]       [-23585,42809]
m_momy    [118,258]   [-77677,-113436]     [-70395,-102802]
m_momz    [265..271]  [131072 x7]          [65536 x7]
m_x       [118,258]   [8272000,13992912]   [8245976,14040150]
m_y       [118,258]   [-4310912,4297488]   [-4388589,4184052]
m_z       [265..271]  [2384896,...]        [2515968,...]

m_health, m_flags, m_state and m_tics agree on every slot, so the
damage itself lands. Three separate things are missing.

m_frame on slots 118 and 258 is this report's subject. P_DamageMobj
calls P_SetMobjState, which writes the entered state's sprite, frame and tics
along with the state. The damage writes m_state (449 to 455) and m_tics,
and slot 118's state matches the probe, but m_frame stays at 2 where the
probe has 7. states gives state 455 a frame of 7, so the frame the thing
shows is the frame of the state it left.

m_sprite agrees only because states 449 and 455 share sprite 0.

The other two are separately tracked work: m_x, m_y, m_momx and m_momy
on the same two slots are P_XYMovement for a thing that is not the player,
and m_z and m_momz on slots 265 to 271 are P_ZMovement for the blood the
shots spawned.

Random draws at that tic

No response

Reproduction

# On the branch that fires the shotgun's seven shots.
make native-load
clickdoom native diff 150 \
  --probe refemu/reference_traces/demo3/probe.9a6a47d01119.tsv \
  --host localhost --port 8123 --password clickdoom --database clickdoom_native

# The whole column set at the tic, rather than the first field:
#   SELECT arrayFilter(k -> n.m_frame[k] != p.m_frame[k], arrayEnumerate(n.m_frame))
#   FROM clickdoom_native.native_state n, clickdoom_native.probe_state p
#   WHERE n.tic = 143 AND p.gametic = 143

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: nativeNative mode: the tic simulation and renderer as SQL, and the WAD loaderdivergencerefemu and sqlcpu disagree on the same ROM

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions