From 96ff8492f923b0c118f9089b1218c4edd8bdfcd1 Mon Sep 17 00:00:00 2001 From: Lexi Quinn Date: Tue, 13 Jun 2023 00:59:02 +1000 Subject: [PATCH] fixed that turn rotation bug, added spectator cam, started work on new client mechanics --- Assets/bad_pip.png | Bin 0 -> 516 bytes Assets/bad_pip.png.import | 34 +++++++ Assets/good_pip.png | Bin 0 -> 516 bytes Assets/good_pip.png.import | 34 +++++++ Assets/medium_pip.png | Bin 0 -> 516 bytes Assets/medium_pip.png.import | 34 +++++++ Assets/task.png | Bin 3640 -> 3850 bytes Scenes/client_card.tscn | 69 +++++++++++++- Scenes/client_editor.tscn | 1 + Scenes/human_player.tscn | 84 +++++++++++++++++- Scenes/worker_editor.tscn | 1 + .../PlayerStateMachine/human_controller.gd | 37 +++++++- .../PlayerStateMachine/player_controller.gd | 37 +++++++- Scripts/card_crafter.gd | 4 +- Scripts/client.gd | 31 ++++++- Scripts/client_card_crafter.gd | 3 + Scripts/game.gd | 5 ++ 17 files changed, 364 insertions(+), 10 deletions(-) create mode 100644 Assets/bad_pip.png create mode 100644 Assets/bad_pip.png.import create mode 100644 Assets/good_pip.png create mode 100644 Assets/good_pip.png.import create mode 100644 Assets/medium_pip.png create mode 100644 Assets/medium_pip.png.import diff --git a/Assets/bad_pip.png b/Assets/bad_pip.png new file mode 100644 index 0000000000000000000000000000000000000000..12b494b25a495260f29885960e38285edf52f516 GIT binary patch literal 516 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 literal 3640 zcmeHKX;f0{8V1@HSQcWPtdm89l4;>R-W*dgEhiMUj+JxQ%9C@)0h|y$P1GqWQ>l(x zOB*~%n53iuV%ce+q;g74APuo_CNUZGey(%Zy8rI~yH-E;UeEs4_wD_?&-=XZ^KE)y zfR~ZsYC{+dX5{1T84QELBLUVR7lQlexA+h+kaE<+Bk*WU3=FpUV){kC-;==QPf1~Q z!Bz(8=wr_VpWZMC3iM)mlx(;eQuE~!&w_QK@}v2#Gk0bEfhp(+-D=&kv=!kiAa`TW z4F4_<16BV1=$x+KP(c$3MyxFml=LB*o=JqwscR}!~Y zwppfyyD`S;8uUuOlQjO3X7bP1uqgb*63#;pVjH$jzQ17l^r`(pttRE@XAVZ*IaX;; z2ke^-7)_8W;fV40*|OjpCyIVJvMUKqLVFqUU#(W1#-r{IzWk}f*r}rCqB{oV9T@nR zMViCuJ=-lgYQc-fWR&@&O;+d~T44okLuO26an)VlpEpL_WL0eVb*}t2%b%3l_XKra z+mY_}j3#ppyxTZBR;BE0r3n|OB--iCUmhL3_BC$L*|iHUn#m?_Raq_)c5JiJCA zAQc8%c5wcJ-*LNr6b4(8ykm-;grnsG+G{_f?^vefldroAieXe4ApR^qx<Kgg>`(=+pdG)+2L*3zKDs}4mfvKwNifGM>7jx)jHtvWS;9G}_?&l8$J)Ao5J}8N-R&dvxpY%M>XE@@$ z`sBlS7qNw;!qrE+fgq~|Zxy-r%t_zp*iFr`N2ilIqqN=csm}H9E*cE(;KwmIvm8Zt zi}p`kYy<+5gb>CBBNgNU2+8vW&{xt35Q`?JNY!s29YZKqP}H0bxfxeut(9aa_w#X| zv=9=#c`=hBy53`qt>FuGA^6oYvq2U96~3FEF?Zj}L2 ztPFDgdW0FbF5$YiWvQvL`dBvEET4f$E$gK2*4|fa%qyE(*Dx5vqEA5 zTl$>6|6j93l{5PaBk!L|W;trLA?L=7P4gY``y4^wnYEGg*(#*b$+)2kYuj@Fk*V(Y z)#S@sE+ZcGYR0KI({3VCxu)?)1QdXc?ssYS2<1EtD?gX$Vo98nOJdzb>}(R&n5p9E zs>!XrA%$aKqehRZIXVr0+Cq}OQ!p>bS{j|ZB&$6`RhX&tx#6;EO-Gv`(kewgpYxHK z`%Z8~^5*f+O450JGDVu4Clb9Nqb^ZHGU6YXQf;ri(q^-{>Y`CaWS-QmSjbYfIoYRj zMJijRM577k=H#YDiIfUHoxF*M0b%1n*a2_6A_hB;H)J%$<9=hQ>(qkqCYCTr{JJN1 zYX|Ya8l{tCWSqLZjCTnnXh1zo9n4}Y&<;H_-EnTJe-e2cKNiiGG>SQ#l528O)Jtx+eKhL9gtGV{db zEsC+Q`MF-LfAEE_i72oy z3I_cx{}N5M)jiGwAfVD)!Cyd!3&fy#=H7__T`)vS_WGKE2z(I*T&T(jpkR3OHQ%a@ z1RBAIFkXzUTMy6{?Dx%mXYRY^z8A#zR`P$|gsGdS-VVwTZgZO6CTE?JAzdce)4MSx zCx1r!bvVGECw|%R_vtQ2qnj>|D&ut?#-YDW+>Q#U@eA9Ol9bPO)VwibQr7hc6M?Br zAzTL{k|{$=RfX?AWe+_&l!{xyY>HweNn5mcm|4Jzs+ZeL+=F(AnuAs5Yb&l{2{Iz0V46r00povooF?P9#H5)($UlIIm3= void: @@ -18,6 +25,22 @@ func _ready() -> void: $Camera2D.make_current() +func spectate_player(player_path): + var player = get_node(player_path) as PlayerController + if player.player_info["username"] == player_info["username"]: + cam_top.visible = false + cam_left.visible = false + cam_right.visible = false + cam_bottom.visible = false + else: + cam_top.visible = true + cam_left.visible = true + cam_right.visible = true + cam_bottom.visible = true + cam_name.text = player.player_info["username"] + player.player_cam.make_current() + + @rpc("call_local", "reliable") func ready_self(): ready_button_pressed.emit(player_info["id"]) @@ -31,9 +54,17 @@ func update_ready_label(readied_players, total_players): func _on_lobby_ready_button_pressed() -> void: - rpc("ready_self") ready_button.visible = false - rpc("end_turn") + if game_started < 2: + rpc("ready_self") + game_started += 1 + else: + rpc("end_turn") + + +func on_poor_discard_deck_clicked(): + super() + ready_button.visible = true func add_chat_line(line: String) -> void: diff --git a/Scripts/PlayerStateMachine/player_controller.gd b/Scripts/PlayerStateMachine/player_controller.gd index e6dd9d8..22f4af0 100644 --- a/Scripts/PlayerStateMachine/player_controller.gd +++ b/Scripts/PlayerStateMachine/player_controller.gd @@ -9,6 +9,7 @@ signal round_finished var player_info @export var hand_position: Node2D @export var client_position: Vector2 +@export var player_cam: Camera2D var hand = [] var draft_picked = [] var draft_pick_amount = 0 @@ -30,20 +31,52 @@ func draft(cards, pick): func select_card(card): + if not is_multiplayer_authority(): + return if not draft_picked.has(card) and draft_picked.size() < draft_pick_amount: draft_picked.append(card) + rpc("networked_select_card", true, card.get_path()) card.slide_to_position(card.position.x, card.position.y - 50.0, 0.0, 0.1) elif draft_picked.has(card): draft_picked.remove_at(draft_picked.find(card)) + rpc("networked_select_card", false, card.get_path()) card.slide_to_position(card.position.x, card.position.y + 50.0, 0.0, 0.1) +@rpc("reliable") +func networked_select_card(add, card_path): + if add: + draft_picked.append(get_node(card_path)) + else: + draft_picked.remove_at(draft_picked.find(get_node(card_path))) + + func select_workspace(workspace): + if not is_multiplayer_authority(): + return if current_client == null: return - workspace.add_client(current_client) + rpc("networked_select_workspace", workspace.get_path(), current_client.get_path()) + #workspace.add_client(current_client) current_client = null - rpc("end_turn") + #rpc("end_turn") + + +func on_poor_discard_deck_clicked(): + if not is_multiplayer_authority(): + return + rpc("turn_away_client") + + +@rpc("call_local", "reliable") +func turn_away_client(): + board.poor_deck.place(current_client) + current_client = null + + +@rpc("call_local", "reliable") +func networked_select_workspace(workspace_path, current_client_path): + get_node(workspace_path).add_client(get_node(current_client_path)) @rpc("call_local", "reliable") diff --git a/Scripts/card_crafter.gd b/Scripts/card_crafter.gd index f8790be..69069a7 100644 --- a/Scripts/card_crafter.gd +++ b/Scripts/card_crafter.gd @@ -73,7 +73,7 @@ func load_deck(): for x in value.slice(1, value.size()): bonuses.append(int(x)) card_instance.setup(key, int(value[0]), bonuses) - card_instance.position = Vector2(-713, -17) + card_instance.position = Vector2(-896, -274) card_instance.scale = Vector2(1.45, 1.45) card_array.append(card_instance) card_count += 1 @@ -224,7 +224,7 @@ func generate_card_from_buttons(): return var card_instance = card_scene.instantiate() card_instance.setup(str($name_box.text), card[0], card.slice(1, card.size())) - card_instance.position = Vector2(-713, -17) + card_instance.position = Vector2(-896, -274) card_instance.scale = Vector2(1.45, 1.45) card_array.append(card_instance) card_count += 1 diff --git a/Scripts/client.gd b/Scripts/client.gd index e6d03a4..ba4a598 100644 --- a/Scripts/client.gd +++ b/Scripts/client.gd @@ -6,12 +6,30 @@ signal time_slots_selected enum difficulties {EASY, MEDIUM, HARD} var icon_prefab = preload("res://Scenes/bonus_icon.tscn") +var bad_pip_sprite = preload("res://Assets/bad_pip.png") +var medium_pip_sprite = preload("res://Assets/medium_pip.png") +var good_pip_sprite = preload("res://Assets/good_pip.png") var title = "New Task" var difficulty = difficulties.EASY var initial_stress = 0 var turns_left = 4 var time_slots = [true, true, false, true] var icon_list = [] +var medium_threshold := 5 +var good_threshold := 8 +var satisfaction := 1 +@export var pip_sprites: Array[TextureRect] = [] + + +func _ready(): + pip_sprites.append($front/pip2) + pip_sprites.append($front/pip3) + pip_sprites.append($front/pip4) + pip_sprites.append($front/pip5) + pip_sprites.append($front/pip6) + pip_sprites.append($front/pip7) + pip_sprites.append($front/pip8) + pip_sprites.append($front/pip9) func _process(delta): @@ -19,11 +37,22 @@ func _process(delta): slide(delta) -func setup(_title, _initial_stress, _time_slots, _services): +func setup(_title, _initial_stress, _time_slots, _services, _medium, _good): if _title != "": title = _title initial_stress = _initial_stress time_slots = _time_slots + medium_threshold = _medium + good_threshold = _good + for x in pip_sprites.size(): + if x < 2: + continue + if x >= good_threshold: + pip_sprites[x - 2].texture = good_pip_sprite + if x < good_threshold: + pip_sprites[x - 2].texture = medium_pip_sprite + if x < medium_threshold: + pip_sprites[x - 2].texture = bad_pip_sprite if time_slots[0] == true: $"Control/1turn".visible = true if time_slots[1] == true: diff --git a/Scripts/client_card_crafter.gd b/Scripts/client_card_crafter.gd index 8125eef..d9115d0 100644 --- a/Scripts/client_card_crafter.gd +++ b/Scripts/client_card_crafter.gd @@ -31,6 +31,7 @@ func _ready(): symbol_count_labels.append($"starcount") symbol_count_labels.append($"chaincount") symbol_count_labels.append($"gustcount") + $Control/Card.turn_front() load_deck() @@ -75,6 +76,7 @@ func load_deck(): card_instance.setup(key, int(value[0]), bool_array, int_array) card_instance.position = Vector2(-927, -176) card_instance.scale = Vector2(1.288, 1.288) + card_instance.turn_front() card_array.append(card_instance) card_count += 1 if card_array.size() > 1: @@ -177,6 +179,7 @@ func generate_card_from_buttons(): card_instance.setup(str($Control/LineEdit.text), card[0], card.slice(1, 5), card.slice(5, card.size())) card_instance.position = Vector2(-926, -176) card_instance.scale = Vector2(1.288, 1.288) + card_instance.turn_front() card_array.append(card_instance) card_count += 1 if card_array.size() > 1: diff --git a/Scripts/game.gd b/Scripts/game.gd index 7740b5b..bb1d8ee 100644 --- a/Scripts/game.gd +++ b/Scripts/game.gd @@ -120,6 +120,7 @@ func add_player(id: int, username: String, type: PlayerType) -> void: board.slots[1].clicked.connect(controller.select_workspace) board.slots[2].clicked.connect(controller.select_workspace) board.slots[3].clicked.connect(controller.select_workspace) + board.poor_deck.clicked.connect(controller.on_poor_discard_deck_clicked) board.name = "board " + str(player_boards.size()) player_boards.append(board) players.append(controller) @@ -146,6 +147,8 @@ func ready_player(id): if round_number == 0: rpc("start_game") else: + for player in players: + player.ready_button_pressed.disconnect(ready_player) rpc("start_round") @@ -183,6 +186,8 @@ func start_turn(): turn_number += 1 for x in players.size(): #players[x].rpc("start_turn") + for other_player in players: + other_player.spectate_player(players[x].get_path()) players[x].start_turn() await players[x].turn_finished if is_multiplayer_authority():