VeryBalancedRoundsMod
Eleven aggressively unbalanced cards: Glass Cannon, Gremlin, Mahoraga, Titan Killer, Inevitable and more. Very balanced. No notes.Very Balanced Rounds Mod
Custom cards for ROUNDS, built on UnboundLib.
Cards
| Card | Rarity | Effect | How it works |
|---|---|---|---|
| Glass Cannon | Rare | +100% damage, -50% health | stats |
| Glasser Cannon | Rare | +200% damage, -75% health | stats |
| McDonalds | Common | +100% health, -50% movement speed | stats |
| Gremlin | Common | -30% size, +50% movement speed | stats |
| Titan Killer | Rare | Bullets deal +5% of the target max health | vanilla Gun.percentageDamage |
| Bird Killer | Uncommon | Your kills cannot be undone by Phoenix | DoDamage patch |
| Inevitable | Rare | +2% damage per second, compounding, resets each point | DoDamage patch + ramp component |
| Eight Handled Sword Divine General Mahoraga | Rare | Each hit from an attacker cuts their damage to you by 10% | DoDamage patch + adaptation component |
| Ihateblockbuild | Uncommon | Blocked bullets still deal 10% of their damage | Block.blocked patch |
| Iloveblockbuild | Rare | On-block effects trigger twice | Block.DoBlockAtPosition patch |
| Balanced | Uncommon | Health and bullet damage both become their average | OnAddCard |
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
- Copy
src/Cards/GlassCannonCard.csto a new file and rename the class. - Add its title to
src/Util/CardNames.cs. - Register it in
VeryBalancedPlugin.RegisterCards(). dotnet build, then relaunch ROUNDS.
Two things worth knowing:
SetupCardruns once at game start, not on pickup. The values you assign togunandstatModifiersthere are multipliers over the player's current stats:2fdoubles,0.5fhalves,1fis neutral. A handful of fields are additive instead, notablyGun.percentageDamageandCharacterStatModifiers.regen, and those treat0fas neutral. For anything that isn't a stat multiplier, useOnAddCardor a Harmony patch.GetStats()only draws the text on the card face. It doesn't affect gameplay, so it will happily lie to your players if you changeSetupCardand forget to update it.
Known caveats
These are design limits, not bugs, and are worth reading before tuning anything.
Balanced averages two quantities that aren't in the same units. Health sits near 100
while a default bullet does 55, so on a fresh player the "average" is 77.5 — which reads as
lose a quarter of your health, gain about 40% damage, not as anything symmetric. It also
can't be expressed as a multiplier, so it runs in OnAddCard against live values and gets
recomputed every time ROUNDS re-applies cards. Expect it to interact unpredictably with
other health and damage cards.
Iloveblockbuild re-fires Block.BlockAction, which covers card effects that subscribe
to the on-block event — most of them. It does not double block effects implemented
elsewhere: objects spawned on block, block healing, the knockback impulse, or cooldown
behaviour. It also assumes every subscriber is safe to invoke twice, which other mods do
not promise. Treat it as "most on-block effects", not literally all.
Bird Killer works by zeroing remainingRespawns for the duration of a killing blow.
That field is what Phoenix uses, but it's also what any other respawn-granting mod uses, so
this card suppresses those too. It applies to every kill you cause, not strictly bullets.
Inevitable compounds hard: 2%/second reaches roughly 3.3x at one minute and 10x at two. "Resets each round" is implemented as each point — the individual fight — which is the ROUNDS term for it.
Mahoraga resets its adaptation each point. Left to accumulate across a whole game it would make the holder nearly immune. Its title is also long enough to crowd the card face.
Ihateblockbuild deals damage from inside Block.blocked, which runs on every client via
ProjectileHit.RPCA_DoHit, so it should stay in sync. It is the card most worth testing in
a real online match rather than against bots.
Testing
Launch ROUNDS through Thunderstore Mod Manager, not Steam directly - the profile's BepInEx is what loads your DLL. Cards appear in the normal between-round pick screen; a local match against a bot is the fastest way to see one.
Logs land in the profile's BepInEx/LogOutput.log.
