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
945
Size
95KB

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 below the MENU title.
  • 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. Each living player shoulders an even share: with even teams the goal is the base percentage, deaths shrink it (a wiped rival never raises yours), late joiners dilute it. The goals are a share of the spawned (doubled) total, so the map always holds more than both teams need together. The level's own extraction check is kept in step with the (higher) team goal, so delivering enough also satisfies it.
  • The tug-of-war bar above the score shows each team's live progress toward its own goal (24 ■ squares, red from the left, blue from the right), so a small team close to its small goal leads. Once a team wins the round the bar goes solid in its colour.

Carts

  • Each team gets its own cart next to the truck, spawned and tinted in its team colour at every level start, and respawned at base if it breaks mid-round (a destroyed cart would gate every check forever). 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. While held, a floating text above the check names the missing cart(s). The veto kills single transition edges and vanilla fires each only once, so a backstop re-drives them: a full waiting check from Active, and any other vetoed edge (Warning from Surplus, Extracting, Complete) from the state vanilla left behind once both carts are in. It only ever completes edges vanilla raised itself — moving carts mid-delivery pauses it, bringing them back resumes it. A team with nobody alive (wiped or simply empty — e.g. playing alone on Red with nobody on Blue) does not gate: its missing cart is excused, so the living team delivers with its own cart. A destroyed or lost cart of a team that does have someone alive still counts as missing.

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 false).
  • 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.

Revive

  • A living player buys back one dead teammate from the truck at the physical terminal (solid totem against the truck wall: grab and hold it like any object, then E within 3.5 m — it flares while held). The totem carries a vanilla static-grab dummy with no rigidbody, so it can never move or rotate. The buyback answers with the check success sting or the cancel buzz at the totem. The team purse pays, the vanilla head revive runs wherever the head lies. Each press brings back one teammate (no head left, no revive).
  • Price: Revive.CostFlat (default $5000, ignored while percent is over 0), or Revive.CostPercent (default 5) to pay that percent of the round-start level total instead. Only the host's values matter. The HUD shows price, dead count and whether the purse covers it.
  • Reviving grows the team's goal back (goals count living players).

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 12 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 false 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.