The pod can now run entirely over the relay: one outbound TCP connection
carries both the console protocol (egg/launch) and all game traffic
(envelope-multiplexed), so internet play works behind NAT with no port
forwarding. All new code is behind 'if (relayMode)' (BT_RELAY unset => mesh
mode byte-for-byte untouched; verified un-regressed).
Env gates (parsed once in the ctor, after WSAStartup so gethostbyname works):
- BT_RELAY=<host>:<consolePort> (host may be a DNS name; game port = +1)
- BT_SELF=<exact [pilots] entry> (NIC matching can't identify us across NAT)
L4NET changes:
- CreateConsoleHost: relay branch dials OUT to the relay console port
(bounded retry; console-less continue on a re-dial) instead of listening.
- StartConnecting: relay self-match by BT_SELF string; peers become VIRTUAL
hosts (INVALID_SOCKET, NoNetworkConnectionStatus) flipped online by the
relay's PEER_UP; then ConnectRelayGame dials the game port + HELLOs. HostID
assignment / remoteHostCount / the connection gate / app ladder unchanged.
- CheckRelay (new): the receive seam -- drains {route,length} envelopes,
synthesizes HostConnected/Disconnected from PEER_UP/DOWN (same messages the
mesh accept path routes), returns game frames envelope-stripped (they
self-identify via NetworkPacketHeader.fromHost; consumers route by payload).
- Send: game-host traffic -> relay unicast envelope (console host excluded --
its legacy protocol is relay-TERMINATED, not routed).
- ExclusiveBroadcast: build ONCE, send ONCE with the broadcast route -- the
relay fans out, killing the mesh's (N-1)x upload duplication.
- RelaySendAll (new): partial-send-safe transmit (required on the multiplexed
socket -- a partial write would desync framing for all peers).
- CheckBuffers: polls CheckRelay first; skips recv on virtual game hosts.
- RelayGameDown: relay-loss synthesizes all-peers-disconnected (match
continues peer-less; pod never exits mid-match).
- Mode(): now STORES the reliable/unreliable mode (was ignored) for the UDP
phase's authentic mode+flag routing.
Verified 2-node localhost relay (MP_RELAY.EGG, tagged [pilots]):
- both pods reach 'All connections completed!' via PEER_UP, then
RunningMission; both mechs' MakeMessages cross the relay (paint x2 each) and
bidirectional 148-byte update records flow (net-tx/net-rx traces; relay
stats tcp rx==tx, registered [2,3]); cockpit/HUD render; no crashes.
- driving one node transmits pose/damage/death frames through the relay.
- mesh smoke (no BT_RELAY): 2-node session still forms + simulates unchanged.
Plan: ~/.claude/plans/partitioned-snuggling-piglet.md. Next: UDP channel.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
245 lines
7.6 KiB
Plaintext
245 lines
7.6 KiB
Plaintext
[mission]
|
|
adventure=BattleTech
|
|
map=cavern
|
|
scenario=freeforall
|
|
time=night
|
|
weather=clear
|
|
temperature=27
|
|
length=600
|
|
[ordinals]
|
|
bitmap=Ordinal::BitMap::1
|
|
bitmap=Ordinal::BitMap::2
|
|
bitmap=Ordinal::BitMap::3
|
|
bitmap=Ordinal::BitMap::4
|
|
[Ordinal::BitMap::1]
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=000038000003C000001FF00000000F00
|
|
bitmap=0000F8000003C000003FF80000000F00
|
|
bitmap=0001F8000003C00000707C0000000F00
|
|
bitmap=0001F8000003C00000603C0000000F00
|
|
bitmap=00007801FC0FF00000003C3DF807FF00
|
|
bitmap=00007803FE0FF00000003C3FFC0FFF00
|
|
bitmap=00007803C703C00000003C3E3C1F0F00
|
|
bitmap=000078078303C0000000783C1E1E0F00
|
|
bitmap=000078078003C0000000783C1E1E0F00
|
|
bitmap=00007807C003C0000000F03C1E1E0F00
|
|
bitmap=00007807F003C0000001E03C1E1E0F00
|
|
bitmap=00007803FC03C0000003C03C1E1E0F00
|
|
bitmap=00007801FE03C0000007803C1E1E0F00
|
|
bitmap=000078007F03C000000F003C1E1E0F00
|
|
bitmap=000078001F03C000001E003C1E1E0F00
|
|
bitmap=000078000F03C000003C003C1E1E0F00
|
|
bitmap=000078060F03C0000078003C1E1E0F00
|
|
bitmap=000078071E03E0000078003C1E1F1F00
|
|
bitmap=00007803FE01F000007FFC3C1E0FFF00
|
|
bitmap=00007801FC00F000007FFC3C1E07EF00
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
x=128
|
|
y=32
|
|
width=8
|
|
[Ordinal::BitMap::2]
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=001FFF0000003C0000003C03C0780000
|
|
bitmap=001FFF0000003C0000007C03C0780000
|
|
bitmap=00000E0000003C000000FC03C0780000
|
|
bitmap=00003C0000003C000001BC03C0780000
|
|
bitmap=0000700F3E1FFC000003BC0FF07BF000
|
|
bitmap=0001E00F7E3FFC0000073C0FF07FF800
|
|
bitmap=0003800FFE7C3C0000063C03C07C7800
|
|
bitmap=0007F80FFE783C00000C3C03C0783C00
|
|
bitmap=0007FE0F80783C0000183C03C0783C00
|
|
bitmap=00001E0F00783C0000383C03C0783C00
|
|
bitmap=00000F0F00783C0000703C03C0783C00
|
|
bitmap=00000F0F00783C00007FFF03C0783C00
|
|
bitmap=00000F0F00783C00007FFF03C0783C00
|
|
bitmap=00000F0F00783C0000003C03C0783C00
|
|
bitmap=00000F0F00783C0000003C03C0783C00
|
|
bitmap=00000F0F00783C0000003C03C0783C00
|
|
bitmap=00180F0F00783C0000003C03C0783C00
|
|
bitmap=001C1F0F007C7C0000003C03E0783C00
|
|
bitmap=000FFE0F003FFC0000003C01F0783C00
|
|
bitmap=0007FC0F001FBC0000003C00F0783C00
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
x=128
|
|
y=32
|
|
width=8
|
|
[Ordinal::BitMap::3]
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=001FFF03C07800000000FC03C0780000
|
|
bitmap=001FFF03C07800000003FC03C0780000
|
|
bitmap=001E0003C07800000007C003C0780000
|
|
bitmap=001E0003C0780000000F0003C0780000
|
|
bitmap=001E000FF07BF000000F000FF07BF000
|
|
bitmap=001E000FF07FF800001E000FF07FF800
|
|
bitmap=001E0003C07C7800001E0003C07C7800
|
|
bitmap=001FFC03C0783C00001EFC03C0783C00
|
|
bitmap=001FFE03C0783C00001FFE03C0783C00
|
|
bitmap=00001F03C0783C00001F1F03C0783C00
|
|
bitmap=00000F03C0783C00001E0F03C0783C00
|
|
bitmap=00000F03C0783C00001E0F03C0783C00
|
|
bitmap=00000F03C0783C00001E0F03C0783C00
|
|
bitmap=00000F03C0783C00001E0F03C0783C00
|
|
bitmap=00000F03C0783C00001E0F03C0783C00
|
|
bitmap=00000F03C0783C00001E0F03C0783C00
|
|
bitmap=00180F03C0783C00001E0F03C0783C00
|
|
bitmap=001C1F03E0783C00001F1F03E0783C00
|
|
bitmap=000FFE01F0783C00000FFE01F0783C00
|
|
bitmap=0007FC00F0783C000007FC00F0783C00
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
x=128
|
|
y=32
|
|
width=8
|
|
[Ordinal::BitMap::4]
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=001FFF03C07800000007FC03C0780000
|
|
bitmap=001FFF03C0780000000FFE03C0780000
|
|
bitmap=00000F03C0780000001F1F03C0780000
|
|
bitmap=00000F03C0780000001E0F03C0780000
|
|
bitmap=00000F0FF07BF000001E0F0FF07BF000
|
|
bitmap=00001F0FF07FF800001E0F0FF07FF800
|
|
bitmap=00001E03C07C7800001E0F03C07C7800
|
|
bitmap=00003E03C0783C00001E0F03C0783C00
|
|
bitmap=00003C03C0783C00000F1E03C0783C00
|
|
bitmap=00003C03C0783C000007FC03C0783C00
|
|
bitmap=00007803C0783C000007FC03C0783C00
|
|
bitmap=00007803C0783C00000F1E03C0783C00
|
|
bitmap=00007803C0783C00001E0F03C0783C00
|
|
bitmap=0000F003C0783C00001E0F03C0783C00
|
|
bitmap=0000F003C0783C00001E0F03C0783C00
|
|
bitmap=0000F003C0783C00001E0F03C0783C00
|
|
bitmap=0000F003C0783C00001E0F03C0783C00
|
|
bitmap=0000F003E0783C00000F1E03E0783C00
|
|
bitmap=0000F001F0783C00000FFE01F0783C00
|
|
bitmap=0000F000F0783C000007FC00F0783C00
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
x=128
|
|
y=32
|
|
width=8
|
|
[pilots]
|
|
pilot=10.99.0.1:1502
|
|
pilot=10.99.0.2:1502
|
|
[10.99.0.1:1502]
|
|
hostType=0
|
|
advancedDamage=1
|
|
loadzones=1
|
|
name=Aeolus
|
|
bitmapindex=1
|
|
experience=expert
|
|
badge=VGL
|
|
patch=Yellow
|
|
role=Role::Default
|
|
dropzone=one
|
|
vehicle=bhk1
|
|
vehicleValue=1000
|
|
color=White
|
|
[10.99.0.2:1502]
|
|
hostType=0
|
|
advancedDamage=1
|
|
loadzones=1
|
|
name=Boreas
|
|
bitmapindex=2
|
|
experience=expert
|
|
badge=VGL
|
|
patch=Yellow
|
|
role=Role::Default
|
|
dropzone=one
|
|
vehicle=madcat
|
|
vehicleValue=1000
|
|
color=Crimson
|
|
[largebitmap]
|
|
bitmap=BitMap::Large::Aeolus
|
|
[BitMap::Large::Aeolus]
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=000003FE0000000001E0000000000000
|
|
bitmap=000007FF0000000001E0000000000000
|
|
bitmap=00000F8F8000000001E0000000000000
|
|
bitmap=00000F078000000001E0000000000000
|
|
bitmap=00000F0781FF00FF81E0F0781FC00000
|
|
bitmap=00000F0783FF81FFC1E0F0783FE00000
|
|
bitmap=00000F0787C7C3E3E1E0F0783C700000
|
|
bitmap=00000F078783C3C1E1E0F07878300000
|
|
bitmap=00000F078783C3C1E1E0F07878000000
|
|
bitmap=00000FFF8783C3C1E1E0F0787C000000
|
|
bitmap=00000FFF8783C3C1E1E0F0787F000000
|
|
bitmap=00000F0787FFC3C1E1E0F0783FC00000
|
|
bitmap=00000F0787FFC3C1E1E0F0781FE00000
|
|
bitmap=00000F07878003C1E1E0F07807F00000
|
|
bitmap=00000F07878003C1E1E0F07801F00000
|
|
bitmap=00000F07878003C1E1E0F07800F00000
|
|
bitmap=00000F078780C3C1E1E0F07860F00000
|
|
bitmap=00000F0787C1C3E3E1E078F871E00000
|
|
bitmap=00000F0783FF81FFC1E07FF83FE00000
|
|
bitmap=00000F0781FF00FF81E03F781FC00000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
x=128
|
|
y=32
|
|
width=8
|
|
[smallbitmap]
|
|
bitmap=BitMap::Small::Aeolus
|
|
[BitMap::Small::Aeolus]
|
|
bitmap=00000000000000000000000000000000
|
|
bitmap=0000000000000000003E00000C000000
|
|
bitmap=006300000C00000000631F0F8CC63C00
|
|
bitmap=00633198CCC66200007F3198CCC66000
|
|
bitmap=00633F98CCC6780000633018CCC61E00
|
|
bitmap=00633018CCC6060000633098CCC64600
|
|
bitmap=00631F0F8C7E3C000000000000000000
|
|
bitmap=00000000000000000000000000000000
|
|
x=64
|
|
y=16
|
|
width=4
|
|
[Role::Default]
|
|
model=dfltrole
|
|
[Role::NoReturn]
|
|
model=noretun
|