Progression Recipes
Status: Reference / authoring aid. Companion to: STAT_PIPELINE.md, COMBAT_SYSTEM.md, Source/CRADL/Inventory/ItemRow.h
Scope
Tabular reference for stamping tiered weapons and armor with OSRS-shape progression curves. Each table pairs the OSRS reference values for a family (so the curve is anchored to a known good ramp) with the concrete FItemRow field values that reproduce a similar curve in the CRADL pipeline. Absolute numbers are not sacred — the shape (relative ramp between tiers, distribution across stat axes) is the contract.
This document is not a balance spec. Curve shape comes from OSRS; final tuning belongs to playtest.
Field Mapping (OSRS → CRADL)
| OSRS column | CRADL field | Bucket | Notes |
|---|---|---|---|
| Stab / Slash / Crush attack bonus | FItemRow::AttackBonus[Combat.DamageType.{Stab,Slash,Crush}] |
2 (matrix) | Per-type weapon-hand-bias. Aggregated by UEquipmentComponent::SumAttackBonus. |
| Ranged attack bonus | AttackBonus[Combat.DamageType.Ranged] |
2 | Same matrix; ranged uses the same TMap. |
| Magic attack bonus | AttackBonus[Combat.DamageType.Magic] |
2 | Same matrix; magic uses the same TMap. |
| Stab/Slash/Crush/Ranged/Magic defense | DefenseBonus[...] |
2 | Per-type defense matrix. Aggregated by SumDefenseBonus. |
| Strength bonus (melee) | FItemRow::StrengthBonus |
1 (scalar) | Synthesized into UGE_Equip_StrengthBonus at equip; reads as UCradlAttributeSet::Strength. |
| Ranged strength | FItemRow::RangedStrengthBonus |
1 | Synthesized into UGE_Equip_RangedStrengthBonus. |
| Magic damage % | FItemRow::MagicDamageBonus (float, 0.10 == +10%) |
1 | Synthesized into UGE_Equip_MagicDamageBonus. |
| (no OSRS analog — see below) | FItemRow::DefenseBonusFlat |
1 | Universal Defense scalar; usually 0 for tier-stamped gear. Reserve for set bonuses, capes, "Defense potion"-style consumables. |
| Attack speed (ticks) | FItemRow::SwingInterval (seconds) |
3 (identity) | SwingInterval = ticks * 0.6. Runtime cadence is SwingInterval / AttackSpeed. |
| Combat style buttons | FItemRow::WeaponDamageType + DefaultStyle + StyleDamageTypes |
3 | WeaponDamageType is the default axis. StyleDamageTypes (TArray<FStyleSwingAxis> — each entry pairs a Combat.Style.* leaf with a Combat.DamageType.* leaf) overrides per active style on melee weapons — a scimitar can swing Slash under Aggressive and Stab under Controlled. Resolved at swing-start via CradlCombat::ResolveSwingDamageType. Style itself (Aggressive/Defensive/Controlled) also routes XP and adds effective-level bonuses — see COMBAT_SYSTEM.md "Combat Styles". |
| Prayer bonus | (no pipeline yet — drop or revisit when prayer ships) | — | Park as a row field on the day prayer lands. |
Tick → SwingInterval cheat sheet: 3t = 1.8s · 4t = 2.4s · 5t = 3.0s · 6t = 3.6s · 7t = 4.2s.
EquipEffects vs row scalar. Per STAT_PIPELINE.md "Item Authoring Shape": static numerical bonuses use the row scalar fields. EquipEffects is reserved for conditional / multiplier / set-bonus shapes — see "Capstone & Conditional Recipes" at the bottom.
Melee Weapons
Per-family StyleDamageTypes mapping. Each melee family below carries a StyleDamageTypes mapping that controls which Combat.DamageType.* axis the active style consumes. The per-axis AttackBonus columns below are all reachable from gameplay — under Aggressive a scimitar swings Slash and rolls against AttackBonus[Slash]; under Controlled it swings Stab and rolls against AttackBonus[Stab]. The same author-once AttackBonus matrix supplies the right axis to whichever style the player picks. See COMBAT_SYSTEM.md "Combat Styles → Style → Swing Axis" for the resolver. Ranged/magic weapons don't author StyleDamageTypes — they swing their single WeaponDamageType regardless of style.
Scimitar family (4-tick, slash-biased one-hand)
OSRS scimitars are the canonical slash mainline: fast, slash-heavy, modest stab, slight crush penalty. Recipe mirrors OSRS values one-to-one — the ramp is already the curve we want.
| Tier | OSRS Stab / Slash / Crush atk | OSRS Str | OSRS speed | → WeaponDamageType |
SwingInterval |
AttackBonus (Stab/Slash/Crush) |
StrengthBonus |
|---|---|---|---|---|---|---|---|
| Bronze | +4 / +7 / −2 | +7 | 4t | ...Slash |
2.4 | 4 / 7 / −2 | 7 |
| Iron | +5 / +9 / −2 | +9 | 4t | ...Slash |
2.4 | 5 / 9 / −2 | 9 |
| Steel | +7 / +14 / −2 | +12 | 4t | ...Slash |
2.4 | 7 / 14 / −2 | 12 |
| Black | +8 / +19 / −2 | +14 | 4t | ...Slash |
2.4 | 8 / 19 / −2 | 14 |
| Mithril | +10 / +21 / −2 | +17 | 4t | ...Slash |
2.4 | 10 / 21 / −2 | 17 |
| Adamant | +13 / +29 / −2 | +22 | 4t | ...Slash |
2.4 | 13 / 29 / −2 | 22 |
| Rune | +18 / +45 / −2 | +44 | 4t | ...Slash |
2.4 | 18 / 45 / −2 | 44 |
| Dragon | +22 / +67 / −2 | +66 | 4t | ...Slash |
2.4 | 22 / 67 / −2 | 66 |
| Capstone (whip-style) | 0 / +82 / 0 | +82 | 4t | ...Slash |
2.4 | 0 / 82 / 0 | 82 |
DefaultStyle = Combat.Style.Aggressive for all (scimitars default-aggressive in OSRS). All other axes on AttackBonus / DefenseBonus left empty (treated as 0).
StyleDamageTypes: { Aggressive → Slash, Defensive → Slash, Controlled → Stab } — matches OSRS's Chop/Slash/Block→Slash and Lunge→Stab button mapping.
Longsword family (5-tick, balanced stab/slash one-hand)
Slower than scimitar, marginally higher slash, similar stab. Used as the "balanced" alternative.
| Tier | OSRS Stab / Slash / Crush | OSRS Str | OSRS speed | SwingInterval |
AttackBonus |
StrengthBonus |
|---|---|---|---|---|---|---|
| Bronze | +4 / +8 / −2 | +7 | 5t | 3.0 | 4 / 8 / −2 | 7 |
| Iron | +5 / +10 / −2 | +9 | 5t | 3.0 | 5 / 10 / −2 | 9 |
| Steel | +7 / +15 / −2 | +12 | 5t | 3.0 | 7 / 15 / −2 | 12 |
| Black | +8 / +20 / −2 | +14 | 5t | 3.0 | 8 / 20 / −2 | 14 |
| Mithril | +10 / +22 / −2 | +17 | 5t | 3.0 | 10 / 22 / −2 | 17 |
| Adamant | +13 / +30 / −2 | +22 | 5t | 3.0 | 13 / 30 / −2 | 22 |
| Rune | +18 / +46 / −2 | +44 | 5t | 3.0 | 18 / 46 / −2 | 44 |
| Dragon | +22 / +69 / −2 | +66 | 5t | 3.0 | 22 / 69 / −2 | 66 |
WeaponDamageType = Combat.DamageType.Slash, DefaultStyle = Combat.Style.Controlled.
StyleDamageTypes: { Aggressive → Slash, Defensive → Slash, Controlled → Stab } — same shape as the scimitar family; longswords give up a tick of speed for slightly higher slash/stab numbers but keep the same per-style axis mapping.
Dagger family (4-tick, stab-focused, low Str)
Fast, stab-dominant, weak base — pure DPS-via-speed/style ramp. Capstone is the special-attack-driven tier in OSRS; we don't model the spec here, just the base values.
| Tier | OSRS Stab / Slash / Crush | OSRS Str | OSRS speed | SwingInterval |
AttackBonus |
StrengthBonus |
|---|---|---|---|---|---|---|
| Bronze | +4 / +3 / −2 | +1 | 4t | 2.4 | 4 / 3 / −2 | 1 |
| Iron | +5 / +4 / −2 | +2 | 4t | 2.4 | 5 / 4 / −2 | 2 |
| Steel | +7 / +6 / −2 | +4 | 4t | 2.4 | 7 / 6 / −2 | 4 |
| Mithril | +10 / +8 / −2 | +6 | 4t | 2.4 | 10 / 8 / −2 | 6 |
| Adamant | +14 / +12 / −2 | +9 | 4t | 2.4 | 14 / 12 / −2 | 9 |
| Rune | +25 / +20 / −2 | +23 | 4t | 2.4 | 25 / 20 / −2 | 23 |
| Dragon | +40 / +25 / −2 | +40 | 4t | 2.4 | 40 / 25 / −2 | 40 |
WeaponDamageType = Combat.DamageType.Stab, DefaultStyle = Combat.Style.Aggressive.
StyleDamageTypes: { Aggressive → Stab, Defensive → Stab, Controlled → Slash } — inverse of the scimitar shape (daggers are stab-default, slash on the off-style).
Mace family (4-tick, crush-biased one-hand)
Crush is the only tier-stamped weapon line that ramps the crush axis. Mace also carries a prayer bonus in OSRS — park that until prayer ships.
| Tier | OSRS Stab / Slash / Crush | OSRS Str | OSRS speed | SwingInterval |
AttackBonus |
StrengthBonus |
|---|---|---|---|---|---|---|
| Bronze | 0 / −1 / +5 | +3 | 4t | 2.4 | 0 / −1 / 5 | 3 |
| Iron | +1 / −1 / +6 | +5 | 4t | 2.4 | 1 / −1 / 6 | 5 |
| Steel | +3 / −1 / +9 | +7 | 4t | 2.4 | 3 / −1 / 9 | 7 |
| Mithril | +5 / −1 / +12 | +10 | 4t | 2.4 | 5 / −1 / 12 | 10 |
| Adamant | +8 / −1 / +16 | +14 | 4t | 2.4 | 8 / −1 / 16 | 14 |
| Rune | +12 / −1 / +24 | +14 | 4t | 2.4 | 12 / −1 / 24 | 14 |
| Dragon | +18 / −1 / +40 | +38 | 4t | 2.4 | 18 / −1 / 40 | 38 |
WeaponDamageType = Combat.DamageType.Crush, DefaultStyle = Combat.Style.Aggressive.
StyleDamageTypes: { Aggressive → Crush, Defensive → Crush, Controlled → Stab } — Spike (OSRS's Controlled mace style) routes to the secondary stab axis; the row's modest stab numbers above are what the swing rolls against under Controlled.
Two-hand greatsword / godsword (7-tick, capstone-tier slash/crush)
Two-hand slot. The godsword tier in OSRS unifies an extremely high slash and crush axis on the same weapon — pick the higher of the two as the player's effective attack roll via the combat-style choice.
| Tier | OSRS Stab / Slash / Crush | OSRS Str | OSRS speed | SwingInterval |
AttackBonus |
StrengthBonus |
|---|---|---|---|---|---|---|
| Bronze 2h | +6 / +9 / −2 | +9 | 7t | 4.2 | 6 / 9 / −2 | 9 |
| Steel 2h | +11 / +18 / −2 | +18 | 7t | 4.2 | 11 / 18 / −2 | 18 |
| Mithril 2h | +15 / +25 / −2 | +25 | 7t | 4.2 | 15 / 25 / −2 | 25 |
| Adamant 2h | +20 / +36 / −2 | +36 | 7t | 4.2 | 20 / 36 / −2 | 36 |
| Rune 2h | +26 / +70 / −2 | +70 | 7t | 4.2 | 26 / 70 / −2 | 70 |
| Dragon 2h | +30 / +85 / −2 | +85 | 7t | 4.2 | 30 / 85 / −2 | 85 |
| Godsword (capstone) | 0 / +132 / +132 | +132 | 6t | 3.6 | 0 / 132 / 132 | 132 |
WeaponDamageType = Combat.DamageType.Slash. Godsword tier ships with both Slash and Crush bonuses populated; the active swing axis is whatever the style → damage-type mapping resolves to at swing time.
StyleDamageTypes:
- Greatsword tiers (Bronze → Dragon 2h): { Aggressive → Slash, Defensive → Slash, Controlled → Crush } — OSRS Chop/Slash/Block are Slash; Smash is Crush.
- Godsword: { Aggressive → Slash, Defensive → Slash, Controlled → Crush } — same family shape; the godsword's distinguishing feature is that both its slash and crush AttackBonus entries are high (132/132), so picking Controlled is a real damage choice instead of a sacrifice.
Ranged
Bows (3-5 tick, ranged attack only — strength comes from ammo)
Two-hand slot. OSRS shortbows are 3t (fast, low ranged str on the weapon); longbows are 6t (slow, high accuracy). Capstone bows (Crystal, Faerdhinen, Twisted) break the pattern with weapon-supplied ranged str.
| Tier | OSRS Ranged atk | OSRS Ranged str | OSRS speed | AttackBonus[Ranged] |
RangedStrengthBonus |
SwingInterval |
|---|---|---|---|---|---|---|
| Shortbow (oak) | +6 | 0 | 3t | 6 | 0 | 1.8 |
| Shortbow (willow) | +14 | 0 | 3t | 14 | 0 | 1.8 |
| Shortbow (maple) | +29 | 0 | 3t | 29 | 0 | 1.8 |
| Shortbow (yew) | +47 | 0 | 3t | 47 | 0 | 1.8 |
| Shortbow (magic) | +69 | 0 | 3t | 69 | 0 | 1.8 |
| Longbow (yew) | +55 | 0 | 6t | 55 | 0 | 3.6 |
| Longbow (magic) | +82 | 0 | 6t | 82 | 0 | 3.6 |
| Crystal bow (capstone) | +100 | +70 | 4t | 100 | 70 | 2.4 |
| Twisted bow (capstone) | +70 | +20 | 5t | 70 | 20 | 3.0 |
WeaponDamageType = Combat.DamageType.Ranged, DefaultStyle = Combat.Style.Aggressive (Rapid in OSRS — map to whatever the project's "fast-but-no-accuracy-bonus" style ends up tagged).
Arrows / bolts (ammo slot — supplies ranged strength)
Ammo authoring is identical to a one-line item: empty WeaponDamageType, ranged str only. Ammo consumption is keyed off the bow's WeaponDamageType == Combat.DamageType.Ranged — see COMBAT_SYSTEM.md "Ammo Slot".
| Tier | OSRS Ranged atk | OSRS Ranged str | AttackBonus[Ranged] |
RangedStrengthBonus |
|---|---|---|---|---|
| Bronze arrow | 0 | +7 | 0 | 7 |
| Iron arrow | +1 | +10 | 1 | 10 |
| Steel arrow | +2 | +16 | 2 | 16 |
| Mithril arrow | +3 | +22 | 3 | 22 |
| Adamant arrow | +5 | +31 | 5 | 31 |
| Rune arrow | +7 | +49 | 7 | 49 |
| Amethyst arrow | +8 | +55 | 8 | 55 |
| Dragon arrow | +9 | +60 | 9 | 60 |
Magic
Staves (magic attack + sometimes magic damage)
Magic damage on staves is a percentage (MagicDamageBonus, float — 0.15 reads as +15%). Most low-tier staves are pure magic-attack bumps; only capstone wands/staves carry the damage %.
| Tier | OSRS Magic atk | OSRS Mag dmg | AttackBonus[Magic] |
MagicDamageBonus |
|---|---|---|---|---|
| Staff of air | +6 | 0 | 6 | 0.00 |
| Mystic air staff | +14 | 0 | 14 | 0.00 |
| Ancient staff | +15 | 0 | 15 | 0.00 |
| Master wand | +20 | 0 | 20 | 0.00 |
| Trident of seas | +25 | +10% | 25 | 0.10 |
| Kodai wand (capstone) | +28 | +15% | 28 | 0.15 |
WeaponDamageType = Combat.DamageType.Magic. SwingInterval depends on the spell, not the staff — OSRS spells are 5t (autocast); set staff SwingInterval = 3.0 as a baseline for autoattacks if the project models a staff "bash" cadence.
Armor
Defense matrix only; armor doesn't contribute to attack bonuses except where the OSRS source data does (rare — most lower-tier armor is pure defense). Magic defense is universally negative on metal armor in OSRS; preserved here because the shape matters (metal-armor mages get cratered by magic).
Body (platebody / chainbody, body slot)
| Tier | OSRS Stab / Slash / Crush / Ranged / Magic def | DefenseBonus |
|---|---|---|
| Bronze plate | +11 / +14 / +11 / +10 / −6 | 11 / 14 / 11 / 10 / −6 |
| Iron plate | +16 / +20 / +16 / +15 / −6 | 16 / 20 / 16 / 15 / −6 |
| Steel plate | +24 / +30 / +24 / +22 / −6 | 24 / 30 / 24 / 22 / −6 |
| Black plate | +29 / +36 / +29 / +25 / −6 | 29 / 36 / 29 / 25 / −6 |
| Mithril plate | +33 / +41 / +33 / +30 / −6 | 33 / 41 / 33 / 30 / −6 |
| Adamant plate | +43 / +54 / +43 / +40 / −6 | 43 / 54 / 43 / 40 / −6 |
| Rune plate | +82 / +80 / +72 / +72 / −6 | 82 / 80 / 72 / 72 / −6 |
| Capstone (Bandos-style) | +82 / +80 / +72 / +72 / −6 (+ Str +4) | 82 / 80 / 72 / 72 / −6 (StrengthBonus = 4) |
| Capstone (Torva-style) | +95 / +94 / +85 / +84 / −4 (+ Str +8) | 95 / 94 / 85 / 84 / −4 (StrengthBonus = 8) |
Helmets (full helm, head slot)
| Tier | OSRS Stab / Slash / Crush / Ranged / Magic def | DefenseBonus |
|---|---|---|
| Bronze full helm | 0 / +2 / 0 / +1 / −1 | 0 / 2 / 0 / 1 / −1 |
| Iron full helm | +3 / +5 / +1 / +2 / −1 | 3 / 5 / 1 / 2 / −1 |
| Steel full helm | +4 / +6 / +2 / +4 / −1 | 4 / 6 / 2 / 4 / −1 |
| Mithril full helm | +5 / +8 / +5 / +6 / −1 | 5 / 8 / 5 / 6 / −1 |
| Adamant full helm | +7 / +10 / +7 / +8 / −1 | 7 / 10 / 7 / 8 / −1 |
| Rune full helm | +12 / +20 / +18 / +16 / −1 | 12 / 20 / 18 / 16 / −1 |
| Dragon med helm | +14 / +24 / +20 / +18 / −1 | 14 / 24 / 20 / 18 / −1 |
| Capstone (Serpentine-style) | +13 / +13 / +13 / +14 / −1 (+ Atk +5 all) | 13 / 13 / 13 / 14 / −1 (also populate AttackBonus: 5/5/5/0/0) |
Legs (platelegs, leg slot)
Same shape as platebody scaled ~2/3. Skipped per-tier — copy platebody column-wise at ~65%.
Shields (kiteshield, offhand)
Roughly platebody-scaled to 30-50%, plus modest Stab/Slash/Crush attack on dragon-tier and up.
| Tier | OSRS def (Stab/Slash/Crush/Ranged/Magic) | OSRS atk bonus | DefenseBonus |
AttackBonus |
|---|---|---|---|---|
| Bronze kite | +4 / +5 / +6 / +3 / −1 | 0 | 4 / 5 / 6 / 3 / −1 | — |
| Steel kite | +12 / +14 / +16 / +10 / −1 | 0 | 12 / 14 / 16 / 10 / −1 | — |
| Mithril kite | +17 / +20 / +21 / +17 / −1 | 0 | 17 / 20 / 21 / 17 / −1 | — |
| Adamant kite | +22 / +25 / +27 / +21 / −1 | 0 | 22 / 25 / 27 / 21 / −1 | — |
| Rune kite | +44 / +48 / +46 / +44 / −1 | 0 | 44 / 48 / 46 / 44 / −1 | — |
| Dragon sq shield | +50 / +52 / +48 / +46 / −1 | 0 | 50 / 52 / 48 / 46 / −1 | — |
| Dragonfire (capstone) | +60 / +63 / +56 / +52 / +5 (+10 mag atk) | mag +10 | 60 / 63 / 56 / 52 / 5 | 0 / 0 / 0 / 0 / 10 |
Boots / Gloves / Cape / Amulet (jewelry & accessory slots)
These slots in OSRS contribute small flat per-axis bonuses and meaningful Str/Ranged-str/Magic-damage scalars — they're the slot where capstone scalar progression hides.
| Item | OSRS contribution | Recipe |
|---|---|---|
| Dragon boots (capstone-tier) | +16 melee def, +2 ranged def, Str +4 | DefenseBonus: 16/16/16/2/0 · StrengthBonus = 4 |
| Primordial boots | +22 / +22 / +22 / +1 / −4 · Str +5 | matching matrix · StrengthBonus = 5 |
| Pegasian boots | +5 / +5 / +5 / +8 / −1 · RngStr +4 | matching matrix · RangedStrengthBonus = 4 |
| Eternal boots | +5 / +5 / +5 / +1 / +8 · MagDmg n/a | matching matrix; no MagicDamageBonus (boots don't carry %) |
| Barrows gloves (capstone) | +12 all atk axes, +6 all def axes, Str +12, RngStr +8 | populate AttackBonus 12/12/12/12/6 + DefenseBonus 6/6/6/6/3 · StrengthBonus = 12 · RangedStrengthBonus = 8 |
| Fire cape | +1 atk all, +11 def all, Str +4 | AttackBonus 1/1/1/0/0 · DefenseBonus 11/11/11/11/11 · StrengthBonus = 4 |
| Infernal cape | +4 atk all, +12 def all, Str +8 | AttackBonus 4/4/4/4/1 · DefenseBonus 12/12/12/12/12 · StrengthBonus = 8 |
| Amulet of glory | +10 atk all melee, +3 def all, Str +6 | AttackBonus 10/10/10/0/0 · DefenseBonus 3/3/3/3/3 · StrengthBonus = 6 |
| Amulet of fury | +10 atk all, +8 def all, Str +10 | AttackBonus 10/10/10/10/10 · DefenseBonus 8/8/8/8/8 · StrengthBonus = 10 |
| Amulet of torture | +15 atk melee · Str +10 | AttackBonus 15/15/15/0/0 · StrengthBonus = 10 |
| Amulet of anguish | +15 atk ranged · RngStr +10 | AttackBonus[Ranged] = 15 · RangedStrengthBonus = 10 |
| Occult necklace | +12 atk magic · MagDmg +10% | AttackBonus[Magic] = 12 · MagicDamageBonus = 0.10 |
Capstone & Conditional Recipes (EquipEffects)
Conditional bonuses, multipliers, and set-bonus shapes use the EquipEffects GE path — not row scalars. See STAT_PIPELINE.md "Target-Conditional Modifiers". These are sketches; the GE classes need to be authored in C++ (or BP-inherited from a parameterized base) and dropped into EquipEffects at item-row author time.
Each recipe lists what authoring work is still required; the dependency table near the bottom (Roadmap to Shippable Recipes) summarizes the remaining work per recipe.
Slayer-helm equivalent — +15% melee Str vs assigned target
Row:
StrengthBonus = 0 (no static contribution)
EquipEffects = [ GE_Item_StrengthBonus_Plus15_VsAssignedTarget ]
GE class:
Modifier: Strength += 0.15 (Multiply Additive)
OngoingTagRequirements: Status.AssignedTarget.MatchingFamily
Status.AssignedTarget.MatchingFamily is declared as a stub in DefaultGameplayTags.ini but has no current publisher — an EquipEffects GE gated on it will load and remain inert until an assignment system ships. Recipe is authorable now; expect it to fire only once that system lands.
Salve amulet — +15% melee acc & dmg vs undead
EquipEffects = [
GE_Item_Strength_Plus15_VsUndead,
GE_Item_AttackBonus_Plus15_VsUndead (or via a synthetic accuracy attribute)
]
Both GEs:
OngoingTagRequirements: Enemy.Family.Undead
Authoring requires the Enemy.Family.Undead leaf in DefaultGameplayTags.ini plus the two EquipEffects GE classes. The runtime hook that surfaces Enemy.Family.<leaf> tags during damage resolution is already shipped — see FTargetClassificationScope in Source/CRADL/Combat/TargetClassificationScope.h.
Dragon hunter lance — +20% acc & dmg vs dragons
Row:
StrengthBonus = (base lance value, e.g. 70)
AttackBonus[Stab] = (base lance stab atk, e.g. 82)
EquipEffects = [
GE_Item_Strength_Plus20_VsDragons,
GE_Item_AttackBonus_Plus20_VsDragons
]
Conditional GEs:
OngoingTagRequirements: Enemy.Family.Dragon
Same machinery as Salve amulet. Authoring requires the Enemy.Family.Dragon leaf in DefaultGameplayTags.ini plus the two conditional GE classes.
Berserker necklace + obsidian weapon — set bonus (+20% Str when both worn)
On Berserker necklace:
EquipEffects = [ GE_Item_Strength_Plus20_WithObsidianWeapon ]
GE class:
Modifier: Strength += 0.20 (Multiply Additive)
OngoingTagRequirements: Item.Equipped.Material.Obsidian
UEquipmentComponent publishes Item.Equipped.Material.Obsidian on the owning ASC whenever any equipped item carries Item.Material.Obsidian in its row Tags. Authoring requires the Item.Material.Obsidian source tag on the obsidian weapon's FItemRow::Tags, the Item.Equipped.Material.Obsidian mirror in DefaultGameplayTags.ini (already declared), and the GE_Item_Strength_Plus20_WithObsidianWeapon class. No GE on the weapon itself — the necklace's conditional GE handles the +20%.
Ancestral / Ahrim's-style magic set — +6% MagDmg per piece
Three pieces, three identical row entries — no GE needed if the bonus is unconditional:
Per-piece row:
MagicDamageBonus = 0.06 (stacks additively across all 3 = +18%)
If the design wants the set bonus to require all three pieces (rather than per-piece additive), move it to EquipEffects:
Per-piece row:
MagicDamageBonus = 0 (no per-piece contribution)
Tags += Item.Material.Ancestral
EquipEffects = [ GE_Item_MagicDamage_Plus6_AncestralSet ]
GE class:
Modifier: MagicDamage += 0.06 (Additive; attribute is the % itself, composes by sum)
OngoingTagRequirements: Item.Equipped.Set.AncestralFull
Authoring requires the Item.Material.Ancestral source tag on each piece, the Item.Equipped.Set.AncestralFull mirror (already declared in DefaultGameplayTags.ini), a configured FEquipmentSetThreshold entry on the loadout's UEquipmentComponent ({SourceMaterial: Item.Material.Ancestral, MinPieces: 3, PublishedSetTag: Item.Equipped.Set.AncestralFull}), and the GE_Item_MagicDamage_Plus6_AncestralSet class. The per-piece additive recipe above remains the lower-friction option when full-set gating isn't strictly required.
(Note: the row field is MagicDamageBonus; the GE modifier targets the MagicDamage attribute. The synthesizer in UEquipmentComponent::ApplyEquipEffect bridges the two — runtime reads UCradlAttributeSet::GetMagicDamage(). Final damage scales by (1 + MagicDamage).)
DefenseBonusFlat — when to use it
The OSRS pipeline has no analog. The DefenseBonusFlat row field synthesizes into the universal Defense attribute via UGE_Equip_DefenseBonus at equip-time (synthesized in UEquipmentComponent::ApplyEquipEffect's SynthesiseScalar lambda). Reserve the row field for items whose defensive contribution isn't naturally per-axis:
- Set bonuses across non-comparable slots (e.g., "Wearing all 4 pieces of Justiciar grants +20 universal defense").
- Capes / amulets that read as "general toughness" rather than per-type plating.
Do NOT use DefenseBonusFlat for:
- Consumable defense potions — those write to the
Defenseattribute directly via their own HasDuration GE (CONSUMABLES.md "Stat Boost Channel"), they don't go through any row field. - Per-archetype enemy defensive profiles — those use the
UGE_DefMult_*per-type multiplier GEs on theDefenseMultiplier[Stab/Slash/Crush/Ranged/Magic]attributes (STAT_PIPELINE.md "Defense Granularity").
Tier-stamped gear in this document leaves DefenseBonusFlat = 0 and expresses all defensive character through the per-type DefenseBonus matrix.
Quick recipe for new tier authoring
- Pick the family table above whose curve shape matches the new item's intended role.
- Locate the OSRS tier closest to the intended power band.
- Copy the recipe column values into the items DataTable row.
- Set
WeaponDamageType+DefaultStyle(weapons only) from the family header. - If the item has a conditional / set / multiplier bonus, author a GE class and attach via
EquipEffects— leave the row scalar field for that stat at 0 (validator rejects double-author). - Run the items DataTable validator (Source/CRADLEditor/Validators/) — it enforces the one-path-per-stat-per-item rule from STAT_PIPELINE.md "Item Authoring Shape".
Roadmap to Shippable Recipes
Mapping each currently-pending recipe to the work it still needs:
| Recipe | Needs |
|---|---|
Salve amulet (Enemy.Family.Undead) |
Author GE + ini leaf |
Dragon hunter (Enemy.Family.Dragon) |
Author GE + ini leaf |
| Slayer-helm equivalent (assigned-target gating) | Author GE — Status.AssignedTarget.MatchingFamily is declared as a stub but inert until an assignment system publishes it |
| Berserker + obsidian set bonus | Author GE + ini leaf (equipped-tag bookkeeping shipped) |
Ancestral full-set bonus (the EquipEffects variant) |
Author GE + configure FEquipmentSetThreshold (equipped-tag bookkeeping shipped) |
| Per-piece additive Ancestral (no full-set requirement) | Already shippable — pure row-scalar authoring |
The per-piece additive recipe path is the lowest-friction option for every set-style bonus that doesn't strictly require full-set gating. When in doubt, ship the per-piece additive first; the full-set marker is a tightening, not a foundation.