R.E.P.O.
You are viewing a potentially older version of this package. View Latest Version
Install with App

Details

Date Uploaded
last week
Downloads
997
Size
66KB

TeamWars

R.E.P.O. mod: competitive 2-team mode. Pick your team in the lobby; everyone hauls to the same vanilla truck, the money is split per team by who carried each valuable in, and each team gets its own colour-coded cart.

Work in progress — the mode is playable per-level (Red vs Blue with a running rounds score) but lacks series/seed mechanics.

Teams

  • Red vs Blue. Teams are picked in the lobby with the small red/blue squares that TeamWars places next to every lobby player row (right of the ping); clicking a square asks the host to put you on that team. You can also re-pick mid-run from the pause menu: the same two squares appear under the MAIN MENU button.
  • The host is authoritative and may also assign a square to any player. Players who never pick get auto-assigned by the host (30 s grace in the lobby, again at every level start), evenly so both teams stay balanced. A player without a team is never treated as a rival.
  • Everyone else sees your choice too: roster strip up top in the lobby, coloured squares with a yellow frame on your current team, score line showing "you: Rojo/Azul".

Money and haul

  • Everyone delivers to the same vanilla extraction. A valuable counts for the team of whoever carried it in — credit is pinned at the exact delivery instant and never moves afterwards, even when the other team grabs the object inside the truck.
  • A valuable that rides a team cart is credited to the cart's team (the cart is the durable clue once nobody is holding it).
  • Taking a valuable back out of the check un-does its delivery: it stops counting.
  • Value that disappears inside the check waits briefly in limbo: if an extraction consumes it, it is banked on its team (the game zeroes its own haul at that point — without banking, a won round would score as a draw); if nothing consumes it, it likely broke or slid out and is dropped instead of counted at its last value.
  • Per-team goals start at a configurable percentage of the level's total value and are capped by what is still unextracted, so they always stay reachable. The level's own extraction check is kept in step with the (higher) team goal, so delivering enough also satisfies it.

Carts

  • Each team gets its own cart next to the truck, spawned and tinted in its team colour at every level start. The rival team cannot grab it (the grab is refused and even the aim prompt is suppressed). The run's free neutral starter cart is removed.
  • Objects sitting in a team cart are claimed for that team — colour, grab block and haul credit — whether they are valuables or ordinary items.
  • An extraction check only delivers with both teams' main carts sitting in it: the countdown start (into Warning) is held while any main cart is missing — the check stays green counting, no 3-2-1, with time to arrange the carts. The button itself is untouched. A short note shows on the HUD counter while held. The veto kills a single transition edge, so a backstop re-kicks a full waiting check once both carts are in. A wiped team (all its players dead) does not gate: its missing cart is excused. A destroyed or lost cart counts as missing. In solo you haul both carts yourself.

Protection

  • A rival cannot grab an object owned by the other team — unless someone from that team is holding it right now: contested grabs (steals from hands) follow their own switch, Protection.AllowGrabHeldByRival (default true).
  • A rival cannot break/crush an owned valuable by throwing, dropping or crashing it: the culprit's team is checked at the single point where impact damage becomes lost value, consistently on every machine.
  • Both blocks are one switch: Protection.BlockRivalTouch (default true). Turning it off only removes the blocks — attribution, colours and haul credit keep working, so deliveries still count for the right team. Turning AllowGrabHeldByRival off additionally forbids grabbing anything a rival holds, even unowned.

Round close

  • Normally the level ends when the vanilla check is met and someone grabs the truck screen. TeamWars adds a competitive round: once a team reaches its goal, the vanilla exit is held back until the minimum time for the level (base + per-module, host config) has passed and the living players are in the truck.
  • A grace period after the minimum time is the safety valve: past it, players still outside cannot hold the close back, so a stuck player never locks the run.
  • Grabbing the truck screen then closes the round, advances the level and scores the winner (GANA ROJO / GANA AZUL through the game's own center-screen popup). Ties score nothing. With no team at its goal, the vanilla exit is untouched and the round closes with no winner.
  • Rounds won is shown for the whole session in the HUD counter.

Extraction surplus

  • Vanilla folds every surplus dollar above the goal into a single moneybag — grab-and-run race, new owner dictated by speed. TeamWars pays each team its own bag instead, split by each team's contribution to the level's extraction (largest-remainder rounding), each bag claimed and coloured at spawn.

The shop

  • An item is bought by putting it in the shop's check and confirming; the game charges the shared pot and destroys the object. TeamWars works on both charge paths (the tube's one-item-per-tick, and the shop's own extraction that charges the whole list at once): it pins which team the items in the check belong to (whoever put them there), only lets through what the owner team can pay, and books the charge per team.
  • Each team pays out of its own purse: what it has extracted over the run minus what it has spent. Unaffordable items (or with no team attached yet) stay in the check untouched; the shop's shared money stays vanilla.
  • An item nobody held (pushed in with something else) has no owner and is never charged: it is ignored. Grab an item to attribute it to your team.
  • Items sitting in the check wear the tint of the team that placed them (taken back when they leave the check).
  • The shared money is kept topped up to what both teams own together, so the game's own gating can never jam what a team could pay.
  • The upgrade stand's reroll press is booked on the presser's team as well.
  • The purchase record is kept by item name, so when the game re-creates the bought items on future spawns they are given back to the buyer's team.
  • While in the shop the vanilla single-pot currency display is hidden and the HUD shows both purses instead.

HUD

  • Persistent counter at the top of the screen: Rojo haul/goal (players) — Azul haul/goal (players), rounds won, a close-state line (countdown to the minimum time, waiting on N players outside the truck, round closed, etc.) and which team you are on.
  • Uses the game's own font and styling; no external assets.

Networking

  • Host-authoritative: the host owns rosters, goals, tallies, ownership and round results and broadcasts them as Photon events; clients ask to join teams and to close rounds. Offline singleplayer works with no room at all.
  • State is re-synced periodically (roster, ownership, tallies, cart ownership), so a client that joined late or lost an event always converges. Late joiners get current goals and tallies too, not just the roster.

Configuration (BepInEx config, host values win in multiplayer)

Setting Default Meaning
Economy.GoalStartPercent 28 Each team's starting goal, as percent of the level's total value.
Spawning.ValuableMultiplier 2 How many times more valuables spawn per level (2 = double, one share per team). Only the host's value matters.
Debug.VerboseLogs false Detailed per-tick logs (haul ticks, tally/roster syncs, blocked damage). Keep off: logging costs performance.
Round.MinTimeBaseMinutes 10 Base minimum round time.
Round.MinTimePerModuleMinutes 3 Extra minutes per level module.
Round.CloseGraceMinutes 5 Extra minutes after the minimum time before players outside the truck stop blocking the close.
Extraction.RequireCarts true Each extraction check needs both teams' main carts inside it to start.
Extraction.CartRadius 6 How close (meters) a main cart must be to the check to count as inside it.
Protection.BlockRivalTouch true Block grabbing or breaking what the other team owns. Off removes only the blocks; attribution still counts.
Protection.AllowGrabHeldByRival true Allow grabbing what a rival holds (contested grabs, steals from hands). Off forbids it, even unowned.

Map (work in progress)

  • Goal: on the TAB map each team sees its own main cart's dot but not the rival's. Vanilla tracks markers through the Map singleton; how it stores the cart dots is still unverified, so 0.8.42 only dumps the Map API surface to the log (enable Debug.VerboseLogs for one level and send the Map filter lines) — hiding comes next.

Installation

Requirements: BepInEx-BepInExPack (5.4.2305).

Install through r2modman / Thunderstore as cacus-TeamWars, or drop the DLL into BepInEx/plugins.

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