Skip to content

Hyper Vault Objective#217

Merged
iwolfking merged 56 commits into
iwolfking:masterfrom
Poor-Mans-Physicist:feature/hyper-objective
Jul 14, 2026
Merged

Hyper Vault Objective#217
iwolfking merged 56 commits into
iwolfking:masterfrom
Poor-Mans-Physicist:feature/hyper-objective

Conversation

@Poor-Mans-Physicist

Copy link
Copy Markdown
Contributor

A new endgame vault objective available only on tier 4-6 maps. Designed partly to be an endgame replacement to the brutal boss spam that everyone runs now for crate loot (is incredibly boring, easy, and repetitive), that has more interesting rewards and requires actual gameplay. Consists of a composite objective system that has three sub objectives followed by a rune boss main objective, with chaos modifiers constantly dumping into the vault. Every time you complete a full sub objective + boss kill, it allows you to cash out or try another cycle to go for a better crate. Also contains some custom logic to limit the number of certain modifiers that appear on hyper vaults to prevent runaway unplayable behavior. Crate loot improves quadratically, making staying in for as long as possible ideal as opposed to running many quick vaults. The loot is pretty well balanced to brutal bosses at the moment, and i also added it as a source of some of the new items and some other very rare stuff, though not in high quantities (more of a drip reward as opposed to targeted farming). Should conform in general to basic pack standards like datagenning, events handling, and such. Has been playtested quite a bit and runs pretty well from what i can tell.


Technical notes: every tuning knob and the three crate injection pools live in config/the_vault/hyper_objective.json (self-generates with the shipped defaults); the modifier ban list and stack caps live in HyperModifierPolicy, and the hyper chaos pools are derived from the concealed-chaos/negative-event pools minus that ban list at datagen time. The objective only becomes rollable with the companion pack-config PR (map objective entries live pack-side). The injection pools reference the greedy ticket and Core of the Vault Gods items by id — without those two PRs merged, the affected rolls just log an error and are skipped.

🤖 Generated with Claude Code

Poor-Mans-Physicist and others added 30 commits July 11, 2026 02:51
…ation cycles

MAP-exclusive (tier 4+), Impossible-locked, no-exit objective. Per cycle: two rolled
minis (bingo/collector/shared elixir bar/chaos/treasure doors/chest collection) plus
forced brutal pillars, then a podium-armed rune-boss fight with escalating stats and
brutal waves (20s timer + 80/60/40/20% health gates). Each kill adds a compounding
HYPER stack (x1.75 hp/dmg, +20% speed via one cycle-derived modifier), crate tiers,
a 25-modifier chaos dump (175 cap), and a 30s exit pillar - the only way out alive.

Also: BrutalBossesObjective gains a negative-pool-only mode (used by the hyper mini,
budget-capped), and VaultMapItem strips the Cull modifier from Hyper crystals so the
boss cycle cannot be trivialized.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
HyperVaultCrystalObjective.configure calls VaultCrateBlock.Type.valueOf(HYPER),
but the variant was never added to MixinVaultCrateType, so entering a hyper
vault threw IllegalArgumentException and kicked the player. Adds the enum
variant (appended last, existing ordinals unchanged) plus the crate blockstate,
models, block loot table, lang entry, and a placeholder texture copied from
brutal_bosses (needs real art before release).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nd HUD

- Brutal obelisks in hyper mode skip the listener-priority gate that swallowed
  every right-click (the mini never joins listener HUD lists by design).
- Settable (+X%) vault-modifier values live only in shared registry instances
  and zero out on any config reload; the objective now snapshots them at first
  init and re-applies on every load (refreshed when escalation bumps them).
- Batch is now always elixir + one of bingo/collector + brutal; the chaos,
  treasure-door and chest-collection minis are gone along with their fields.
- HUD: one compact horizontal row (elixir bar + obelisk wave icons) with a top
  margin, no HYPER counter, no per-mini status text; the card renders only
  while the open-bingo key is held. Elixir bar and obelisk icons are replicas
  because the originals need per-player goals or hard-anchor to screen center.
- HYPER stacks now surface as vault-modifier entries (+1 per boss kill).
- Difficulty lock switched from impossible to fragged.
- New BossRunePillarAccessor pins the pillar rune requirement back to 0 after
  chunk reloads re-derive it (no setter exists upstream).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
