You are viewing a potentially older version of this package. View all versions.
SigmaCharple-VeryBalancedRoundsMod-0.16.0 icon

VeryBalancedRoundsMod

Sixty-eight aggressively unbalanced cards, Legendary tier included: Icon of Sin, Atomic Bomb, Black Hole, Tree, Railgun, Xane's Wire Management, Go Blue, Claude's Choice and more. Very balanced. No notes.

Date uploaded 3 days ago
Version 0.16.0
Download link SigmaCharple-VeryBalancedRoundsMod-0.16.0.zip
Downloads 1101
Dependency string SigmaCharple-VeryBalancedRoundsMod-0.16.0

This mod requires the following mods to function

BepInEx-BepInExPack_ROUNDS-5.4.1900 icon
BepInEx-BepInExPack_ROUNDS

BepInEx pack for ROUNDS. Preconfigured and ready to use.

Preferred version: 5.4.1900
willis81808-UnboundLib-3.2.14 icon
willis81808-UnboundLib

This is a helpful utility for ROUNDS modders aimed at simplifying common tasks.

Preferred version: 3.2.14
Pykess-ModdingUtils-0.4.8 icon
Pykess-ModdingUtils

Utilities aimed at making modding easier and more accessible

Preferred version: 0.4.8
Root-RarityLib-1.3.0 icon
Root-RarityLib

A utility library for adding custom rarities to the game.

Preferred version: 1.3.0

README

Very Balanced Rounds Mod

Custom cards for ROUNDS, built on UnboundLib, with ModdingUtils for deck surgery and RarityLib for the Legendary tier.

Cards

