Grindstone, Bangles & Damage over Time
Why a flat bonus can cause very large fire and poison tick increases, what is confirmed in the code, and what remains conditional.
Reviewed local game tables and selected native instructions from Windows build 1.1.1.0. Original-instruction tests use synthetic actors and engine services. They are not gameplay measurements; online overrides have not been observed.
A small tick base makes a flat bonus powerful
Grindstone authors +15 to BaseDamageBonus for 6 seconds using the NonStacking trait. It is a flat internal bonus, not +15% and not automatically +15 displayed damage. Blaze Bangle and Blight Bangle have separate added-hit and status payloads.
MMC_Damage's missing Health input falls back to 1. In a qualified attack with that fallback and otherwise neutral factors, adding Grindstone changes the base from 1 to 16. Burning's −2 coefficient gives requests of −2 and −32; Poisoned's −4 coefficient gives −4 and −64. The 16-fold ratio is a conditional arithmetic example, not a universal measured multiplier or proof of exactly 20×.
Community reports support a large interaction, but do not establish controlled gear, target, patch or tick-by-tick measurements. The selected status builder writes Duration and copies attack-source tags; it does not write Health. Selected game-global hooks are no-ops, but all surrounding components and callbacks have not yet been excluded as possible input writers.
Evidence for this section
- A flat bonus on a small tick base can explain the roughly sixteenfold pattern
Authored modifier; native calculation and eighteen synthetic CPU checks; conditional explanation. Record:
reference/local-grindstone-status-evidence-1.1.1.0.json/findings/1.Reviewed record SHA-256:
f7cb606b1f50a3f3d4cc32ef99f66f12cd23322d95b9a0d88ac67594967f0c84 - Large tick boosts are independently reported, but twenty times is not a universal measured ratio
Multiple firsthand community reports plus a user-supplied screenshot. Record:
reference/local-grindstone-status-evidence-1.1.1.0.json/findings/0.Reviewed record SHA-256:
f7cb606b1f50a3f3d4cc32ef99f66f12cd23322d95b9a0d88ac67594967f0c84 - The status builder binds duration and copies source tags without setting Health
Native builder/spec-constructor/tag-append instructions; eight controlled boundary cases. Record:
reference/local-status-application-evidence-1.1.1.0.json/findings/3.Reviewed record SHA-256:
a182ec3d1e44e467f7d1fcd102452e811c190dc66152df15df6869536b189918 - Selected game-global application hooks do not add a Health binding
Static class/vtable and callback-registration trace. Record:
reference/local-status-tag-construction-evidence-1.1.1.0.json/findings/1.Reviewed record SHA-256:
d5823171f0c968f3d0c999fbce040d2fd018ec5fbf513203b6d6c90d4f70b6ac
A bangle hit and its later status are different calculations
The selected added-damage consumer requires an exact melee attack-source match. Matching bangle buffs collect statuses in a set, while one selected additional instant-damage view is overwritten by later matches. Two active bangles can therefore collect both statuses without proving two independently added instantaneous components. Actual iteration order remains unresolved.
The bangle's extra instant component has authored base 2. The hit-to-status event forwards its attack source and a literal magnitude of 1, rather than the final direct-hit damage. The reviewed forwarding path does not automatically copy a critical tag into the status.
Attack tags can qualify a tick for the flat attack bonus. A melee source tag can qualify weapon-power and empowerment factors. Those facts do not automatically make a periodic tick a critical, an instant hit or a recipient of every melee-damage modifier.
Evidence for this section
- Blaze and Blight Bangles grant distinct added-damage and status definitions
Exact authored tag/row joins. Record:
reference/local-grindstone-status-evidence-1.1.1.0.json/findings/2.Reviewed record SHA-256:
f7cb606b1f50a3f3d4cc32ef99f66f12cd23322d95b9a0d88ac67594967f0c84 - The added-damage consumer requires an exact attack-source match
Native instruction trace and eleven controlled selection cases. Record:
reference/local-status-application-evidence-1.1.1.0.json/findings/0.Reviewed record SHA-256:
a182ec3d1e44e467f7d1fcd102452e811c190dc66152df15df6869536b189918 - Multiple bangles collect multiple statuses but share one selected added instant component
Native storage/loop trace and controlled order-reversal cases. Record:
reference/local-status-application-evidence-1.1.1.0.json/findings/1.Reviewed record SHA-256:
a182ec3d1e44e467f7d1fcd102452e811c190dc66152df15df6869536b189918 - A hit forwards its attack source and a literal status magnitude of one
Native dispatch/event instructions; seven source scenarios with fourteen event deliveries. Record:
reference/local-status-application-evidence-1.1.1.0.json/findings/2.Reviewed record SHA-256:
a182ec3d1e44e467f7d1fcd102452e811c190dc66152df15df6869536b189918
Status duration, periods and recalculation
Full Burning has a −2 coefficient, a 0.5-second period and a default duration of 4 seconds. Full Poisoned has a −4 coefficient, a 1.1-second period and a default duration of 15 seconds. Both enable execution on application and use NeverReset for their periodic timer. These are not enough to assert an exact tick count at expiration or after reapplication.
Burning.Short uses a 0.4-second period and Poisoned.Short uses 0.8. Application exclusions distinguish short and full variants. Never substitute a short variant's period for every source of that status.
Negative-status duration is default duration × source negative-duration-given factor × target negative-duration-received factor × event magnitude. Positive statuses use their positive-duration counterparts. A value of 1 is neutral.
All 47 reviewed damage captures are non-snapshot captures linked to actor attribute aggregators. Periodic execution recalculates its modifier before applying the coefficient. Later ticks can therefore use changed resolved attributes, including a Grindstone bonus appearing or expiring. This does not establish the order of buff expiration and a simultaneous tick, nor an extra tick whenever an attribute changes.
The resolved full Burning and Poisoned policies use AggregateByTarget with stack limit 1. The child NeverReset setting survives inheritance from NonStacking, whose own raw default is ResetOnSuccessfulApplication. The selected duration policy refreshes on successful application. The recovered timer rules below still require explicit frame timing and expiration-policy assumptions before generating a scenario.
Evidence for this section
- Fire and poison require separate tick calculations and lifetimes
Authored status definitions. Record:
reference/local-grindstone-status-evidence-1.1.1.0.json/findings/3.Reviewed record SHA-256:
f7cb606b1f50a3f3d4cc32ef99f66f12cd23322d95b9a0d88ac67594967f0c84 - Short poison and burning variants must stay separate
Authored local data. Record:
reference/local-mechanics-evidence-1.1.1.0.json/reviewFindings/2.Reviewed record SHA-256:
b0ab63e0606439b04fb9087a3c7f99f2e88bd3069624cc70f211205697fbc232 - Source and target status-duration modifiers multiply
Original duration calculation; seven controlled attribute-selection cases. Record:
reference/local-status-application-evidence-1.1.1.0.json/findings/4.Reviewed record SHA-256:
a182ec3d1e44e467f7d1fcd102452e811c190dc66152df15df6869536b189918 - Damage captures stay linked to source and target attributes
Native initialization/capture/query trace and twelve controlled live-versus-snapshot cases. Record:
reference/local-status-lifecycle-evidence-1.1.1.0.json/findings/0.Reviewed record SHA-256:
1770e48faf656112929521f01b15bb3f7547fde658b4ab92353d0109dca59e46 - Periodic execution recalculates the existing effect’s damage
Native timer-callback-to-execution trace and ten repeated-execution scenarios. Record:
reference/local-status-lifecycle-evidence-1.1.1.0.json/findings/1.Reviewed record SHA-256:
1770e48faf656112929521f01b15bb3f7547fde658b4ab92353d0109dca59e46 - The engine applies the status coefficient after MMC recalculation
Native custom-magnitude wrapper and authored Burning/Poisoned definitions. Record:
reference/local-status-lifecycle-evidence-1.1.1.0.json/findings/2.Reviewed record SHA-256:
1770e48faf656112929521f01b15bb3f7547fde658b4ab92353d0109dca59e46 - Later ticks can gain and lose the Grindstone boost
Inference from the recovered live-capture and per-execution recalculation paths; controlled intermediate-stage examples. Record:
reference/local-status-lifecycle-evidence-1.1.1.0.json/findings/3.Reviewed record SHA-256:
1770e48faf656112929521f01b15bb3f7547fde658b4ab92353d0109dca59e46 - Capture dependencies and timer setup do not establish an extra damage tick
Native dependency registration tests and static timer-setup trace. Record:
reference/local-status-lifecycle-evidence-1.1.1.0.json/findings/4.Reviewed record SHA-256:
1770e48faf656112929521f01b15bb3f7547fde658b4ab92353d0109dca59e46 - Repeated statuses and different bonuses are separate stacking questions
data-and-engine-model. Record:
reference/local-combat-formula-evidence-1.1.1.0.json/findings/5.Reviewed record SHA-256:
3c2eb87416ae4f2b217b79ddd453ed9d65fe98aaee226c2cfa7c69e623cd03d8 - Full Burning and Poisoned retain their child NeverReset setting
Authored status/trait rows, native merge/field-assignment trace and three controlled merge cases. Record:
reference/local-status-reapplication-evidence-1.1.1.0.json/findings/0.Reviewed record SHA-256:
d928b10076f274b729f018d07838be9b6749da2e797b850763d5c87dc11a245c
Reapplication can change whose damage is used
For an accepted authoritative reapplication of the same full-status effect definition, the native stack path replaces the stored specification with the incoming specification and keeps the stack count capped at one. AggregateByTarget does not require the same attacker. The replacement includes source context, source captures and set-by-caller inputs; this branch does not select the stronger damage value.
A weaker source can therefore replace a stronger source on this recovered path. Later periodic calculations use the latest accepted specification and its linked source attributes. This matters when one player has an active Grindstone bonus and another player reapplies the same status. It is a conditional native-code result, with no co-op gameplay measurement yet.
The full-status NeverReset policy skips the periodic scheduling block on accepted refresh, including that block’s additional on-application execution request. Duration refresh is a separate operation. Refreshing a status is therefore not grounds to add another independent damage stream or assume a fresh immediate tick.
Application acceptance is essential: overflow denial and nonauthoritative control cases preserved the old specification. Immunity, short/full variant exclusions, reactive callbacks and online replacements remain separate checks. Matching uses the gameplay-effect definition identity; sharing a related tag is insufficient.
Twenty-four controlled native cases cover stack lookup, replacement and scalar inheritance. A conditional adapter matches twenty-one of those cases, rejects eighteen invalid inputs and tracks changing source attributes at explicitly supplied execution times. It does not generate tick timestamps, DPS or final Health loss.
Evidence for this section
- An accepted same-status reapplication replaces its stored source specification
Eleven native stack-lookup cases and ten native replacement/control cases with explicit engine fixtures. Record:
reference/local-status-reapplication-evidence-1.1.1.0.json/findings/1.Reviewed record SHA-256:
d928b10076f274b729f018d07838be9b6749da2e797b850763d5c87dc11a245c - Accepted full-status refresh skips this periodic timer-reset branch
Native replacement flags and periodic scheduling gate; duration helper and timer-call static trace. Record:
reference/local-status-reapplication-evidence-1.1.1.0.json/findings/2.Reviewed record SHA-256:
d928b10076f274b729f018d07838be9b6749da2e797b850763d5c87dc11a245c - The conditional model now tracks the latest accepted status source
Twenty-one native policy comparisons, eighteen rejected invalid inputs and three software compositions. Record:
reference/local-status-reapplication-evidence-1.1.1.0.json/findings/3.Reviewed record SHA-256:
d928b10076f274b729f018d07838be9b6749da2e797b850763d5c87dc11a245c
Frame timing, catch-up and the last tick
Execution on application is registered through the timer manager. It is not a synchronous damage call in that branch. Whether it can run in the current timer pass or a later one depends on the registration phase and the GuaranteeEngineTickDelay setting. The live setting and authoritative frame timing have not been measured.
The selected timer manager processes an active deadline only when its internal time is strictly greater than that deadline. A due repeating timer computes trunc((internalTime − deadline) / period) + 1 callbacks. The normal timer wrapper used here leaves max-once-per-frame disabled, so delayed frames can request multiple calculations in one pass.
Before removing an effect under the tested ClearEntireStack policy, the duration callback checks its periodic timer. If no more than 0.0001 seconds remain and the effect is not inhibited, it can request a final periodic calculation, then clear that timer. Equal deadlines follow the native heap order; they do not have an assumed universal priority.
In controlled native-code scenarios, four-second Burning requested nine calculations with 1/32-second frame steps and ten with supplied 0.5-, 1- or 4.5-second steps. Fifteen-second Poisoned requested fourteen with 1/32-second steps. These are conditional engine scenarios with matching supplied clocks, bound delegates and an explicit expiration policy. They are not measured gameplay totals or evidence of a client-frame-rate damage advantage.
The conditional timeline calculator matches all thirty native timing cases and rejects twenty-two invalid inputs. In a saved Poisoned scenario with neutral factors and an explicitly absent Health binding, a supplied +15 flat bonus from t=1 to t=7 produces six requests of −64 and eight of −4: −416 internal signed modifier units in total. This sum is not final Health loss, displayed damage or DPS. Application acceptance, live attributes, clock steps and policy remain explicit inputs.
Evidence for this section
- Execution on application is scheduled through the timer manager
Original timer registration and Tick instructions, with explicit storage/delegate fixtures. Record:
reference/local-status-timer-evidence-1.1.1.0.json/findings/0.Reviewed record SHA-256:
66c8590d366b5f01a424ef349b2b7872630fd4b3b08522e40a7ed138eaebb454 - Delayed frames and expiration affect the number of requested calculations
Original timer Tick, heap ordering, periodic callback and duration-expiration instructions. Record:
reference/local-status-timer-evidence-1.1.1.0.json/findings/1.Reviewed record SHA-256:
66c8590d366b5f01a424ef349b2b7872630fd4b3b08522e40a7ed138eaebb454 - A conditional calculator now generates status requests from supplied frame steps
Thirty native schedule comparisons, twenty-two rejected invalid inputs and four software compositions. Record:
reference/local-status-timer-evidence-1.1.1.0.json/findings/2.Reviewed record SHA-256:
66c8590d366b5f01a424ef349b2b7872630fd4b3b08522e40a7ed138eaebb454
Rejection, immunity and paused status ticks
Applying a status and allowing its ongoing effect are separate decisions. The recovered component checks application requirements first; enabled removal requirements can also reject it. Ongoing requirements can suppress an existing effect without rejecting creation. Required tags must all match, while any matching ignored tag blocks that predicate. An owned child tag can satisfy a parent requirement; owning the parent does not satisfy a child requirement.
When owned tags change, a valid active effect first checks enabled removal requirements. Otherwise its ongoing requirements request active or inhibited state. Empty removal requirements do not remove every effect. Authority and the explicit client-removal switch affect whether removal checks run; these controls cannot be omitted when composing a scenario.
Six native transition sequences, covering sixteen transitions, preserve the existing periodic and duration handles for the tested NeverReset status fixtures. Setting the same inhibited state again does not rerun the transition handlers. In those fixtures, suppressing then resuming a status does not restart its periodic clock. Reactive listeners, cues and granted abilities were empty in the test, and the complete live object/default-copy path remains unverified.
A software-composed Poison example uses the earlier +15 flat-bonus schedule but supplies immunity from time 2 through time 8. It produces eight requests instead of fourteen, with a signed modifier sum of −92 instead of −416 in that specific schedule. These are requested modifier units, not final Health loss, displayed damage or DPS. The immunity schedule is an input, not a newly observed gameplay fact.
The selected status application virtual call now resolves to the traced core. The three inspected definition-component application callbacks make no further specification changes in the native fixture. This does not exclude all live delegates or establish that the Health and ProtectedByShield inputs are always absent.
Evidence for this section
- Selected status application entry and component callbacks resolved
Static class/constructor/vtable trace plus original-instruction callback dispatch. Record:
reference/local-status-admission-evidence-1.1.1.0.json/findings/0.Reviewed record SHA-256:
7284c1c4da673e8688679f7e373b7642757c2f4f6f19579a1bced300b07bdf98 - Application rejection and ongoing suppression are separate decisions
Twenty-nine native predicate/component cases; twenty-eight portable comparisons. Record:
reference/local-status-admission-evidence-1.1.1.0.json/findings/1.Reviewed record SHA-256:
7284c1c4da673e8688679f7e373b7642757c2f4f6f19579a1bced300b07bdf98 - Tested NeverReset inhibition transitions preserve periodic timer handles
Native tag-change requests and six state-transition sequences covering sixteen transitions. Record:
reference/local-status-admission-evidence-1.1.1.0.json/findings/2.Reviewed record SHA-256:
7284c1c4da673e8688679f7e373b7642757c2f4f6f19579a1bced300b07bdf98 - Supplied immunity changes can now drive the conditional status schedule
Portable model with twenty-one invalid-input rejections and one software composition. Record:
reference/local-status-admission-evidence-1.1.1.0.json/findings/3.Reviewed record SHA-256:
7284c1c4da673e8688679f7e373b7642757c2f4f6f19579a1bced300b07bdf98
Fire and electricity have a distinct fusion rule
The recovered fusion path combines Burning and Conductive into Overload, removes the constituent statuses and authors 2.3 seconds of fusion immunity. No Burning + Poisoned fusion row was found in the shipped table. Fire and electricity therefore cannot always be modeled as two unchanged parallel statuses. Overload damage and the exact fusion/immunity schedule remain unresolved.
Evidence for this section
- Burning and Conductive fuse into Overload; fire and poison have no shipped fusion row
Complete extracted fusion table, native registry/row identity and seven native matching scenarios. Record:
reference/local-status-application-evidence-1.1.1.0.json/findings/5.Reviewed record SHA-256:
a182ec3d1e44e467f7d1fcd102452e811c190dc66152df15df6869536b189918
Sources & data coverage
Reviewed local game tables and selected native instructions from Windows build 1.1.1.0. Original-instruction tests use synthetic actors and engine services. They are not gameplay measurements; online overrides have not been observed.