SpongeSpeedRunners
Godmode (players only), 999999 fist damage, always-green roulette, Baby Bitch Boy difficulty, the hidden dev island with a pink radar dot, 10x multi-jump and 5x swim speed.
By SpongeMods
| Last updated | 37 minutes ago |
| Total downloads | 15 |
| Total rating | 0 |
| Categories | |
| Dependency string | SpongeMods-SpongeSpeedRunners-1.0.1 |
| Dependants | 0 other packages depend on this package |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2305README
SpongeMods - SpongeSpeedRunners
A cheat and exploration mod for How to Fish. Built to sit alongside SpongeTweaks without conflicting, while interoperating with it when both are present. Neither mod requires the other.
Built and verified against the current game build, BepInEx 5.4.2305.
Features
| Feature | Default | Notes |
|---|---|---|
| God mode | on | Players are invincible. Fish and bosses are unaffected. |
| Lethal fists | 999999 dmg | Bare-handed punches one-shot almost anything. |
| Rigged roulette | on | The casino ball always lands on green. |
| Baby Bitch Boy | on | A fourth difficulty that is internally the game's Hard. |
| Dev island | on | Re-enables the hidden island that ships with the game. |
| Pink radar dot | on | Marks the dev island, only if pink is otherwise unused. |
| Multi-jump | 10 jumps | Jump repeatedly in mid-air. |
| Fast swimming | 5x | Water movement at five times walking speed. |
Everything is switchable in
BepInEx/config/spongemods.howtofish.deepseaoverride.cfg.
Keybinds
| Key | Action |
|---|---|
F7 |
Host only: send the whole session to the dev island. |
The dev island is also reachable simply by sailing past the last normal island.
God mode is player-only, by construction
The request was explicit that invincibility must not extend to bosses or fish. That is guaranteed structurally rather than by a filter that could be wrong:
- Player health lives in
PlayerVitals._syncedHealth, changed only byPlayerVitals.TakeDamage. - Fish and bosses are
Creature, which derives fromItemand carries its own_hpSyncVar changed throughCreature.ServerChangeHp.
The two share no damage code, so the single patch on PlayerVitals.TakeDamage
cannot reach a creature. Fish and bosses keep taking damage from you and
dealing damage to each other exactly as in vanilla; they simply can no longer
kill a player.
TakeDamage was confirmed to be the only sink for player damage. Weapons and
punches (through Server.HitPlayer), drowning, hunger, poison, fire, crab
attacks and boss damage all funnel into it, and it is the only place that
lowers _syncedHealth or calls ServerDie. Blocking it blocks death itself,
not merely most sources of it.
Multiplayer model
The stated assumption is that every player has both mods.
| Feature | Where it runs | How other players see it |
|---|---|---|
| God mode | Host (server-authoritative) | Health SyncVar simply never drops |
| Roulette green | Host decides in EndRoulette |
Result is broadcast by the game |
| Dev island | Host writes _curIsland SyncVar |
Everyone loads the same scene, including late joiners |
| Baby Bitch Boy | Host owns the flag, broadcast | Joiners receive the correct label |
| Fists, jumps, swim | Each player locally | Position and damage already replicate |
Nothing here invents a networking layer where the game already has one. The
island in particular needed no custom sync at all: SpawnIsland writes a
SyncVar, and a client joining later reads its current value on connect.
Baby Bitch Boy
The game's Difficulty enum has exactly three values and is baked into the save
format, so a real fourth value would corrupt saves and every switch that reads
it. Instead this is a virtual fourth option:
- Selecting it stores
Difficulty.Hardeverywhere the game looks, so health and damage multipliers are the hardest available and a run stays legitimate for speedrunning. - A separate per-world flag remembers the choice so the menus can display
BABY BITCH BOY. - The "easy" half comes from this mod's other features, not from softened difficulty numbers. That is the point of the mode.
Both difficulty cyclers are handled (ChangeDifficultyButton on the create
screen, ChangeCurServerDifficulty on the server settings screen). Rather than
transpiling the enum bound, the patch intercepts the wrap: stepping past Hard
holds on Hard and raises the flag, and stepping again continues to Easy. The
resulting cycle was simulated and verified to give four distinct positions in
both directions, with Baby always internally Hard.
The dev island
The shipped build contains seven scenes:
0 Game.unity (main scene)
1 Island1 -> island index 0
...
5 Island5 -> island index 4
6 DevIsland -> island index 5 <- normally unreachable
IslandManager loads island N with LoadSceneAsync(N + 1), and
OnlineIslandManager.NextIslandInBuild wraps once the index reaches
TotalIslands - 1, which is exactly 5. That single off-by-one is what hides the
island. The patch extends the wrap by one so the dev island becomes the last
stop in the normal rotation, still routed through SpawnIsland so it stays
server-authoritative.
The pink dot
The request was conditional: pink only if that colour is not already used. Dot colours live in the scene, not in code, so they are sampled at runtime and compared in HSV space (hue distance within 0.06 turns, ignoring greys and near blacks, since two pinks can differ in brightness and still read as the same colour on a small radar).
If any island already uses a similar colour, the feature stands down and logs which dot clashed rather than adding a second indistinguishable marker.
The dot itself is cloned from an existing radar dot, so it inherits the radar's
sprite, size and parent, and is driven through the game's own private
UpdateDot so it pings and fades identically to the built-in ones.
Conflict analysis with SpongeTweaks
Zero shared patch targets. Verified mechanically:
SpongeTweaks : 49 targets
SpongeSpeedRunners : 11 targets
Overlap : 0
Both mods patch the PlayerMovement class, but never the same method:
| SpongeTweaks | SpongeSpeedRunners |
|---|---|
Move, FixedUpdate, UpdateMoveSpeed, Jump, UnderWaterCheck |
JumpInput, GroundCheck, LateUpdate |
Two interactions were checked rather than assumed:
- Multi-jump vs the Compendium's
Jumpprefix. That prefix returns early for anything not swimming, so mid-air jumps pass straight through it. - Fast swimming vs the Compendium's water speed clamp. Its
FixedUpdatepostfix caps horizontal speed in water, which would otherwise pin 5x swimming back to roughly walking pace. Two defences:SwimmingInteropreads that mod's config reflectively and widens itsWater Speed Clamp Headroomso the clamp permits the requested speed. If the required headroom exceeds the entry's maximum of 5, the clamp is turned off instead and this mod owns water speed.- The boost is applied in
LateUpdate, which runs after the whole physics step and is unclaimed by the other mod, so it lands last regardless.
All of that is resolved by name through reflection and treated as absent when missing, so this mod behaves correctly standalone. Neither mod depends on the other.
Naming
Everything internal carries the SpongeMods identifier:
| Thing | Value |
|---|---|
| Plugin GUID | spongemods.howtofish.deepseaoverride |
| Assembly | SpongeMods.SpongeSpeedRunners.dll |
| Namespace | SpongeMods.SpongeSpeedRunners.* |
| Config file | spongemods.howtofish.deepseaoverride.cfg |
| Runtime objects | SpongeMods_DevIslandDot, SpongeMods_BabyDifficultyLabel |
The cross-mod interop resolves SpongeTweaks by namespace string, so
that string had to be renamed in lockstep. tools/VerifyModInterop exists
specifically to catch a mismatch there, since it compiles fine and simply
disables interop silently at runtime.
Bugs found and fixed during optimisation
These were caught by inspection after the features worked, and are the kind that only appear in a long session:
| Bug | Consequence | Fix |
|---|---|---|
_devDot is a plain C# object holding a Unity Image |
It survived a scene reload while the Image was destroyed, so the next radar update would call into a destroyed object | Re-validate the Image each time and rebuild the dot if it died |
Difficulty patches read _selectedDifficulty via FindAnyObjectByType |
A scene scan per button press, and it could read a different ButtonManager than the one being patched |
Take __instance from the patch |
| Turning Baby mode off mid-session | RefreshLabels was never reached, leaving the real "HARD" caption permanently hidden behind the custom label |
Restore the vanilla labels on the way out |
| Radar dot re-tinted every frame | Fought MapDot's alpha tween for no reason; UpdateAlpha already preserves RGB |
Removed |
MethodInfo.Invoke for UpdateDot |
Boxed arguments into a fresh object[] every frame the radar was visible |
Bound Action<MapDot, Vector3> delegate, re-bound if the RadarUI instance changes |
Building and verifying
dotnet build -c Release
Both mods are verified together by one script in the parent directory:
../verify-all.sh
Current results for this mod: 22 game references resolve, 14 patch signatures valid, plus the shared interop and conflict checks.
Those tools compare declarations only. They cannot see plain C# behaviour, so requirement-to-code tracing and the difficulty cycle simulation were done separately. See the SpongeTweaks README section "What the verifiers cannot see" for why that distinction matters; ignoring it previously hid a dropped feature in that mod.
Status
Built, statically verified and installed to
BepInEx/plugins/SpongeMods-SpongeSpeedRunners/.
Not yet run in-game. How to Fish is a Windows title run through Proton and
BepInEx has never started in this profile, so no runtime evidence could be
collected. On first launch check BepInEx/LogOutput.log for:
SpongeSpeedRunners 1.0.0 loaded. GodMode=True Fists=True ... MultiJump=10 SwimSpeed=5x
Then verify in play, in rough order of risk:
- The difficulty cycler shows
BABY BITCH BOYafter Hard, in both directions. - Sailing past the last island reaches the dev island, and a second player joining mid-session lands there too.
- The radar shows a pink dot, or the log explains which colour it clashed with.
- Fish and bosses still take and deal damage normally while players cannot die.