Card Rarity Effect
Glasser Cannon Rare +200% damage, -75% health
McDonalds Common +400% health, -50% movement speed
Gremlin Common -30% size, +50% movement speed
Whipped Common +100% movement speed, -20% health
Density Common +70% health, -40% size
Leg Day Common +100% jump height, -0.5s block cooldown
Fraud Uncommon -30% size, -50% block cooldown
Super Quick Reload Uncommon -90% reload time, -20% damage
Lowe's Worker Uncommon -25% damage, heavy bullet drop, +150% damage to enemies below you
Invisible Bullets Uncommon Your bullets do not render
MTG Player Uncommon Touching you deals 50% of your bullet damage
Giga Drum Mag Rare Magazine maxed out, reload 20x longer
Sword Rare +777% damage, +75% movement speed, very short bullet range
Card Counter Rare +15% damage per card held, +0.5s reload
Titan Killer Rare Bullets deal +5% of the target max health
Random Crits Rare Every bullet has a 2% chance to instantly kill
Bird Killer Uncommon Your kills cannot be undone by Phoenix
Inevitable Rare +5% damage per second, compounding, resets each point
Rev Up Rare -50% attack speed, +5% per second, resets each point
Icon of Sin Legendary +5%/s damage, health, bullet and move speed; -5%/s reload and cooldown
Particle Accelerator Rare +50% movement speed per hit dealt, compounding, resets each point
Infinity Rare Enemy bullets freeze in place when they get close
Black Hole Rare Nearby players are pulled toward you
Tree Legendary +5000% health, immune to knockback, cannot move at all (unless you have The Lorax)
The Last Breath Rare At 20% health: full heal, invincible and doubled, then dead in 5s
Chris's Side Project Legendary No block cooldown; dead at 7 seconds if the point is not over
The Kirk Special Rare Every bullet hit explodes the victim 1s later for 2.5x your bullet damage; stacks per pellet
Portal Gun Rare Blocking teleports you to your cursor; +0.5s block cooldown
Prestige Rare Destroys your other cards, +100% health, damage and attack speed
Touch the Wall Legendary Your next 3 picks only offer Legendary cards
Conner's Pride Rare +100% health, damage and attack speed — in June only
Eight Handled Sword Divine General Mahoraga Legendary Each hit you take cuts further damage by 10%, compounding
Ihateblockbuild Uncommon Blocked bullets still deal 25% of their damage
Iloveblockbuild Rare Every block heals 25% of your max health
Balanced Uncommon Health and bullet damage both become their average
AK Uncommon +50% bullet speed, +10 ammo, no bullet gravity, +1s reload
Up Uncommon Bullet gravity reversed
Down Common Your gravity and bullet gravity x2
Go Blue Uncommon If you die and everyone else dies within a moment, you win
Claude's Choice Rare A surprise. Deliberately undocumented - read src/Cards/ClaudesChoiceCard.cs only if you want it spoiled
Conner Hack Special Rare 3.5x damage at point blank on a steep curve; ~1.4x at 20 units, 0.5x across the map
Onceler Uncommon Hitting a Tree holder kills them instantly (unless they have The Lorax)
Banana Uncommon Stand still 5s, then heal 10% max health per second
Xane's Wire Management Rare Every card you hold is swapped for a random one of the same rarity
Border Hop Uncommon -80% damage from the map edge, -10% movement speed
Ronald McDonald Rare Bullets deal +25% of your current health, -20% attack speed
Hitscan Rare +1000% bullet speed, -40% attack speed
Railgun Rare +50% of bullet speed added as damage, +20% bullet speed, +1.5s reload
Discord Mod Rare Nearby players pushed away, harder the closer they are
Hollow Purple Legendary Massive purple bullets, +200% damage, ignore walls and gravity, -80% bullet speed, +60% cooldown, +4s reload
Dense Bullets Uncommon Much smaller bullets, +60% damage, +0.5s reload
The Block Build Special Legendary Shooting triggers your block effects (not the shield), -90% health
Killdozer Legendary Contact damage scaling with your speed and bullet damage, +25% movement speed
Shulker Uncommon Players you hit are launched upward as if they jumped with 1000% jump height
Drone Strike Rare Unlimited jumps in midair; picking it also gives you Homing and Explosive Bullet
C-Ram Rare Attack speed squared (150% becomes 225%), +2s reload; each copy squares again
The Island Uncommon Lose 2 random cards when picked, -75% block cooldown
The Lorax Rare Frees a Tree holder to move, immunity to Onceler, -40% health
Super Shotgun Rare +12 bullets, +9 ammo, -40% attack speed, range a little longer than Buckshot
500 Cigarettes Rare +150% damage; toxic clouds heal you instead; lose 5% max health per second
Atomic Bomb Legendary Bullets per shot equal your max ammo, +50% damage, +10s reload
ASU Frat Leader Rare Bullets deal +(100 x size ratio)% damage to smaller players, and damage x size ratio to bigger ones
The Flavorful Garlic Uncommon yumby. Deliberately undocumented - read src/Cards/FlavorfulGarlicCard.cs only if you want it spoiled
Projectile Dysfunction Uncommon Bullets wander in random, ever-changing directions, +100% damage
Rare Artifact Rare -20% damage taken from everything
Legendary Artifact Legendary -40% damage taken from everything
Daedalus Stormbow Legendary Bullets fall from the top of the map toward your cursor, a little to one side at random, and go through walls
Patience Legendary Other players can't shoot for the first 3 seconds of each point

Building

Requires the .NET SDK (8 or newer). From the project root:

dotnet build

That compiles the mod and copies VeryBalancedRoundsMod.dll straight into the Thunderstore profile it was set up against, so the next launch picks it up.

Useful overrides:

dotnet build -p:DeployToRounds=false                 # compile only, don't copy
dotnet build -p:ProfileDir="...\profiles\Default"    # deploy somewhere else
dotnet build -p:RoundsDir="D:\...\common\ROUNDS"     # non-default game install

To produce a Thunderstore-ready zip in dist/:

dotnet build -t:Package

Adding a card

  1. Copy src/Cards/GremlinCard.cs to a new file and rename the class.
  2. Add its title to src/Util/CardNames.cs.
  3. Register it in VeryBalancedPlugin.RegisterCards().
  4. dotnet build, then relaunch ROUNDS.