BingoObjective only learns which players to track from LISTENER_JOIN, which
fired long before a mid-vault batch roll, so its EntityTaskSource stayed empty
and filtered out every player action. Card minis are now pre-seeded with the
current runners (task source + JOINED scaling counters) before initServer.

The HUD row also gains a one-line card label under the obelisk icons (name +
hold-key hint, checkmark when the line is done) so the batch is fully visible
without opening the card.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The exit obelisk was silently rejected by the boss room's no-modify
  WorldZone; place/remove now run with the zone bypass VH itself uses.
- Arena gates: a rune fight freezes its own OPEN_ROOM animation on frame one
  once completed (invisible upstream because rune vaults end right there), so
  the escalation manager now drives a fresh open animation after each kill,
  replayed on reload if the reward window was interrupted. The room zone is
  kept for the whole vault so the arena stays grief-proof between cycles.
- FIGHT phase now renders the synced fight's own rune-boss health bar
  (health, shield, wave-blast countdown) instead of a text line.
- A lone tank or assassin add (curated from the entity-group rosters) spawns
  in the arena every six seconds while the boss lives.
- Chaos dumps announce each modifier in chat like brutal bosses, and the
  first 25 now hit when the first player steps into the vault.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…allout

- The completion crate never awarded: AwardCrateObjective only acts from its
  own tick paths, which the orchestrator deliberately never runs. The exit
  pillar now ticks the children once for the leaving runner right after
  setting COMPLETED, which is the same award idiom other objectives use.
- Chaos draws now come from the concealed-chaos pools: dumps alternate the
  positive and backfire sides 50/50 until the budget is filled, brutal-boss
  kills draw only from the backfire side. The bespoke hyper_chaos pool is
  removed from the pack config.
- The HYPER kill broadcast now spells out the crate tiers it just added.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The concealed-chaos pools roll 15 modifiers per pull, and brutal bosses pull
once per infernal modifier name, so a single kill dumped dozens of modifiers.
The dumps now roll the pack-defined hyper_mixed pool (25 per pull) and brutal
kills roll hyper_all_bad (1 per pull), restoring the old per-kill rate. Add
pools also switch to the VaultMod/WoldsVaults id helpers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…reseeds

- The fight consumes the pillar block when the boss summons and nothing put
  it back, so cycle 2 could never be armed. Arming now snapshots the tile
  NBT and the reward phase re-places the pillar from it (zone-bypassed).
- Vault score = round((boss max health + melee damage x 100) / 1000), read
  off the armed boss at spawn and shown under the exit-pillar timer.
- New greedy_crate_tier marker modifier (+1 per kill); the greed-coin crate
  injection in MixinRunner multiplies coins by 1 + 0.5 per stack.
- Ambient 2-minute events now draw from the curated hyper_bad_timer_events
  pool instead of the negative enchanted-event registry.
- Elixir target grows +50% of its base per completed cycle.
- Repeat cards differ per cycle: bingo's task-source seed mixes the cycle
  in; the Collector card regenerates via the existing accessor mixin with
  its time-mixed seed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pture

- The boss room no-modify zone outlives the fight (vanilla removes it at an
  animation step that never runs) and covers nearby POI chests, making them
  respawn when mined. The zone id is captured at arm time via the pillar
  accessor and the zone is removed once the boss dies; later fights rely on
  the physical gates.
- The hyperboss is modifier-immune, so challenge stacks and mob % modifiers
  never touched it. Arming now sums the vault modifier list (vanilla mob
  attribute modifiers + the settable map family, percent operations only)
  and folds the aggregate into the arm-time health/damage.
- Vault score read the boss at the spawn event, which fires before traits
  apply, so it was computed from base stats (displayed 0). It is now read
  off the live boss during the fight, after traits and folded stats.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The zone now lives exactly as long as a fight: on every arm the pillar's zoneId is
reset and its own onLoad re-registers a fresh vanilla zone (stale ids from removed
zones are detected via WorldZones lookup), and the escalation manager keeps removing
it on boss death. Fights 2+ get anti-cheese block protection again, and POI chests
stay mineable between fights.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…lock guards, bingo line rewards off

- The hyperboss now receives every mob attribute modifier on the vault exactly as
  ENTITY_SPAWN gives them to normal mobs (it is IModifierImmunity, so it never got
  them): applied to the live boss at first sighting, so multiplicative health stacks
  compound on it the same way they do on brutals. The old additive fold is removed.
