R.E.P.O.
This package has been deprecated and may no longer be maintained. We recommend looking for an alternative.
Install with App

Details

Latest version
1.9.0
Last Updated
First Uploaded
Downloads
227
Likes
1
Size
48KB
Dependants

Tags

Deprecated

🐌 TinySnail

You finish generating the level. You hear nothing. You see nothing. Somewhere on the map, a snail begins to move.

A tiny, slimy, photorealistically uncomfortable snail spawns on your level. It crawls toward the nearest player at a snail's pace. If it touches you, you die.

It is not in a hurry. It does not need to be.

By default: one snail per level. It will investigate gunshots. It will recoil from a flashlight. It will steal your shiniest valuable. You can kill it with a thrown bottle or a crouch-stomp. If a single snail isn't enough fun, flip on [Difficulty] Preset = Inevitable (or Snailpocalypse) and the population starts doubling every minute — an opt-in "extra mode."


Mechanics

Mechanic Detail
Movement Constant pursuit of the nearest player. Cruises ~0.30 u/s, accelerates to ~1.20 u/s inside RageDistance (snail rage).
Smart targeting The snail picks the nearest of all players to its own position. Switches target if someone gets closer. Re-evaluates 4× per second.
Investigates noises Gunshots and player damage (≥10 HP) attract the snail if within 60 units. It diverts for ~4 seconds when the noise is meaningfully closer than its chase target.
Scared of flashlights Direct flashlight beam, 30° cone, within 15 units, for >0.5 seconds — the snail retracts into its shell and freezes for 3 seconds. Stall mechanic.
Steals valuables The snail crawls over a loose valuable (PhysGrabObject, mass <4) — it sticks to its slime. Carried on its back until killed, grabbed back, or the level ends.
Killable Throw a valuable at it at >3 m/s, or crouch within KillRadius, and the snail dies in a slime burst + wet squelch. Default HP = 1.
Doubling (opt-in extra mode) OFF by default. Every 60s (configurable) the snail population doubles up to CountMax. Newcomers spawn at random valid points across the map.
Permanent slime trail Bright, glowing slime decals dropped every 0.6s. Persist for the level (global cap 600). Lights up dark corridors via REPO's bloom — you can see where the snail's been from across the map. Tune [Visual] SlimeGlowIntensity (default 1.0, range 0–8).
Kill = death Player takes 9999 damage via REPO's PlayerHealth.Hurt, networked. Everyone sees the death.
Walls don't matter to the snail. The snail clips through geometry. The snail is patient. The snail is geometric in nature.

The HUD heat meter

A small, soft-glowing panel in the corner. Snail icon, a heat word, and a colored bar that fills as the snail closes in. No numeric distance by default — you're supposed to feel it.

Distance Word Vibe
> 50 m Ice cold safe
30–50 m Cool fine
18–30 m Tepid huh
10–18 m Warm uh
5–10 m Hot uh oh
2–5 m Burning RUN
< 2 m SCORCHING (pulses red; you are already dead)

A 2D heartbeat thump layers in once the meter goes Warm or higher and gets faster as the snail closes. Set [HUD] ShowDistance = true if you'd rather see a real "12.3 m" readout.


Difficulty presets

[Difficulty] Preset is the only knob you usually need:

Preset Speed Rage Cap Doubling
Cute 0.18 → 0.45 3m 4 off
Standard (default) 0.30 → 1.20 5m 8 off
Inevitable 0.45 → 2.00 8m 16 on, every 90s
Snailpocalypse 0.55 → 3.00 12m 64 on, every 45s, starts with 3
Custom use individual fields

Configuration

All settings live in BepInEx/config/TinySnail.cfg after first launch.

Tip: install REPOConfig (used by 1600+ REPO mods) and TinySnail's settings will appear in the in-game Mods menu as sliders + dropdowns — no need to edit the .cfg by hand. All TinySnail numeric fields declare proper AcceptableValueRange and enum fields declare AcceptableValueList, so REPOConfig renders them correctly automatically.

  • [Difficulty] Preset — pick one of the above.
  • [Behavior] BaseSpeed, MaxSpeed, RageDistance, KillRadius, InvestigateNoises, ScaredByFlashlight, StealValuables.
  • [Killable] Enabled (true), Health (1), ImpactDamageThreshold (3.0 m/s), CrouchStompKills (true).
  • [Visual] Scale (0.12), SlimeTrail, PermanentTrail, DecalInterval (0.6), SlimeGlowIntensity (1.0, range 0–8), GlowingEyes, WobbleAnimation.
  • [Spawning] CountBase, CountPerLevel, CountMax, MinSpawnDistance (20), MaxSpawnDistance (80), DoubleEachMinute (false), DoublingIntervalSeconds (60).
  • [Audio] Enabled, SlitherSound, SlitherVolume (0.5), SlitherAudibleRange (15), HeartbeatSound, HeartbeatVolume (0.7), SquelchOnDeath.
  • [Networking] UpdateRateHz (15, range 1–30).
  • [HUD] Enabled, ShowDistance (false), Position (TopRight / TopLeft / BottomLeft / BottomRight / BottomCenter).

How it works (technical)

For the curious and for fellow modders:

  • No Unity asset bundle, no custom prefabs. The snail is built entirely at runtime from primitives (GameObject.CreatePrimitive) with procedurally generated Texture2D materials — polar-coordinate spiral on the shell, Perlin-noise mottling on the body. Audio is generated procedurally with AudioClip.Create + SetData. Optionally, a tinysnail.bundle Unity asset bundle next to the DLL overrides the procedural visual with a sculpted prefab.
  • Spawning is hooked via Harmony postfix on LevelGenerator.GenerateDone. Master client picks LevelPoints via SemiFunc.LevelPointsGetAll() biased toward [MinSpawnDistance, MaxSpawnDistance] from the player.
  • Targeting uses SemiFunc.PlayerGetList() to consider every player. The snail re-evaluates ~4× per second.
  • Noise investigation is a SnailSenses static registry; Harmony postfixes on ItemGun.Shoot and PlayerHealth.Hurt push noise events that decay after 10 seconds. The snail checks the registry and diverts if a noise is meaningfully closer than its chase target.
  • Flashlight detection uses PlayerAvatar.flashlightController.{active, spotlight} — cone test against each player's flashlight spotlight transform.
  • Item theft uses Physics.OverlapSphere for PhysGrabObject components not currently grabbed (checked via SemiFunc.PhysGrabObjectIsGrabbed), sets the rigidbody to kinematic, and lerps it to the snail's back.
  • Killable mechanics add a SphereCollider trigger to the snail. OnTriggerEnter checks incoming rigidbodies' velocity against ImpactDamageThreshold. Crouch-stomp checks PlayerAvatar.isCrouching inside the kill range.
  • Networking uses PhotonNetwork.RaiseEvent (codes 180–183) for spawn/despawn/pose/despawn-all. Pose broadcasts at 15 Hz with unreliable transport; spawns/despawns are reliable. Payload validation: finite floats, position bounds ≤10000, ID range, receive-side cap at 2× SafeCountMax. Photon subscription is retried each frame until ready.
  • Material leaks are prevented by the MaterialCleanup MonoBehaviour, which explicitly destroys all per-instance material clones on snail destruction.
  • All Update loops are wrapped in try/catch. A single bad frame won't crash the snail, much less the game.

Multiplayer

Fully synchronized. The host (master client) simulates the snail; everyone else sees it in the same place. Sync uses Photon events (no PhotonView registration, no REPOLib dependency) at 15 Hz by default. The killing blow uses REPO's own networked damage RPC. Singleplayer: the network layer detects singleplayer and skips broadcasts entirely.


Compatibility

  • REPO built around the May 2026 game build
  • BepInEx 5.4.2305 required (auto-installed by Thunderstore Mod Manager / r2modman)
  • Render pipeline: Built-in (no URP/HDRP dependency)
  • No REPOLib dependency — intentionally avoided to keep the mod self-contained

Known limitations

  • Built from Unity primitives + procedural textures, not a sculpted 3D model. Adorable in a programmer-art way. A real model is on the roadmap (or ship your own via the asset-bundle path — see unity/UNITY_SETUP.md in the source repo).
  • The snail clips through walls. This is intentional.
  • Master-handoff when the host leaves mid-run isn't yet smooth — the snail freezes until the next level. On the roadmap.

Roadmap

See PROJECT_PLAN.md in the source repo. Highlights for upcoming releases:

  • v1.9: Master-handoff for hot-swapping the simulation when the host leaves
  • v1.10: Per-snail varieties (boss snail, slug, albino), per-player snail color sync

Found a bug? Want a feature?

Open an issue on the repo or post on the Thunderstore comments. PRs welcome.

Stay slow.

Thunderstore development is made possible with ads. Please consider making an exception to your adblock.