class_name GameOpts extends RefCounted ## Process-wide options parsed from the command line. ## ## These are per-machine settings and must never affect the simulation -- if a ## value would change how the world evolves, it belongs in [SimConfig] so server ## and client cannot disagree about it. static var is_server: bool = false static var port: int = Protocol.DEFAULT_PORT static var host_address: String = "127.0.0.1" static var player_name: String = "player" ## Replaces keyboard input with a scripted loop so CI can play the game with no ## display. See `tools/smoke.sh`. static var bot_client: bool = false ## Quit after this many physics ticks. 0 = run forever. static var autoquit_ticks: int = 0 ## Skip the menu and connect straight away. Implied by --bot. static var autojoin: bool = false ## Bot harness only: gracefully disconnect after this many ticks inside a ## dungeon, the way the in-game menu's "Disconnect" button does. Lets the smoke ## test cover the clean-exit path as well as a hard kill -- both must be caught ## by the same server-side escape channel. static var bot_leave_after: int = 0 ## Skip the menu and start a listen server (host + local player). static var listen: bool = false ## Server-side dev switch: new dungeons open straight onto the boss, skipping ## the trash waves. For iterating on a pattern without clearing two waves first. static var boss_rush: bool = false ## Dev switch: depth of newly opened dungeons, which drives map size. Depth ## progression is a later-stage concern; this makes big maps testable now. static var dungeon_depth: int = 1 ## Override the local account id. Two clients on one machine would otherwise ## read the same user:// id file, land on the same account, and fight over one ## roster of characters -- which is exactly what the smoke test does. A real ## identity provider makes this unnecessary. static var account_override: int = 0 ## Where the server keeps characters. Overridable so a test run cannot read or ## write the characters someone is actually playing -- and so repeated runs ## start from a known state instead of resuming each other's progress. static var store_path: String = CharacterStore.SAVE_PATH static var parsed: bool = false static func parse(argv: PackedStringArray = PackedStringArray()) -> void: if argv.is_empty(): argv = OS.get_cmdline_user_args() var i := 0 while i < argv.size(): match argv[i]: "--server": is_server = true "--bot": bot_client = true autojoin = true "--join": autojoin = true "--leave-after": i += 1 if i < argv.size(): bot_leave_after = int(argv[i]) "--listen": listen = true "--boss-rush": boss_rush = true "--account": i += 1 if i < argv.size(): account_override = int(argv[i]) "--store": i += 1 if i < argv.size(): store_path = argv[i] "--depth": i += 1 if i < argv.size(): dungeon_depth = int(argv[i]) "--port": i += 1 if i < argv.size(): port = int(argv[i]) "--host": i += 1 if i < argv.size(): host_address = argv[i] "--name": i += 1 if i < argv.size(): player_name = argv[i] "--autoquit": i += 1 if i < argv.size(): autoquit_ticks = int(argv[i]) "--verbose": GameLog.min_level = GameLog.Level.DEBUG "--quiet": GameLog.min_level = GameLog.Level.WARN i += 1 GameLog.role_tag = "server" if is_server else "client" parsed = true