Wardogs — GameFeature: Rewards (Buildables) Reference
Extracted from cooked game data (build ++Wardogs+Live-CL-516586, UE 5.7.4). Source: Wardogs/Plugins/GameFeatures/Rewards/ (18 JSON files). Scripted pass over every file, then spot-checked against representative rows.
Overlap with the main doc: the flat per-structure cash values (Built / Placed / Destroyed) are in
Wardogs_Rewards_and_Progression_v2.md, section 7. This doc covers what that doc does not: the formula structure of the buildable reward calculator, the variable and modifier selectors it uses, the feed/UI strings that announce each reward, the variant-to-reward lookup for destroyed buildables, and the assist damage curve.
Season 02 update (2026-10-15)
- Calculator rows (
DT_ChallengeRewards_SessionEvents_Buildables): 29 → 47. Added 18 rows: 17 destroyed-variant rows andFOBDoorClosed. - New destroyed-variant rows: AirRaidShelter.Ceiling, AirRaidShelter.Floor, Bunker.Floor, Bunker.Roof, CrowsNest.BaseFloor, CrowsNest.FirstFloor, CrowsNest.Roof, Door, Door.TopSegment, Gate.Ramp, Loudspeaker, MistralAA, Mortar, Phalanx, RefuelStation, SV_Shelter, WoodBase.
- New
FOBDoorClosedrow: cash only (no XP), feed text “FOB Door Closed”, new state treeST_Challenges_SessionEvents_Buildable_FOBDoorClosed. State trees 10 → 11. Feed strings 11 → 12. - Destroyed-variant lookup (
DT_RewardLookup_SessionEvent_BuildableDestroyed): 34 → 36 rows. Door, Gate.Ramp, and the floor and roof variants now have their own reward tags instead of sharing BarbedWire, Gate or BremmerWall. WoodBase and SV_Shelter are added. - Destroyed XP:
BaseReward→(BaseReward) * BuildProgresson the 18 existing destroyed rows. The 17 new destroyed-variant rows use the new form from the start, so all 35 destroyed rows now have it. - FOB destroyed row: adds a supplies term, with
FOBSuppliesBonus7500 (cash) and 250 (XP),FOBSuppliesMax25000. BaseValue(cash) changes: Gate 500 → 200, RepairStation 400 → 200, HotZoneMagnet 4500 → 2750, HBlockQuadWall 150 → 75, HBlock 30 → 15, SandbagWall 30 → 15, TallHBlock 44 → 20, TankTrap 44 → 20, BarbedWire 14 → 5, CamoNetTent 14 → 5, FloorBoard 10 → 5, Radio 40 → 20, Ramp 40 → 20.FOBHackedBaseValue: 2500 → 1000. NewHackerValueoption (2500) onBaseValuefor buildables owned by the player.- New selectors:
TotalFOBSupplies,FOBSuppliesMax,FOBSuppliesBonus(used by the FOB row).
Full before/after list: Season 2 Changes → Rewards & Unlocks.
1. Package Contents
| Export type | Count | Role |
|---|---|---|
GameFeatureData (BuildableRewards) | 1 | Root bundle. Adds a data-registry source and a registry. |
StateTree | 11 | One per buildable session event (section 3). |
WDChallengeStateTreeSchema | 11 | Empty schema objects, one per state tree. |
DataTable | 5 | Reward calculator (DT_ChallengeRewards_SessionEvents_Buildables), feed strings (DT_ChallengesFeedActions_Building), challenge definitions (DT_Challenges_SessionEvents_Buildables, 0 rows), assist curve table, and the destroyed-variant lookup. |
CurveFloat | 1 | CRV_Challenges_Curves_BuildableDestroyedAssist_DamageFraction (section 6). |
Files in the folder, with row counts:
| File | Rows | Row struct |
|---|---|---|
DT_ChallengeRewards_SessionEvents_Buildables | 47 | WDChallengeRewardDefinition (calculator) |
DT_RewardLookup_SessionEvent_BuildableDestroyed | 36 | WDVariantRewardLookupRow |
DT_ChallengesFeedActions_Building | 12 | WDRewardFeedActionDataTableRow |
DT_Challenges_Curves_BuildableDestroyedAssist | 1 | WDLiveCurveTableRow |
DT_Challenges_SessionEvents_Buildables | 0 | WDChallengeDefinition |
2. How the Calculator Works
Each row of DT_ChallengeRewards_SessionEvents_Buildables has one or two resources, each a DefaultExpression:
Attribute.Meta.Currency.Cash: present on all 47 rows.Attribute.Meta.XP.Role: present on 43 rows.
Each resource has:
- An
ExpressionString: the formula, written in named variables (for exampleBaseValue * AlignmentModifier). Selectors: one per variable. Each selector has aDefaultOptionand a list ofOptions. Each option has a condition (a tag query such asALL( Challenges.Context.Instigator.InHotZone )) and a variable name it resolves to. The first matching option wins; otherwise the default applies.
So a formula variable is not a number in the table. It is a choice of named factor, picked at runtime from the event’s context tags.
2a. Selector dictionary (distinct selectors across the 47 rows)
| Formula variable | Default | Options (condition → variable) | Meaning (inferred from names) |
|---|---|---|---|
BaseValue | BaseValue | ALL(Buildables.Dismantle, Buildables.Friendly) → DismantleValue; ALL(Context.TankKill) → TankValue; ALL(Buildables.BuildableOwner) → HackerValue | Base payout. Dismantling a friendly buildable and killing a tank each use their own base. |
AlignmentModifier | DefaultModifier | ALL(Buildables.Friendly) → FriendlyModifier | Penalty or reduction when the buildable is friendly. |
InstigatorZoneModifier | DefaultFactor or DefaultModifier (varies by row) | ALL(Instigator.InHotZone, HotZoneMagnetActive) → HotZoneMagnetFactor; ALL(Instigator.InHotZone) → HotZoneFactor; ALL(Instigator.InControlZone) → ControlZoneFactor | Multiplier when the instigator is in a zone. Magnet is the strongest case. |
TargetZoneModifier | DefaultModifier | ALL(Target.InHotZone, HotZoneMagnetActive) → HotZoneMagnetFactor; ALL(Target.InHotZone) → HotZoneFactor; ALL(Target.InControlZone) → ControlZoneFactor | Multiplier when the target buildable is in a zone. |
InstigatorZoneWeight | InstigatorFactor | none | Weight on the instigator-side term. |
TargetZoneWeight | TargetFactor | none | Weight on the target-side term. |
AssistCurve | DefaultModifier | ALL(Assist.BuildableDamage) → DamageAssistCurve | Assist share, read from the damage-fraction curve (section 6). |
AssistScalar | DefaultModifier | ALL(Assist.BuildableDamage) → DamageAssistScalar | Scalar applied to assist credit. |
TankReward / TankAssistReward | n/a | ALL(TankKill), ALL(TankKill, Assist.BuildableDamage) | Used by the tank-kill variants. |
FriendlyReward / DriverValue / FriendlyValue | n/a | ANY/ALL(Buildables.Friendly) | Friendly-side payouts. |
HotZoneReward / ControlZoneReward | n/a | ALL(Instigator.InHotZone) / ALL(Instigator.InControlZone) | Zone-specific payouts on the supply and schematic rows. |
SchematicOwnerValue / OwnerAssistReward / BaseReward | n/a | ALL(Buildables.SchematicOwner), ALL(SchematicOwner, BuildableOwner) | Owner-only payouts for the schematic path. |
TotalFOBSupplies, FOBSuppliesMax, FOBSuppliesBonus | none | none | FOB supply term used by the FOB destroyed row (section 3a). |
DefaultValue, BuildProgress, BuildCost, BuildAmount, BaseReward, CashSpent, BuildSuppliesDeposited, LastVictimCount, LastVictimCountMax, LastVictimReductionModifier | none | none | Numeric inputs. They are supplied at runtime from the event payload, not defined in these tables. |
Every condition is written as a tag query over Challenges.Context.* tags. Those tags are set by the state tree from the event (section 3).
Numbers are not in these tables. The option variables (DismantleValue, HotZoneMagnetFactor, and the rest) carry no values here. Their values are defined in the shared challenge tables, which are covered by Wardogs_Rewards_and_Progression_v2.md, section 15 (DT_ChallengeRewards_SessionEvents_Shared). This doc does not guess them.
3. Calculator Rows (47)
Each row is one challenge event. “Cash” and “XP” are the expressions in plain form.
3a. Destroyed buildables (Challenges.Rewards.Buildables.BuildableDestroyed.<Structure>, 36 rows)
All 36 rows use the same cash expression, except the FOB row (below). The XP expression is the same on 35 rows; the FOB row differs:
- Cash:
(BaseValue * AlignmentModifier * InstigatorZoneModifier * InstigatorZoneWeight * BuildProgress * AssistCurve * AssistScalar) + (BaseValue * AlignmentModifier * TargetZoneModifier * TargetZoneWeight * BuildProgress * AssistCurve * AssistScalar) - XP:
(BaseReward) * BuildProgress
FOB (BuildableDestroyed.FOB) adds a supplies term. Its cash expression replaces BaseValue with (BaseValue + ((clamp(TotalFOBSupplies, 0, FOBSuppliesMax) / FOBSuppliesMax) * FOBSuppliesBonus)) in both terms. Its XP is (BaseReward + ((clamp(TotalFOBSupplies, 0, FOBSuppliesMax) / FOBSuppliesMax) * FOBSuppliesBonus)).
So the destroyed payout is two terms added together: one for the instigator’s zone position and one for the target’s zone position, each scaled by build progress and by the assist curve. The per-structure base values are in section 2 of the main doc (section 7 there).
Structures (36 rows): FOB, AirRaidShelter, AirRaidShelter.Ceiling, AirRaidShelter.Floor, BarbedWire, BremmerWall, Bunker, Bunker.Floor, Bunker.Roof, CamoNetTent, CrowsNest, CrowsNest.BaseFloor, CrowsNest.FirstFloor, CrowsNest.Roof, Door, Door.TopSegment, FloorBoard, Gate, Gate.Ramp, HBlock, HBlockQuadWall, HotZoneMagnet, Loudspeaker, MistralAA, Mortar, Phalanx, Radio, Ramp, RefuelStation, RepairStation, SandbagWall, SV_Shelter, TallHBlock, TankTrap, WindowBoard, WoodBase.
3b. Other calculator rows (11)
| Row | Cash expression | XP expression |
|---|---|---|
BuildableDamaged | BaseValue * AlignmentModifier | none |
Building | BuildAmount * BaseReward * InstigatorZoneModifier | BuildAmount * BaseReward |
BuildableFinished | ((BuildCost * BaseReward) * InstigatorZoneModifier) + SchematicOwnerModifier | BuildCost * BaseReward |
SchematicPlaced | DefaultValue * InstigatorZoneModifier | none |
BuildSuppliesDeposited.Owner | DefaultValue * BuildSuppliesDeposited * InstigatorZoneModifier | BaseReward * BuildSuppliesDeposited * InstigatorZoneModifier |
BuildSuppliesDeposited.Interactor | DefaultValue * BuildSuppliesDeposited * InstigatorZoneModifier | BaseReward * BuildSuppliesDeposited * InstigatorZoneModifier |
BuildSuppliesConsumed.Owner | DefaultValue * BuildSuppliesDeposited * InstigatorZoneModifier | BaseReward * BuildSuppliesDeposited * InstigatorZoneModifier |
BuildSuppliesConsumed.Instigator | DefaultValue * InstigatorZoneModifier | (BaseReward) |
FOBOwnerPayed | DefaultValue * CashSpent | none |
FOBHacked | (1 - (clamp(LastVictimCount, 0, LastVictimCountMax) * LastVictimReductionModifier)) * (BaseValue * InstigatorZoneModifier) | (1 - (clamp(LastVictimCount, 0, LastVictimCountMax) * LastVictimReductionModifier)) * (BaseValue) |
FOBDoorClosed | (1 - (clamp(LastVictimCount, 0, LastVictimCountMax) * LastVictimReductionModifier)) * (BaseValue * InstigatorZoneModifier) | none |
Notes:
FOBHackeduses the last victim reduction, so repeated hacks of the same owner pay less. The reduction isclamp(LastVictimCount, 0, LastVictimCountMax) * LastVictimReductionModifier, subtracted from 1.BuildableFinishedaddsSchematicOwnerModifieras a flat term, so the schematic owner gets a flat bonus on completion.BuildSuppliesConsumed.Ownerand.Instigatordiffer. The owner row scales cash and XP byBuildSuppliesDeposited, the instigator row does not.BuildableDamaged,SchematicPlaced,FOBOwnerPayedandFOBDoorClosedhave no XP resource. That accounts for 4 of the 47 rows, leaving the 43 rows with XP.
3c. Assist entry without a calculator row
The feed table has a Challenges.Rewards.Buildables.BuildableDestroyed.Assist entry (“Buildable Destroyed Assist”, section 4). There is no matching calculator row in DT_ChallengeRewards_SessionEvents_Buildables. The assist credit appears to come through the AssistCurve and AssistScalar selectors inside the destroyed rows instead. This is an inference from the table layout, not a verified path.
4. Feed Strings (DT_ChallengesFeedActions_Building, 12 rows)
These are the messages shown in the reward feed, and the audio event each one plays. Strings come from /Game/UI/StringTables/STRINGS_ChallengesRewardFeed.
| Feed tag | Display string | Audio event |
|---|---|---|
BuildableDamaged | Buildable Damaged | none |
BuildableDestroyed | Buildable Destroyed | Audio.Event.UX.Cash.RevivedScore |
BuildableDestroyed.Assist | Buildable Destroyed Assist | Audio.Event.UX.Cash.BuiltScore |
Building | Building | none |
BuildableFinished | Building Complete | Audio.Event.UX.Cash.HealedScore |
SchematicPlaced | Build Schematic Placed | none |
BuildSuppliesDeposited | Supplies Deposited | Audio.Event.UX.Cash.HotzoneReward |
BuildSuppliesConsumed.Owner | Supplies Used | none |
BuildSuppliesConsumed.Instigator | Supplies Consumed | none |
FOBOwnerPayed | FOB Resources Used | none |
FOBHacked | FOB Hacked | Audio.Event.UX.Cash.RevivedScore |
FOBDoorClosed | FOB Door Closed | Audio.Event.UX.Cash.HealedScore |
Two of these rows have a ConditionalExpressions entry: BuildableDamaged and BuildableDestroyed show different text when the buildable is friendly (ANY(Challenges.Context.Buildables.Friendly)).
Note: BuildSuppliesConsumed.Instigator has a localisation key that reads ...BuildSuppliesConsumed.Repair while its feed tag is ...BuildSuppliesConsumed.Instigator. The text is correct, but the key name does not match the tag.
5. Destroyed-Variant Lookup (DT_RewardLookup_SessionEvent_BuildableDestroyed, 36 rows)
Maps each placed buildable variant to the reward tag that the destroyed calculator (section 3a) uses. Every variant has its own reward tag.
| Reward tag | Variants | Notes |
|---|---|---|
BuildableDestroyed.FOB | 1 | Id.Buildable.FOB |
BuildableDestroyed.AirRaidShelter | 1 | Id.Buildable.AirRaidShelter |
BuildableDestroyed.AirRaidShelter.Ceiling | 1 | Id.Buildable.AirRaidShelter.Ceiling |
BuildableDestroyed.AirRaidShelter.Floor | 1 | Id.Buildable.AirRaidShelter.Floor |
BuildableDestroyed.BarbedWire | 1 | Id.Buildable.BarbedWire |
BuildableDestroyed.BremmerWall | 1 | Id.Buildable.BremmerWall |
BuildableDestroyed.Bunker | 1 | Id.Buildable.Bunker |
BuildableDestroyed.Bunker.Floor | 1 | Id.Buildable.Bunker.Floor |
BuildableDestroyed.Bunker.Roof | 1 | Id.Buildable.Bunker.Roof |
BuildableDestroyed.CamoNetTent | 1 | Id.Buildable.CamoNetTent |
BuildableDestroyed.CrowsNest | 1 | Id.Buildable.CrowsNest |
BuildableDestroyed.CrowsNest.BaseFloor | 1 | Id.Buildable.CrowsNest.BaseFloor |
BuildableDestroyed.CrowsNest.FirstFloor | 1 | Id.Buildable.CrowsNest.FirstFloor |
BuildableDestroyed.CrowsNest.Roof | 1 | Id.Buildable.CrowsNest.Roof |
BuildableDestroyed.Door | 1 | Id.Buildable.Door |
BuildableDestroyed.Door.TopSegment | 1 | Id.Buildable.Door.TopSegment |
BuildableDestroyed.FloorBoard | 1 | Id.Buildable.FloorBoard |
BuildableDestroyed.Gate | 1 | Id.Buildable.Gate |
BuildableDestroyed.Gate.Ramp | 1 | Id.Buildable.Gate.Ramp |
BuildableDestroyed.HBlock | 1 | Id.Buildable.HBlock |
BuildableDestroyed.HBlockQuadWall | 1 | Id.Buildable.HBlockQuadWall |
BuildableDestroyed.HotZoneMagnet | 1 | Id.Buildable.HotzoneMagnet |
BuildableDestroyed.Loudspeaker | 1 | Id.Buildable.Loudspeaker |
BuildableDestroyed.MistralAA | 1 | Id.Buildable.MistralAA |
BuildableDestroyed.Mortar | 1 | Id.Buildable.Mortar |
BuildableDestroyed.Phalanx | 1 | Id.Buildable.Phalanx |
BuildableDestroyed.Radio | 1 | Id.Buildable.Radio |
BuildableDestroyed.Ramp | 1 | Id.Buildable.Ramp |
BuildableDestroyed.RefuelStation | 1 | Id.Buildable.RefuelStation |
BuildableDestroyed.RepairStation | 1 | Id.Buildable.RepairStation |
BuildableDestroyed.SandbagWall | 1 | Id.Buildable.SandbagWall |
BuildableDestroyed.SV_Shelter | 1 | Id.Buildable.SV_Shelter |
BuildableDestroyed.TallHBlock | 1 | Id.Buildable.TallHBlock |
BuildableDestroyed.TankTrap | 1 | Id.Buildable.TankTrap |
BuildableDestroyed.WindowBoard | 1 | Id.Buildable.WindowBoard |
BuildableDestroyed.WoodBase | 1 | Id.Buildable.WoodBase |
Three things to note:
- The Door (
Id.Buildable.Door) and the gate ramp (Id.Buildable.Gate.Ramp) each have their own reward tag and their own calculator row. They no longer share the Gate or BremmerWall payout. - The table has 36 rows and 36 reward tags. Each tag maps to one calculator row in section 3a, so each variant has its own payout.
Id.Buildable.Door.TopSegmentand the AirRaidShelter, Bunker and CrowsNest floor and roof pieces each have their own tag, separate from BarbedWire.
6. Assist Damage Curve
| Item | Value |
|---|---|
| Table | DT_Challenges_Curves_BuildableDestroyedAssist (1 row) |
| Live curve tag | LiveCurves.Challenges.SessionEvents.BuildableDestroyedAssist.DamageFraction |
| Curve asset | CRV_Challenges_Curves_BuildableDestroyedAssist_DamageFraction |
| Interpolation | Linear |
| Keys | (time 0.0, value 0.0) and (time 1.0, value 1.0) |
| Default value | 0.0 |
So the curve is a straight line from 0 to 1 over the input range. The input is not named in these files. The most likely reading is that the input is the fraction of a buildable’s health the assisting player damaged, so an assist that removes a bigger share of the buildable’s health earns a bigger share of the reward. That reading is not confirmed by the data.
The curve is wired to AssistCurve through the DamageAssistCurve option (section 2a).
7. Limitations
- No numeric reward values in this folder. The calculator uses option variables (
DismantleValue,HotZoneMagnetFactor,ControlZoneFactor,BaseReward,DefaultValue, and so on). Their values are defined outside this folder, in the shared challenge tables covered by the main doc. This doc names them but does not give values. - Input sources and ranges need tracing. The producers and ranges of
BuildProgress,BuildCost,BuildAmount,CashSpent,BuildSuppliesDepositedandLastVictimCountare not established here.LastVictimCountMaxis a configured literal of 2.0 in all three variable definitions inDT_ChallengeRewards_SessionEvents_Buildables, rather than an unknown event input in those definitions. See runtime triage RT-015. - The assist path is inferred. No
BuildableDestroyed.Assistcalculator row exists (section 3c). The assist credit is assumed to flow throughAssistCurveandAssistScalar. - The
Repairkey mismatch in section 4 is a localisation quirk, not a gameplay issue. It was not checked in-game. - The buildable challenge definitions table
DT_Challenges_SessionEvents_Buildableshas zero rows. The active buildable challenge list is not visible from this folder. - The 11 state trees (
ST_Challenges_SessionEvents_Buildable_*) are compiled StateTree bytecode. This doc names them (BuildableDamaged, BuildableDestroyed, BuildableDestroyed_Assist, Building, BuildingFinished, BuildSuppliesConsumed, BuildSuppliesDeposited, FOBDoorClosed, FOBHacked, FOBOwnerPayed, SchematicPlaced) but does not decode their states. - For the per-structure cash base values, see
Wardogs_Rewards_and_Progression_v2.md, section 7. Modifier values for the zone factors are in section 15 of the same doc.