diff --git a/src/client.odin b/src/client.odin index f715c5a..749d8fe 100644 --- a/src/client.odin +++ b/src/client.odin @@ -1,7 +1,10 @@ package hanabi +import "core:bufio" import "core:fmt" +import "core:mem" import "core:net" +import "core:os" Client_View :: struct { num_players: int, @@ -56,18 +59,29 @@ render_view :: proc(view: Client_View) { } } - run_client :: proc(host_addr: net.Endpoint) { serv, list_err := net.dial_tcp(host_addr) if list_err != nil do panic(fmt.tprintln("failed to dial:", net.to_string(host_addr))) defer net.close(serv) - pl := recv_payload(serv, context.temp_allocator) - fmt.println("received payload") + scanner: bufio.Scanner + bufio.scanner_init(&scanner, os.stream_from_handle(os.stdin), context.temp_allocator) - view := create_view(pl, context.temp_allocator) - render_view(view) - - free_all(context.temp_allocator) + LISTEN: for { + msg_header: Msg_Type + net.recv(serv, mem.ptr_to_bytes(&msg_header)) + switch msg_header { + case .Poke: + fmt.println("action:") + bufio.scanner_scan(&scanner) + action := bufio.scanner_text(&scanner) + net.send(serv, transmute([]byte)action) + case .State_Update: + pl := recv_payload(serv, context.temp_allocator) + view := create_view(pl, context.temp_allocator) + render_view(view) + } + free_all(context.temp_allocator) + } } diff --git a/src/server.odin b/src/server.odin index 42d701e..079ac85 100644 --- a/src/server.odin +++ b/src/server.odin @@ -2,6 +2,7 @@ package hanabi import "core:fmt" import "core:math/rand" +import "core:mem" import "core:net" Comm_World :: struct { @@ -49,7 +50,14 @@ create_payload :: proc(g: Game, player: int, allocator := context.allocator) -> return {u8(g.num_players), u8(g.hint_tokens), u8(g.lives_left), u8(len(cards)), cards[:]} } +Msg_Type :: enum u8 { + State_Update, + Poke, +} + send_payload :: proc(sock: net.TCP_Socket, pl: Payload) -> net.Network_Error { + header := Msg_Type.State_Update + net.send(sock, mem.ptr_to_bytes(&header)) data: [dynamic]u8 defer delete(data) append(&data, pl.num_players, pl.num_hints, pl.num_lives, pl.num_cards) @@ -58,8 +66,10 @@ send_payload :: proc(sock: net.TCP_Socket, pl: Payload) -> net.Network_Error { return nil } -poke_player :: proc(player: int) -> bool { - unimplemented() +send_poke :: proc(sock: net.TCP_Socket) -> net.Network_Error { + header := Msg_Type.Poke + net.send(sock, mem.ptr_to_bytes(&header)) or_return + return nil } Play_Action :: distinct Card @@ -72,7 +82,7 @@ Action :: union { Hint_Action, } -receive_action :: proc(player: int) -> (action: Action, is_valid: bool) { +receive_action :: proc(player: net.TCP_Socket) -> (action: Action, is_valid: bool) { unimplemented() } @@ -80,7 +90,6 @@ perform_action :: proc(game: ^Game, action: Action) { unimplemented() } - run_server :: proc(listen_addr: net.Endpoint, num_players: int, num_hints: int, num_lives: int) { listener, list_err := net.listen_tcp(listen_addr) if list_err != nil do panic(fmt.tprintln("failed to listen:", net.to_string(listen_addr))) @@ -116,9 +125,9 @@ run_server :: proc(listen_addr: net.Endpoint, num_players: int, num_hints: int, action: Action POKE: for { - poke_ok := poke_player(current_player) - if !poke_ok do panic(fmt.tprintln("failed to poke player", current_player)) - action, is_valid := receive_action(current_player) + poke_err := send_poke(w.sockets[current_player]) + if poke_err != nil do panic(fmt.tprintfln("failed to poke player %d; %s", current_player, poke_err)) + action, is_valid := receive_action(w.sockets[current_player]) if is_valid do break POKE fmt.println("invalid action received. try again.") }