Files
hanabi/src/client.odin
T
2026-05-25 13:59:48 +02:00

81 lines
1.8 KiB
Odin

package hanabi
import "core:fmt"
import "core:net"
Client_View :: struct {
num_hints: int,
num_lives: int,
players: []Player,
}
unpack_card :: proc(c: Bit_Card) -> Card {
return {value = c.value, color = c.color}
}
recv_payload :: proc(sock: net.TCP_Socket, allocator := context.allocator) -> Payload {
header: [3]byte
net.recv(sock, header[:])
num_cards := header[2]
body := make([]byte, num_cards)
net.recv(sock, body)
return {header[0], header[1], header[2], transmute([]Bit_Card)body}
}
num_players :: proc(num_cards: int) -> int {
switch num_cards {
case 5:
return 2
case 10:
return 3
case 12:
return 4
case 16:
return 5
case:
return -1
}
}
create_view :: proc(pl: Payload, allocator := context.allocator) -> Client_View {
n := num_players(int(pl.num_cards))
assert(n > 0)
players := make([]Player, n)
for i in 0 ..< n - 1 {
cards_per_hand := int(pl.num_cards) / (n - 1)
hand: [dynamic]Card
for c in 0 ..< cards_per_hand {
append(&hand, unpack_card(pl.cards[i * cards_per_hand + c]))
}
players[i].hand = hand
}
return {num_hints = int(pl.num_hints), num_lives = int(pl.num_lives), players = players}
}
render_view :: proc(view: Client_View) {
fmt.println("number of hints left:", view.num_hints)
fmt.println("number of lives left:", view.num_lives)
for p in view.players {
fmt.println()
for c in p.hand {
fmt.println(c.value, c.color)
}
}
}
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")
view := create_view(pl, context.temp_allocator)
render_view(view)
free_all(context.temp_allocator)
}