You are viewing a potentially older version of this package. View all versions.
HotelCharlie-BigScreen-1.0.4 icon

BigScreen

A shared in-world screen for watching YouTube together in Big Walk. Everyone with the mod sees and hears the same video, in sync.

Date uploaded a week ago
Version 1.0.4
Download link HotelCharlie-BigScreen-1.0.4.zip
Downloads 180
Dependency string HotelCharlie-BigScreen-1.0.4

This mod requires the following mods to function

BepInEx-BepInExPack_IL2CPP-6.0.755 icon
BepInEx-BepInExPack_IL2CPP

BepInEx pack for IL2CPP x64 Unity games. Preconfigured and ready to use.

Preferred version: 6.0.755

README

BigScreen

A shared, in-world screen for Big Walk. The host places a screen somewhere on the island, pastes a YouTube link, and everyone with the mod sees and hears the same video at the same moment. Sit around it, heckle, walk off and let the sound fade behind you.

Status: alpha, runs in-game. As of 2026-09-19 the mod compiles against Big Walk (Unity 6000.3.17f1, BepInEx 6.0.0-be.755), loads, hooks Mirror, and places a working screen that syncs and tears down correctly. Video playback is the remaining unverified step. All three risks in docs/ARCHITECTURE.md are now resolved or retired and annotated with what actually happened; docs/PLAYTEST.md tracks what is still unverified.

How it works, in one paragraph

Big Walk is a Unity (IL2CPP) game networked with Mirror. BigScreen is a BepInEx plugin. Every player who wants to watch installs it. The host owns a tiny piece of shared state (where the screen is, which video, playing or paused, and a timeline anchor); it is sent to modded guests over the game's own Mirror connection on a private message id. Each player resolves the YouTube link to a direct stream URL locally with yt-dlp and plays it with Unity's built-in VideoPlayer onto a quad in the world, with positional audio. Everyone keeps their playback locked to the host's timeline using Mirror's shared clock. Players without the mod are unaffected: they see nothing and receive nothing.

Requirements

  • Big Walk on Steam (Windows, or Linux through Proton)
  • BepInExPack IL2CPP (installed for you by a mod manager such as Gale or r2modman)
  • yt-dlp.exe. BigScreen downloads it automatically the first time it is needed (from the official yt-dlp GitHub releases), or set YtDlp.Path in the config.

Install

With a mod manager (recommended): in Gale or r2modman, select Big Walk, create a profile, install BepInExPack_IL2CPP, then import the BigScreen zip (or install it from Thunderstore once it is published). Launch the game from the manager.

Manually: install BepInExPack IL2CPP into the game folder, launch the game once (the first launch takes a few minutes while it generates interop files), then drop BigScreen.dll into BepInEx\plugins\BigScreen\.

Everyone who wants to watch needs the mod. The host does not need to do anything special.

Use

  1. Host or join a walk.
  2. Press F8 to open the panel.
  3. Place screen here puts a screen 4 m in front of you, facing you.
  4. Paste a YouTube URL and press Load. Everyone with the mod resolves and starts the video in sync a few seconds later.
  5. Play/pause and seek from the panel. Guests can only control playback if the host ticks "Let modded guests control playback".

Your own volume slider is local. The audio is positional: stand close to hear it, walk away and it fades (configurable range).

Configuration

BepInEx\config\dev.h223chen.bigscreen.cfg (created on first launch). Highlights:

Section Key Default Meaning
Keys ToggleUI F8 Open/close the panel
Audio Volume / MaxDistance 0.8 / 40 Local volume; distance at which the screen goes silent
Screen WidthMeters 4 Physical screen width (16:9)
YtDlp Path / AutoDownload "" / true Where yt-dlp.exe lives; download it if missing
YtDlp FormatSelector muxed-MP4 chain yt-dlp -f expression. Unity needs a single H.264+AAC MP4
Sync DriftToleranceSeconds 1.0 Re-seek when you are further than this from the host's timeline
Sync GuestsCanControl / AutoPlay false / true Host-side permissions
Debug Diagnostics false Verbose log line every 2 s

Building from source

Prerequisites:

  1. .NET SDK 10 or newer
  2. A mod manager: Gale or r2modman
  3. BepInExPack_IL2CPP installed via your chosen mod manager
  4. Big Walk launched modded at least once so that BepInEx\interop exists

Setup:

# 1. Install and launch the game modded through Gale or r2modman
#    (this generates the interop files you need to build)

# 2. Verify .NET SDK is installed
dotnet --version

# 3. Build and deploy the mod
.\scripts\build.ps1 -Deploy    # build and copy into <BepInEx>\plugins\BigScreen

# Alternative: create a Thunderstore-ready package
.\scripts\package.ps1          # creates dist\BigScreen-*.zip

The build auto-detects the Gale profile, the r2modman profile, and the Steam game folder in that order. For a custom BepInEx path: copy Config.Build.user.props.template to Config.Build.user.props and set BepInExPath.

