#!/usr/bin/env python3
"""
Game Server Guide Generator
Generates comprehensive host-agnostic server guides for all games in CSV.
"""
import csv
import re
import os
from pathlib import Path
class GameGuideGenerator:
def __init__(self):
self.csv_path = "all_hostable_games_union.csv"
self.docs_dir = Path("docs/games")
# Game engine mappings for specific content generation
self.engine_mapping = {
# Source Engine games
'counter-strike': 'Source',
'counter-strike-2': 'Source 2',
'counter-strike-global-offensive': 'Source',
'counter-strike-source': 'Source',
'counter-strike-condition-zero': 'GoldSrc',
'team-fortress-2': 'Source',
'left-4-dead-2': 'Source',
'half-life-2-deathmatch': 'Source',
'garry-s-mod': 'Source',
'day-of-defeat-source': 'Source',
# Unreal Engine games
'ark-survival-evolved': 'Unreal Engine 4',
'ark-survival-ascended': 'Unreal Engine 5',
'squad': 'Unreal Engine 4',
'mordhau': 'Unreal Engine 4',
'hell-let-loose': 'Unreal Engine 4',
'conan-exiles': 'Unreal Engine 4',
# Unity games
'rust': 'Unity',
'7-days-to-die': 'Unity',
'hurtworld': 'Unity',
'unturned': 'Unity',
'valheim': 'Unity',
# Arma/Real Virtuality
'arma-3': 'Real Virtuality 4',
'arma-2': 'Real Virtuality 3',
'arma-2-operation-arrowhead': 'Real Virtuality 3',
'arma-reforger': 'Enfusion',
'dayz': 'Enfusion',
'dayz-mod-for-arma2co': 'Real Virtuality 3',
# Java games
'minecraft': 'Java',
# Other engines
'factorio': 'Custom',
'terraria': 'XNA/MonoGame',
'space-engineers': 'VRAGE 2.0',
}
def slugify(self, name):
"""Convert game name to slug format"""
slug = re.sub(r'[^a-zA-Z0-9]+', '-', name.lower())
return slug.strip('-')
def read_games_from_csv(self):
"""Read all games from CSV file"""
games = []
with open(self.csv_path, 'r') as f:
reader = csv.reader(f)
for i, row in enumerate(reader):
if i == 0 or not row or row[0] == 'Game': # Skip header
continue
game_name = row[0].strip()
if game_name and not game_name.startswith('#'):
games.append(game_name)
return games
def get_engine_for_game(self, slug):
"""Get game engine for specific content generation"""
return self.engine_mapping.get(slug, 'Unknown')
def generate_startup_parameters(self, game_name, slug, engine):
"""Generate game-specific startup parameters"""
if engine == 'Source':
return self.generate_source_startup(game_name, slug)
elif engine == 'Source 2':
return self.generate_source2_startup(game_name, slug)
elif engine == 'GoldSrc':
return self.generate_goldsrc_startup(game_name, slug)
elif 'Unreal' in engine:
return self.generate_unreal_startup(game_name, slug)
elif engine == 'Unity':
return self.generate_unity_startup(game_name, slug)
elif 'Real Virtuality' in engine or engine == 'Enfusion':
return self.generate_arma_startup(game_name, slug)
elif engine == 'Java' and 'minecraft' in slug:
return self.generate_minecraft_startup(game_name, slug)
else:
return self.generate_generic_startup(game_name, slug)
def generate_source_startup(self, game_name, slug):
"""Source engine specific startup parameters"""
game_dir = slug.replace('-', '')
if 'counter-strike' in slug:
game_dir = 'cstrike' if 'source' not in slug else 'cstrike'
elif 'team-fortress' in slug:
game_dir = 'tf'
elif 'left-4-dead' in slug:
game_dir = 'left4dead2'
elif 'garry' in slug:
game_dir = 'garrysmod'
elif 'day-of-defeat' in slug:
game_dir = 'dod'
elif 'half-life' in slug:
game_dir = 'hl2mp'
return f"""**Default command line**
```bash
srcds_run -game {game_dir} -console -usercon +hostport 27015 +map de_dust2 +maxplayers 16 +exec server.cfg
```
**Parameters (exhaustive, server-relevant only)**
- `-game
` — Game directory. Required.
- `-console` — Enable server console output.
- `-usercon` — Enable user console commands.
- `+hostport ` — Server port (UDP). Default: 27015.
- `+ip ` — Bind to specific IP address.
- `+map ` — Starting map. Required.
- `+maxplayers ` — Maximum players (1-64).
- `+exec ` — Execute config file on startup.
- `+sv_setsteamaccount ` — Game Server Login Token for public servers.
- `+rcon_password ` — RCON password for remote administration.
- `+sv_password ` — Server password for private games.
- `+hostname ` — Server name in browser.
- `+sv_lan <0|1>` — LAN mode (0=Internet, 1=LAN only).
- `-tickrate ` — Server tickrate (default: 66, competitive: 128).
- `-port ` — Alternative syntax for hostport.
- `-nohltv` — Disable SourceTV.
- `+tv_enable <0|1>` — Enable/disable SourceTV.
- `+tv_port ` — SourceTV port (default: hostport + 5).
- `-secure` — Enable VAC (Valve Anti-Cheat).
- `-insecure` — Disable VAC (for testing only).
- `+sv_region ` — Server region (255=world, 0-7=specific regions).
- `+fps_max ` — Server FPS limit.
- `-threads ` — Number of worker threads.
- `-norestart` — Don't restart server on crash.
- `+log ` — Enable/disable logging.
- `-condebug` — Log console output to file.
- `+sv_logfile <0|1>` — Enable server logging.
- `+sv_logflush <0|1>` — Flush logs immediately.
**Ports**
- Game: UDP **27015** (primary)
- RCON: TCP **27015** (same as game port)
- SourceTV: UDP **27020** (game port + 5)
- Steam Query: UDP **27016** (game port + 1)"""
def generate_source2_startup(self, game_name, slug):
"""Source 2 engine (CS2) specific startup parameters"""
return f"""**Default command line**
```bash
cs2 -dedicated +map de_dust2 +maxplayers 10 +sv_setsteamaccount YOUR_GSLT +game_type 0 +game_mode 1
```
**Parameters (exhaustive, server-relevant only)**
- `-dedicated` — Run as dedicated server.
- `+map ` — Starting map. Required.
- `+maxplayers ` — Maximum players (2-64).
- `+sv_setsteamaccount ` — Game Server Login Token. Required for public servers.
- `+game_type ` — Game type (0=Classic Casual, 1=Classic Competitive).
- `+game_mode ` — Game mode (0=Casual, 1=Competitive, 2=Wingman, 3=Arms Race, 4=Demolition).
- `+hostname ` — Server name in browser.
- `+sv_password ` — Server password.
- `+rcon_password ` — RCON password.
- `-port ` — Server port. Default: 27015.
- `-ip ` — Bind IP address.
- `+sv_lan <0|1>` — LAN mode.
- `+exec ` — Execute config file.
- `-usercon` — Enable user console.
- `-console` — Enable console output.
- `+sv_region ` — Server region.
- `+sv_cheats <0|1>` — Enable cheats (for practice).
- `+mp_autokick <0|1>` — Auto-kick idle players.
- `+mp_autoteambalance <0|1>` — Auto team balance.
- `+sv_logfile <0|1>` — Enable logging.
- `-tickrate ` — Server tickrate (64 or 128).
**Ports**
- Game: UDP **27015** (primary)
- RCON: TCP **27015** (same as game port)
- Steam Query: UDP **27016** (game port + 1)
- GOTV: UDP **27020** (game port + 5)"""
def generate_goldsrc_startup(self, game_name, slug):
"""GoldSrc engine (CS 1.6, etc.) specific startup parameters"""
return f"""**Default command line**
```bash
hlds_run -game cstrike -port 27015 +map de_dust2 +maxplayers 16 +sv_lan 0 -pingboost 3 -sys_ticrate 1000
```
**Parameters (exhaustive, server-relevant only)**
- `-game ` — Game directory (cstrike, valve, etc.).
- `-port ` — Server port. Default: 27015.
- `+map ` — Starting map.
- `+maxplayers ` — Maximum players (1-32).
- `+sv_lan <0|1>` — LAN mode.
- `+rcon_password ` — RCON password.
- `+sv_password ` — Server password.
- `+hostname ` — Server name.
- `+exec ` — Execute config file.
- `-pingboost <1|2|3>` — Performance optimization (Linux).
- `-sys_ticrate ` — Server FPS (Linux, default: 100).
- `-secure` — Enable VAC.
- `-insecure` — Disable VAC.
- `-noipx` — Disable IPX networking.
- `-norestart` — Don't restart on crash.
- `+log ` — Enable logging.
- `-condebug` — Console debug logging.
- `+sv_region ` — Server region.
- `-zone ` — Memory allocation.
- `-heapsize ` — Heap size in kilobytes.
**Ports**
- Game/Query: UDP **27015** (primary)
- RCON: TCP **27015** (same as game port)
- HLTV: UDP **27020** (if enabled)"""
def generate_unreal_startup(self, game_name, slug):
"""Unreal Engine specific startup parameters"""
if 'ark' in slug:
return self.generate_ark_startup(game_name, slug)
elif 'squad' in slug:
return self.generate_squad_startup(game_name, slug)
elif 'conan' in slug:
return self.generate_conan_startup(game_name, slug)
else:
return self.generate_generic_unreal_startup(game_name, slug)
def generate_ark_startup(self, game_name, slug):
"""ARK specific startup parameters"""
executable = "ArkAscendedServer.exe" if "ascended" in slug else "ShooterGameServer.exe"
return f"""**Default command line**
```bash
{executable} TheIsland?listen?SessionName="My ARK Server"?ServerPassword=""?ServerAdminPassword="adminpass"?Port=7777?QueryPort=27015?MaxPlayers=70
```
**Parameters (exhaustive, server-relevant only)**
- Map name (TheIsland, Ragnarok, Extinction, etc.) — Starting map.
- `?listen` — Enable server listening.
- `?SessionName=""` — Server name in browser.
- `?ServerPassword=""` — Server password.
- `?ServerAdminPassword=""` — Admin password.
- `?Port=` — Game port. Default: 7777.
- `?QueryPort=` — Query port. Default: 27015.
- `?MaxPlayers=` — Maximum players (1-200).
- `?PVE=` — PvE mode.
- `?RCONEnabled=` — Enable RCON.
- `?RCONPort=` — RCON port.
- `?DifficultyOffset=<0.0-1.0>` — Difficulty level.
- `?OverrideOfficialDifficulty=<1.0-10.0>` — Override difficulty.
- `?TamingSpeedMultiplier=<1.0+>` — Taming speed.
- `?XPMultiplier=<1.0+>` — Experience multiplier.
- `?HarvestAmountMultiplier=<1.0+>` — Harvest amount.
- `?AllowFlyerCarryPvE=` — Allow flyer carry in PvE.
- `?AlwaysAllowStructurePickup=` — Allow structure pickup.
- `?BattlEye=` — Enable BattlEye anti-cheat.
- `-log` — Enable logging.
- `-NoHangDetection` — Disable hang detection.
- `-UseDynamicConfig` — Use dynamic configuration.
- `-ConfigSubDir=` — Config subdirectory.
**Ports**
- Game: UDP **7777** (primary)
- Query: UDP **27015** (Steam query)
- RCON: TCP **27020** (if enabled)
- Raw UDP: UDP **7778** (game port + 1)"""
def generate_squad_startup(self, game_name, slug):
"""Squad specific startup parameters"""
return f"""**Default command line**
```bash
SquadGameServer.exe Port=7787 QueryPort=27165 RCON=21114 FIXEDMAXPLAYERS=80 RANDOM=NONE
```
**Parameters (exhaustive, server-relevant only)**
- `Port=` — Game port. Default: 7787.
- `QueryPort=` — Steam query port. Default: 27165.
- `RCON=` — RCON port. Default: 21114.
- `FIXEDMAXPLAYERS=` — Maximum players (1-100).
- `RANDOM=` — Random map selection.
- `FIXEDVRFILLTHRESHOLD=` — VR fill threshold.
- `FIXEDMAXTICKRATE=` — Maximum tick rate.
**Ports**
- Game: UDP **7787** (primary)
- Query: UDP **27165** (Steam query)
- RCON: TCP **21114** (administration)"""
def generate_conan_startup(self, game_name, slug):
"""Conan Exiles specific startup parameters"""
return f"""**Default command line**
```bash
ConanSandboxServer.exe -log -Port=7777 -QueryPort=27015 -MaxPlayers=40
```
**Parameters (exhaustive, server-relevant only)**
- `-log` — Enable logging.
- `-Port=` — Game port. Default: 7777.
- `-QueryPort=` — Query port. Default: 27015.
- `-MaxPlayers=` — Maximum players (1-40).
- `-ServerName=""` — Server name.
- `-ServerPassword=""` — Server password.
- `-AdminPassword=""` — Admin password.
- `-RconEnabled=` — Enable RCON.
- `-RconPort=` — RCON port.
- `-RconPassword=""` — RCON password.
**Ports**
- Game: UDP **7777** (primary)
- Query: UDP **27015** (Steam query)
- RCON: TCP **25575** (if enabled)"""
def generate_generic_unreal_startup(self, game_name, slug):
"""Generic Unreal Engine startup parameters"""
return f"""**Default command line**
```bash
{game_name}Server.exe -log -Port=7777 -QueryPort=27015
```
**Parameters (common Unreal server flags)**
- `-log` — Enable logging.
- `-Port=` — Game port.
- `-QueryPort=` — Steam query port.
- `-MaxPlayers=` — Maximum players.
- `-ServerName=""` — Server name.
- `-ServerPassword=""` — Server password.
**Ports**
- Game: UDP **7777** (typical)
- Query: UDP **27015** (Steam query)"""
def generate_unity_startup(self, game_name, slug):
"""Unity engine specific startup parameters"""
if 'rust' in slug:
return self.generate_rust_startup(game_name, slug)
elif '7-days' in slug:
return self.generate_7dtd_startup(game_name, slug)
elif 'valheim' in slug:
return self.generate_valheim_startup(game_name, slug)
else:
return self.generate_generic_unity_startup(game_name, slug)
def generate_7dtd_startup(self, game_name, slug):
"""7 Days to Die specific startup parameters"""
return f"""**Default command line**
```bash
7DaysToDieServer.exe -configfile=serverconfig.xml -quit -batchmode -nographics -dedicated
```
**Parameters (exhaustive, server-relevant only)**
- `-configfile=` — Server configuration XML file.
- `-quit` — Quit after completing operations.
- `-batchmode` — Run in batch mode without GUI.
- `-nographics` — Disable graphics rendering.
- `-dedicated` — Run as dedicated server.
- `-logfile ` — Log file location.
- `-UserDataFolder=` — User data directory.
- `-SaveGameFolder=` — Save game directory.
- `-configfile=` — Configuration file path.
**Ports**
- Game: UDP **26900** (primary)
- Steam Query: UDP **26901** (game port + 1)
- Web Control Panel: TCP **8080** (if enabled)
- Telnet: TCP **8081** (if enabled)"""
def generate_valheim_startup(self, game_name, slug):
"""Valheim specific startup parameters"""
return f"""**Default command line**
```bash
valheim_server.exe -name "My Server" -port 2456 -world "Dedicated" -password "secret" -public 1
```
**Parameters (exhaustive, server-relevant only)**
- `-name ""` — Server name visible in browser.
- `-port ` — Server port. Default: 2456.
- `-world ""` — World name to load/create.
- `-password ""` — Server password.
- `-public <0|1>` — Advertise on public server list.
- `-savedir ""` — Save directory location.
- `-logFile ""` — Log file location.
- `-saveinterval ` — World save interval.
- `-backups ` — Number of world backups to keep.
- `-backupshort ` — Short interval backup count.
- `-backuplong ` — Long interval backup count.
- `-crossplay` — Enable crossplay between platforms.
**Ports**
- Game: UDP **2456** (primary)
- Steam Query: UDP **2457** (game port + 1)
- Additional: UDP **2458** (game port + 2)"""
def generate_generic_unity_startup(self, game_name, slug):
"""Generic Unity engine startup parameters"""
return f"""**Default command line**
```bash
{slug}_server.exe -batchmode -nographics -dedicated -port 27015
```
**Parameters (common Unity server flags)**
- `-batchmode` — Run without GUI.
- `-nographics` — Disable graphics rendering.
- `-dedicated` — Dedicated server mode.
- `-port ` — Server port.
- `-logFile ` — Log file location.
- `-quit` — Quit after operations complete.
**Ports**
- Game: UDP **27015** (typical)
- Query: UDP **27016** (game port + 1)"""
def generate_rust_startup(self, game_name, slug):
"""Rust specific startup parameters"""
return f"""**Default command line**
```bash
RustDedicated.exe -batchmode -nographics +server.port 28015 +server.identity "my_server" +server.hostname "My Rust Server" +server.maxplayers 100 +server.worldsize 4000 +server.seed 1234567
```
**Parameters (exhaustive, server-relevant only)**
- `-batchmode` — Run in batch mode (no graphics).
- `-nographics` — Disable graphics rendering.
- `+server.port ` — Server port. Default: 28015.
- `+server.identity ""` — Server identity folder name.
- `+server.hostname ""` — Server name in browser.
- `+server.maxplayers ` — Maximum players (1-500).
- `+server.worldsize ` — World size (1000-8000).
- `+server.seed ` — World generation seed.
- `+server.level "