- Damage escalation switched from BossRuneModifiers (whose damage trait applies
  amounts as FLAT damage — operator "add" in vault_boss.json) to a real
  MULTIPLY_BASE attribute modifier.
- The pillar rerolls its boss from the palette roster on every arm (vanilla rolls
  once, position-seeded, hence the same boss forever).
- BingoCard.addModifiersToVault is cancelled in Hyper vaults: vanilla rolls a vault
  modifier (crate tiers included) per completed bingo line.
- Fight adds and waves are tagged and discarded when the boss dies; the last player
  out purges all hostiles/projectiles. A leftover VaultFireball resolving its
  explosion in an unloading chunk sync-loads from the vault tick thread and joins
  forever (VirtualWorlds.tick awaitCompletion deadlock, seen in playtest 8).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ngo line rewards

Two fixes from playtest 9:
- The podium ignored clicks whenever the player sneaked with an off-hand item:
  BLOCK_USE fires from inside BlockBehaviour.use, and vanilla skips use() entirely
  for a sneaking player holding anything in either hand. The shift requirement is
  dropped (ARMED phase + empty main hand is deliberate enough) and the popup reads
  "Click the boss podium with an empty hand!".
- Round 12 suppressed bingo-line modifiers in the wrong bingo system (BingoCard —
  the mixin is deleted). BingoObjective's card is a task/BingoTask, whose onBingo
  attaches a reward task per line: the first-line pool rolls the Bingo! loot buffs,
  later lines can roll crate tiers — matching the original report exactly. onBingo
  is now cancelled in Hyper vaults, in the addon's existing MixinBingoTask.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eptions

Root cause of the dead podium: Event.invoke wraps every listener in
catch (Exception e) { e.printStackTrace(); } — stderr only, never the log — so the
round-12 rerollBoss casting the pillar's Config to a freshly added accessor mixin
could fail on every click with zero visible evidence.

- rerollBoss now reads the boss roster from the tile's saved config NBT (the
  Config.writeNbt "boss" list) instead of through BossRunePillarConfigAccessor;
  that accessor is deleted. One less mixin that can fail to attach.
- The podium and exit-pillar handlers wrap their bodies in try/catch with a real
  LOGGER.error, so a handler failure can never be silent again.
- Podium clicks while armed log hand/sneak state; blocked re-arms (hasFightAt) warn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…arm since round 12

The round-14 handler catch finally surfaced the real podium killer:
PartialEntity.copy() dereferences blockPos, which is null on the position-less
roster templates, so every arm click threw an NPE that VH's event bus swallowed.
The copy was pure caution and is unnecessary — the pool is freshly parsed from the
tile's config NBT (exclusively ours), and vanilla's onPopulate assigns the rolled
template directly too. The Config accessor deleted in round 14 was innocent; the
same copy() call was the round-12 failure as well.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…base 75%

Playtest 12 proved the round-12 scaling applied but was invisible: the pools' mob
health modifiers are additive-percentile, and +100% of base next to the boss's
+5000%x1.75^cycle MULTIPLY_BASE trait term moves total health ~2%. The vault's
health factor — (1 + sum additive) x (product of multiplicatives), exactly as it
stacks on a normal mob — now multiplies the whole escalated total inside the trait
at arm time (also correct for the boss's frozen raw health, which is built at
summon). Non-health modifiers (damage, speed) still apply as real attribute
modifiers at first sighting; max-health ones are skipped there to avoid double
counting.

Elixir: target now starts at 75% of a normal vault's requirement (was 50%), still
+25% of that base per completed cycle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…calation, electric cap

- CHAOS_CAP 175 -> 350 (vault handles max chaos fine per playtest 12).
- Boss escalation switched from x1.75^cycle compounding to linear base+increment:
  health and damage both +5000% base, +2500% per cycle (BOSS_STAT_INCREMENT).
- Score thresholds 75k/150k/500k add rare/epic/omega crate-tier markers per kill
  (non-exclusive); HyperCrateRewards rolls each marker stack's weighted pool (4/3/2
  draws) into the crate's additional items via a new CRATE_AWARD hook in MixinRunner —
  bypassing all crate quantity modifiers by design. Greed-coin lines scale with the
  player's greed tier; booster packs carry their pool id NBT. Unresolvable item ids
  log loudly and skip.
- the_vault:electric capped at 1 stack for hyper adds (dumps, ambient, brutal kills).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… on top at +1500%/cycle

