package hanabi import "core:flags" import "core:fmt" import "core:net" import "core:os" import "core:strings" USAGE :: `usage: hanabi [FLAGS] COMMAND can be one of the following, with args and FLAGS specified under: * connect (c) // server to connect to * host (h) // server to host on // between 2-5 --hints (-H) // number of hints (default=8) --lives (-l) // number of lives (default=3). try 1 for instant death difficulty! example: host $ hanabi host localhost:42069 2 --lives 1 -H 20 player 1 $ hanabi connect localhost:42069 player 2 $ hanabi c localhost:42069` Host_Args :: struct { addr: net.Host_Or_Endpoint `args:"pos=0,required" usage:"ip:port to host on"`, players: int `args:"pos=1,required" usage:"how many players (2-5)"`, hints: int `usage:"number of hints (default=8)"`, lives: int `usage:"number of lives (default=3). try 1 for instant death difficulty!"`, } Connect_Args :: struct { addr: net.Host_Or_Endpoint `args:"pos=0,required" usage:"ip:port to connect to"`, } resolve_endpoint :: proc(addr: net.Host_Or_Endpoint) -> (endpoint: net.Endpoint) { switch v in addr { case net.Endpoint: endpoint = v case net.Host: ep, err := net.resolve_ip4(v.hostname) if err != nil do panic(fmt.tprintln("failed to resolve endpoint", err)) endpoint = ep endpoint.port = v.port } return } main :: proc() { ok := false defer if !ok do fmt.println(USAGE) N := len(os.args) - 2 if N <= 0 do return // aliases args: [dynamic]string for a in os.args { switch a { case "-H": append(&args, "--hints") case "-l": append(&args, "--lives") case: append(&args, a) } } // COMMAND switch strings.to_lower(args[1]) { case "connect", "c": c: Connect_Args flags.parse(&c, args[2:], .Unix) endpoint := resolve_endpoint(c.addr) run_client(endpoint) case "host", "h": h: Host_Args h.hints = 8 h.lives = 3 flags.parse(&h, args[2:], .Unix) endpoint := resolve_endpoint(h.addr) run_server(endpoint, h.players, h.hints, h.lives) case: return } ok = true }