wip
This commit is contained in:
+21
-7
@@ -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
@@ -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.")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user