This commit is contained in:
2026-05-30 22:13:10 +02:00
parent d29d61cada
commit b1182e5488
2 changed files with 37 additions and 14 deletions
+21 -7
View File
@@ -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)
}
}
+16 -7
View File
@@ -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.")
}