Things worth knowing before you tune numbers:

  • SetupCard runs once at game start, not on pickup. The values you assign to gun and statModifiers there are multipliers over the player's current stats: 2f doubles, 0.5f halves, 1f is neutral. Several fields are additive instead — Gun.ammo, Gun.reloadTimeAdd, Gun.percentageDamage, Block.cdAdd, CharacterStatModifiers.regen — and those treat 0f as neutral. Gun.destroyBulletAfter is neither: it's a plain override that the game ignores when zero, so the last card to set it wins.
  • Gun.attackSpeed is a cooldown, not a rate. Bigger is slower. 2f means half speed.
  • Magazine size is hard-capped at 90 by Mathf.Clamp(maxAmmo, 1, 90) in the game's own stat code. No card can exceed it.
  • Total gun damage has a floor of 0.25x, also clamped by the game.
  • Bullet size is Gun.size, additive padding on the bullet's collision trail (so it changes the hitbox, not just the sprite): the radius is damage^0.85 / 400 + 0.3 + size. Gun.projectileSize also exists and nothing in the game reads it. The game has no floor; this mod puts one at 0.05 (RayCastTrail_Start_Patch) so stacked Dense Bullets still hit.
  • Block cooldown is (cooldown + cdAdd) * cdMultiplier with no floor, so a zero multiplier really is instant.
  • Override the five-argument SetupCard when you need the player's Block. That's the overload CustomCard.Awake actually calls; its default forwards to the four-argument one.
  • GetStats() only draws the text on the card face. It doesn't affect gameplay, so it will happily lie to your players if you change SetupCard and forget to update it.
  • Card text convention. Stat rows are only for changes to a stat (damage, health, speeds, reload, ammo, gravity, size, block cooldown), including scaling ones like "+5% per second". Everything else is a rule and goes in the description as a plain sentence: triggers, special interactions, restrictions, resets. All-rules cards have no stat rows (NoStats); all-stats cards have no description. No flavour text, except on Hitscan, Onceler, MTG Player, Icon of Sin, Mahoraga and The Kirk Special - the last two replace their rules text with the joke on purpose.
  • Unless a player turns on card stat numbers in the game's options, a stat row shows its SimpleAmount word ("A bunch more", "Lower") instead of the amount. Pick the word that reads correctly after the stat name, or leave it unset to always show the amount — needed for anything a word can't say, like "+5% per second" or "Reversed".

Effects that change during a fight

Prefer scaling a stat where the game reads it over writing to the stored value. ApplyCardStats multiplies into the current value when cards are re-applied, and other mods' temporary effects add to and subtract from the same fields, so a live write that is "undone" later can leave the stat permanently wrong. The read points used here:

  • damage: HealthHandler.CallTakeDamage, on the one client that sends each hit (DamageMath). Never ProjectileHit.damage — the game reuses that field for bounce damage, poison and on-hit explosions on every client;
  • shot cooldown: Gun.usedCooldown; reload time: GunAmmo.ReloadTime();
  • movement speed: PlayerMovement.Move, scaled for the call and put straight back;
  • bullet speed: each bullet's MoveTransform.localForce, as it spawns.

Max health is read too widely to intercept, so Icon of Sin writes it relative to whatever is there and takes it back out when the fight ends. Components that track a fight derive from FightScoped, which handles the fight ending by death, by the point ending, and by a full stat reset.

Damage that depends on positions or timers must be worked out once, by the client that sends it. Every client applies the broadcast number and nothing ever resyncs health, so a calculation repeated on each machine drifts apart for good.

Card art

All 68 cards have art.

Images live in art/ and are embedded into the DLL at build time, so the mod still ships as a single file with no AssetBundle and no Unity project. At startup CardArt decodes the bytes into a Texture2D, wraps it in a Sprite, and builds a RectTransform

  • Image object — which is what CardVisuals.Start expects, since it instantiates CardInfo.cardArt as a child of the card's Canvas/Front/Background/Art transform.

To add art for another card:

  1. Drop a PNG or JPG in art/. Unity's Texture2D.LoadImage decodes nothing else — WebP, GIF and BMP all fail silently at runtime, so convert first.
  2. Add a line to resourceByCard in src/Util/CardArt.cs mapping the card's title to the filename. The key must match GetTitle() exactly or the card just stays blank.
  3. dotnet build.

Keep source images at roughly 512px on the long edge. Prefer JPG unless the image genuinely uses transparency — a PNG whose alpha channel is entirely opaque is several times larger for an identical result. The art is drawn with preserveAspect, so any aspect ratio letterboxes rather than distorting.

Known caveats

These are design limits, not bugs.

Prestige and Xane's Wire Management are the riskiest cards here. They're the only ones that rebuild a player's deck rather than change their stats, which they do through ModdingUtils. Each waits a frame after being picked before touching the deck. Worth testing on their own.

Infinity freezes enemy bullets that come within 2.5 units of the holder and releases them if the holder moves away. A frozen bullet is not sweeping for collisions, so walking into one does nothing. Radius is a knob in MoveTransform_Update_Patch. A standard bullet has no visible body - its sprite is disabled in the prefab and all you see is a trail that lives 0.03 seconds - so a frozen bullet is told to keep its trail, and a slow one too short to see gets a small tail drawn behind it. The bullet's own 15-second despawn timer is also held while it is frozen, so a long freeze can't destroy it mid-air.

Black Hole applies its pull only to players the local client owns, from the holder's synced position. That keeps it from fighting the network sync, at the cost of each client computing its own share. Radius and strength are knobs in BlackHole.

Tree pins the player to the first floor they land on each point, on the owning client only. Anything that moves them — knockback, a teleport card, a dash — gets undone on the next physics step. Walking is scaled to 0.001, not 0, to avoid feeding a zero into movement code that may divide by it, and jumps are refused outright. None of this is baked into the card's stats: every part checks live whether the player also holds The Lorax, which lifts all of it for as long as they hold it, in whichever order the two were picked.

The Kirk Special borrows an explosion prefab from the vanilla card pool at runtime (Supernova's, else Explosive Bullet's). Explosions deal damage through a broadcast RPC, so the visual is spawned on every client and only the attacker's own client keeps the damage. If no explosion prefab is found it falls back to plain area damage with no visual. Damage is 2.5x the holder's bullet damage in a 4-unit radius — both knobs on the card. One explosion per bullet hit, so shotguns and spray guns stack them. Only bullet hits schedule explosions; the explosions themselves never do.

MTG Player detects contact by overlapping collider bounds rather than collision callbacks, because ROUNDS moves players with kinematic physics. One hit per touch; the victim has to separate and come back.

Killdozer is calibrated by KilldozerContact.ReferenceSpeed, the speed a player has at 150% movement speed. At that speed with a default gun, one touch does exactly a full default health bar. The number is a guess until measured in-game; adjust it if one-taps land too early or too late.

Portal Gun teleports to the mouse cursor. It does not check whether the destination is inside a wall. Controller players fall back to six units along their aim direction.

Icon of Sin's "-5% reload speed" is implemented as reload time shrinking 5%/s, matching the "stronger over time" intent.

Legendary is RarityLib's built-in tier: a yellow border, and a draw weight of 0.025 against Rare's 0.1, Uncommon's 0.4 and Common's 1 - a quarter as common as Rare. This mod puts twelve cards there. Xane's Wire Management swaps a Legendary for another Legendary.

Random Crits rolls once per bullet, so guns that fire several projectiles per shot get several rolls per trigger pull. The roll happens on the client that owns the bullet, behind the same hasControl flag the game uses, so all clients agree on who died.

The Last Breath makes you immune to everything while the window is open, including self-damage and damage over time. If you haven't won by the time the five seconds are up, it kills you outright. Winning the point resets it before the timer can fire.

Chris's Side Project and The Last Breath both end in a self-kill sent straight through the game's damage relay, which ignores blocking, so a well-timed shield cannot dodge it. Last Breath's invincibility window would still swallow Chris's deadline if both were active at once.

Go Blue works by briefly counting the dead holder as alive inside the game's TeamsAlive() / GetLastTeamAlive() scans for 2.5 seconds (the card says one). If the window closes with the point still open, the holder's death is announced a second time. Multi-team lobbies are handled, but the card was designed around 1v1 ties.

Touch the Wall counts 3 pick phases in which you were offered cards — a phase where you don't pick (you won the round) doesn't use one up. It offers the rarest tier you can still be offered: Legendary, until every Legendary you could take is already in the hand or in your deck, then the next tier down. It works with and without CardChoiceSpawnUniqueCardPatch.

Daedalus Stormbow places each bullet at the top edge of the arena (y = 20), up to 3 units to either side of the cursor at random, pointed at the cursor. Only the shooter's client knows its cursor, so the spot is chosen there and travels with the bullet's own spawn message, which already carries position and rotation to everyone else. Controller players' "cursor" is six units along their aim. Every pellet of a multi-shot gun gets its own spot, so shotguns rain.

Patience stops other players' guns from firing for the first 3 seconds of each point, on each shooter's own machine, which is the only place a shot can start. The 3 seconds run on the holder's fight clock as each machine sees it, so the lock can end a few frames apart between players.

