81 lines
1.8 KiB
Odin
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)
|
|
}
|
|
|