The linear escalation was meant to be exclusive to the rune boss and stack ON TOP of
the x1.75^cycle HYPER scaling everything in the vault rides, not replace it:
escalation = 50 x 1.75^cycle + 15 x cycle for both health and damage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ped at 4

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Second super crate tier now keys off the killed boss scoring 1M+
  instead of cycle > 5.
- Every mob spawn is speed-clamped to base x3 one tick after spawn (one
  corrective MULTIPLY_TOTAL modifier); the hyperboss gets the same cap
  when its stats apply. Stacked speed modifiers made mobs unhittable.
- Crate injection pools: rare gains a random etching at the receiving
  player's greed tier (w5); epic gains the five greater deck cores
  (pure/arcane/construction/shiny/void, w2 each); omega gains Prismatic
  Reinforcement and the greater Archive Core (w2 each).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Hyperboss immunity to %-max-health damage: Bleed application is denied
  on rune bosses in hyper vaults (HyperBossEffectImmunity); Reaving is
  neutralized by pre-applying its own once-per-mob latch effect at stat
  time. Both procs scale with the hyper-inflated health pool.
- Clicking the exit pillar now starts a vault-wide 15-second victory
  transition (Phase.WIN) that completes and extracts every runner,
  matching the post-boss pause of normal vaults; the pillar itself only
  lives 15 seconds.
- The floor bordering the arena gates is snapshotted pristine at the
  first arm and re-placed at every later arm - the gate-frame animation
  never covers it, so explosion holes there used to persist forever.
- Enchanted events (crystal Enchanted modifier) redirect their
  basic/medium/omega_negative modifier pulls to the filtered hyper pool
  in hyper vaults - this was the Inert (CDR) leak, and could also smuggle
  in Ethereal and Fading.
- Crate pools: omega boxes added to rare (1x w10) and epic (2x w5);
  deluxe-resource-booster entries now use the actual wolds pack id
  the_vault:deluxe_resource_pack (they were producing Mega packs) and the
  epic weight is doubled to 4.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The exit-pillar click now starts a PERSONAL 15s victory countdown
  (EXTRACTIONS uuid->ticks map, elixir-style) that completes and
  extracts only the clicker; the vault keeps cycling for everyone else.
  Reverts round 21 vault-wide WIN (legacy WIN saves are converted to an
  expired reward window on load).
- Every hurt event on a hyperboss logs one line at LOWEST priority: raw
  amount (captured at HIGHEST) vs final amount, % of boss max health,
  damage source id, immediate entity, and for player attackers their
  live attack-damage attribute, Strength amplifier and main-hand item -
  diagnostics for the runaway melee damage reports.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Score is boogeyman-normalized: the killed boss TOTAL/BASE attribute
  multipliers (pure cycle+modifier scaling) apply to fixed reference
  bases, so a weaker roster roll can never score below the previous
  cycle. Also clamps the int cast that wrapped negative past ~2.1B.
- Epic/omega tier stacks earned by kills scoring 2M+ roll one extra draw
  per set (EPIC_PLUS/OMEGA_PLUS counters; once, not per 2M).
- Greedy crate tiers scale with the kill score: 2 past 1M, 3 past 5M.
- Mana Leak capped at 1 + floor(cycle/3) stacks (dynamic stack cap).
- The personal victory transition now uses the exact VictoryObjective
  presentation: firework + launch sound + Vault Completed! title +
  message.the_vault.teleporting_back_seconds action bar + damage
  immunity while counting down; custom HUD countdown removed.
- New item woldsvaults:greedy_ticket (16x16 golden ticket sprite):
  right-click consumes one for +10 greed reputation; shift tooltip;
  injected into epic (1x w5) and omega (3x w2) crate pools.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The runaway melee damage is MixinMobFrenzyModifier: every Frenzy (x3)
and Catastrophic Brew (x2) stack registers an ENTITY_DAMAGE hook that
multiplies ALL player-dealt damage - hyper chaos dumps stack them, so
the multiplier compounds per cycle (x24 -> x2100 observed).

- Hurt events on a hyperboss are now sampled at all five priorities;
  one log line shows the per-band multipliers from raw to final, plus a
  post-armor LivingDamageEvent line.