The Block Build Special fires block effects the same way the vanilla Empower card does: effects only, never the shield, once per trigger pull. Effects that behave differently for Empower (Teleport, Shield Charge) do the same here. Portal Gun teleports you on every shot.

Xane's Wire Management never draws itself or Prestige as a replacement. A card with no possible replacement is kept, and handed back without re-running its pick effects.

Mahoraga counts each hit once, even when Decay spreads it out. The reduction is worked out where the hit is sent, so everyone agrees on your health.

Conner's Pride genuinely checks the date — but at game start, since that's when SetupCard and GetStats run. It reads the local system clock.

Bird Killer zeroes remainingRespawns for the duration of a killing blow, which also suppresses any other respawn-granting mod.

Balanced averages two quantities that aren't in the same units (health ~100, bullet 55), so on a fresh player it reads as lose a quarter of your health, gain about 40% damage.

Giga Drum Mag cannot literally grant +100 ammo — the game clamps magazines at 90.

Ammo is spent per bullet, not per shot, everywhere in ROUNDS: each pellet a gun fires costs a round. So Super Shotgun (13 pellets against 3 + 9 ammo) fires once per reload, and Atomic Bomb empties the whole magazine every shot, which is the point of it.

Atomic Bomb sets bullets per shot to max ammo for the length of each shot and puts the stat straight back, so the link follows every ammo change and bullet count cards stop mattering while you hold it.

Super Shotgun copies the vanilla Buckshot card's range limit, read from the game's own data: spread 0.5, drag 10, bullets removed after 0.2s, bullet speed x3.5 - with bullet speed x3.85 instead, for about 10% more range. Drag takes a fixed fraction of a bullet's speed each frame, so range is roughly speed over drag. It does not copy Buckshot's -60% damage.

C-Ram squares attack speed as a percentage of the default rate, live and last, after every other attack speed effect, so cards picked later are squared too. Below 100% that makes you slower: 80% becomes 64%. It stacks, and each copy squares again - three copies turn 150% into about 2,560% and 80% into about 17%. The squared cooldown never drops below 0.0001s, which is already a shot every frame, and it is left out of the game's screen-shake maths so a nearly-never-firing gun can't fling the camera.

Drone Strike adds the real vanilla Homing and Explosive Bullet cards to your deck, a frame after it is picked. They are found by name; if another mod removes them from the game, nothing is added. Drone Strike, The Island and Prestige are never drawn by Xane's Wire Management, since each changes the deck as it is picked.

The Island picks its 2 cards at random, never another copy of The Island. Online, only the host's pick happens, so everyone loses the same cards.

500 Cigarettes converts damage from the vanilla Toxic Cloud card's clouds, recognised by their prefab name, E_ToxicCloud. Those clouds also hit the player who made them, so a holder who also has Toxic Cloud heals off their own clouds. The slow still applies. The health loss is not damage: it doesn't flash, count as a hit for Mahoraga, or stop for a shield, and it pauses during The Last Breath's invulnerability. Both the loss and the cloud heal are decided on one client and broadcast, so every player sees the same health.

ASU Frat Leader compares actual body sizes, and the game grows a player with their max health as well as with size cards, so health cards count. Size ratio is your size over theirs: 10% bigger is 1.1, which is +110% damage. Anything not bigger - equal included - just scales damage by the ratio. Bullets only.

Projectile Dysfunction steers each bullet by an amount drawn from smooth random noise, keyed to the bullet's own random seed and how long it has been flying. The shooter sends that seed with every bullet, so every player watches each bullet take the same crazy path.

Rare Artifact cuts every piece of damage by 20% at the very last step, on every client - bullets, explosions, the map edge, poison. Instant kills are still instant kills.

Multiplayer. ROUNDS keeps health in sync only because every client applies the same broadcast damage. A few effects are still worked out on each machine separately, so they can differ by a hair between players:

  • Poison (vanilla) ticks on each machine from the bullet's base damage. Damage multipliers don't boost it and Mahoraga doesn't reduce it.
  • Icon of Sin's max health grows on each machine's own clock.
  • Claude's Choice checks its cooldown on each machine.
  • Banana's stand-still timer and heal run on each machine.
  • The Last Breath window opens and closes on each machine's own clock, so a hit landing right at an edge of the window can count on one machine and not another.

