Wardogs: Medical and Healing (what each item does, in numbers)
Source: the item definitions of every medical item under data/Wardogs, the GameplayEffect values in assets/data/ge-values.json, the Medic skill rows and curves, and a few native constants read from the decompile corpus (CL-516586, image base 0x140000000, addresses are RVAs). Every table below is generated by _tools/medical_tables.py; do not edit it by hand.
The Item Shop lists what medical items cost and the Item Actions page lists the use actions. This page joins them with the gameplay effects and the downed and revive rules to answer: how long does each use take, what is consumed, how much does it heal, and what else does it do. The Medic skills are also on Progression Tables.
Sources and labels
| Label | Meaning |
|---|---|
| Data | read from an exported asset (data/ or ge-values.json) |
| Native | read from the decompiled game code; these are class defaults, and the cooked blueprint may override them (the player blueprint is not in data/) |
| Derived | arithmetic on Data or Native values, with the assumption stated |
| not traced | not found in data or code; said plainly where it matters |
1. What the data says, in short
- Healing is per use, not a rate, except for the Medical Bag. The bandage adds 35 health and the Individual First Aid Kit adds 100 per use (Data). The Medical Bag is the only item with a stated duration: 35 over 5 s on yourself, 15 over 1.5 s on a teammate (Data).
- There is no damage-over-time bleeding. “Bleed” in the game is the downed bleed-out timer (section 6). No medical item definition has a cure or removal tag, and no effect below changes health over time (Data). No splint or tourniquet item exists in the data.
- Using an item slows you. The bandage, First Aid Kit, Medical Bag, stim and resuscitator apply
GE_UseAppliable, which multiplies max speed by 0.5 (Data). - Use time in seconds is the length of the animation montage. Most items use
AnimationLength; the base action reads the length of the item’s animation (CalculateTotalInteractionTimeinB_Action_Appliable_Base, Data (Blueprint bytecode)), or the position of a named notify forAnimationNotifier. The montage lengths are in the use table below (Data (Blueprint CDO), round 17 export, evidence): bandage 5.23 s on yourself and 4.83 s on a teammate, First Aid Kit 5.23 s with the heal at 4.73 s, Enox 2.17 s, Stim Pen 2 s. Every montage has play rate 1.0. The Medical Bag and the resuscitator run until the item is empty or the target is full. - Natural regeneration for infantry was not found. The vitality component only starts a 10 s regen delay timer after damage (Native); the one regen component in the data belongs to Deathmatch and its values are blueprint (not traced).
2. Items: use and consumption
How the use is timed, what it consumes and what the user and target must be. The primary use targets another player and the secondary use targets yourself.
| Item | Use | Time method | Animation (first-person montage) | Seconds (Data, montage) | Consumed per use | Stack or charges | Owner must be | Target must be | |—|—|—|—|—|—|—|—|—| | Bandage (Id.Item.Bandage) | Action.Appliable.Bandage.SecondaryUse (self) | AnimationLength | AM_FP_Bandage_Self_Heal | 5.23 s | 1 | stack of 5 | Injured, Vitality.Alive | - | | Bandage (Id.Item.Bandage) | Action.Appliable.Bandage.PrimaryUse (other player) | AnimationLength | AM_FP_Bandage_Teammate_Heal | 4.83 s | 1 | stack of 5 | Vitality.Alive | Injured, Vitality.Alive | | Individual First Aid Kit (Id.Item.SuperBandage) | Action.Appliable.Bandage.SecondaryUse (self) | AnimationNotifier, notifier Heal | AM_FP_IFAK_Self_Heal | 5.23 s; Heal notify at 4.73 s | 1 | single item | Vitality.Alive, Injured | - | | Individual First Aid Kit (Id.Item.SuperBandage) | Action.Appliable.Bandage.PrimaryUse (other player) | AnimationLength, notifier Heal | AM_FP_IFAK_Teammate_Heal | 5.23 s; Heal notify at 5.18 s | 1 | single item | Vitality.Alive | Vitality.Alive, Injured | | Medical Bag (ID.Item.MedKit.Standard) | Action.MedKit.PrimaryUse (other player) | UntilItemEmptyOrTargetFull | AM_FP_Medkit_Use | 7.4 s (loop 1.47 to 5.7 s; the use lasts until the item or target is done) | durability (see medkit table) | durability 150 | Vitality.Alive | - | | Medical Bag (ID.Item.MedKit.Standard) | Action.Appliable.MedKit.SecondaryUse (self) | UntilItemEmptyOrTargetFull | AM_FP_Medkit_Use_Self | 7.4 s (loop 1.47 to 5.7 s; the use lasts until the item or target is done) | durability (see medkit table) | durability 150 | Injured, Vitality.Alive | - | | Enox (ID.Item.Enox.Standard) | Action.Appliable.Enox.SecondaryUse (self) | AnimationLength | AM_FP_Enox_Use | 2.17 s | 1 | single item | Vitality.Alive, Injured | - | | Stim Pen (Id.Item.StimPen) | Action.Appliable.StimPen.SecondaryUse (self) | AnimationLength | AM_FP_StimPen_Use | 2 s | 1 | stack of 3 | Vitality.Alive | - | | Stim Pen (Id.Item.StimPen) | Action.Appliable.StimPen.PrimaryUse (other player) | AnimationLength | AM_FP_StimPen_Use_Teammate | 1.27 s | 1 | stack of 3 | Vitality.Alive | Vitality.Alive | | Emergency Resuscitator (Id.Item.Resuscitator.Cheap) | Action.Appliable.Resuscitator.PrimaryUse (other player) | UntilItemEmptyOrTargetFull | AM_Resuscitator_Use | 2.17 s | 1 (container unit) | single item | Vitality.Alive | - | | Field Resuscitator (Id.Item.Resuscitator.Standard) | Action.Appliable.Resuscitator.PrimaryUse (other player) | UntilItemEmptyOrTargetFull | AM_Resuscitator_Use | 2.17 s | 1 (container unit) | single item | Vitality.Alive | - |
Charge and container data for the items that revive (they have no AppliableActionData, or use a container instead of a count):
| Item | Attribute and amount | Container start / max | Update time | Update amount | Derived reading | |—|—|—|—|—|—| | Defibrillator (Id.Item.Defibrillator.Standard) | Appliable.Amount 35 | - | 0.2 s | 1 | Data (Blueprint CDO): the action starts a timer of ChargeDuration 4 s and the discharge spends BatteryChargesUsed 25 battery charges (BH_Defibrillator_WattsExtensionData); the 35 is the revive health, so the container reading (7 s) is not the charge time; ChargesPerSecondConsumption is 0 | | Emergency Resuscitator (Id.Item.Resuscitator.Cheap) | Appliable.Amount 10 (delta) | 10 / 10 | 4 s | 1 | 10 units emptied at 1 per 4 s; Derived from the base action formula CalculateInteractionTimeToReachValue = (amount / update amount + 1) x update time = 44 s to empty (Data (Blueprint bytecode), B_Action_Appliable_Base); whether a revive needs all 10 units is not traced | | Field Resuscitator (Id.Item.Resuscitator.Standard) | Appliable.Amount 10 (delta) | 10 / 10 | 4 s | 1 | 10 units emptied at 1 per 4 s; Derived from the base action formula CalculateInteractionTimeToReachValue = (amount / update amount + 1) x update time = 44 s to empty (Data (Blueprint bytecode), B_Action_Appliable_Base); whether a revive needs all 10 units is not traced |
Batteries that feed the defibrillator (Data, Plugins/GameFeatures/Items/Battery): Id.Item.Battery holds up to 100 Id.Item.BatteryCharge, Id.Item.LargeBattery up to 250 (MaxSlotAmountStackSize of the charge container). The defibrillator takes a battery as its magazine (Item.Attachment.Magazine.Battery) and starts with one Id.Item.Battery.
3. Items: effects, side effects and stacking
| Item | Heal now | Heal over time | Revive | Cures or removes | Applied effects | Side effects | Stacking and cooldown | |—|—|—|—|—|—|—|—| | Bandage (Id.Item.Bandage) | +35 health (delta) | no per-tick value in data; one AttributeValue per use (applied once when the use animation ends, round 39) | - | no cure or removal tags in data (no bleed, splint or poison state exists to cure) | GE_UseAppliable | movement speed x0.5 while using (GE_UseAppliable, no duration set; removal by the action, not traced) | carry up to 5; the primary and secondary bandage use block each other (response rules in Item Actions §4.1) | | Individual First Aid Kit (Id.Item.SuperBandage) | +100 health (delta) | no per-tick value in data; one AttributeValue per use (applied once when the use animation ends, round 39) | - | no cure or removal tags in data (no bleed, splint or poison state exists to cure) | GE_UseAppliable | movement speed x0.5 while using (GE_UseAppliable, no duration set; removal by the action, not traced) | the primary and secondary bandage use block each other (response rules in Item Actions §4.1) | | Medical Bag (ID.Item.MedKit.Standard) | self 35 over 5 s; other 15 over 1.5 s | self 7 HP/s; other 10 HP/s (Derived: amount / duration) | 50 health (durability 10) | no cure or removal tags in data (no bleed, splint or poison state exists to cure) | GE_UseAppliable | movement speed x0.5 while using (GE_UseAppliable, no duration set; removal by the action, not traced) | no cooldown in data; durability 150 is the limit | | Enox (ID.Item.Enox.Standard) | +40 as decaying health (DecayHealAmount 40) | decays after use; pool size 40 (Blueprint MaxDecayHealth), decay delta not decoded (see states) | - | no cure or removal tags in data (no bleed, splint or poison state exists to cure) | - | - | requires Injured; no cooldown in data | | Stim Pen (Id.Item.StimPen) | - | - | - | no cure or removal tags in data (no bleed, splint or poison state exists to cure) | GE_UnlimitedTacSprint, GE_UseAppliable | movement speed x0.5 while using (GE_UseAppliable, no duration set; removal by the action, not traced); 60 s: tac sprint stamina use x0, focus energy use x0; tags Stimulant.UnlimitedTacSprint, InhibitWeight.StepDown (equipment weight class one step lower); camera FOV x1.05 (ignored while Critical) | carry up to 3; effect Stacks 1; max_stacks and refresh policy are not set in data (native default not traced); the two stim uses block each other | | Defibrillator (Id.Item.Defibrillator.Standard) | - | - | instant revive to 35 health (AttributeValue, passed to RevivePlayer by BH_Defibrillator_WattsExtensionComponent.ReviveCharacter; Data (Blueprint CDO)) | no cure or removal tags in data (no bleed, splint or poison state exists to cure) | GE_Defib | GE_Defib (from the action) grants tag Reviving.Friendly (no modifiers); watts extension Damage 100 (what it applies to is not traced) | cannot be used while the user is Critical | | Emergency Resuscitator (Id.Item.Resuscitator.Cheap) | - | - | revive to 10 health (AttributeValue, passed to RevivePlayer by B_Action_Resuscitator.OnInteractionFinished; Data, round 39) | no cure or removal tags in data (no bleed, splint or poison state exists to cure) | GE_UseAppliable | movement speed x0.5 while using (GE_UseAppliable, no duration set; removal by the action, not traced) | single use per purchase (shop text) | | Field Resuscitator (Id.Item.Resuscitator.Standard) | - | - | revive to 10 health (AttributeValue, passed to RevivePlayer by B_Action_Resuscitator.OnInteractionFinished; Data, round 39) | no cure or removal tags in data (no bleed, splint or poison state exists to cure) | GE_UseAppliable | movement speed x0.5 while using (GE_UseAppliable, no duration set; removal by the action, not traced) | single use per purchase (shop text) |
Notes:
- Bandage and kit amounts are the item’s
AttributeValuewithbApplyAsDeltatrue (added to current health). Whether the amount lands at the animation notify or spreads over the animation is blueprint (B_Action_Appliable_Base) and not traced. The First Aid Kit text says it heals back to full; the data value is +100, which reaches full from any health at 100 max health (Derived). - Stim Pen does not heal. Its
AttributeValueis unset; it appliesGE_UnlimitedTacSprint(section 5). Shop text: “Unlimited Tactical Sprint for Short Time; Reduces Equipment Weight Class” (Data). The tutorial text says it temporarily increases sprint and tac sprint speed. - Defibrillator is blocked while the user is
Vitality.Critical(action response rules, Data). The shop text says it revives instantly and needs a battery. - Resuscitators are single use per purchase, with a faster revive than bare hands (shop and tutorial text, Data).
4. The Medical Bag in detail
The Medical Bag (ID.Item.MedKit.Standard) has its own extension data instead of a single AttributeValue. Each action spends durability from a pool of 150. The tutorial text says healing applies over time and stops if you move away, and that self-use quickly drains durability.
| Action | Amount | Duration | Rate (Derived) | Durability cost | Uses from 150 durability (Derived) | |—|—|—|—|—|—| | Heal self | 35 | 5 s | 7 HP/s | 25 | 6 | | Heal other | 15 | 1.5 s | 10 HP/s | 2 | 75 | | Revive other (health after revive) | 50 | - | - | 10 | 15 |
ReduceUsage_Medkit skill curve (multiplies Attribute.Gameplay.Item.UsageRateMultiplier, which the item lists as default 1; Data): key 0: 1, key 2: 0.8, key 3: 0.7, key 4: 0.6 (the curve is evaluated at the skill level, which the Progression page describes).
| Skill curve value | Durability cost per self heal | per other heal | per revive | Self heals per kit | Other heals per kit | Revives per kit | |—|—|—|—|—|—|—| | key 0: 1 | 25 | 2 | 10 | 6 | 75 | 15 | | key 2: 0.8 | 20 | 1.6 | 8 | 7.5 | 93.75 | 18.75 | | key 3: 0.7 | 17.5 | 1.4 | 7 | 8.57 | 107.14 | 21.43 | | key 4: 0.6 | 15 | 1.2 | 6 | 10 | 125 | 25 |
The rate columns are Derived: amount divided by duration. How the engine spends durability (per second, per step or once per use) is blueprint (Auth_ReduceDurability is a ProcessEvent stub) and not traced, so the “per kit” columns assume one durability cost per use. The skill table assumes the multiplier scales the cost: the skill text says “more uses” and the multiplier falls from 1 to 0.6, which fits, but the code that reads Attribute.Gameplay.Item.UsageRateMultiplier is not traced.
5. GameplayEffects applied by medical items and skills
Resolved from ge-values.json. Magnitudes marked “set by the caller” are filled in when the effect is applied; for the skill effects that is the curve value in the skill row (Data).
| GameplayEffect | Modifiers | Duration | Granted tags | Magnitude source | |—|—|—|—|—| | GE_UseAppliable | Movement.MaxSpeedMultiplier MultiplyCompound 0.5 | not set (native default) | - | fixed in the effect | | GE_UnlimitedTacSprint | Movement.TacSprintStaminaUsageMultiplier Override 0
Weapon.FocusEnergyUsageMultiplier Override 0 | 60 s | Stimulant.UnlimitedTacSprint, InhibitWeight.StepDown | fixed in the effect | | GE_Item_UsageRateMultiplier | Item.UsageRateMultiplier Multiply set-by-caller Item.UsageRateMultiplier (x1, fallback 1) | not set (native default) | - | skill ReduceUsage_Medkit supplies the value (Data) | | GE_Weapon_EquipSpeedMultiplier | Weapon.EquipSpeedMultiplier Multiply set-by-caller Weapon.EquipSpeedMultiplier (x1, fallback 1) | not set (native default) | - | skill MedicalItemSwapSpeed supplies the value (Data) | | GE_Player_SprintSpeedMultiplier_Temp | Movement.SprintSpeedMultiplier Multiply set-by-caller Movement.SprintSpeedMultiplier (x1, no fallback)
Movement.TacSprintSpeedMultiplier Multiply set-by-caller Movement.TacSprintSpeedMultiplier (x1, no fallback) | 5 s | - | skills ReviveSpeedBoost.* supply both values (Data) | | GE_Defib | none | not set (native default) | Action.Appliable.Reviving.Friendly | tag only | | GE_Player_RessedByEnemy | none | 60 s | RessedByEnemy | tag only; what applies it is not traced |
Only GE_UnlimitedTacSprint carries a duration among the item effects: 60 s per stim, with Stacks 1 in the stim action. max_stacks, the stack refresh policy and the removal of GE_UseAppliable after the action are not set in the data (the native defaults are not in the paks), so using a stim again during the 60 s is not traced. The stim also has a camera modifier (DA_CharacterModifierState_StimulantEffects): field of view x1.05 while the stim tag is held, with a 0.15 s blend in and 0.25 s blend out, ignored while the user is Critical (Data).
6. Downed, bleed-out, revive and regeneration
What the tutorial says (Data, DA_Tutorials_Health): “When your health reaches zero, you enter the critical state. If you aren’t revived in time, you’ll bleed out and respawn at Headquarters.” and “Reviving with no medical gear takes time, so watch your surroundings.” A critical player can be dragged by a friend. IA_Player_DownedHoldOn, IA_Player_DownedGiveUp and IA_Player_DownedCallForHelp are the downed inputs (Data).
| Mechanic | Value | Source | |—|—|—| | Base bleed-out time | 360 s | Data (Blueprint CDO): B_WDCore_MoverPlayerCharacter sets BaseBleedOutTime 360; the Native default is 300 (constructor 0x6E67160, +0x980). The timer start 0x6E75540 copies the field into total (+0x814) and remaining (+0x828) | | Minimum bleed-out time after a revive | 30 s | Data (Blueprint CDO): B_WDCore_MoverPlayerCharacter sets MinBleedOutTime 30; Native default 60 (+0x984). 0x6E75540 uses max(MinBleedOutTime, remaining) when the revive counter byte (+0xA70) is nonzero, so a character that was revived once and goes down again restarts from at least this time | | Bleed-out drain | dt x rate; kill at 0; normal state rate 0.5, give-up rate 240 | Native: tick 0x6E780D0 subtracts dt * rate from the remaining time (floored at 0) and, with role byte 3, calls the kill path 0x6E71400 at 0. Normal state reads +0x990 (HoldOnBleedOutRate), give-up state (byte +0x820 = 2) reads +0x994 (GiveUpBleedOutRate). Data (Blueprint CDO): HoldOnBleedOutRate 0.5 (B_WDCore_MoverPlayerCharacter; native default 0.1), GiveUpBleedOutRate 240 (B_WDMoverPlayerCharacter; native default 6). DefaultBleedOutRate is not set by any Blueprint, so it stays at the native 1 (no native reader). No function in the two player Blueprints writes these fields at runtime (Data (Blueprint bytecode)). Derived: a full timer lasts 720 s in the normal state (360 / 0.5), 60 s after a revive restart (30 / 0.5) and 1.5 s once the player gives up (360 / 240) | | Damage while critical | none | Native: the bleed tick never calls the damage or health path; UWDCharacterVitalityComponent (0x6B17760) returns 0 and writes no health when the character lacks State.Player.Vitality.Alive. There is no damage-over-time bleeding | | Revive health (component default) | 25 (no Blueprint override) | UWDCharacterVitalityComponent constructor 0x6B16790 writes DefaultHealthToReviveTo (+0x160) = 25.0 and no Blueprint sets it (Data (Blueprint CDO): the player VitalityComponent sets only MaxDecayHealth). The revive handler (AWDMoverCharacter vtable slot 323, 0x6E75620) sets the Alive tag, bumps the revive counter, restarts the bleed timer and calls ResetHealth (0x6B16E80). The revive call RevivePlayer(..., float, ...) is Blueprint-implemented and each reviver passes a health: the defibrillator 35 (AttributeValue), the Medical Bag 50 (ReviveOtherHealthAmount). The value passed by the base revive and the resuscitator is not traced | | Max health | 100 | Native: UWDVitalityComponent constructor 0x6B81720 writes BaseHealth = MaxHealth = 100.0 (Data (Blueprint CDO): neither player Blueprint sets MaxHealth, so 100 stands) | | Regeneration delay | 10 s | Native: same constructor: RegenDelay (+0x138) = 10.0. The damage path (0x6B82520) only broadcasts the RegenTimer delegate with this delay; no native tick that adds health to infantry was found. The only regeneration component in the data is WDHealthRegenComponent, added by the Deathmatch game feature (OnRegenTimerStarted 0x84965F0 is a ProcessEvent stub, so its logic and values are blueprint: not traced) | | Overheal pool | max 0 | Native: MaxOverhealHealth (+0x164) defaults to 0 in the constructor 0x6B16790; the character clamp is [0, MaxHealth + MaxOverhealHealth + MaxDecayHealth] (0x6B17D20) | | Decay pool (Enox) | max 40; DecayRate 5, DecayMagnitude 5 | Data (Blueprint CDO): the VitalityComponent of B_WDMoverPlayerCharacter sets MaxDecayHealth 40 (native default 0), inherited by B_WDCore_MoverPlayerCharacter; DecayRate and DecayMagnitude are not set, so they stay at the Native 5 and 5 (constructor 0x6B16790, +0x16C, +0x170). Auth_CharacterHeal (0x6B168B0) with a decay amount > 0 caps the heal at MaxHealth + MaxDecay - health, writes the decay pool (+0x17C) and starts a timer with period DecayRate whose callback 0x6B16EC0 subtracts a delta from health and the pool. That delta is not visible in the decompile (assumed DecayMagnitude, not confirmed). The Enox DecayHealAmount 40 equals the pool size 40, so one use can fill it. Derived if the delta is DecayMagnitude: 5 health every 5 s, so 40 empties in 40 s | | Damage reduces the decay pool | by the damage | Native: 0x6B17760, server role only: damage lowers the pool at +0x17C by the damage taken, at most to 0 | | Bleed-out revive penalty offset | 100 | Data (Blueprint CDO): BleedOutRevivePenaltyOffset 100 on B_WDCore_MoverPlayerCharacter (+0x988; Native default 15). Its use in the timer restart is not decoded | | Critical revive hold threshold | 20 | Data (Blueprint CDO): CriticalReviveHoldThreshold 20 on B_WDCore_MoverPlayerCharacter (its parent B_WDMoverPlayerCharacter sets 10); Native default 2 (+0x970). What it gates is not decoded | | Base revive hold time (no equipment) | 20 s | Data (Blueprint CDO): B_Action_Revive.ReviveHoldTime 20; the first-person montage AM_FP_Revive is 20.5 s with a Complete notify at 20 s |
Reading of the bleed-out values (Derived from the player Blueprint defaults above): the timer starts at 360 s and drains at 0.5 per second in the normal critical state, so a downed player lasts 720 s unless someone helps; a player who was revived once and goes down again restarts at no less than 30 s, which drains in 60 s. Giving up switches the rate to 240 per second, so a full timer ends in 1.5 s. The game defaults (300 s, 60 s, 0.1, 6.0) are overridden by the Blueprint. What the IncreaseBleedTime skill changes is not traced.
7. Medic skills that change these numbers
The Medic skill tree has the nodes below (Data, DT_CharacterSkillNodes_Data). Only four have an effect row in DT_MedicSkills; for the rest the tree text is all the data shows, so the size of the bonus is not traced. MedkitUsage and ReduceUsage.Medkit are two nodes with the same text; only the second has a row. The curve keys are the skill levels the Progression page describes.
| Skill | Skill-tree text | Resolved in data | Effect on medical numbers | |—|—|—|—| | BuffApplicationTime | Buff application speed improvement: Reduces the amount of time it takes to apply buffs to self AND teammates. | no data row (not traced) | - | | BuffDuration.Self | Increased self buff duration: Increases the amount of time a buff is active after you have self-buffed. | no data row (not traced) | - | | BuffDuration.Teammate | Increased teammate buff duration: Increases the amount of time a buff is active on a teammate you have buffed. | no data row (not traced) | - | | ChargeTime.Defibrillator | Defib charge speed improvement: Reduces the amount of time it takes to charge up your defib. | no data row (not traced) | - | | DragSpeed | Drag speed improvement: Increases the speed that you can move when you are dragging another player. | no data row (not traced) | - | | HealTime.Self | Self-healing speed improvement: Reduces the amount of time it takes to heal yourself with all medical items. | no data row (not traced) | - | | HealTime.Teammate | Teammate healing speed improvement: Reduces the amount of time it takes to heal teammates with all medical items. | no data row (not traced) | - | | HealTimeWhileSuppressed | Faster healing whilst suppressed: Reduces the amount of time it takes to heal a teammate whilst you are experiencing the suppressed effect from enemy fire. | no data row (not traced) | - | | HealthierRevive | Increased health after base reviving someone: Increases the amount of health a teammate revives with after you have revived them using the base-revive (no equipment, just bare hands). | no data row (not traced) | - | | IncreaseBleedTime | Increased bleedout timer: Increases the amount of time you have before you bleed out when you are in a downed state. | no data row (not traced) | - | | LessSuppression | Reduced suppression effect: Reduces the severity of the suppression effect experienced when enemies are firing at you. | no data row (not traced) | - | | MedicBag | Medic bag (additional slots for medical items): Unlocks the ability to purchase a medic bag, which provides additional slots specifically for medical items. | no data row (not traced) | - | | MedicalItemSwapSpeed | Item-switch speed improvement (Medical Archetype): Reduces the amount of time it takes to switch TO any items / equipment within the ‘medical’ archetype. | yes (DT_MedicSkills) | Weapon.EquipSpeedMultiplier from MedicalItemSwapSpeed (0: 1, 2: 1.2, 4: 1.4) | | MedicalItemWeightReduction | Reduced weight-penalty for medical items: Reduces the amount of weight-penalty that is given from carrying medical items specifically. | no data row (not traced) | - | | MedkitUsage | Medkits have more uses: Increases the amount of ‘uses’ a medkit has before it is depleted (only when you are using it). | no data row (not traced) | - | | ReduceUsage.Defibrillator | Increased charges per battery: Increases the amount of charges per battery when you are using a defib. (One time unlock). | no data row (not traced) | - | | ReduceUsage.Medkit | Medkits have more uses: Increases the amount of ‘uses’ a medkit has before it is depleted (only when you are using it). | yes (DT_MedicSkills) | Item.UsageRateMultiplier from ReduceUsage_Medkit (0: 1, 2: 0.8, 3: 0.7, 4: 0.6) | | ReducedFalldamage | Reduced fall damage: Reduces the amount of fall damage you take. | no data row (not traced) | - | | ReviveDamageReduction | Take less damage whilst reviving teammate: Reduces the amount of incoming damage whilst you are reviving a teammate. | no data row (not traced) | - | | ReviveSpeed.Standard | Base revive speed improvement: Reduces the time it takes to ‘base-revive’ a teammate. (no equipment, just bare hands). | no data row (not traced) | - | | ReviveSpeedBoost.Self | Increased sprint speed after reviving teammates: After you have revived a teammate, YOU will receive a temporary increase in your sprint speed. | yes (DT_MedicSkills) | Movement.SprintSpeedMultiplier from ReviveSpeedBoost_Self_SprintSpeed (0: 1, 2: 1.2, 4: 1.4), 5 sMovement.TacSprintSpeedMultiplier from ReviveSpeedBoost_Self_TacSprintSpeed (0: 1, 2: 1.2, 4: 1.4), 5 s | | ReviveSpeedBoost.Teammate | Teammates faster after you’ve revived them: After you have revived a teammate, THEY will receive a temporary increase in their sprint speed. | yes (DT_MedicSkills) | Movement.SprintSpeedMultiplier from ReviveSpeedBoost_Teammate_SprintSpeed (0: 1, 2: 1.2, 4: 1.4), 5 sMovement.TacSprintSpeedMultiplier from ReviveSpeedBoost_Teammate_TacSprintSpeed (0: 1, 2: 1.2, 4: 1.4), 5 s | | StunResistance | Reduced flash/stun effect duration: Reduces the duration of the effects received from flash & stun grenades. | no data row (not traced) | - |
The same four rows, with their curve tables, are on Progression Tables. The heal-time, defibrillator, bleed-out and revive-health skills have a tag and a text but no data row: whether they work through a gameplay effect, a native check or blueprint is not traced.
8. Worked example: from low health to full
Start at 20 health, goal 100 (assumed max health, Native default; need 80). All figures are Derived from the item data above.
| Method | Uses needed | Time | Items or durability spent | Notes | |—|—|—|—|—| | Bandage (self) | 3 | 3 x 5.23 s = 15.7 s (montage length, Data) | 3 of a stack of 5 | +35 each; the last one is clamped at max health | | Individual First Aid Kit (self) | 1 | 4.73 s (the heal lands at the Heal notify; montage 5.23 s, Data) | 1 kit | +100 clamps at max health | | Medical Bag (self) | continuous | 11.43 s | 57.14 durability (38.1 % of 150) | assumes the 35 HP is spread evenly over 5 s and durability is spent in proportion; if cost is charged per full 5 s step instead it is 75 | | Medical Bag (self), skill curve value 0.8 | continuous | 11.43 s | 45.71 durability | assumes UsageRateMultiplier scales the cost (not traced) | | Medical Bag (self), skill curve value 0.7 | continuous | 11.43 s | 40 durability | assumes UsageRateMultiplier scales the cost (not traced) | | Medical Bag (self), skill curve value 0.6 | continuous | 11.43 s | 34.29 durability | assumes UsageRateMultiplier scales the cost (not traced) | | Medical Bag (teammate) | continuous | 8 s | 10.67 durability | 10 HP/s, cheap per HP; heals stop if the user moves away (tutorial text) | | Enox | 1 | 2.17 s (montage length, Data) | 1 | gives 40 health as decaying health, not permanent; the pool holds 40 (Blueprint MaxDecayHealth) | | Natural regeneration | - | - | - | no infantry regen tick traced outside Deathmatch |
Reading it: the bandage and the First Aid Kit are counted in uses and in montage seconds (the heal-time skills, which have no data row, are not applied). The Medical Bag is the only method with a data-backed rate. It is the cheapest on teammates (10 HP/s at about 1.3 durability per 10 HP) and the most expensive on yourself (7 HP/s at about 7 durability per 10 HP).
9. Coverage and open items
| Measure | Count | |—|—| | Medical item definitions read | 8 | | Medic skill-tree nodes | 23 | | Medic skills resolved to a GameplayEffect and curve | 4 | | Medic skills with no data row | 19 | | GameplayEffects resolved | 7 of 7 |
Settled in round 17 (Data (Blueprint CDO), evidence): the seconds of every AnimationLength use (montage lengths) and the Heal notify time; the defibrillator charge time (ChargeDuration 4 s) and battery cost (BatteryChargesUsed 25 per discharge); the player bleed-out values (360 s, 30 s, rates 0.5 and 240); the Enox pool (MaxDecayHealth 40); the defibrillator revive health (35).
Open (not traced after round 39):
- What reads
BleedOutRevivePenaltyOffset(no reader found in round 40 either;CriticalReviveHoldThresholdis the hold time of the revive interaction context). - Enox decay per tick: settled in round 40 (section 11b):
min(DecayMagnitude, pool)= 5 every 5 s. - How many application steps the Medical Bag makes while healing a teammate (base-class timing).
- The 19 Medic skill nodes without a data row: nothing in the client reads them (see section 10).
10. Round 39 findings
Evidence: round 39 medical and movement. Data: medical-status-r39.json (_tools/round39_medical_tables.py).
| Question | Answer | Level |
|---|---|---|
| Health after a hand revive | 10 (UWDReviveInteractionContext +0x240, constructor 0x772C5F0; passed to RevivePlayer 0x6E75620, which calls ResetHealth 0x6B16E80; 25 is used only when the passed value is 0). Corrects section 6, which read the 25 default as the hand revive | static disassembly |
| Health after a resuscitator revive | 10 (AttributeValue of both ID_Resuscitator items, passed by B_Action_Resuscitator.OnInteractionFinished). One revive, then the item is consumed; derived interaction time 4 s (base CalculateAmountToFullTarget returns 0; this replaces the 44 s container formula shown in section 2, which assumed the full 10 units are stepped through) | cooked data and bytecode read; Derived time |
GE_Player_RessedByEnemy | applied by the resuscitator action when the target is on another faction; 60 s, tag State.Player.RessedByEnemy | bytecode read |
| Bandage +35 timing | applied once when the use animation ends (AnimationLength method), 5.2333 s self and 4.8333 s teammate | bytecode and data read |
| Medical Bag durability | fixed cost per application call (Auth_ReduceDurability(cost), helper 0x6C1D110 subtracts); no code reads UsageRateMultiplier, so the skill curve is not applied to durability in any code read | bytecode and disassembly; negative result |
| Adrenaline Pen, second use | one stack, restarts the 60 s (UBHGameplayEffect constructor 0x5225C60: MaxStacks 1, refresh on application) | disassembly; Derived |
| Adrenaline Pen, teammate | the same effect (GE_UnlimitedTacSprint x1), target must be alive | cooked data |
| Item-switch skill coverage | items tagged Item.Context.Medical: Medical Bag, Bandage, Individual First Aid Kit, Defibrillator, both Resuscitators, Stim Pen (not Enox) | cooked data |
| Critical revive hold threshold | read once by 0x6E69D20, passed as the hold threshold of the revive interaction context (20 in data, native 2) | static disassembly |
| Deathmatch regeneration | WDHealthRegenComponent constructor 0x848B5F0: 5 health per 1 s tick; delay 10 s from the vitality component. No regeneration component exists outside Deathmatch | disassembly; tick body not located |
| Medic skill nodes without a row (19) | no asset and no native string reads their tags: no values exist in the game files | name-map search of all packages, string scan |
11. Round 40 findings
Read from the cooked data and the restored exe; the reading path of every row is in the round 40 evidence. Generated by _tools/round40_medical_movement.py.
11a. Armour: durability, stages, weight and what happens on a hit
| Piece | Context tag | Durability | Stage rows (reduction %, thickness, density) | Covered locations | Weight | |—|—|—:|—|—|—:| | ID_GhillieArmor | Meta.Damage.Armor.Ghillie | - | none | - | 1.5 | | ID_GhillieArmorDry | Meta.Damage.Armor.Ghillie | - | none | - | 1.5 | | ID_GhillieHelmet | Meta.Damage.Helmet.Ghillie | - | none | - | 1 (class default, omitted) | | ID_GhillieHelmetDry | Meta.Damage.Helmet.Ghillie | - | none | - | 1 (class default, omitted) | | ID_HeavyArmor | Meta.Damage.Armor.Heavy | 250 | 50 / 1 / 100; 50 / 1 / 90; 50 / 1 / 80; 50 / 1 / 60 | Lower, Middle, Upper | 10.5 | | ID_HeavyHelmet | Meta.Damage.Helmet.Heavy | 180 | 50 / 1 / 100; 50 / 1 / 90; 50 / 1 / 80; 50 / 1 / 60 | Head, Neck | 3 | | ID_LightArmor | Meta.Damage.Armor.Light | 200 | 30 / 0.5 / 50; 30 / 0.5 / 40; 30 / 0.5 / 30; 30 / 0.5 / 20 | Lower, Middle, Upper | 3 | | ID_LightHelmet | Meta.Damage.Helmet.Light | 80 | 30 / 0.5 / 50; 30 / 0.5 / 40; 30 / 0.5 / 30; 30 / 0.5 / 20 | Head | 1 (class default, omitted) | | ID_MediumArmor | Meta.Damage.Armor.Medium | 220 | 40 / 0.7 / 60; 40 / 0.7 / 50; 40 / 0.7 / 40; 40 / 0.7 / 30 | Lower, Middle, Upper | 4.5 | | ID_MediumHelmet | Meta.Damage.Helmet.Medium | 100 | 40 / 0.7 / 60; 40 / 0.7 / 50; 40 / 0.7 / 40; 40 / 0.7 / 30 | Head | 1.6 | | ID_PilotHelmet | Meta.Damage.Helmet.Pilot | 180 | 30 / 0.5 / 50; 30 / 0.5 / 40; 30 / 0.5 / 30; 30 / 0.5 / 20 | Head | 1 (class default, omitted) | | ID_SuperHeavyArmor | Meta.Damage.Armor.SuperHeavy | 300 | 60 / 1.5 / 130; 60 / 1.5 / 120; 60 / 1.5 / 110; 60 / 1.5 / 100 | Lower, Middle, Upper, Pelvis | 18 | | ID_SuperHeavyHelmet | Meta.Damage.Helmet.SuperHeavy | 200 | 60 / 1.5 / 130; 60 / 1.5 / 120; 60 / 1.5 / 110; 60 / 1.5 / 100 | Head, Neck | 4.5 | | ID_TankHelmet | Meta.Damage.Helmet.Tank | 180 | 55 / 1 / 100; 55 / 1 / 90; 55 / 1 / 80; 55 / 1 / 60 | Head, Neck | 1 (class default, omitted) |
Ghillie pieces have no durability fragment, no covered locations and no stage rows, so the armour operation returns 0 for them. The Ghillie set effect (GE_Player_GhilliEffects) needs both the body suit tag and the headwear tag and applies: ADS time x0.8, aim sway x1.15, lean and un-lean time x1.15, max speed x0.95, jump velocity x0.95. In DT_GlobalDamage_ArmorData the Ghillie target rows are -100% for bullet, explosive, cannon, impact, melee and the unconditional entry (armour event amount x0), and the ordinary armour and helmet rows carry -10000% and -1000% entries that require the Ghillie context tag; so a Ghillie piece takes no armour damage and gives no reduction (the evaluator behaviour for values below -100% was not traced).
11b. Native readings
| Item | Reading | |—|—| | Armour durability when hit | Each armour or helmet piece that takes a hit gets an armour event whose Amount comes from DT_GlobalDamage_ArmorData (ordinary bullet: 0.4 x the incoming amount). Events queue in QueuedArmorDamageEvents; the inventory tick 0x6B64EC0 runs 0x6B59000, which does Durability -= Amount, updates the stage and fires WDEvent_ArmorDamage (0x6B53280 (called from the slot-5 hook 0x6E74970 and 0x6B676DD)). The piece breaks when durability reaches 0 (Native). The stage tables above all give a flat reduction, so the number only drives the break and the durability bar | | Halligan durability | ID_Crowbar durability 7000; opening a door (B_Action_ForceOpenDoor) or unlocking a vehicle (B_Action_ForceUnlockVehicle) each add DurabilityCost -1000; the item is consumed when the result is 0 or less, so 7 uses (Data and bytecode read) | | Enox decay per tick | min(DecayMagnitude (+0x170), decay pool (+0x17C)), applied to Health through 0x52311D0; with DecayRate 5 s and DecayMagnitude 5 that is 5 health every 5 s until the pool (+0x17C) is empty (Native; the movss xmm0,[rcx+0x170] read at 0x6B16EE7 is the reader earlier searches missed) | | Armour weight default | 1 (constructor 0x67793A0 (UBHInventoryFragment_Weight)); stores 0x3F800000 at +0x38; fragments that omit Weight (Level 1 Helmet, Tank, Pilot, Ghillie headwear) take it (Native) | | Deathmatch regeneration tick | UWDHealthRegenComponent tick 0x8496170 (vtable slot 131): stored regen deadline byte (+0xF0, set by OnRegenTimerStarted 0x84965F0 as world time + RegenDelay) reached, then if CurrentHealth < MaxHealth a heal event of HealthToRegenerate (movss at 0x849627C) is sent through the vitality component vtable +0x518. Amount 5 per tick (Native). TickInterval (+0xEC) has no reader; whether it feeds the component tick rate was not shown, so “5 per second” stays derived |
11c. Critical state
| Item | Value | |—|—| | Where the Critical tag is set | The vitality state object UWDPlayerVitalityState_Critical carries VitalityTag; its constructor 0x6E9B030 stores the global tag State.Player.Vitality.Critical (qword_14D36B800) at +0x28. The pawn lists three state classes (Alive, B_WDPlayerVitalityState_Critical_C, Dead); the character applies a state’s tag when it enters the state (Native, constructor read; the enter call itself was not traced) | | Critical state defaults | bIsPlayerAbleToGiveUp True, CallForHelpCooldownTime 5 s, InputMappingContextPriority 2 (Native constructor; the Blueprint only sets the call-for-help cue and the input context) | | Critical camera | DA_CharacterModifierState_Critical, priority 0, pitch lock 40 degrees. Default state: Character transform, bone head, world offset (0, -200, 0), transition 0 s. Dragged state: Character transform, bone pelvis, relative offset (3, 20, 0), rotation (0, 110, -90). Character modifier B_CharacterModifier_IgnoreLookInput (look input ignored). Applies while: State.Player.Vitality.Critical and none of the vehicle roles (driver, gunner, active or passive passenger) (Data) | | Pawn bleed-out values | BaseBleedOutTime 360, MinBleedOutTime 30, HoldOnBleedOutRate 0.5, GiveUpBleedOutRate 240, OutOfBoundsTimeLimit 20 (Data, pawn CDO; the WDCore pawn holds CriticalReviveHoldThreshold 20, its parent 10) |