New to Unity or game modding? Start with docs/MODDING-PRIMER.md.

Docs

Credits

Built on the shoulders of the Big Walk modding community, in particular dougwithseismic/bigwalk-mods (toolchain and reverse-engineering guide), iameli/big-walk-practice (Mirror ownership notes, CI pattern) and the Trifocals mods (in-game patterns for players, audio and effects). BepInEx, Il2CppInterop, Harmony, Mirror and yt-dlp do the heavy lifting. Not affiliated with House House or Panic.

License

MIT. See LICENSE.

CHANGELOG

Changelog

1.0.4

1.0.3 was never published: Thunderstore rejected the package and this release carries its changes plus the packaging fix.

Fixed

  • package.ps1 wrote manifest.json with a UTF-8 BOM, which Thunderstore rejects without giving a reason. Set-Content -Encoding UTF8 means "with BOM" on Windows PowerShell 5.1; the manifest is now written through WriteAllText with an explicit no-BOM encoder. Every package built before this carried the BOM - the source file was always clean, so it never showed up in the repo.

Both players must be on this version: the sync message gained two fields, so the protocol version went to 2 and a 1.0.2 peer is rejected outright rather than misreading the message.

Changed

  • Screen geometry (GroundClearance, WidthMeters) is now part of the shared state and owned by the host, the way position and yaw already were. A guest joining a lobby renders the host's screen at the host's height and width instead of their own, so everyone is looking at the same thing. Your own config still decides the screen for lobbies YOU host.
  • Raise/Lower is a host control now, and moves the screen for the whole lobby. A guest pressing it is told the host sets the height; the panel shows the shared value.
  • GroundClearance now defaults to -0.3 rather than 0.6, which puts the screen near the ground and hides the stand. A fresh install and a tuned one no longer disagree by almost a metre. Existing configs keep whatever value they already hold - BepInEx does not rewrite a setting that is already there, so a host on the old default still needs to lower theirs once.

1.0.2

Fixed

  • Guests never received anything from the host, so the screen only ever existed on the hosting machine. Mirror's message delegate hands us the connection typed as NetworkConnection, and the legacy-signature path cast it with as, which compares IL2CPP interop wrapper types rather than the native type and so produced null. The host then dropped every guest's Hello without logging anything, and with no peer registered it never broadcast state. Uses TryCast now, and a Hello that still arrives without a connection says so in the log instead of vanishing.

    Only reachable with two machines: a solo host never sends itself a Hello, so no amount of single-machine testing could have hit it.

1.0.1

Comfort tweaks for actually sitting and watching something, rather than standing in front of a screen fighting the game's idle handling.

Added

  • Comfort.KeepAwake, which holds off the game's idle sleep - the dimming that creeps in when you stand still - while a video is playing and you are within Comfort.KeepAwakeRadius (15 m) of the screen. Sleep still works normally away from the screen. Set it to Always to hold it off for the whole lobby, or Off for stock behaviour. Local only: it resets your own idle timer and changes nothing for other players.
  • Comfort.HideCrosshair, which takes the crosshair off the picture once you have stood still for Comfort.HideCrosshairDelaySeconds (5 s), and brings it back the instant you move or look around. Same conditions as KeepAwake: only in front of a playing screen, and only within Comfort.KeepAwakeRadius. Set the delay to 0 to follow the game's own sleep timer instead.

1.0.0 - alpha

First version verified end to end in game: a YouTube link plays on a shared screen with positional audio, driven from an in-world control podium.

Added

  • In-world control console beside the screen: skip back/forward 10 s, play/pause, and a paste bar that loads whatever YouTube link is on the clipboard. Aimed at and pressed with the game's own interact button, on mouse or controller.
  • Status lamp on the console: grey idle, amber while resolving, green ready, red failed. Colour is the only feedback channel available - the mod ships no font.
  • Screen positioning from the panel: raise/lower, and slide left/right/forward/back along the screen's own axes. Placement is remembered across restarts.
  • YtDlp.CookiesFromBrowser, for when YouTube blocks anonymous requests with "Sign in to confirm you're not a bot".

Changed

  • Audio falls off as 1/distance rescaled to reach silence at MaxDistance, instead of linear. Standing 4 m from the screen was previously 97% of full volume.
  • Guests with the mod can control playback by default.

Known limitations

  • YouTube serves only one muxed format to the client yt-dlp can still reach, so playback is capped at 360p. Higher resolutions are separate video and audio streams, which Unity's VideoPlayer cannot take. Lifting this needs the ffmpeg backend in docs/ARCHITECTURE.md.
  • Two modded players staying in sync has not been tested; there has only ever been one machine. See milestone 3 in docs/HANDOFF.md.

0.1.0 (unreleased)

  • Initial scaffold: BepInEx 6 IL2CPP plugin, Mirror-based sync channel, yt-dlp resolver, Unity VideoPlayer backend, in-world screen with positional audio, IMGUI control panel.
  • Not yet verified in-game. See docs/PLAYTEST.md.