- applyBossStats logs a per-fight amplifier audit: Frenzy/Brew stack
  counts with the expected 3^a*2^b player-damage multiplier, and each
  runner`s %-scaling damage gear (reaving/execution/AP/thorns).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- the_vault:frenzy capped at 1 + max(0, cycle-1)/4 stacks (1 through
  cycle 4, 2 at 5-8, 3 at 9-12...): each stack multiplies ALL player
  damage x3 via the MixinMobFrenzyModifier rework, and uncapped it
  outgrew the boss scaling. Catastrophic Brew (x2) is banned pack-side.
- The hyper redirect in VaultModifierFromPoolTask now rolls the pool
  manually and skips stack-capped modifiers - enchanted events could
  previously bypass every hyper cap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ega archive core w2 to w1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A fight whose whole arena roster is dead can never end on its own: the boss
idles in the sealed room and RuneBossFights keeps the vault clock paused,
soft-locking everyone who stayed outside. The boss manager now watches the
fights own zone-tracked player set once the boss is alive; when no living,
non-spectator fighter remains for 60 ticks, the boss is discarded (no loot,
no kill path) and the escalation manager winds the room back to the armed
pillar: doors reopen, pillar respawns, zone and fight spawns cleared, phase
ARMED, cycle and score untouched. Offline participants hold the fight open
since they rejoin inside the arena. Roster changes are logged for
multiplayer auditability.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ults

Explosive joins the id-keyed stack caps (one TNT spawner stack is plenty;
the grouped carriers curse/curse_explosive are banned or unpooled, so the
cap cannot be bypassed). The elite zombie brutal boss self-applies the
Immortality effect every 10 ticks while its raised minions live, and VHs
own ImmortalityEffect.onAdded carves an explicit exemption for it — with
hyper-scaled minion health that made it effectively unkillable. Hyper
vaults now DENY the Immortality effect on every Mob (players unaffected),
logging the first denial per entity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ults

Each frenzy-family stack registers its own ENTITY_DAMAGE hook multiplying
all player damage by its factor, so N stacks compounded to factor^N. In a
hyper vault the first hook to see a damage event now applies the whole
additive factor x(1 + (factor-1) x stacks) for its modifier id and the
other hooks skip (event-identity ThreadLocal). Non-hyper vaults keep the
compounding behavior. The per-fight damage audit line prints the additive
expectation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Card requirements grow +10% of base per boss kill, and both card boards
grow to 5x5 from the 6th cycle. Every extra live runner multiplies
requirements on top of the cycle scaling: elixir +33%, collector +15%,
bingo +10% per extra player - all recomputed from the live runner count
(elixir every tick, collector via a hyper OBJECTIVE_TARGET handler feeding
the tiles own per-tick recompute, bingo through VHs base-target scaler
once a second), so requirements relax when a runner dies or leaves. The
cards JOINED counters stay pinned at 1 to keep VHs own per-player scaling
(+50%/player collector tiles, config contributions on bingo) out of the
math; a mid-vault join that bumps them is re-pinned and logged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…yer scaling

Every logged hyperboss hit now gets a hit detail line: attack charge,
fatal-strike state and gear stats, every live entry in VHs
damage-multiplier registry (value, operation, remaining ticks - the
xNORMAL band product), rage and retribution stacks, and the targets
Vulnerable amplifier. Two accessor mixins expose the private registry.

The collector card goes back to VHs native JOINED player scaling
(+50% per extra runner, refreshed per batch); the hyper OBJECTIVE_TARGET
handler now contributes only the +10%/kill cycle growth. Bingo keeps the
hyper +10%/extra-player rate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Poor-Mans-Physicist and others added 26 commits July 11, 2026 02:52
… ramp)

The settable map_crate_quantity is removed from the objective: its
onVaultAdd consumes percentage-points as a raw fraction, so the intended
+100% per cycle landed as +10,000% once at the second kill (and re-fired
with the full accumulated value on relog). Kill k now grants 2k super
crate tiers, doubled to 4k when the kill scores 500k+, plus 4k regular
crate tiers past 500k and 8k past 2M - an intentionally aggressive
quadratic ramp using only the safe additive modifiers. Broadcast lists
super/regular/greedy tier grants.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…M breakpoints

No regular crate tiers anywhere: kill k grants 2k super crate tiers under
500k power, 3k from 500k, 4k from 5M.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Kill k grants 2k super crate tiers under 2M score, 3k from 2M, 4k from
25M (SCORE_SUPER_RATE_3/SCORE_SUPER_RATE_4 constants).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…reakpoints

Kills never grant super crate tiers anymore; kill k grants regular crate
tiers at the rate its score selects (SCORE_CRATE_RATE_8/10/16 constants).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… + 5k/7k/9k/15k tiers

In hyper vaults the per-crate greed bonus rolls a second, quantity-scaled
pass for its NON-COIN items (x(1 + ITEM_QUANTITY x 0.5)); coins keep the
unscaled base roll and their greedy-crate-tier multiplier so they do not
double-dip. The score-tier injections stay flat. Kill crate-tier grants
reduced by 1 at every rate: 5k under 250k, 7k from 250k, 9k from 1.5M,
15k from 25M.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Brutal pillar minimum rises +1 per 3 kills and +1 per 2 extra runners,
  range 2-5 (capped at all-5)
- Hyperboss holds Resistance III while any fight spawn lives (1s pulse,
  checked once a second)
- One Inert every 2nd kill (deterministic; still banned from pools)
- +k Refined Experience at kill k
- Stack caps: volcanic 2, void_pools 2, safari 5, winter 5, fungal 5
- Hyperboss gets infernal modifiers: min(4, 1 + kills/2), death adds no
  vault modifiers (wave-guarded handler verified)
- Mob speed cap +200% -> +150%
- Card boards go 5x5 one cycle earlier (cycle 4)
- Explosions in hyper vaults cannot affect lava/void pool fluids or any
  block within one step of them
- Recolored crate marker sprites (plus tinted per tier: blue/purple/
  green/gold) shipped as woldsvaults gui/modifiers textures

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
InfernalMobs rewrites an infernal mobs MAX_HEALTH base attribute to
classBaseHealth x modCount x modHealthFactor, where classBaseHealth is
the first-ever-seen max health of that entity class (persisted into
infernalmobs.cfg). The cycle-1 hyperboss captured its own 203M pre-
infernal max as the class base; setting that as the BASE value made VHs
MULTIPLY_BASE health trait re-multiply the whole pool (~x500) -> ~100B
HP. Reverted; the polluted BoogiemanBossEntity entry was also removed
from the instance infernalmobs.cfg.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…scale bumps

- Hyper vaults convert any rolled classic bounded layout (circle/polygon/star,
  from the pack pool where infinite has weight 0) to ClassicInfiniteLayout at
  init, carrying tunnel span and theme-stamped template pools; boss room hook
  unchanged and still places the arena ahead of spawn.
- New MixinFlowingFluid: lava and void-liquid scheduled fluid ticks are
  cancelled inside Hyper vaults, so hazard pools never flow when explosions or
  block breaks disturb them (pass-through/damage untouched, other vaults
  unaffected).
- Hyperboss max health x(1 + 0.5 x extra runners) at summon, MULTIPLY_TOTAL
  after all other modifiers, applied after the score capture so multiplayer
  never inflates loot escalation.
- PLAYER_SCALE_BINGO 0.10 -> 0.25, PLAYER_SCALE_ELIXIR 0.33 -> 0.45.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pack-standard integer-weight rescale: every omega-pool weight is multiplied
by 10 except the greater archive core, which gets x2 - making it ~5x rarer
relative to the pool (1/62 -> 2/612) while keeping all weights integers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The hyper crate pools keep referencing woldsvaults:greedy_ticket by id;
without the item PR merged those rolls log an error and are lost.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…on XP

One class now owns hyper's modifier policy: the 32-id ban list and the stack
caps (fixed + the cycle-scaled mana-leak/frenzy caps). The three chaos pools
are DERIVED in ModVaultModifierPoolsProvider from the concealed-chaos and
negative-event source lists (extracted into shared entry lists, output
unchanged) minus the policy bans — banning a modifier is now: edit the policy,
run runData. The five marker defs and the 'hyper' completion XP move in-jar
via their providers, like every other addon objective's data; the equivalents
leave the pack config. Verified: each source list matches the previously
generated JSON exactly, and each derived pool reproduces the pack-side v11
pools entry-for-entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…r_objective.json

New HyperObjectiveConfig (config/the_vault/hyper_objective.json, registered in
ModConfigs like the other objective configs) holds all ~40 tunables with a
one-line documentation block per knob, plus the three score-tier crate
injection pools as data — weight/count retunes no longer need a mod rebuild.
HyperCrateRewards becomes a thin roller over the config pools (the
core_of_the_vault_gods omega line rides along from the gods-mastery split).

Also in this rework of the objective itself:
- Phase now serializes by NAME (never ordinal) and the legacy WIN constant +
  its migration are gone; HyperMini carries explicit persisted BATCH_MASK bits
- every CommonEvents handler body runs through a guarded() wrapper so the VH
  event bus can never swallow a failure invisibly again (the round-14 lesson,
  applied to all 11 handlers instead of 2)
- the once-per-fight damage-amplifier audit is gated behind enableDebugMode
- rune-boss lifecycle fragility notes on both managers, a pointer list of all
  remote if-hyper branches on the objective, stale docs fixed (175-cap
  comment, settable-snapshot contract)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… behind debug mode

The Forge-bus handlers move to the events/ package like every other subscriber
in the mod. events/HyperVaultEvents keeps the three always-on gameplay rules
(boss bleed denial, mob immortality denial — which also covers the champion
Immune aura inside hyper vaults — and explosion pool-shielding).
events/HyperBossDamageInstrumentation keeps the per-hit hurt-chain sampler,
hit-detail dump and post-armor line for future forensics, but every handler
early-returns unless enableDebugMode is set: shipped gameplay logs nothing
per hit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, loud addModifier

- MixinMobFrenzyModifier: one per-event state (hyper check cached for all
  stacks' hooks, additive ids deduped) held behind a WeakReference — a closed
  vault world can never be pinned by the last damage event; non-hyper behavior
  byte-identical
- rerollBoss reads the pillar roster through BossRunePillarConfigAccessor
  (typed) instead of parsing the tile's save NBT by string key
- VaultModifierUtils.addModifier logs an error on an unregistered id instead
  of silently doing nothing — every hyper kill reward rides that path

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Exactly the five expected files change: the three derived pools land in
wolds_builtin_modifier_pools.json (verified entry-for-entry identical to the
pack-side v11 pools they replace), the five defs in wolds_builtin_modifiers,
the 'hyper' completion in wolds_objectives, one lang line re-sorts, cache
updates. No other generated churn.

Dev note: runData itself was broken independently of this branch — the
run-data/config dir had been wiped, and the_vault's freshly generated
researches_gui_styles defaults reference 33 gui/researches textures the jar
does not ship (crashes ModItemModelProvider.researchToken). Fixed locally by
seeding run-data/config from the game instance; upstream-reportable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Only conflict was the generated datagen cache manifest; resolved by taking
master's and regenerating via runData in the follow-up commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CRATE_AWARD_EVENT is server-global and fires PRE+POST per crate, so the
per-Runner greed and hyper score-reward handlers each ran once per live
runner (any vault) per crate award, multiplying injections in
multiplayer. Same fix as the standalone upstream PR branch
fix/greed-crate-event-filter, extended to the hyper handler.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ualified names

Review feedback on the PRs applied to the hyper branch:
- field/enum/record comment blocks become Javadoc; handler-body notes are
  tightened or dropped where the code already says it; the HUD banner and
  instrumentation section rulers are gone; the remote if-hyper pointer
  list is folded into HyperVaultObjective's class Javadoc
- package-qualified class names are imported instead, except where the
  same simple name is used from two packages in one file (wolds vs VH
  ModConfigs in HyperVaultObjective) or where the surrounding upstream
  code follows the qualified pattern (ModCustomVaultObjectiveEntries)
- two stale "shift-click" mentions now describe the real empty-hand
  podium click; rollBatch composes BATCH_MASK from the HyperMini.bit()
  accessors instead of re-deriving ordinal bit positions

No behavior changes; the BATCH_MASK expression is bit-identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
MixinRunner resolves to this branch's version of the greed-crate guard
(the @unique helper covering both handlers supersedes the inline guard
merged upstream in iwolfking#218). The omega_negative rename to daycare_effect is
applied to the extracted source list, so the derived hyper pools inherit
it at the next runData. The datagen cache is regenerated in the
follow-up commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The derived hyper_bad_timer_events pool picks up upstream's
daycare -> daycare_effect rename from the omega_negative source list.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every //-comment the branch added is gone: load-bearing content is
hoisted into proper Javadoc on the nearest field, method or class
(modifier ban reasons, the arm-time health folding, gate-mask save
semantics, crate-injection NBT shapes, zone-bypass and copy() traps),
and the rest is deleted. The PR diff now adds Javadoc only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@iwolfking
iwolfking merged commit 97bf2d5 into iwolfking:master Jul 14, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants