From 9c21f4ef09bfc4149d1dd7da153bcdbb23c36a19 Mon Sep 17 00:00:00 2001 From: Drefvelin <54400154+Drefvelin@users.noreply.github.com> Date: Fri, 25 Sep 2026 19:20:39 +0000 Subject: [PATCH] feat: spawn weapon orbs within two seconds and extend each window The opening set, including rift orbs, was trickling in after the first two seconds. Fit that set into the burst and give every charge tier three more seconds. Co-authored-by: Cursor --- .../magic/gear/orb/GearOrbSession.java | 2 +- .../tfminecraft/magic/gear/orb/OrbCache.java | 17 ++++++++++++++++- .../tfminecraft/magic/loader/GearLoader.java | 1 + src/main/resources/gear/orbs.yml | 12 +++++++----- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/tfminecraft/magic/gear/orb/GearOrbSession.java b/src/main/java/net/tfminecraft/magic/gear/orb/GearOrbSession.java index 92cde92..581161b 100644 --- a/src/main/java/net/tfminecraft/magic/gear/orb/GearOrbSession.java +++ b/src/main/java/net/tfminecraft/magic/gear/orb/GearOrbSession.java @@ -115,7 +115,7 @@ public void tick(Player player) { expire(); if (!isFinished() && ticks >= nextSpawnTick && livingOrbs().size() < tier.live()) { spawn(); - nextSpawnTick = ticks + Math.max(1, (int) (OrbCache.spawnIntervalTicks / tier.speed())); + nextSpawnTick = ticks + OrbCache.spawnGap(tier.live(), tier.speed()); } orbit(); render(); diff --git a/src/main/java/net/tfminecraft/magic/gear/orb/OrbCache.java b/src/main/java/net/tfminecraft/magic/gear/orb/OrbCache.java index 4f5a8fc..7211f73 100644 --- a/src/main/java/net/tfminecraft/magic/gear/orb/OrbCache.java +++ b/src/main/java/net/tfminecraft/magic/gear/orb/OrbCache.java @@ -23,7 +23,9 @@ public final class OrbCache { public static int introTicks = 10; public static int lifetimeTicks = 70; public static int spawnIntervalTicks = 14; - public static int windowTicks = 200; + /** Opening set, good and rift, must all have spawned by this tick. */ + public static int spawnBurstTicks = 40; + public static int windowTicks = 260; public static double missPenalty = 0.08; @@ -77,6 +79,19 @@ public int goodTarget() { } } + /** + * Ticks between spawns so {@code live} orbs, good and rift, are all out by + * {@link #spawnBurstTicks}. A shorter configured interval is kept. + */ + public static int spawnGap(int live, double speed) { + int count = Math.max(1, live); + int burst = Math.max(1, spawnBurstTicks); + int fitted = count <= 1 ? 1 : Math.max(1, (burst - 1) / (count - 1)); + double pace = speed <= 0 ? 1.0 : speed; + int paced = Math.max(1, (int) (spawnIntervalTicks / pace)); + return Math.min(paced, fitted); + } + public static void clearTiers() { TIERS.clear(); } diff --git a/src/main/java/net/tfminecraft/magic/loader/GearLoader.java b/src/main/java/net/tfminecraft/magic/loader/GearLoader.java index 4a1fe7f..247bb7c 100644 --- a/src/main/java/net/tfminecraft/magic/loader/GearLoader.java +++ b/src/main/java/net/tfminecraft/magic/loader/GearLoader.java @@ -172,6 +172,7 @@ private static boolean loadOrbs(File file) { OrbCache.introTicks = Math.max(0, config.getInt("intro_ticks", OrbCache.introTicks)); OrbCache.lifetimeTicks = Math.max(1, config.getInt("lifetime_ticks", OrbCache.lifetimeTicks)); OrbCache.spawnIntervalTicks = Math.max(1, config.getInt("spawn_interval_ticks", OrbCache.spawnIntervalTicks)); + OrbCache.spawnBurstTicks = Math.max(1, config.getInt("spawn_burst_ticks", OrbCache.spawnBurstTicks)); OrbCache.windowTicks = Math.max(20, config.getInt("window_ticks", OrbCache.windowTicks)); OrbCache.missPenalty = Math.max(0.0, config.getDouble("miss_penalty", OrbCache.missPenalty)); diff --git a/src/main/resources/gear/orbs.yml b/src/main/resources/gear/orbs.yml index 62517a9..9ff8272 100644 --- a/src/main/resources/gear/orbs.yml +++ b/src/main/resources/gear/orbs.yml @@ -22,9 +22,11 @@ orbit_period_ticks: 90 intro_ticks: 10 lifetime_ticks: 70 spawn_interval_ticks: 14 +# The opening set, good and rift orbs together, is spawned by this tick (40 = 2s). +spawn_burst_ticks: 40 # Default window, overridden per tier below. -window_ticks: 200 +window_ticks: 260 # Capture lost per good orb that expires unhit, as a fraction of the run. miss_penalty: 0.08 @@ -53,23 +55,23 @@ tiers: live: 4 good_ratio: 0.75 speed: 0.8 - window_ticks: 220 + window_ticks: 280 good_target: 4 2: live: 5 good_ratio: 0.65 speed: 1.0 - window_ticks: 200 + window_ticks: 260 good_target: 5 3: live: 6 good_ratio: 0.55 speed: 1.15 - window_ticks: 180 + window_ticks: 240 good_target: 6 4: live: 8 good_ratio: 0.45 speed: 1.3 - window_ticks: 160 + window_ticks: 220 good_target: 8