Testing

Launch ROUNDS through Thunderstore Mod Manager, not Steam directly - the profile's BepInEx is what loads your DLL. To get a specific card reliably, open MODS → Toggle Cards from the main menu, hit Toggle All to disable everything, then re-enable just the card you want; every pick will then offer it.

Logs land in the profile's BepInEx/LogOutput.log.

CHANGELOG

Changelog

0.16.0

A Legendary tier, using RarityLib's built-in one (yellow border, a quarter as common as Rare). RarityLib is now a dependency.

Moved to Legendary: Touch the Wall, Killdozer, Tree, Hollow Purple, Chris's Side Project, The Block Build Special, Atomic Bomb, Icon of Sin, Mahoraga.

New Legendary cards, all with art:

  • Legendary Artifact: -40% damage taken.
  • Daedalus Stormbow: bullets fall from the top of the map toward your cursor, a little to one side at random, and go through walls.
  • Patience: other players can't shoot for the first 3 seconds of each point.

Other:

  • Touch the Wall now offers Legendary cards (the rarest tier you can still be offered).
  • Icon of Sin can block again.

0.15.1

  • Infinity: frozen bullets stay visible. A standard bullet is drawn only as a 0.03-second trail, which collapsed to nothing the moment the bullet stopped, slow bullets first. The trail is now kept while frozen, very short streaks get a small tail drawn in, and the bullet's 15-second despawn timer no longer runs down while it is frozen. The freeze itself is unchanged.
  • The Flavorful Garlic is a little stronger, and is now Uncommon.
  • The Lorax is now Rare.

0.15.0

New cards, all with art:

  • ASU Frat Leader: bullets hit much harder against smaller players and softer against bigger ones, scaling with the size difference.
  • The Flavorful Garlic: yumby.
  • Projectile Dysfunction: your bullets fly in random, constantly changing directions, +100% damage. Every player sees the same path.
  • Rare Artifact: -20% damage taken, from everything.

0.14.1

  • C-Ram stacks: each copy squares your attack speed again.

0.14.0

New cards, all with art:

  • Drone Strike: jump in midair; picking it also gives you Homing and Explosive Bullet.
  • C-Ram: attack speed squared, +2s reload.
  • The Island: lose 2 random cards when picked, -75% block cooldown.
  • The Lorax: a Tree holder can move freely, Onceler can't instantly kill you, -40% health.
  • Super Shotgun: +12 bullets, +9 ammo, -40% attack speed, Buckshot's range limit stretched about 10%.
  • 500 Cigarettes: +150% damage, toxic clouds heal you instead of hurting you, lose 5% of max health per second.
  • Atomic Bomb: bullets per shot equal your max ammo, +50% damage, +10s reload.

Balance:

  • Ihateblockbuild leaks 25% of a blocked bullet's damage (was 10%).
  • Chris's Side Project: no block cooldown again, and the deadline is 7 seconds (was 20).
  • The Kirk Special explodes for 2.5x bullet damage (was 2x).

Other:

  • Tree's rooting is checked live instead of being baked into its stats, so The Lorax can lift it. Rooted players' jumps are now refused outright rather than shrunk, so jump effects don't fire either.
  • Xane's Wire Management never draws The Island or Drone Strike.

0.13.3

Card wording only:

  • The Kirk Special: "Bullets kirk hit players".
  • Mahoraga: "Adapt to these hands". Its damage-taken row stays.
  • Onceler: "+inf% damage against trees", with "Unless." under it.
  • Shulker no longer gives the exact launch height.
  • The Last Breath is much shorter and no longer lists which stats it buffs.
  • Conner's Pride no longer says it does nothing outside June.

0.13.2

  • Icon of Sin's description line is back: "The longer the icon of sin remains on earth, the stronger he will become." Its rules follow on the next line.

0.13.1

Card text only; no gameplay changes.

  • Cards whose effect is a rule rather than a stat change now explain that rule in a plain sentence, with no stat rows (Go Blue, The Kirk Special, Banana, and others).
  • Stat rows are only stat changes. Rules that were squeezed into rows, like "Resets every point", moved to the description.
  • Removed the joke descriptions, except on Hitscan, Onceler and MTG Player.
  • Fixed stat rows that showed the wrong word for players with card stat numbers turned off. AK's bullet gravity read "A bunch more", and Giga Drum Mag's 20x reload read "A lot lower". Rows a word can't describe, like "+5% per second", now always show the number.

