|
|
-- Gear balance overlay for every row in public.gear (no per-name balance runs).
|
|
|
-- Anchors from the previous overlay: weapon families daggers/sword/axe bases 3/7/12; chest light/medium/heavy 2/4/10;
|
|
|
-- extended slots use canonical base per gear.form.* (catalog §0a; same idea as equipment_items MIN-per-form).
|
|
|
-- primary_stat = round(base_primary * L(ilvl) * M(rarity) * tol(id)) with
|
|
|
-- L(ilvl) = 1.1^max(0, ilvl-1) (§6.4 / runtime_config ilvlPerLevelMultiplier)
|
|
|
-- M(rarity) from runtime_config §6.4.2
|
|
|
-- tol(id) in [0.92, 1.15] — deterministic spread (+15% / −8% band) via mod(id, 24).
|
|
|
-- main_hand: class-uniform speed/crit (000010).
|
|
|
|
|
|
WITH canon AS (
|
|
|
SELECT
|
|
|
g.id,
|
|
|
COALESCE(
|
|
|
CASE
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'daggers' THEN 3
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'sword' THEN 7
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'axe' THEN 12
|
|
|
WHEN g.slot = 'chest' AND g.subtype = 'light' THEN 2
|
|
|
WHEN g.slot = 'chest' AND g.subtype = 'medium' THEN 4
|
|
|
WHEN g.slot = 'chest' AND g.subtype = 'heavy' THEN 10
|
|
|
WHEN g.form_id = 'gear.form.chest.plate' THEN 10
|
|
|
WHEN g.form_id = 'gear.form.chest.mail' THEN 4
|
|
|
WHEN g.form_id = 'gear.form.chest.leather' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.chest.robe' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.chest.brigandine' THEN 4
|
|
|
WHEN g.form_id = 'gear.form.head.cap' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.head.crown' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.head.helmet' THEN 4
|
|
|
WHEN g.form_id = 'gear.form.head.hood' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.head.hat' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.head.circlet' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.head.mask' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.head.coif' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.neck.amulet' THEN 4
|
|
|
WHEN g.form_id = 'gear.form.neck.necklace' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.neck.pendant' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.neck.medallion' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.neck.talisman' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.finger.ring' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.finger.signet' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.finger.band' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.feet.boots' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.feet.shoes' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.feet.sabatons' THEN 4
|
|
|
WHEN g.form_id = 'gear.form.feet.greaves' THEN 5
|
|
|
WHEN g.form_id = 'gear.form.feet.sandals' THEN 1
|
|
|
WHEN g.form_id = 'gear.form.legs.greaves' THEN 5
|
|
|
WHEN g.form_id = 'gear.form.legs.chausses' THEN 4
|
|
|
WHEN g.form_id = 'gear.form.legs.pants' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.legs.tassets' THEN 4
|
|
|
WHEN g.form_id = 'gear.form.cloak.cloak' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.cloak.cape' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.cloak.mantle' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.wrist.bracers' THEN 3
|
|
|
WHEN g.form_id = 'gear.form.wrist.bracelet' THEN 2
|
|
|
WHEN g.form_id = 'gear.form.wrist.vambraces' THEN 4
|
|
|
END,
|
|
|
GREATEST(1, g.base_primary)
|
|
|
) AS canon_base
|
|
|
FROM public.gear AS g
|
|
|
)
|
|
|
UPDATE public.gear AS g
|
|
|
SET
|
|
|
base_primary = c.canon_base,
|
|
|
primary_stat = GREATEST(
|
|
|
1,
|
|
|
ROUND(
|
|
|
c.canon_base::numeric
|
|
|
* POWER(1.1, GREATEST(0, g.ilvl - 1))
|
|
|
* (CASE g.rarity::text
|
|
|
WHEN 'common' THEN 1.0
|
|
|
WHEN 'uncommon' THEN 1.0877573
|
|
|
WHEN 'rare' THEN 1.1832160
|
|
|
WHEN 'epic' THEN 1.2870518
|
|
|
WHEN 'legendary' THEN 1.40
|
|
|
ELSE 1.0
|
|
|
END)
|
|
|
* (0.92::numeric + (mod(g.id, 24)::numeric / 23.0) * 0.23)
|
|
|
)::integer
|
|
|
),
|
|
|
speed_modifier = CASE
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'daggers' THEN 1.3
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'sword' THEN 1.0
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'axe' THEN 0.7
|
|
|
ELSE g.speed_modifier
|
|
|
END,
|
|
|
crit_chance = CASE
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'daggers' THEN 0.05
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'sword' THEN 0.03
|
|
|
WHEN g.slot = 'main_hand' AND g.subtype = 'axe' THEN 0.02
|
|
|
ELSE g.crit_chance
|
|
|
END
|
|
|
FROM canon AS c
|
|
|
WHERE g.id = c.id;
|
|
|
|
|
|
-- Heavy chest armor: strong attack-cadence penalty (chest multiplies EffectiveSpeedAt after weapon).
|
|
|
-- Spec heavy ≈ −30% speed (0.7); here 0.55 for a clearly heavier feel. Extra agility on the piece
|
|
|
-- further lowers effective attack speed via agility_coef (world MoveSpeed is still buff/debuff-only).
|
|
|
UPDATE public.gear
|
|
|
SET
|
|
|
speed_modifier = 0.55,
|
|
|
agility_bonus = agility_bonus - 3
|
|
|
WHERE slot = 'chest' AND subtype = 'heavy';
|