string.concat(^port, conv.format(port_buffer, "{}", (package runtime.vars).Game_Port));
}
- leave :: (_: rawptr) {
- array.free(^ip_addr);
- array.free(^port);
- }
-
join :: (_: rawptr) {
net_connect(ip_addr, ~~ conv.str_to_i64(port));
tx := (ww - 200) / 2;
ty := (wh - 160) / 2;
+ textbox_list_start();
draw_textbox(.{tx, ty+0, 200, 40}, ^ip_addr, "IP Address");
draw_textbox(.{tx, ty+40, 200, 40}, ^port, "Port");
draw_textbox(.{tx, ty+80, 200, 40}, ^name, "Name");
+ textbox_list_end();
if draw_button(.{tx, ty+120, 200, 40}, "Join") {
join(_);
Connecting_Menu :: struct {
- #persist font: Font
+ #persist font: Font;
+ #persist connection_timeout: f32;
init :: (_: rawptr) {
font = font_lookup(.{"./assets/fonts/calibri.ttf", 32});
net_set_on_connect_callback(.{ _, on_connect });
+
+ connection_timeout = 10.0f; // 10 second timeout
}
on_connect :: (_: rawptr) {
net_send_connect(name);
- array.free(^name); @HACK // This feels gross to free this down here.
+ }
+
+ leave :: (_: rawptr) {
+ array.free(^ip_addr);
+ array.free(^port);
+ array.free(^name);
}
update :: (_: rawptr, dt: f32) {
net_pulse();
+
+ connection_timeout -= dt;
+ if connection_timeout < 0 {
+ pop_game_state();
+ push_game_state(Connect_Menu, null);
+ }
}
draw :: (_: rawptr) {
animation_state := get_animation(hash);
mx, my := mouse_get_position();
+ textbox_tab_list << .{ hash, text_buffer.count };
+
border_width := theme.border_width;
text_color := theme.text_color;
text := str.{text_buffer.data, text_buffer.count};
case GLFW_KEY_ENTER {
result = .Enter_Pressed;
}
+
+ case GLFW_KEY_TAB {
+ if !inside_textbox_list do continue;
+ textbox_tab_pressed = true;
+ }
}
}
+//
+// Textbox-list (enables tabbing between textboxes)
+//
+#local {
+ inside_textbox_list := false;
+
+ Textbox_Tab_Field :: struct {
+ id: UI_Id;
+ char_count: u32;
+ }
+ #operator == macro (t1, t2: Textbox_Tab_Field) => t1.id == t2.id;
+
+ textbox_tab_list: [..] Textbox_Tab_Field;
+
+ textbox_tab_list_size: u32;
+ textbox_tab_pressed := false;
+}
+
+textbox_list_start :: () {
+ if inside_textbox_list do return;
+ inside_textbox_list = true;
+ array.clear(^textbox_tab_list);
+}
+
+textbox_list_end :: () {
+ inside_textbox_list = false;
+
+ if textbox_tab_pressed {
+ active_index := array.find(textbox_tab_list, .{active_item, 0});
+ new_index := (active_index + 1) % textbox_tab_list.count;
+
+ field := textbox_tab_list[new_index];
+ set_active_item(field.id);
+ textbox_editing_state.hash = field.id;
+ textbox_editing_state.cursor_position = field.char_count;
+ textbox_tab_pressed = false;
+ }
+}
+
+
+
//
// Checkboxes
send_chat_message(0, msg);
}
+ // Send a verify connect packet
msg := new(packets.Verify_Connect);
msg.type = .Verify_Connect;
msg.player_id = ~~next_player_id;
if it.type == .Disconnection {
printf("Disconnection from {}:{}\n", net.ipv4_to_str(it.peer.addr.addr), it.peer.addr.port);
+
+ for ^player: connected_players.entries {
+ if player.value.peer == it.peer {
+ map.delete(^connected_players, player.key);
+ break;
+ }
+ }
}
if it.type == .Message {