0.13.0

A bug-hunting release. Most of these only showed up online.

Fixes:

  • Xane's Wire Management could stop the next round from starting. With no other card of its rarity available, it swapped itself for itself, which started another reshuffle, forever, reviving the holder every other frame so the point could never end. It now never draws itself, drops its own slot, and can't run twice at once.
  • The Kirk Special is back to 2x your bullet damage per explosion, one per bullet hit, stacking with shotguns and spray. Explosions no longer set off more explosions (each explosion was being mistaken for a bullet hit).
  • Touch the Wall never worked alongside CardChoiceSpawnUniqueCardPatch, which most modded lobbies run: the draw it hooked is never used there. Both draw paths are covered now. It offers Rare (pink) cards or rarer, only uses up a pick in phases where you actually picked, and can no longer force a hand the game rejects over and over.
  • The Block Build Special made you unhittable online. Each shot was sent to the other players as a real block with a shield. It now fires block effects the way the vanilla Empower card does, with no shield. Portal Gun works with it.
  • Bullet damage bonuses (Railgun, Ronald McDonald, Random Crits and every damage multiplier) are added to the final damage number instead of written onto the bullet. Writing onto the bullet threw away vanilla bounce damage, and made poison and on-hit explosions use a different damage on each player's machine.
  • Damage multipliers (Inevitable, Icon of Sin, Card Counter, Lowe's Worker, Conner Hack Special, The Last Breath) apply to explosions and other non-bullet damage again, worked out once by the attacker so every machine agrees.
  • Death timers (Chris's Side Project, The Last Breath) could be dodged by blocking at the right moment. They can't any more.
  • Mahoraga is worked out where each hit is sent, so every machine agrees on your health, and a hit spread out by Decay counts once.
  • Border Hop recognises map-edge damage exactly, including when Decay spreads it out.
  • Phoenix respawns no longer reset Icon of Sin's ramp or restart Chris's Side Project's 20 seconds.
  • Icon of Sin, Particle Accelerator and The Last Breath no longer write movement speed, reload time or bullet speed into your stats and try to undo it later. Other mods' temporary buffs could leave those stats permanently wrong.
  • Prestige only wipes your deck when you pick it, not every time any mod rebuilds your deck. Touch the Wall no longer refills when that happens either.
  • Iloveblockbuild no longer heals several times during a single Shield Charge.
  • Ihateblockbuild leaks the same amount on every machine.
  • Bullets have a minimum hit radius, so stacked Dense Bullets can't shrink bullets to nothing.
  • Per-point cleanup now reaches players who are dead at the time, and ramping bonuses are capped so a very long fight can't overflow into broken numbers.

0.12.0

  • New cards: The Block Build Special, Killdozer, Shulker. All have art.
  • PlayerPhysics gained an impulse launch that reproduces the game's own jump formula.

0.11.2

  • Hollow Purple: the attack cooldown penalty is +60% (multiplicative) instead of a flat +2s, so it scales with other cooldown cards.

0.11.1

  • Hollow Purple: +2s flat attack cooldown, +4s reload time.

0.11.0

  • New cards: Hollow Purple, Dense Bullets. Both have art.

0.10.1

  • Conner Hack Special now scales on a cubic curve: 3.5x at point blank, about 1.4x at 20 units, crossing 1x near 27, down to 0.5x across the map.
  • The Kirk Special explosion is 25% of the victim's max health (was 40%).
  • Art for the nine cards added in 0.10.0. Every card has art.

0.10.0

Balance:

  • The Kirk Special explodes once per bullet hit for 40% of the victim's max health, and borrows Supernova's explosion if the game has one.
  • Sword: +777% damage, +75% movement speed, slightly longer reach.
  • Density: +70% health.
  • Leg Day: +100% jump (was +200%), -0.5s block cooldown.
  • Chris's Side Project: block cooldown is exactly one second.
  • Black Hole: wider and stronger.
  • Mahoraga was already reducing percentage-of-max-health damage; no change needed.

New cards: Conner Hack Special, Onceler, Banana, Xane's Wire Management, Border Hop, Ronald McDonald, Hitscan, Railgun, Discord Mod. None have art yet.

0.9.1

  • Art for Down. Every card has art again.

0.9.0

  • New cards: AK, Go Blue, Claude's Choice, Up, Down.
  • Go Blue holds a dying player as "alive" in the game's team-alive checks for a short window, so simultaneous deaths resolve in the holder's favour instead of by processing order.
  • Claude's Choice is deliberately undocumented.
  • Art for all of the above except Down, which has none yet.

0.8.1

  • Fixed Portal Gun never triggering, and Iloveblockbuild's heal along with it. Both hung off Block.DoBlockAtPosition, whose only caller in the entire game is one Empower hit effect. Ordinary blocks go straight to Block.RPCA_DoBlock, which is where both now live.
  • Portal Gun now computes its destination the same way GeneralInput does.
  • Replacement art for Card Counter; it no longer shares an image with Gremlin.

0.8.0

  • Art for the twelve cards added in 0.7.0. Every card now has art.

0.7.0

Balance, from playtesting:

  • Inevitable and Rev Up ramp at 5%/s instead of 2%/s.
  • McDonalds: +400% health (was +100%).
  • Card Counter: +15% damage per card (was +5%).
  • Mahoraga no longer tracks attackers separately; every hit taken compounds a 10% reduction.
  • Iloveblockbuild now heals 25% of max health per block; the old re-fire effect overlapped a vanilla card.
  • Infinity rewritten: enemy bullets now freeze in place near the holder rather than slowing.

New cards: Icon of Sin, Particle Accelerator, Density, MTG Player, Black Hole, Invisible Bullets, Tree, Chris's Side Project, The Kirk Special, Portal Gun, Lowe's Worker, Leg Day.

Internals:

  • FightScoped base for components that ramp live stats during a point, with capture on fight start and restore on fight end so card re-application never sees modified values.
  • IPointReset interface; the plugin resets every implementing component on point start.
  • PlayerPhysics reaches into PlayerVelocity for forces, stops and teleports.
  • Explosions borrows the game's own explosion prefab from the card pool.

0.6.0

  • Every card now has art; all 23 images are embedded in the DLL.
  • Fully opaque alpha channels are dropped at build time, which halved the embedded art from 1.4 MB to 780 KB.

0.5.0

  • Card art for McDonalds, Inevitable, Ihateblockbuild, Iloveblockbuild, Conner's Pride, Mahoraga, Bird Killer and Random Crits.
  • Art is embedded in the DLL and built into a UI object at runtime, so the mod is still a single file with no AssetBundle.
  • Source images that arrived as WebP were converted; Unity's Texture2D.LoadImage only decodes PNG and JPG.

0.4.0

  • Added Random Crits, Infinity, Sword, Conner's Pride, The Last Breath, Fraud, Prestige, Touch the Wall, Whipped and Super Quick Reload.
  • New dependency on ModdingUtils, required only by Prestige for safe card removal.
  • Added patches on ProjectileHit.RPCA_DoHit, MoveTransform.Update and CardChoice.GetRanomCard.
  • Cards are now registered in a shared PlayerRegistry so patches can find players without scanning the scene every frame.

0.3.0

  • Added Rev Up, Giga Drum Mag and Card Counter.
  • Removed Glass Cannon; vanilla ROUNDS already has a card by that name, and a duplicate title would have made the runtime card lookups count the wrong cards.
  • Replaced InevitableRamp with a shared PointTimer component, now used by both Inevitable and Rev Up.
  • Added a Gun.usedCooldown patch so attack speed can change during a fight.
  • Credits link now points at the Thunderstore page instead of a placeholder.

0.2.0

  • Added McDonalds, Gremlin, Bird Killer, Inevitable, Ihateblockbuild, Iloveblockbuild, Eight Handled Sword Divine General Mahoraga, Titan Killer, Glasser Cannon and Balanced.
  • Added a shared VeryBalancedCard base class so each card file is just its own behaviour.
  • Added Harmony patches on HealthHandler.DoDamage, Block.blocked and Block.DoBlockAtPosition.
  • Per-point state for Inevitable and Mahoraga resets on GameModeHooks.HookPointStart.

0.1.0

  • Initial scaffold.
  • Adds the Glass Cannon card (double damage, half health).