diff --git a/src/main.odin b/src/main.odin new file mode 100644 index 0000000..eed22be --- /dev/null +++ b/src/main.odin @@ -0,0 +1,121 @@ +package hanabi + +import "core:fmt" +import "core:math/rand" +import "core:net" +import "core:os" + +COLORS :: enum { + RED, + GREEN, + WHITE, + BLUE, + YELLOW, + RAINBOW, +} + +Card :: struct { + value: u8, + color: COLORS, +} + +VALUES: []u8 : {1, 1, 1, 2, 2, 3, 3, 4, 4, 5} + +Player :: struct { + hand: [dynamic]Card, +} + +Game :: struct { + num_players: u8, + hint_tokens: u8, + lives_left: u8, + players: [dynamic]Player, + deck: [dynamic]Card, +} + +hand_size :: proc(s: Game) -> int { + return s.num_players <= 3 ? 5 : 4 +} + +create_deck :: proc() -> (deck: [dynamic]Card) { + for c in COLORS { + for v in VALUES { + append(&deck, Card{v, c}) + } + } + rand.shuffle(deck[:]) + return +} + +create_player :: proc(s: ^Game) -> (p: Player) { + for i in 0 ..< hand_size(s^) { + append(&p.hand, pop(&s.deck)) + } + return +} + +create_game :: proc(hint_tokens, lives_left, num_players: u8) -> (s: Game) { + assert(num_players > 1 && num_players < 6) + s.hint_tokens = hint_tokens + s.lives_left = lives_left + s.deck = create_deck() + for i in 0 ..< num_players { + append(&s.players, create_player(&s)) + } + return +} + +print_game :: proc(s: Game) { + for p in s.players { + fmt.println("---") + for c in p.hand { + fmt.println(c.value, c.color) + } + } + // fmt.println("---") + // for c in s.deck { + // fmt.println(c.value, c.color) + // } + // fmt.println("---") + // fmt.println(len(s.deck)) +} + +Comm_World :: struct { + sockets: [dynamic]net.TCP_Socket, +} + +create_socket :: proc(addr_str: string) -> (net.TCP_Socket, bool) { + addr, endpoint_ok := net.parse_endpoint(addr_str) + if !endpoint_ok { + fmt.eprintln("failed to parse endpoint") + return 0, false + } + sock, dial_error := net.listen_tcp(addr) + if dial_error != nil { + fmt.eprintln(addr_str, dial_error) + return 0, false + } + return sock, true +} + +create_comm_world :: proc(addresses: []string) -> (comm: Comm_World) { + for addr_str in addresses { + sock, ok := create_socket(addr_str) + if !ok do panic(fmt.tprintfln("%s: failed to create socket", addr_str)) + append(&comm.sockets, sock) + } + return +} + +main :: proc() { + game := create_game(8, 3, 3) + print_game(game) + + if len(os.args) > 1 { + comm := create_comm_world(os.args[1:]) + fmt.println(comm.sockets) + } else { + fmt.eprintln("usage: [p3] [p4] [p5]") + } +} +